ARM: 8247/2: pcmcia: sa1100: make use of device clock
Use per-device clock (instead of calling cpufreq_get(0), which can return 0 if no cpu frequency driver is selected) to program timings. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
b02cba8693
commit
86d88bfca4
2 changed files with 13 additions and 2 deletions
|
@ -93,6 +93,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
|
||||||
for (i = 0; i < sinfo->nskt; i++)
|
for (i = 0; i < sinfo->nskt; i++)
|
||||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||||
|
|
||||||
|
clk_put(sinfo->clk);
|
||||||
kfree(sinfo);
|
kfree(sinfo);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,14 +135,16 @@ sa1100_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
|
||||||
static int
|
static int
|
||||||
sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
|
sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
|
||||||
{
|
{
|
||||||
return sa1100_pcmcia_set_mecr(skt, cpufreq_get(0));
|
unsigned long clk = clk_get_rate(skt->clk);
|
||||||
|
|
||||||
|
return sa1100_pcmcia_set_mecr(skt, clk / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf)
|
sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf)
|
||||||
{
|
{
|
||||||
struct soc_pcmcia_timing timing;
|
struct soc_pcmcia_timing timing;
|
||||||
unsigned int clock = cpufreq_get(0);
|
unsigned int clock = clk_get_rate(skt->clk);
|
||||||
unsigned long mecr = MECR;
|
unsigned long mecr = MECR;
|
||||||
char *p = buf;
|
char *p = buf;
|
||||||
|
|
||||||
|
@ -218,6 +220,11 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||||
struct skt_dev_info *sinfo;
|
struct skt_dev_info *sinfo;
|
||||||
struct soc_pcmcia_socket *skt;
|
struct soc_pcmcia_socket *skt;
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
|
struct clk *clk;
|
||||||
|
|
||||||
|
clk = clk_get(dev, NULL);
|
||||||
|
if (IS_ERR(clk))
|
||||||
|
return PTR_ERR(clk);
|
||||||
|
|
||||||
sa11xx_drv_pcmcia_ops(ops);
|
sa11xx_drv_pcmcia_ops(ops);
|
||||||
|
|
||||||
|
@ -226,12 +233,14 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
sinfo->nskt = nr;
|
sinfo->nskt = nr;
|
||||||
|
sinfo->clk = clk;
|
||||||
|
|
||||||
/* Initialize processor specific parameters */
|
/* Initialize processor specific parameters */
|
||||||
for (i = 0; i < nr; i++) {
|
for (i = 0; i < nr; i++) {
|
||||||
skt = &sinfo->skt[i];
|
skt = &sinfo->skt[i];
|
||||||
|
|
||||||
skt->nr = first + i;
|
skt->nr = first + i;
|
||||||
|
skt->clk = clk;
|
||||||
soc_pcmcia_init_one(skt, ops, dev);
|
soc_pcmcia_init_one(skt, ops, dev);
|
||||||
|
|
||||||
ret = sa11xx_drv_pcmcia_add_one(skt);
|
ret = sa11xx_drv_pcmcia_add_one(skt);
|
||||||
|
@ -242,6 +251,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||||
|
clk_put(clk);
|
||||||
kfree(sinfo);
|
kfree(sinfo);
|
||||||
} else {
|
} else {
|
||||||
dev_set_drvdata(dev, sinfo);
|
dev_set_drvdata(dev, sinfo);
|
||||||
|
|
Loading…
Add table
Reference in a new issue