diff options
author | Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 2014-12-03 12:42:51 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-12-05 11:30:33 -0500 |
commit | 86d88bfca4758a9a95cbd183c917d623abc3ce84 (patch) | |
tree | 2fb3b851e0fc927ad50c0cabf847dcb5d87fe858 /drivers/pcmcia | |
parent | b02cba8693fca6bd9166dd541f6a61cd82f6e231 (diff) |
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>
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/sa1100_generic.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/sa11xx_base.c | 14 |
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index ff8a027a4afb..d2ab06048169 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c | |||
@@ -93,6 +93,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev) | |||
93 | for (i = 0; i < sinfo->nskt; i++) | 93 | for (i = 0; i < sinfo->nskt; i++) |
94 | soc_pcmcia_remove_one(&sinfo->skt[i]); | 94 | soc_pcmcia_remove_one(&sinfo->skt[i]); |
95 | 95 | ||
96 | clk_put(sinfo->clk); | ||
96 | kfree(sinfo); | 97 | kfree(sinfo); |
97 | return 0; | 98 | return 0; |
98 | } | 99 | } |
diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c index 54d3089d157b..cf6de2c2b329 100644 --- a/drivers/pcmcia/sa11xx_base.c +++ b/drivers/pcmcia/sa11xx_base.c | |||
@@ -135,14 +135,16 @@ sa1100_pcmcia_frequency_change(struct soc_pcmcia_socket *skt, | |||
135 | static int | 135 | static int |
136 | sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt) | 136 | sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt) |
137 | { | 137 | { |
138 | return sa1100_pcmcia_set_mecr(skt, cpufreq_get(0)); | 138 | unsigned long clk = clk_get_rate(skt->clk); |
139 | |||
140 | return sa1100_pcmcia_set_mecr(skt, clk / 1000); | ||
139 | } | 141 | } |
140 | 142 | ||
141 | static int | 143 | static int |
142 | sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf) | 144 | sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf) |
143 | { | 145 | { |
144 | struct soc_pcmcia_timing timing; | 146 | struct soc_pcmcia_timing timing; |
145 | unsigned int clock = cpufreq_get(0); | 147 | unsigned int clock = clk_get_rate(skt->clk); |
146 | unsigned long mecr = MECR; | 148 | unsigned long mecr = MECR; |
147 | char *p = buf; | 149 | char *p = buf; |
148 | 150 | ||
@@ -218,6 +220,11 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
218 | struct skt_dev_info *sinfo; | 220 | struct skt_dev_info *sinfo; |
219 | struct soc_pcmcia_socket *skt; | 221 | struct soc_pcmcia_socket *skt; |
220 | int i, ret = 0; | 222 | int i, ret = 0; |
223 | struct clk *clk; | ||
224 | |||
225 | clk = clk_get(dev, NULL); | ||
226 | if (IS_ERR(clk)) | ||
227 | return PTR_ERR(clk); | ||
221 | 228 | ||
222 | sa11xx_drv_pcmcia_ops(ops); | 229 | sa11xx_drv_pcmcia_ops(ops); |
223 | 230 | ||
@@ -226,12 +233,14 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
226 | return -ENOMEM; | 233 | return -ENOMEM; |
227 | 234 | ||
228 | sinfo->nskt = nr; | 235 | sinfo->nskt = nr; |
236 | sinfo->clk = clk; | ||
229 | 237 | ||
230 | /* Initialize processor specific parameters */ | 238 | /* Initialize processor specific parameters */ |
231 | for (i = 0; i < nr; i++) { | 239 | for (i = 0; i < nr; i++) { |
232 | skt = &sinfo->skt[i]; | 240 | skt = &sinfo->skt[i]; |
233 | 241 | ||
234 | skt->nr = first + i; | 242 | skt->nr = first + i; |
243 | skt->clk = clk; | ||
235 | soc_pcmcia_init_one(skt, ops, dev); | 244 | soc_pcmcia_init_one(skt, ops, dev); |
236 | 245 | ||
237 | ret = sa11xx_drv_pcmcia_add_one(skt); | 246 | 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 | if (ret) { | 251 | if (ret) { |
243 | while (--i >= 0) | 252 | while (--i >= 0) |
244 | soc_pcmcia_remove_one(&sinfo->skt[i]); | 253 | soc_pcmcia_remove_one(&sinfo->skt[i]); |
254 | clk_put(clk); | ||
245 | kfree(sinfo); | 255 | kfree(sinfo); |
246 | } else { | 256 | } else { |
247 | dev_set_drvdata(dev, sinfo); | 257 | dev_set_drvdata(dev, sinfo); |