brcm2708-gpu-fw: update to latest version
[librecmc/librecmc.git] / target / linux / brcm2708 / patches-4.4 / 0226-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
1 From 28035a98dc9820c065dc64ad3016a1f71a9911f2 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 226/232] Revert "bcm2835-sdhost: Adjust to core clock changes"
5
6 This reverts commit 4b89d07fd299a0f4e25321920cb74416ba2e638e.
7 ---
8  drivers/mmc/host/Kconfig          |   1 -
9  drivers/mmc/host/bcm2835-sdhost.c | 140 ++++++--------------------------------
10  2 files changed, 22 insertions(+), 119 deletions(-)
11
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
19         help
20           This selects the SDHost controller on BCM2835/6.
21  
22 --- a/drivers/mmc/host/bcm2835-sdhost.c
23 +++ b/drivers/mmc/host/bcm2835-sdhost.c
24 @@ -50,10 +50,6 @@
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>
31 -
32  
33  #define DRIVER_NAME "sdhost-bcm2835"
34  
35 @@ -140,8 +136,6 @@
36  
37  #define MHZ 1000000
38  
39 -#define RPI_FIRMWARE_CLOCK_CORE  4
40 -
41  
42  struct bcm2835_host {
43         spinlock_t              lock;
44 @@ -157,9 +151,7 @@ struct bcm2835_host {
45  
46         bool                    slow_card;      /* Force 11-bit divisor */
47  
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 */
52  
53         struct tasklet_struct   finish_tasklet; /* Tasklet structures */
54  
55 @@ -191,7 +183,6 @@ struct bcm2835_host {
56         unsigned int                    use_sbc:1;              /* Send CMD23 */
57  
58         unsigned int                    debug:1;                /* Enable debug output */
59 -       unsigned int                    variable_clock:1;       /* The core clock may change */
60  
61         /*DMA part*/
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) */
65  
66         u32                             sectors;        /* Cached card size in sectors */
67 -
68 -       struct notifier_block           cpufreq_nb;     /* The cpufreq callback list item */
69 -       struct semaphore                cpufreq_semaphore; /* Interlock between SD activity and cpufreq changes */
70  };
71  
72  #if ENABLE_LOG
73 @@ -239,10 +227,6 @@ static u32 sdhost_log_idx;
74  static spinlock_t log_lock;
75  static void __iomem *timer_base;
76  
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);
80 -
81  #define LOG_ENTRIES (256*1)
82  #define LOG_SIZE (sizeof(LOG_ENTRY_T)*LOG_ENTRIES)
83  
84 @@ -464,14 +448,20 @@ static void bcm2835_sdhost_reset(struct
85  
86  static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios);
87  
88 -static void bcm2835_sdhost_init(struct bcm2835_host *host)
89 +static void bcm2835_sdhost_init(struct bcm2835_host *host, int soft)
90  {
91 -       pr_debug("bcm2835_sdhost_init()\n");
92 +       pr_debug("bcm2835_sdhost_init(%d)\n", soft);
93  
94         /* Set interrupt enables */
95         host->hcfg = SDHCFG_BUSY_IRPT_EN;
96  
97         bcm2835_sdhost_reset_internal(host);
98 +
99 +       if (soft) {
100 +               /* force clock reconfiguration */
101 +               host->clock = 0;
102 +               bcm2835_sdhost_set_ios(host->mmc, &host->mmc->ios);
103 +       }
104  }
105  
106  static void bcm2835_sdhost_wait_transfer_complete(struct bcm2835_host *host)
107 @@ -1509,10 +1499,10 @@ static irqreturn_t bcm2835_sdhost_irq(in
108         return result;
109  }
110  
111 -void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
112 +void bcm2835_sdhost_set_clock(struct bcm2835_host *host, unsigned int clock)
113  {
114         int div = 0; /* Initialized for compiler warning */
115 -       unsigned int clock = host->clock;
116 +       unsigned int input_clock = clock;
117  
118         if (host->debug)
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
121             return;
122         }
123  
124 -       div = host->cur_clk / clock;
125 +       div = host->max_clk / clock;
126         if (div < 2)
127                 div = 2;
128 -       if ((host->cur_clk / div) > clock)
129 +       if ((host->max_clk / div) > clock)
130                 div++;
131         div -= 2;
132  
133         if (div > SDCDIV_MAX_CDIV)
134             div = SDCDIV_MAX_CDIV;
135  
136 -       clock = host->cur_clk / (div + 2);
137 +       clock = host->max_clk / (div + 2);
138         host->mmc->actual_clock = clock;
139  
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);
144  
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);
152  
153         if (host->debug)
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);
160  }
161  
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);
166  
167 -       if (host->variable_clock &&
168 -           (down_killable(&host->cpufreq_semaphore) != 0)) {
169 -               mrq->cmd->error = -EINTR;
170 -               mmc_request_done(mmc, mrq);
171 -               return;
172 -       }
173 -
174         spin_lock_irqsave(&host->lock, flags);
175  
176         WARN_ON(host->mrq != NULL);
177 @@ -1704,52 +1687,6 @@ static void bcm2835_sdhost_request(struc
178         spin_unlock_irqrestore(&host->lock, flags);
179  }
180  
181 -static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
182 -                                          unsigned long action, void *data)
183 -{
184 -       struct cpufreq_freqs *freq = data;
185 -       struct bcm2835_host *host;
186 -
187 -       host = container_of(nb, struct bcm2835_host, cpufreq_nb);
188 -
189 -       if (freq->cpu == 0) {
190 -               switch (action) {
191 -               case CPUFREQ_PRECHANGE:
192 -                       if (down_killable(&host->cpufreq_semaphore) != 0)
193 -                               return NOTIFY_BAD;
194 -                       break;
195 -               case CPUFREQ_POSTCHANGE:
196 -                       if (freq->new > freq->old)
197 -                               host->cur_clk = host->max_clk;
198 -                       else
199 -                               host->cur_clk = host->min_clk;
200 -                       bcm2835_sdhost_set_clock(host);
201 -                       up(&host->cpufreq_semaphore);
202 -                       break;
203 -               default:
204 -                       break;
205 -               }
206 -       }
207 -       return NOTIFY_OK;
208 -}
209 -
210 -static unsigned int get_core_clock(unsigned int mode)
211 -{
212 -       struct rpi_firmware *fw = rpi_firmware_get(NULL);
213 -       struct {
214 -               u32 id;
215 -               u32 val;
216 -       } packet;
217 -       int ret;
218 -
219 -       packet.id = RPI_FIRMWARE_CLOCK_CORE;
220 -       ret = rpi_firmware_property(fw, mode, &packet, sizeof(packet));
221 -       if (ret)
222 -               return 0;
223 -
224 -       return packet.val;
225 -}
226 -
227  static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
228  {
229  
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);
233  
234 -       if (ios->clock && !host->cur_clk)
235 -               host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
236 -
237         spin_lock_irqsave(&host->lock, flags);
238  
239         log_event("IOS<", ios->clock, 0);
240  
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);
245         }
246  
247         /* set bus width */
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;
256                 }
257 @@ -1879,9 +1813,6 @@ static void bcm2835_sdhost_tasklet_finis
258  
259         spin_unlock_irqrestore(&host->lock, flags);
260  
261 -       if (host->variable_clock)
262 -               up(&host->cpufreq_semaphore);
263 -
264         if (terminate_chan)
265         {
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);
270  
271 -       bcm2835_sdhost_init(host);
272 +       bcm2835_sdhost_init(host, 0);
273  
274         ret = request_irq(host->irq, bcm2835_sdhost_irq, 0 /*IRQF_SHARED*/,
275 -                         mmc_hostname(mmc), host);
276 +                                 mmc_hostname(mmc), host);
277         if (ret) {
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;
283         const __be32 *addr;
284 -       unsigned int max_clk;
285         int ret;
286  
287         pr_debug("bcm2835_sdhost_probe\n");
288 @@ -2132,28 +2062,6 @@ static int bcm2835_sdhost_probe(struct p
289         if (ret)
290                 goto err;
291  
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;
299 -       }
300 -
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 */
309 -       } else {
310 -               host->variable_clock = 0;
311 -               host->cur_clk = host->max_clk;
312 -       }
313 -
314         platform_set_drvdata(pdev, host);
315  
316         pr_debug("bcm2835_sdhost_probe -> OK\n");
317 @@ -2173,10 +2081,6 @@ static int bcm2835_sdhost_remove(struct
318  
319         pr_debug("bcm2835_sdhost_remove\n");
320  
321 -       if (host->variable_clock)
322 -               cpufreq_unregister_notifier(&host->cpufreq_nb,
323 -                                           CPUFREQ_TRANSITION_NOTIFIER);
324 -
325         mmc_remove_host(host->mmc);
326  
327         bcm2835_sdhost_set_power(host, false);