hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/mmc/host/renesas_sdhi_core.c
....@@ -1,14 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Renesas SDHI
34 *
4
- * Copyright (C) 2015-17 Renesas Electronics Corporation
5
- * Copyright (C) 2016-17 Sang Engineering, Wolfram Sang
5
+ * Copyright (C) 2015-19 Renesas Electronics Corporation
6
+ * Copyright (C) 2016-19 Sang Engineering, Wolfram Sang
67 * Copyright (C) 2016-17 Horms Solutions, Simon Horman
78 * Copyright (C) 2009 Magnus Damm
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License version 2 as
11
- * published by the Free Software Foundation.
129 *
1310 * Based on "Compaq ASIC3 support":
1411 *
....@@ -27,7 +24,9 @@
2724 #include <linux/module.h>
2825 #include <linux/of_device.h>
2926 #include <linux/platform_device.h>
27
+#include <linux/pm_domain.h>
3028 #include <linux/mmc/host.h>
29
+#include <linux/mmc/mmc.h>
3130 #include <linux/mmc/slot-gpio.h>
3231 #include <linux/mfd/tmio.h>
3332 #include <linux/sh_dma.h>
....@@ -35,6 +34,7 @@
3534 #include <linux/pinctrl/consumer.h>
3635 #include <linux/pinctrl/pinctrl-state.h>
3736 #include <linux/regulator/consumer.h>
37
+#include <linux/sys_soc.h>
3838
3939 #include "renesas_sdhi.h"
4040 #include "tmio_mmc.h"
....@@ -47,6 +47,8 @@
4747 #define SDHI_VER_GEN2_SDR104 0xcb0d
4848 #define SDHI_VER_GEN3_SD 0xcc10
4949 #define SDHI_VER_GEN3_SDMMC 0xcd10
50
+
51
+#define SDHI_GEN3_MMC0_ADDR 0xee140000
5052
5153 static void renesas_sdhi_sdbuf_width(struct tmio_mmc_host *host, int width)
5254 {
....@@ -84,16 +86,11 @@
8486 {
8587 struct mmc_host *mmc = host->mmc;
8688 struct renesas_sdhi *priv = host_to_priv(host);
87
- int ret = clk_prepare_enable(priv->clk);
88
-
89
- if (ret < 0)
90
- return ret;
89
+ int ret;
9190
9291 ret = clk_prepare_enable(priv->clk_cd);
93
- if (ret < 0) {
94
- clk_disable_unprepare(priv->clk);
92
+ if (ret < 0)
9593 return ret;
96
- }
9794
9895 /*
9996 * The clock driver may not know what maximum frequency
....@@ -121,10 +118,14 @@
121118 {
122119 struct renesas_sdhi *priv = host_to_priv(host);
123120 unsigned int freq, diff, best_freq = 0, diff_min = ~0;
124
- int i, ret;
121
+ int i;
125122
126
- /* tested only on R-Car Gen2+ currently; may work for others */
127
- if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
123
+ /*
124
+ * We simply return the current rate if a) we are not on a R-Car Gen2+
125
+ * SoC (may work for others, but untested) or b) if the SCC needs its
126
+ * clock during tuning, so we don't change the external clock setup.
127
+ */
128
+ if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2) || mmc_doing_tune(host->mmc))
128129 return clk_get_rate(priv->clk);
129130
130131 /*
....@@ -150,16 +151,55 @@
150151 }
151152 }
152153
153
- ret = clk_set_rate(priv->clk, best_freq);
154
+ clk_set_rate(priv->clk, best_freq);
154155
155
- return ret == 0 ? best_freq : clk_get_rate(priv->clk);
156
+ return clk_get_rate(priv->clk);
157
+}
158
+
159
+static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
160
+ unsigned int new_clock)
161
+{
162
+ u32 clk = 0, clock;
163
+
164
+ sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
165
+ sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
166
+
167
+ if (new_clock == 0) {
168
+ host->mmc->actual_clock = 0;
169
+ goto out;
170
+ }
171
+
172
+ host->mmc->actual_clock = renesas_sdhi_clk_update(host, new_clock);
173
+ clock = host->mmc->actual_clock / 512;
174
+
175
+ for (clk = 0x80000080; new_clock >= (clock << 1); clk >>= 1)
176
+ clock <<= 1;
177
+
178
+ /* 1/1 clock is option */
179
+ if ((host->pdata->flags & TMIO_MMC_CLK_ACTUAL) && ((clk >> 22) & 0x1)) {
180
+ if (!(host->mmc->ios.timing == MMC_TIMING_MMC_HS400))
181
+ clk |= 0xff;
182
+ else
183
+ clk &= ~0xff;
184
+ }
185
+
186
+ sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
187
+ if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
188
+ usleep_range(10000, 11000);
189
+
190
+ sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
191
+ sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
192
+
193
+out:
194
+ /* HW engineers overrode docs: no sleep needed on R-Car2+ */
195
+ if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
196
+ usleep_range(10000, 11000);
156197 }
157198
158199 static void renesas_sdhi_clk_disable(struct tmio_mmc_host *host)
159200 {
160201 struct renesas_sdhi *priv = host_to_priv(host);
161202
162
- clk_disable_unprepare(priv->clk);
163203 clk_disable_unprepare(priv->clk_cd);
164204 }
165205
....@@ -199,7 +239,7 @@
199239 MMC_SIGNAL_VOLTAGE_330 ? 0 : -EINVAL;
200240
201241 ret = mmc_regulator_set_vqmmc(host->mmc, ios);
202
- if (ret)
242
+ if (ret < 0)
203243 return ret;
204244
205245 return pinctrl_select_state(priv->pinctrl, pin_state);
....@@ -212,22 +252,66 @@
212252 #define SH_MOBILE_SDHI_SCC_CKSEL 0x006
213253 #define SH_MOBILE_SDHI_SCC_RVSCNTL 0x008
214254 #define SH_MOBILE_SDHI_SCC_RVSREQ 0x00A
255
+#define SH_MOBILE_SDHI_SCC_SMPCMP 0x00C
215256 #define SH_MOBILE_SDHI_SCC_TMPPORT2 0x00E
257
+#define SH_MOBILE_SDHI_SCC_TMPPORT3 0x014
258
+#define SH_MOBILE_SDHI_SCC_TMPPORT4 0x016
259
+#define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018
260
+#define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A
261
+#define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C
216262
217
-/* Definitions for values the SH_MOBILE_SDHI_SCC_DTCNTL register */
218263 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN BIT(0)
219264 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT 16
220265 #define SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_MASK 0xff
221266
222
-/* Definitions for values the SH_MOBILE_SDHI_SCC_CKSEL register */
223267 #define SH_MOBILE_SDHI_SCC_CKSEL_DTSEL BIT(0)
224
-/* Definitions for values the SH_MOBILE_SDHI_SCC_RVSCNTL register */
268
+
225269 #define SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN BIT(0)
226
-/* Definitions for values the SH_MOBILE_SDHI_SCC_RVSREQ register */
270
+
271
+#define SH_MOBILE_SDHI_SCC_RVSREQ_REQTAPDOWN BIT(0)
272
+#define SH_MOBILE_SDHI_SCC_RVSREQ_REQTAPUP BIT(1)
227273 #define SH_MOBILE_SDHI_SCC_RVSREQ_RVSERR BIT(2)
228
-/* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT2 register */
274
+
275
+#define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQDOWN BIT(8)
276
+#define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQUP BIT(24)
277
+#define SH_MOBILE_SDHI_SCC_SMPCMP_CMD_ERR (BIT(8) | BIT(24))
278
+
229279 #define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL BIT(4)
230280 #define SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN BIT(31)
281
+
282
+/* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT4 register */
283
+#define SH_MOBILE_SDHI_SCC_TMPPORT4_DLL_ACC_START BIT(0)
284
+
285
+/* Definitions for values the SH_MOBILE_SDHI_SCC_TMPPORT5 register */
286
+#define SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_RW_SEL_R BIT(8)
287
+#define SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_RW_SEL_W (0 << 8)
288
+#define SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_ADR_MASK 0x3F
289
+
290
+/* Definitions for values the SH_MOBILE_SDHI_SCC register */
291
+#define SH_MOBILE_SDHI_SCC_TMPPORT_DISABLE_WP_CODE 0xa5000000
292
+#define SH_MOBILE_SDHI_SCC_TMPPORT_CALIB_CODE_MASK 0x1f
293
+#define SH_MOBILE_SDHI_SCC_TMPPORT_MANUAL_MODE BIT(7)
294
+
295
+static const u8 r8a7796_es13_calib_table[2][SDHI_CALIB_TABLE_MAX] = {
296
+ { 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 15,
297
+ 16, 16, 16, 16, 16, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25 },
298
+ { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 11,
299
+ 12, 17, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 25, 25 }
300
+};
301
+
302
+static const u8 r8a77965_calib_table[2][SDHI_CALIB_TABLE_MAX] = {
303
+ { 1, 2, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 16,
304
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31 },
305
+ { 2, 3, 4, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17,
306
+ 17, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 31, 31, 31 }
307
+};
308
+
309
+static const u8 r8a77990_calib_table[2][SDHI_CALIB_TABLE_MAX] = {
310
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
312
+ { 0, 0, 0, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 8, 9, 10,
313
+ 11, 12, 13, 15, 16, 17, 17, 18, 18, 19, 20, 22, 24, 25, 26, 26 }
314
+};
231315
232316 static inline u32 sd_scc_read32(struct tmio_mmc_host *host,
233317 struct renesas_sdhi *priv, int addr)
....@@ -278,18 +362,12 @@
278362 SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_MASK;
279363 }
280364
281
-static void renesas_sdhi_prepare_tuning(struct tmio_mmc_host *host,
282
- unsigned long tap)
365
+static void renesas_sdhi_hs400_complete(struct mmc_host *mmc)
283366 {
367
+ struct tmio_mmc_host *host = mmc_priv(mmc);
284368 struct renesas_sdhi *priv = host_to_priv(host);
285
-
286
- /* Set sampling clock position */
287
- sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, tap);
288
-}
289
-
290
-static void renesas_sdhi_hs400_complete(struct tmio_mmc_host *host)
291
-{
292
- struct renesas_sdhi *priv = host_to_priv(host);
369
+ u32 bad_taps = priv->quirks ? priv->quirks->hs400_bad_taps : 0;
370
+ bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
293371
294372 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
295373 sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
....@@ -297,20 +375,43 @@
297375 /* Set HS400 mode */
298376 sd_ctrl_write16(host, CTL_SDIF_MODE, 0x0001 |
299377 sd_ctrl_read16(host, CTL_SDIF_MODE));
378
+
379
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF,
380
+ priv->scc_tappos_hs400);
381
+
382
+ /* Gen3 can't do automatic tap correction with HS400, so disable it */
383
+ if (sd_ctrl_read16(host, CTL_VERSION) == SDHI_VER_GEN3_SDMMC)
384
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
385
+ ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
386
+ sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
387
+
300388 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2,
301389 (SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN |
302390 SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) |
303391 sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
304392
305
- /* Set the sampling clock selection range of HS400 mode */
306393 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
307394 SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
308
- 0x4 << SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT);
395
+ sd_scc_read32(host, priv,
396
+ SH_MOBILE_SDHI_SCC_DTCNTL));
309397
398
+ /* Avoid bad TAP */
399
+ if (bad_taps & BIT(priv->tap_set)) {
400
+ u32 new_tap = (priv->tap_set + 1) % priv->tap_num;
310401
311
- if (host->pdata->flags & TMIO_MMC_HAVE_4TAP_HS400)
312
- sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
313
- host->tap_set / 2);
402
+ if (bad_taps & BIT(new_tap))
403
+ new_tap = (priv->tap_set - 1) % priv->tap_num;
404
+
405
+ if (bad_taps & BIT(new_tap)) {
406
+ new_tap = priv->tap_set;
407
+ dev_dbg(&host->pdev->dev, "Can't handle three bad tap in a row\n");
408
+ }
409
+
410
+ priv->tap_set = new_tap;
411
+ }
412
+
413
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
414
+ priv->tap_set / (use_4tap ? 2 : 1));
314415
315416 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL,
316417 SH_MOBILE_SDHI_SCC_CKSEL_DTSEL |
....@@ -318,6 +419,9 @@
318419
319420 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
320421 sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
422
+
423
+ if (priv->adjust_hs400_calib_table)
424
+ priv->needs_adjust_hs400 = true;
321425 }
322426
323427 static void renesas_sdhi_reset_scc(struct tmio_mmc_host *host,
....@@ -332,8 +436,9 @@
332436 SH_MOBILE_SDHI_SCC_CKSEL));
333437 }
334438
335
-static void renesas_sdhi_disable_scc(struct tmio_mmc_host *host)
439
+static void renesas_sdhi_disable_scc(struct mmc_host *mmc)
336440 {
441
+ struct tmio_mmc_host *host = mmc_priv(mmc);
337442 struct renesas_sdhi *priv = host_to_priv(host);
338443
339444 renesas_sdhi_reset_scc(host, priv);
....@@ -347,6 +452,74 @@
347452 sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
348453 }
349454
455
+static u32 sd_scc_tmpport_read32(struct tmio_mmc_host *host,
456
+ struct renesas_sdhi *priv, u32 addr)
457
+{
458
+ /* read mode */
459
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT5,
460
+ SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_RW_SEL_R |
461
+ (SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_ADR_MASK & addr));
462
+
463
+ /* access start and stop */
464
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT4,
465
+ SH_MOBILE_SDHI_SCC_TMPPORT4_DLL_ACC_START);
466
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT4, 0);
467
+
468
+ return sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT7);
469
+}
470
+
471
+static void sd_scc_tmpport_write32(struct tmio_mmc_host *host,
472
+ struct renesas_sdhi *priv, u32 addr, u32 val)
473
+{
474
+ /* write mode */
475
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT5,
476
+ SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_RW_SEL_W |
477
+ (SH_MOBILE_SDHI_SCC_TMPPORT5_DLL_ADR_MASK & addr));
478
+
479
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT6, val);
480
+
481
+ /* access start and stop */
482
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT4,
483
+ SH_MOBILE_SDHI_SCC_TMPPORT4_DLL_ACC_START);
484
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT4, 0);
485
+}
486
+
487
+static void renesas_sdhi_adjust_hs400_mode_enable(struct tmio_mmc_host *host)
488
+{
489
+ struct renesas_sdhi *priv = host_to_priv(host);
490
+ u32 calib_code;
491
+
492
+ /* disable write protect */
493
+ sd_scc_tmpport_write32(host, priv, 0x00,
494
+ SH_MOBILE_SDHI_SCC_TMPPORT_DISABLE_WP_CODE);
495
+ /* read calibration code and adjust */
496
+ calib_code = sd_scc_tmpport_read32(host, priv, 0x26);
497
+ calib_code &= SH_MOBILE_SDHI_SCC_TMPPORT_CALIB_CODE_MASK;
498
+
499
+ sd_scc_tmpport_write32(host, priv, 0x22,
500
+ SH_MOBILE_SDHI_SCC_TMPPORT_MANUAL_MODE |
501
+ priv->adjust_hs400_calib_table[calib_code]);
502
+
503
+ /* set offset value to TMPPORT3, hardcoded to OFFSET0 (= 0x3) for now */
504
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT3, 0x3);
505
+
506
+ /* adjustment done, clear flag */
507
+ priv->needs_adjust_hs400 = false;
508
+}
509
+
510
+static void renesas_sdhi_adjust_hs400_mode_disable(struct tmio_mmc_host *host)
511
+{
512
+ struct renesas_sdhi *priv = host_to_priv(host);
513
+
514
+ /* disable write protect */
515
+ sd_scc_tmpport_write32(host, priv, 0x00,
516
+ SH_MOBILE_SDHI_SCC_TMPPORT_DISABLE_WP_CODE);
517
+ /* disable manual calibration */
518
+ sd_scc_tmpport_write32(host, priv, 0x22, 0);
519
+ /* clear offset value of TMPPORT3 */
520
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT3, 0);
521
+}
522
+
350523 static void renesas_sdhi_reset_hs400_mode(struct tmio_mmc_host *host,
351524 struct renesas_sdhi *priv)
352525 {
....@@ -356,32 +529,60 @@
356529 /* Reset HS400 mode */
357530 sd_ctrl_write16(host, CTL_SDIF_MODE, ~0x0001 &
358531 sd_ctrl_read16(host, CTL_SDIF_MODE));
532
+
533
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos);
534
+
359535 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2,
360536 ~(SH_MOBILE_SDHI_SCC_TMPPORT2_HS400EN |
361537 SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) &
362538 sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
363539
540
+ if (priv->quirks && (priv->quirks->hs400_calib_table || priv->quirks->hs400_bad_taps))
541
+ renesas_sdhi_adjust_hs400_mode_disable(host);
542
+
364543 sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
365544 sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
366545 }
367546
368
-static void renesas_sdhi_prepare_hs400_tuning(struct tmio_mmc_host *host)
547
+static int renesas_sdhi_prepare_hs400_tuning(struct mmc_host *mmc, struct mmc_ios *ios)
369548 {
549
+ struct tmio_mmc_host *host = mmc_priv(mmc);
550
+
370551 renesas_sdhi_reset_hs400_mode(host, host_to_priv(host));
552
+ return 0;
371553 }
372554
373
-#define SH_MOBILE_SDHI_MAX_TAP 3
555
+static void renesas_sdhi_reset(struct tmio_mmc_host *host)
556
+{
557
+ struct renesas_sdhi *priv = host_to_priv(host);
558
+
559
+ if (priv->scc_ctl) {
560
+ renesas_sdhi_reset_scc(host, priv);
561
+ renesas_sdhi_reset_hs400_mode(host, priv);
562
+ priv->needs_adjust_hs400 = false;
563
+
564
+ sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
565
+ sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
566
+
567
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
568
+ ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
569
+ sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
570
+ }
571
+
572
+ if (host->pdata->flags & TMIO_MMC_MIN_RCAR2)
573
+ sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK,
574
+ TMIO_MASK_INIT_RCAR2);
575
+}
576
+
577
+#define SH_MOBILE_SDHI_MIN_TAP_ROW 3
374578
375579 static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
376580 {
377581 struct renesas_sdhi *priv = host_to_priv(host);
378
- unsigned long tap_cnt; /* counter of tuning success */
379
- unsigned long tap_start;/* start position of tuning success */
380
- unsigned long tap_end; /* end position of tuning success */
381
- unsigned long ntap; /* temporary counter of tuning success */
382
- unsigned long i;
582
+ unsigned int tap_start = 0, tap_end = 0, tap_cnt = 0, rs, re, i;
583
+ unsigned int taps_size = priv->tap_num * 2, min_tap_row;
584
+ unsigned long *bitmap;
383585
384
- /* Clear SCC_RVSREQ */
385586 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ, 0);
386587
387588 /*
....@@ -389,48 +590,48 @@
389590 * result requiring the tap to be good in both runs before
390591 * considering it for tuning selection.
391592 */
392
- for (i = 0; i < host->tap_num * 2; i++) {
393
- int offset = host->tap_num * (i < host->tap_num ? 1 : -1);
593
+ for (i = 0; i < taps_size; i++) {
594
+ int offset = priv->tap_num * (i < priv->tap_num ? 1 : -1);
394595
395
- if (!test_bit(i, host->taps))
396
- clear_bit(i + offset, host->taps);
596
+ if (!test_bit(i, priv->taps))
597
+ clear_bit(i + offset, priv->taps);
598
+
599
+ if (!test_bit(i, priv->smpcmp))
600
+ clear_bit(i + offset, priv->smpcmp);
397601 }
398602
399603 /*
400
- * Find the longest consecutive run of successful probes. If that
401
- * is more than SH_MOBILE_SDHI_MAX_TAP probes long then use the
402
- * center index as the tap.
604
+ * If all TAP are OK, the sampling clock position is selected by
605
+ * identifying the change point of data.
403606 */
404
- tap_cnt = 0;
405
- ntap = 0;
406
- tap_start = 0;
407
- tap_end = 0;
408
- for (i = 0; i < host->tap_num * 2; i++) {
409
- if (test_bit(i, host->taps)) {
410
- ntap++;
411
- } else {
412
- if (ntap > tap_cnt) {
413
- tap_start = i - ntap;
414
- tap_end = i - 1;
415
- tap_cnt = ntap;
416
- }
417
- ntap = 0;
607
+ if (bitmap_full(priv->taps, taps_size)) {
608
+ bitmap = priv->smpcmp;
609
+ min_tap_row = 1;
610
+ } else {
611
+ bitmap = priv->taps;
612
+ min_tap_row = SH_MOBILE_SDHI_MIN_TAP_ROW;
613
+ }
614
+
615
+ /*
616
+ * Find the longest consecutive run of successful probes. If that
617
+ * is at least SH_MOBILE_SDHI_MIN_TAP_ROW probes long then use the
618
+ * center index as the tap, otherwise bail out.
619
+ */
620
+ bitmap_for_each_set_region(bitmap, rs, re, 0, taps_size) {
621
+ if (re - rs > tap_cnt) {
622
+ tap_end = re;
623
+ tap_start = rs;
624
+ tap_cnt = tap_end - tap_start;
418625 }
419626 }
420627
421
- if (ntap > tap_cnt) {
422
- tap_start = i - ntap;
423
- tap_end = i - 1;
424
- tap_cnt = ntap;
425
- }
426
-
427
- if (tap_cnt >= SH_MOBILE_SDHI_MAX_TAP)
428
- host->tap_set = (tap_start + tap_end) / 2 % host->tap_num;
628
+ if (tap_cnt >= min_tap_row)
629
+ priv->tap_set = (tap_start + tap_end) / 2 % priv->tap_num;
429630 else
430631 return -EIO;
431632
432633 /* Set SCC */
433
- sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, host->tap_set);
634
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, priv->tap_set);
434635
435636 /* Enable auto re-tuning */
436637 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
....@@ -440,16 +641,114 @@
440641 return 0;
441642 }
442643
443
-static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host)
644
+static int renesas_sdhi_execute_tuning(struct mmc_host *mmc, u32 opcode)
645
+{
646
+ struct tmio_mmc_host *host = mmc_priv(mmc);
647
+ struct renesas_sdhi *priv = host_to_priv(host);
648
+ int i, ret;
649
+
650
+ priv->tap_num = renesas_sdhi_init_tuning(host);
651
+ if (!priv->tap_num)
652
+ return 0; /* Tuning is not supported */
653
+
654
+ if (priv->tap_num * 2 >= sizeof(priv->taps) * BITS_PER_BYTE) {
655
+ dev_err(&host->pdev->dev,
656
+ "Too many taps, please update 'taps' in tmio_mmc_host!\n");
657
+ return -EINVAL;
658
+ }
659
+
660
+ bitmap_zero(priv->taps, priv->tap_num * 2);
661
+ bitmap_zero(priv->smpcmp, priv->tap_num * 2);
662
+
663
+ /* Issue CMD19 twice for each tap */
664
+ for (i = 0; i < 2 * priv->tap_num; i++) {
665
+ int cmd_error = 0;
666
+
667
+ /* Set sampling clock position */
668
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, i % priv->tap_num);
669
+
670
+ if (mmc_send_tuning(mmc, opcode, &cmd_error) == 0)
671
+ set_bit(i, priv->taps);
672
+
673
+ if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_SMPCMP) == 0)
674
+ set_bit(i, priv->smpcmp);
675
+
676
+ if (cmd_error)
677
+ mmc_abort_tuning(mmc, opcode);
678
+ }
679
+
680
+ ret = renesas_sdhi_select_tuning(host);
681
+ if (ret < 0)
682
+ renesas_sdhi_reset(host);
683
+ return ret;
684
+}
685
+
686
+static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_4tap)
687
+{
688
+ struct renesas_sdhi *priv = host_to_priv(host);
689
+ unsigned int new_tap = priv->tap_set, error_tap = priv->tap_set;
690
+ u32 val;
691
+
692
+ val = sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ);
693
+ if (!val)
694
+ return false;
695
+
696
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ, 0);
697
+
698
+ /* Change TAP position according to correction status */
699
+ if (sd_ctrl_read16(host, CTL_VERSION) == SDHI_VER_GEN3_SDMMC &&
700
+ host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
701
+ u32 bad_taps = priv->quirks ? priv->quirks->hs400_bad_taps : 0;
702
+ /*
703
+ * With HS400, the DAT signal is based on DS, not CLK.
704
+ * Therefore, use only CMD status.
705
+ */
706
+ u32 smpcmp = sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_SMPCMP) &
707
+ SH_MOBILE_SDHI_SCC_SMPCMP_CMD_ERR;
708
+ if (!smpcmp) {
709
+ return false; /* no error in CMD signal */
710
+ } else if (smpcmp == SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQUP) {
711
+ new_tap++;
712
+ error_tap--;
713
+ } else if (smpcmp == SH_MOBILE_SDHI_SCC_SMPCMP_CMD_REQDOWN) {
714
+ new_tap--;
715
+ error_tap++;
716
+ } else {
717
+ return true; /* need retune */
718
+ }
719
+
720
+ /*
721
+ * When new_tap is a bad tap, we cannot change. Then, we compare
722
+ * with the HS200 tuning result. When smpcmp[error_tap] is OK,
723
+ * we can at least retune.
724
+ */
725
+ if (bad_taps & BIT(new_tap % priv->tap_num))
726
+ return test_bit(error_tap % priv->tap_num, priv->smpcmp);
727
+ } else {
728
+ if (val & SH_MOBILE_SDHI_SCC_RVSREQ_RVSERR)
729
+ return true; /* need retune */
730
+ else if (val & SH_MOBILE_SDHI_SCC_RVSREQ_REQTAPUP)
731
+ new_tap++;
732
+ else if (val & SH_MOBILE_SDHI_SCC_RVSREQ_REQTAPDOWN)
733
+ new_tap--;
734
+ else
735
+ return false;
736
+ }
737
+
738
+ priv->tap_set = (new_tap % priv->tap_num);
739
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
740
+ priv->tap_set / (use_4tap ? 2 : 1));
741
+
742
+ return false;
743
+}
744
+
745
+static bool renesas_sdhi_auto_correction(struct tmio_mmc_host *host)
444746 {
445747 struct renesas_sdhi *priv = host_to_priv(host);
446748
447749 /* Check SCC error */
448
- if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL) &
449
- SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &&
450
- sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ) &
750
+ if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ) &
451751 SH_MOBILE_SDHI_SCC_RVSREQ_RVSERR) {
452
- /* Clear SCC error */
453752 sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ, 0);
454753 return true;
455754 }
....@@ -457,25 +756,28 @@
457756 return false;
458757 }
459758
460
-static void renesas_sdhi_hw_reset(struct tmio_mmc_host *host)
759
+static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host)
461760 {
462
- struct renesas_sdhi *priv;
761
+ struct renesas_sdhi *priv = host_to_priv(host);
762
+ bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
463763
464
- priv = host_to_priv(host);
764
+ /*
765
+ * Skip checking SCC errors when running on 4 taps in HS400 mode as
766
+ * any retuning would still result in the same 4 taps being used.
767
+ */
768
+ if (!(host->mmc->ios.timing == MMC_TIMING_UHS_SDR104) &&
769
+ !(host->mmc->ios.timing == MMC_TIMING_MMC_HS200) &&
770
+ !(host->mmc->ios.timing == MMC_TIMING_MMC_HS400 && !use_4tap))
771
+ return false;
465772
466
- renesas_sdhi_reset_scc(host, priv);
467
- renesas_sdhi_reset_hs400_mode(host, priv);
773
+ if (mmc_doing_tune(host->mmc))
774
+ return false;
468775
469
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
470
- sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
776
+ if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL) &
777
+ SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN)
778
+ return renesas_sdhi_auto_correction(host);
471779
472
- sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
473
- ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
474
- sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
475
-
476
- sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
477
- ~SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN &
478
- sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL));
780
+ return renesas_sdhi_manual_correction(host, use_4tap);
479781 }
480782
481783 static int renesas_sdhi_wait_idle(struct tmio_mmc_host *host, u32 bit)
....@@ -511,7 +813,7 @@
511813 case HOST_MODE:
512814 if (host->pdata->flags & TMIO_MMC_HAVE_CBSY)
513815 bit = TMIO_STAT_CMD_BUSY;
514
- /* fallthrough */
816
+ fallthrough;
515817 case CTL_SD_CARD_CLK_CTL:
516818 return renesas_sdhi_wait_idle(host, bit);
517819 }
....@@ -537,6 +839,13 @@
537839 return blk_size;
538840 }
539841
842
+static void renesas_sdhi_fixup_request(struct tmio_mmc_host *host, struct mmc_request *mrq)
843
+{
844
+ struct renesas_sdhi *priv = host_to_priv(host);
845
+
846
+ if (priv->needs_adjust_hs400 && mrq->cmd->opcode == MMC_SEND_STATUS)
847
+ renesas_sdhi_adjust_hs400_mode_enable(host);
848
+}
540849 static void renesas_sdhi_enable_dma(struct tmio_mmc_host *host, bool enable)
541850 {
542851 /* Iff regs are 8 byte apart, sdbuf is 64 bit. Otherwise always 32. */
....@@ -546,20 +855,82 @@
546855 renesas_sdhi_sdbuf_width(host, enable ? width : 16);
547856 }
548857
858
+static const struct renesas_sdhi_quirks sdhi_quirks_4tap_nohs400 = {
859
+ .hs400_disabled = true,
860
+ .hs400_4taps = true,
861
+};
862
+
863
+static const struct renesas_sdhi_quirks sdhi_quirks_4tap = {
864
+ .hs400_4taps = true,
865
+ .hs400_bad_taps = BIT(2) | BIT(3) | BIT(6) | BIT(7),
866
+};
867
+
868
+static const struct renesas_sdhi_quirks sdhi_quirks_nohs400 = {
869
+ .hs400_disabled = true,
870
+};
871
+
872
+static const struct renesas_sdhi_quirks sdhi_quirks_bad_taps1357 = {
873
+ .hs400_bad_taps = BIT(1) | BIT(3) | BIT(5) | BIT(7),
874
+};
875
+
876
+static const struct renesas_sdhi_quirks sdhi_quirks_bad_taps2367 = {
877
+ .hs400_bad_taps = BIT(2) | BIT(3) | BIT(6) | BIT(7),
878
+};
879
+
880
+static const struct renesas_sdhi_quirks sdhi_quirks_r8a7796_es13 = {
881
+ .hs400_4taps = true,
882
+ .hs400_bad_taps = BIT(2) | BIT(3) | BIT(6) | BIT(7),
883
+ .hs400_calib_table = r8a7796_es13_calib_table,
884
+};
885
+
886
+static const struct renesas_sdhi_quirks sdhi_quirks_r8a77965 = {
887
+ .hs400_bad_taps = BIT(2) | BIT(3) | BIT(6) | BIT(7),
888
+ .hs400_calib_table = r8a77965_calib_table,
889
+};
890
+
891
+static const struct renesas_sdhi_quirks sdhi_quirks_r8a77990 = {
892
+ .hs400_calib_table = r8a77990_calib_table,
893
+};
894
+
895
+/*
896
+ * Note for r8a7796 / r8a774a1: we can't distinguish ES1.1 and 1.2 as of now.
897
+ * So, we want to treat them equally and only have a match for ES1.2 to enforce
898
+ * this if there ever will be a way to distinguish ES1.2.
899
+ */
900
+static const struct soc_device_attribute sdhi_quirks_match[] = {
901
+ { .soc_id = "r8a774a1", .revision = "ES1.[012]", .data = &sdhi_quirks_4tap_nohs400 },
902
+ { .soc_id = "r8a7795", .revision = "ES1.*", .data = &sdhi_quirks_4tap_nohs400 },
903
+ { .soc_id = "r8a7795", .revision = "ES2.0", .data = &sdhi_quirks_4tap },
904
+ { .soc_id = "r8a7795", .revision = "ES3.*", .data = &sdhi_quirks_bad_taps2367 },
905
+ { .soc_id = "r8a7796", .revision = "ES1.[012]", .data = &sdhi_quirks_4tap_nohs400 },
906
+ { .soc_id = "r8a7796", .revision = "ES1.*", .data = &sdhi_quirks_r8a7796_es13 },
907
+ { .soc_id = "r8a77961", .data = &sdhi_quirks_bad_taps1357 },
908
+ { .soc_id = "r8a77965", .data = &sdhi_quirks_r8a77965 },
909
+ { .soc_id = "r8a77980", .data = &sdhi_quirks_nohs400 },
910
+ { .soc_id = "r8a77990", .data = &sdhi_quirks_r8a77990 },
911
+ { /* Sentinel. */ },
912
+};
913
+
549914 int renesas_sdhi_probe(struct platform_device *pdev,
550915 const struct tmio_mmc_dma_ops *dma_ops)
551916 {
552917 struct tmio_mmc_data *mmd = pdev->dev.platform_data;
918
+ const struct renesas_sdhi_quirks *quirks = NULL;
553919 const struct renesas_sdhi_of_data *of_data;
920
+ const struct soc_device_attribute *attr;
554921 struct tmio_mmc_data *mmc_data;
555922 struct tmio_mmc_dma *dma_priv;
556923 struct tmio_mmc_host *host;
557924 struct renesas_sdhi *priv;
925
+ int num_irqs, irq, ret, i;
558926 struct resource *res;
559
- int irq, ret, i;
560927 u16 ver;
561928
562929 of_data = of_device_get_match_data(&pdev->dev);
930
+
931
+ attr = soc_device_match(sdhi_quirks_match);
932
+ if (attr)
933
+ quirks = attr->data;
563934
564935 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
565936 if (!res)
....@@ -570,6 +941,7 @@
570941 if (!priv)
571942 return -ENOMEM;
572943
944
+ priv->quirks = quirks;
573945 mmc_data = &priv->mmc_data;
574946 dma_priv = &priv->dma_priv;
575947
....@@ -621,10 +993,13 @@
621993
622994 host->write16_hook = renesas_sdhi_write16_hook;
623995 host->clk_enable = renesas_sdhi_clk_enable;
624
- host->clk_update = renesas_sdhi_clk_update;
625996 host->clk_disable = renesas_sdhi_clk_disable;
997
+ host->set_clock = renesas_sdhi_set_clock;
626998 host->multi_io_quirk = renesas_sdhi_multi_io_quirk;
627999 host->dma_ops = dma_ops;
1000
+
1001
+ if (quirks && quirks->hs400_disabled)
1002
+ host->mmc->caps2 &= ~(MMC_CAP2_HS400 | MMC_CAP2_HS400_ES);
6281003
6291004 /* For some SoC, we disable internal WP. GPIO may override this */
6301005 if (mmc_can_gpio_ro(host->mmc))
....@@ -636,13 +1011,10 @@
6361011 host->ops.card_busy = renesas_sdhi_card_busy;
6371012 host->ops.start_signal_voltage_switch =
6381013 renesas_sdhi_start_signal_voltage_switch;
639
-
640
- /* SDR and HS200/400 registers requires HW reset */
641
- if (of_data && of_data->scc_offset) {
642
- priv->scc_ctl = host->ctl + of_data->scc_offset;
643
- host->mmc->caps |= MMC_CAP_HW_RESET;
644
- host->hw_reset = renesas_sdhi_hw_reset;
645
- }
1014
+ host->sdcard_irq_setbit_mask = TMIO_STAT_ALWAYS_SET_27;
1015
+ host->reset = renesas_sdhi_reset;
1016
+ } else {
1017
+ host->sdcard_irq_mask_all = TMIO_MASK_ALL;
6461018 }
6471019
6481020 /* Orginally registers were 16 bit apart, could be 32 or 64 nowadays */
....@@ -675,6 +1047,8 @@
6751047 /* All SDHI have SDIO status bits which must be 1 */
6761048 mmc_data->flags |= TMIO_MMC_SDIO_STATUS_SETBITS;
6771049
1050
+ dev_pm_domain_start(&pdev->dev);
1051
+
6781052 ret = renesas_sdhi_clk_enable(host);
6791053 if (ret)
6801054 goto efree;
....@@ -684,13 +1058,17 @@
6841058 if (ver < SDHI_VER_GEN2_SDR104 && mmc_data->max_blk_count > U16_MAX)
6851059 mmc_data->max_blk_count = U16_MAX;
6861060
687
- ret = tmio_mmc_host_probe(host);
688
- if (ret < 0)
689
- goto edisclk;
690
-
6911061 /* One Gen2 SDHI incarnation does NOT have a CBSY bit */
6921062 if (ver == SDHI_VER_GEN2_SDR50)
6931063 mmc_data->flags &= ~TMIO_MMC_HAVE_CBSY;
1064
+
1065
+ if (ver == SDHI_VER_GEN3_SDMMC && quirks && quirks->hs400_calib_table) {
1066
+ host->fixup_request = renesas_sdhi_fixup_request;
1067
+ priv->adjust_hs400_calib_table = *(
1068
+ res->start == SDHI_GEN3_MMC0_ADDR ?
1069
+ quirks->hs400_calib_table :
1070
+ quirks->hs400_calib_table + 1);
1071
+ }
6941072
6951073 /* Enable tuning iff we have an SCC and a supported mode */
6961074 if (of_data && of_data->scc_offset &&
....@@ -698,52 +1076,65 @@
6981076 host->mmc->caps2 & (MMC_CAP2_HS200_1_8V_SDR |
6991077 MMC_CAP2_HS400_1_8V))) {
7001078 const struct renesas_sdhi_scc *taps = of_data->taps;
1079
+ bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
7011080 bool hit = false;
7021081
7031082 for (i = 0; i < of_data->taps_num; i++) {
7041083 if (taps[i].clk_rate == 0 ||
7051084 taps[i].clk_rate == host->mmc->f_max) {
7061085 priv->scc_tappos = taps->tap;
1086
+ priv->scc_tappos_hs400 = use_4tap ?
1087
+ taps->tap_hs400_4tap :
1088
+ taps->tap;
7071089 hit = true;
7081090 break;
7091091 }
7101092 }
7111093
7121094 if (!hit)
713
- dev_warn(&host->pdev->dev, "Unknown clock rate for SDR104\n");
1095
+ dev_warn(&host->pdev->dev, "Unknown clock rate for tuning\n");
7141096
715
- host->init_tuning = renesas_sdhi_init_tuning;
716
- host->prepare_tuning = renesas_sdhi_prepare_tuning;
717
- host->select_tuning = renesas_sdhi_select_tuning;
718
- host->check_scc_error = renesas_sdhi_check_scc_error;
719
- host->prepare_hs400_tuning =
720
- renesas_sdhi_prepare_hs400_tuning;
721
- host->hs400_downgrade = renesas_sdhi_disable_scc;
722
- host->hs400_complete = renesas_sdhi_hs400_complete;
1097
+ priv->scc_ctl = host->ctl + of_data->scc_offset;
1098
+ host->check_retune = renesas_sdhi_check_scc_error;
1099
+ host->ops.execute_tuning = renesas_sdhi_execute_tuning;
1100
+ host->ops.prepare_hs400_tuning = renesas_sdhi_prepare_hs400_tuning;
1101
+ host->ops.hs400_downgrade = renesas_sdhi_disable_scc;
1102
+ host->ops.hs400_complete = renesas_sdhi_hs400_complete;
7231103 }
7241104
725
- i = 0;
726
- while (1) {
1105
+ sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, host->sdcard_irq_mask_all);
1106
+
1107
+ num_irqs = platform_irq_count(pdev);
1108
+ if (num_irqs < 0) {
1109
+ ret = num_irqs;
1110
+ goto eirq;
1111
+ }
1112
+
1113
+ /* There must be at least one IRQ source */
1114
+ if (!num_irqs) {
1115
+ ret = -ENXIO;
1116
+ goto eirq;
1117
+ }
1118
+
1119
+ for (i = 0; i < num_irqs; i++) {
7271120 irq = platform_get_irq(pdev, i);
728
- if (irq < 0)
729
- break;
730
- i++;
1121
+ if (irq < 0) {
1122
+ ret = irq;
1123
+ goto eirq;
1124
+ }
1125
+
7311126 ret = devm_request_irq(&pdev->dev, irq, tmio_mmc_irq, 0,
7321127 dev_name(&pdev->dev), host);
7331128 if (ret)
7341129 goto eirq;
7351130 }
7361131
737
- /* There must be at least one IRQ source */
738
- if (!i) {
739
- ret = irq;
740
- goto eirq;
741
- }
1132
+ ret = tmio_mmc_host_probe(host);
1133
+ if (ret < 0)
1134
+ goto edisclk;
7421135
743
- dev_info(&pdev->dev, "%s base at 0x%08lx max clock rate %u MHz\n",
744
- mmc_hostname(host->mmc), (unsigned long)
745
- (platform_get_resource(pdev, IORESOURCE_MEM, 0)->start),
746
- host->mmc->f_max / 1000000);
1136
+ dev_info(&pdev->dev, "%s base at %pa, max clock rate %u MHz\n",
1137
+ mmc_hostname(host->mmc), &res->start, host->mmc->f_max / 1000000);
7471138
7481139 return ret;
7491140