1 From 14c3f0b3a4fd51c2bb98146b3395ddc69a2b50ab Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Mon, 4 Apr 2016 12:35:51 +0100
4 Subject: [PATCH 224/381] Revert "bcm2835-sdhost: Adjust to core clock changes"
6 This reverts commit 4b89d07fd299a0f4e25321920cb74416ba2e638e.
8 drivers/mmc/host/Kconfig | 1 -
9 drivers/mmc/host/bcm2835-sdhost.c | 140 ++++++--------------------------------
10 2 files changed, 22 insertions(+), 119 deletions(-)
12 --- a/drivers/mmc/host/Kconfig
13 +++ b/drivers/mmc/host/Kconfig
14 @@ -36,7 +36,6 @@ config MMC_BCM2835_PIO_DMA_BARRIER
15 config MMC_BCM2835_SDHOST
16 tristate "Support for the SDHost controller on BCM2708/9"
17 depends on MACH_BCM2708 || MACH_BCM2709 || ARCH_BCM2835
18 - depends on RASPBERRYPI_FIRMWARE
20 This selects the SDHost controller on BCM2835/6.
22 --- a/drivers/mmc/host/bcm2835-sdhost.c
23 +++ b/drivers/mmc/host/bcm2835-sdhost.c
25 #include <linux/of_dma.h>
26 #include <linux/time.h>
27 #include <linux/workqueue.h>
28 -#include <linux/cpufreq.h>
29 -#include <linux/semaphore.h>
30 -#include <soc/bcm2835/raspberrypi-firmware.h>
33 #define DRIVER_NAME "sdhost-bcm2835"
39 -#define RPI_FIRMWARE_CLOCK_CORE 4
44 @@ -157,9 +151,7 @@ struct bcm2835_host {
46 bool slow_card; /* Force 11-bit divisor */
48 - unsigned int max_clk; /* Max src clock freq */
49 - unsigned int min_clk; /* Min src clock freq */
50 - unsigned int cur_clk; /* Current src clock freq */
51 + unsigned int max_clk; /* Max possible freq */
53 struct tasklet_struct finish_tasklet; /* Tasklet structures */
55 @@ -191,7 +183,6 @@ struct bcm2835_host {
56 unsigned int use_sbc:1; /* Send CMD23 */
58 unsigned int debug:1; /* Enable debug output */
59 - unsigned int variable_clock:1; /* The core clock may change */
62 struct dma_chan *dma_chan_rxtx; /* DMA channel for reads and writes */
63 @@ -217,9 +208,6 @@ struct bcm2835_host {
64 u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
66 u32 sectors; /* Cached card size in sectors */
68 - struct notifier_block cpufreq_nb; /* The cpufreq callback list item */
69 - struct semaphore cpufreq_semaphore; /* Interlock between SD activity and cpufreq changes */
73 @@ -239,10 +227,6 @@ static u32 sdhost_log_idx;
74 static spinlock_t log_lock;
75 static void __iomem *timer_base;
77 -static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
78 - unsigned long action, void *data);
79 -static unsigned int get_core_clock(unsigned int mode);
81 #define LOG_ENTRIES (256*1)
82 #define LOG_SIZE (sizeof(LOG_ENTRY_T)*LOG_ENTRIES)
84 @@ -464,14 +448,20 @@ static void bcm2835_sdhost_reset(struct
86 static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios);
88 -static void bcm2835_sdhost_init(struct bcm2835_host *host)
89 +static void bcm2835_sdhost_init(struct bcm2835_host *host, int soft)
91 - pr_debug("bcm2835_sdhost_init()\n");
92 + pr_debug("bcm2835_sdhost_init(%d)\n", soft);
94 /* Set interrupt enables */
95 host->hcfg = SDHCFG_BUSY_IRPT_EN;
97 bcm2835_sdhost_reset_internal(host);
100 + /* force clock reconfiguration */
102 + bcm2835_sdhost_set_ios(host->mmc, &host->mmc->ios);
106 static void bcm2835_sdhost_wait_transfer_complete(struct bcm2835_host *host)
107 @@ -1509,10 +1499,10 @@ static irqreturn_t bcm2835_sdhost_irq(in
111 -void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
112 +void bcm2835_sdhost_set_clock(struct bcm2835_host *host, unsigned int clock)
114 int div = 0; /* Initialized for compiler warning */
115 - unsigned int clock = host->clock;
116 + unsigned int input_clock = clock;
119 pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock);
120 @@ -1553,17 +1543,17 @@ void bcm2835_sdhost_set_clock(struct bcm
124 - div = host->cur_clk / clock;
125 + div = host->max_clk / clock;
128 - if ((host->cur_clk / div) > clock)
129 + if ((host->max_clk / div) > clock)
133 if (div > SDCDIV_MAX_CDIV)
134 div = SDCDIV_MAX_CDIV;
136 - clock = host->cur_clk / (div + 2);
137 + clock = host->max_clk / (div + 2);
138 host->mmc->actual_clock = clock;
140 /* Calibrate some delays */
141 @@ -1571,7 +1561,7 @@ void bcm2835_sdhost_set_clock(struct bcm
142 host->ns_per_fifo_word = (1000000000/clock) *
143 ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
145 - if (clock > host->clock) {
146 + if (clock > input_clock) {
147 /* Save the closest value, to make it easier
148 to reduce in the event of error */
149 host->overclock_50 = (clock/MHZ);
150 @@ -1597,9 +1587,9 @@ void bcm2835_sdhost_set_clock(struct bcm
151 bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
154 - pr_info("%s: clock=%d -> cur_clk=%d, cdiv=%x (actual clock %d)\n",
155 - mmc_hostname(host->mmc), host->clock,
156 - host->cur_clk, host->cdiv, host->mmc->actual_clock);
157 + pr_info("%s: clock=%d -> max_clk=%d, cdiv=%x (actual clock %d)\n",
158 + mmc_hostname(host->mmc), input_clock,
159 + host->max_clk, host->cdiv, host->mmc->actual_clock);
162 static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
163 @@ -1648,13 +1638,6 @@ static void bcm2835_sdhost_request(struc
164 (mrq->data->blocks > host->pio_limit))
165 bcm2835_sdhost_prepare_dma(host, mrq->data);
167 - if (host->variable_clock &&
168 - (down_killable(&host->cpufreq_semaphore) != 0)) {
169 - mrq->cmd->error = -EINTR;
170 - mmc_request_done(mmc, mrq);
174 spin_lock_irqsave(&host->lock, flags);
176 WARN_ON(host->mrq != NULL);
177 @@ -1704,52 +1687,6 @@ static void bcm2835_sdhost_request(struc
178 spin_unlock_irqrestore(&host->lock, flags);
181 -static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
182 - unsigned long action, void *data)
184 - struct cpufreq_freqs *freq = data;
185 - struct bcm2835_host *host;
187 - host = container_of(nb, struct bcm2835_host, cpufreq_nb);
189 - if (freq->cpu == 0) {
191 - case CPUFREQ_PRECHANGE:
192 - if (down_killable(&host->cpufreq_semaphore) != 0)
195 - case CPUFREQ_POSTCHANGE:
196 - if (freq->new > freq->old)
197 - host->cur_clk = host->max_clk;
199 - host->cur_clk = host->min_clk;
200 - bcm2835_sdhost_set_clock(host);
201 - up(&host->cpufreq_semaphore);
210 -static unsigned int get_core_clock(unsigned int mode)
212 - struct rpi_firmware *fw = rpi_firmware_get(NULL);
219 - packet.id = RPI_FIRMWARE_CLOCK_CORE;
220 - ret = rpi_firmware_property(fw, mode, &packet, sizeof(packet));
227 static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
230 @@ -1763,16 +1700,13 @@ static void bcm2835_sdhost_set_ios(struc
231 ios->clock, ios->power_mode, ios->bus_width,
232 ios->timing, ios->signal_voltage, ios->drv_type);
234 - if (ios->clock && !host->cur_clk)
235 - host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
237 spin_lock_irqsave(&host->lock, flags);
239 log_event("IOS<", ios->clock, 0);
241 if (!ios->clock || ios->clock != host->clock) {
242 + bcm2835_sdhost_set_clock(host, ios->clock);
243 host->clock = ios->clock;
244 - bcm2835_sdhost_set_clock(host);
248 @@ -1861,7 +1795,7 @@ static void bcm2835_sdhost_tasklet_finis
249 host->overclock_50--;
250 pr_warn("%s: reducing overclock due to errors\n",
251 mmc_hostname(host->mmc));
252 - bcm2835_sdhost_set_clock(host);
253 + bcm2835_sdhost_set_clock(host,50*MHZ);
254 mrq->cmd->error = -EILSEQ;
255 mrq->cmd->retries = 1;
257 @@ -1879,9 +1813,6 @@ static void bcm2835_sdhost_tasklet_finis
259 spin_unlock_irqrestore(&host->lock, flags);
261 - if (host->variable_clock)
262 - up(&host->cpufreq_semaphore);
266 int err = dmaengine_terminate_all(terminate_chan);
267 @@ -1984,10 +1915,10 @@ int bcm2835_sdhost_add_host(struct bcm28
268 setup_timer(&host->timer, bcm2835_sdhost_timeout,
269 (unsigned long)host);
271 - bcm2835_sdhost_init(host);
272 + bcm2835_sdhost_init(host, 0);
274 ret = request_irq(host->irq, bcm2835_sdhost_irq, 0 /*IRQF_SHARED*/,
275 - mmc_hostname(mmc), host);
276 + mmc_hostname(mmc), host);
278 pr_err("%s: failed to request IRQ %d: %d\n",
279 mmc_hostname(mmc), host->irq, ret);
280 @@ -2022,7 +1953,6 @@ static int bcm2835_sdhost_probe(struct p
281 struct bcm2835_host *host;
282 struct mmc_host *mmc;
284 - unsigned int max_clk;
287 pr_debug("bcm2835_sdhost_probe\n");
288 @@ -2132,28 +2062,6 @@ static int bcm2835_sdhost_probe(struct p
292 - /* Query the core clock frequencies */
293 - host->min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
294 - max_clk = get_core_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
295 - if (max_clk != host->max_clk) {
296 - pr_warn("%s: Expected max clock %d, found %d\n",
297 - mmc_hostname(mmc), host->max_clk, max_clk);
298 - host->max_clk = max_clk;
301 - if (host->min_clk != host->max_clk) {
302 - host->cpufreq_nb.notifier_call =
303 - bcm2835_sdhost_cpufreq_callback;
304 - sema_init(&host->cpufreq_semaphore, 1);
305 - cpufreq_register_notifier(&host->cpufreq_nb,
306 - CPUFREQ_TRANSITION_NOTIFIER);
307 - host->variable_clock = 1;
308 - host->cur_clk = 0; /* Get this later */
310 - host->variable_clock = 0;
311 - host->cur_clk = host->max_clk;
314 platform_set_drvdata(pdev, host);
316 pr_debug("bcm2835_sdhost_probe -> OK\n");
317 @@ -2173,10 +2081,6 @@ static int bcm2835_sdhost_remove(struct
319 pr_debug("bcm2835_sdhost_remove\n");
321 - if (host->variable_clock)
322 - cpufreq_unregister_notifier(&host->cpufreq_nb,
323 - CPUFREQ_TRANSITION_NOTIFIER);
325 mmc_remove_host(host->mmc);
327 bcm2835_sdhost_set_power(host, false);