Commit 86d88bfc authored by Dmitry Eremin-Solenikov's avatar Dmitry Eremin-Solenikov Committed by Russell King

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: default avatarDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent b02cba86
...@@ -93,6 +93,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment