1 /* Copyright Statement:
3 * This software/firmware and related documentation ("MediaTek Software") are
4 * protected under relevant copyright laws. The information contained herein
5 * is confidential and proprietary to MediaTek Inc. and/or its licensors.
6 * Without the prior written permission of MediaTek inc. and/or its licensors,
7 * any reproduction, modification, use or disclosure of MediaTek Software,
8 * and information contained herein, in whole or in part, shall be strictly prohibited.
10 * MediaTek Inc. (C) 2010. All rights reserved.
12 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
13 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
14 * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
15 * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
18 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
19 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
20 * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
21 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
22 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
23 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
24 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
25 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
26 * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
27 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
28 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
29 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
31 * The following software/firmware and/or related documentation ("MediaTek Software")
32 * have been modified by MediaTek Inc. All revisions are subject to any receiver's
33 * applicable license agreements with MediaTek Inc.
36 #include <linux/module.h>
37 #include <linux/moduleparam.h>
38 #include <linux/init.h>
39 #include <linux/spinlock.h>
40 #include <linux/timer.h>
41 #include <linux/ioport.h>
42 #include <linux/device.h>
43 #include <linux/platform_device.h>
44 #include <linux/interrupt.h>
45 #include <linux/delay.h>
46 #include <linux/blkdev.h>
47 #include <linux/slab.h>
48 #include <linux/mmc/host.h>
49 #include <linux/mmc/card.h>
50 #include <linux/mmc/core.h>
51 #include <linux/mmc/mmc.h>
52 #include <linux/mmc/sd.h>
53 #include <linux/mmc/sdio.h>
54 #include <linux/dma-mapping.h>
57 #include <linux/types.h>
58 #include <linux/kernel.h>
59 #include <linux/version.h>
63 #define MSDC_SMPL_FALLING (1)
64 #define MSDC_CD_PIN_EN (1 << 0) /* card detection pin is wired */
65 #define MSDC_WP_PIN_EN (1 << 1) /* write protection pin is wired */
66 #define MSDC_REMOVABLE (1 << 5) /* removable slot */
67 #define MSDC_SYS_SUSPEND (1 << 6) /* suspended by system */
68 #define MSDC_HIGHSPEED (1 << 7)
70 //#define IRQ_SDC 14 //MT7620 /*FIXME*/
71 #ifdef CONFIG_SOC_MT7621
72 #define RALINK_SYSCTL_BASE 0xbe000000
73 #define RALINK_MSDC_BASE 0xbe130000
75 #define RALINK_SYSCTL_BASE 0xb0000000
76 #define RALINK_MSDC_BASE 0xb0130000
78 #define IRQ_SDC 22 /*FIXME*/
84 #include <asm/mach-ralink/ralink_regs.h>
86 #if 0 /* --- by chhung */
87 #include <mach/board.h>
88 #include <mach/mt6575_devs.h>
89 #include <mach/mt6575_typedefs.h>
90 #include <mach/mt6575_clock_manager.h>
91 #include <mach/mt6575_pm_ldo.h>
92 //#include <mach/mt6575_pll.h>
93 //#include <mach/mt6575_gpio.h>
94 //#include <mach/mt6575_gpt_sw.h>
96 // #include <mach/mt6575_gpt.h>
97 #endif /* end of --- */
99 #include "mt6575_sd.h"
106 #if 0 /* --- by chhung */
107 #define isb() __asm__ __volatile__ ("" : : : "memory")
108 #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
109 : : "r" (0) : "memory")
110 #define dmb() __asm__ __volatile__ ("" : : : "memory")
111 #endif /* end of --- */
113 #define DRV_NAME "mtk-sd"
115 #define HOST_MAX_NUM (1) /* +/- by chhung */
117 #if defined (CONFIG_SOC_MT7620)
118 #define HOST_MAX_MCLK (48000000) /* +/- by chhung */
119 #elif defined (CONFIG_SOC_MT7621)
120 #define HOST_MAX_MCLK (50000000) /* +/- by chhung */
122 #define HOST_MIN_MCLK (260000)
124 #define HOST_MAX_BLKSZ (2048)
126 #define MSDC_OCR_AVAIL (MMC_VDD_28_29 | MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33)
128 #define GPIO_PULL_DOWN (0)
129 #define GPIO_PULL_UP (1)
131 #if 0 /* --- by chhung */
132 #define MSDC_CLKSRC_REG (0xf100000C)
133 #define PDN_REG (0xF1000010)
134 #endif /* end of --- */
136 #define DEFAULT_DEBOUNCE (8) /* 8 cycles */
137 #define DEFAULT_DTOC (40) /* data timeout counter. 65536x40 sclk. */
139 #define CMD_TIMEOUT (HZ/10) /* 100ms */
140 #define DAT_TIMEOUT (HZ/2 * 5) /* 500ms x5 */
142 #define MAX_DMA_CNT (64 * 1024 - 512) /* a single transaction for WIFI may be 50K*/
144 #define MAX_GPD_NUM (1 + 1) /* one null gpd */
145 #define MAX_BD_NUM (1024)
146 #define MAX_BD_PER_GPD (MAX_BD_NUM)
148 #define MAX_HW_SGMTS (MAX_BD_NUM)
149 #define MAX_PHY_SGMTS (MAX_BD_NUM)
150 #define MAX_SGMT_SZ (MAX_DMA_CNT)
151 #define MAX_REQ_SZ (MAX_SGMT_SZ * 8)
153 static int mtk_sw_poll
;
155 static int cd_active_low
= 1;
157 //=================================
158 #define PERI_MSDC0_PDN (15)
159 //#define PERI_MSDC1_PDN (16)
160 //#define PERI_MSDC2_PDN (17)
161 //#define PERI_MSDC3_PDN (18)
163 #if 0 /* --- by chhung */
164 /* gate means clock power down */
165 static int g_clk_gate
= 0;
166 #define msdc_gate_clock(id) \
168 g_clk_gate &= ~(1 << ((id) + PERI_MSDC0_PDN)); \
170 /* not like power down register. 1 means clock on. */
171 #define msdc_ungate_clock(id) \
173 g_clk_gate |= 1 << ((id) + PERI_MSDC0_PDN); \
176 // do we need sync object or not
177 void msdc_clk_status(int * status
)
179 *status
= g_clk_gate
;
181 #endif /* end of --- */
184 struct msdc_hw msdc0_hw
= {
186 .cmd_edge
= MSDC_SMPL_FALLING
,
187 .data_edge
= MSDC_SMPL_FALLING
,
193 .flags
= MSDC_SYS_SUSPEND
| MSDC_CD_PIN_EN
| MSDC_REMOVABLE
| MSDC_HIGHSPEED
,
194 // .flags = MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE,
197 static struct resource mtk_sd_resources
[] = {
199 .start
= RALINK_MSDC_BASE
,
200 .end
= RALINK_MSDC_BASE
+0x3fff,
201 .flags
= IORESOURCE_MEM
,
204 .start
= IRQ_SDC
, /*FIXME*/
205 .end
= IRQ_SDC
, /*FIXME*/
206 .flags
= IORESOURCE_IRQ
,
210 static struct platform_device mtk_sd_device
= {
213 .num_resources
= ARRAY_SIZE(mtk_sd_resources
),
214 .resource
= mtk_sd_resources
,
218 static int msdc_rsp
[] = {
230 /* For Inhanced DMA */
231 #define msdc_init_gpd_ex(gpd,extlen,cmd,arg,blknum) \
233 ((gpd_t*)gpd)->extlen = extlen; \
234 ((gpd_t*)gpd)->cmd = cmd; \
235 ((gpd_t*)gpd)->arg = arg; \
236 ((gpd_t*)gpd)->blknum = blknum; \
239 #define msdc_init_bd(bd, blkpad, dwpad, dptr, dlen) \
241 BUG_ON(dlen > 0xFFFFUL); \
242 ((bd_t*)bd)->blkpad = blkpad; \
243 ((bd_t*)bd)->dwpad = dwpad; \
244 ((bd_t*)bd)->ptr = (void*)dptr; \
245 ((bd_t*)bd)->buflen = dlen; \
248 #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16)
249 #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0)
250 #define msdc_fifo_write32(v) sdr_write32(MSDC_TXDATA, (v))
251 #define msdc_fifo_write8(v) sdr_write8(MSDC_TXDATA, (v))
252 #define msdc_fifo_read32() sdr_read32(MSDC_RXDATA)
253 #define msdc_fifo_read8() sdr_read8(MSDC_RXDATA)
256 #define msdc_dma_on() sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO)
257 #define msdc_dma_off() sdr_set_bits(MSDC_CFG, MSDC_CFG_PIO)
259 #define msdc_retry(expr,retry,cnt) \
263 if (!(expr)) break; \
265 retry--; mdelay(1); cnt = backup; \
268 WARN_ON(retry == 0); \
271 #if 0 /* --- by chhung */
272 #define msdc_reset() \
274 int retry = 3, cnt = 1000; \
275 sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \
277 msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \
280 #define msdc_reset() \
282 int retry = 3, cnt = 1000; \
283 sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \
284 msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \
286 #endif /* end of +/- */
288 #define msdc_clr_int() \
290 volatile u32 val = sdr_read32(MSDC_INT); \
291 sdr_write32(MSDC_INT, val); \
294 #define msdc_clr_fifo() \
296 int retry = 3, cnt = 1000; \
297 sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \
298 msdc_retry(sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \
301 #define msdc_irq_save(val) \
303 val = sdr_read32(MSDC_INTEN); \
304 sdr_clr_bits(MSDC_INTEN, val); \
307 #define msdc_irq_restore(val) \
309 sdr_set_bits(MSDC_INTEN, val); \
312 /* clock source for host: global */
313 #if defined (CONFIG_SOC_MT7620)
314 static u32 hclks
[] = {48000000}; /* +/- by chhung */
315 #elif defined (CONFIG_SOC_MT7621)
316 static u32 hclks
[] = {50000000}; /* +/- by chhung */
319 //============================================
320 // the power for msdc host controller: global
321 // always keep the VMC on.
322 //============================================
323 #define msdc_vcore_on(host) \
325 INIT_MSG("[+]VMC ref. count<%d>", ++host->pwr_ref); \
326 (void)hwPowerOn(MT65XX_POWER_LDO_VMC, VOL_3300, "SD"); \
328 #define msdc_vcore_off(host) \
330 INIT_MSG("[-]VMC ref. count<%d>", --host->pwr_ref); \
331 (void)hwPowerDown(MT65XX_POWER_LDO_VMC, "SD"); \
334 //====================================
335 // the vdd output for card: global
336 // always keep the VMCH on.
337 //====================================
338 #define msdc_vdd_on(host) \
340 (void)hwPowerOn(MT65XX_POWER_LDO_VMCH, VOL_3300, "SD"); \
342 #define msdc_vdd_off(host) \
344 (void)hwPowerDown(MT65XX_POWER_LDO_VMCH, "SD"); \
347 #define sdc_is_busy() (sdr_read32(SDC_STS) & SDC_STS_SDCBUSY)
348 #define sdc_is_cmd_busy() (sdr_read32(SDC_STS) & SDC_STS_CMDBUSY)
350 #define sdc_send_cmd(cmd,arg) \
352 sdr_write32(SDC_ARG, (arg)); \
353 sdr_write32(SDC_CMD, (cmd)); \
356 // can modify to read h/w register.
357 //#define is_card_present(h) ((sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1);
358 #define is_card_present(h) (((struct msdc_host*)(h))->card_inserted)
362 #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff)
364 #define PHYSADDR(a) ((a) & 0x1fffffff)
367 static unsigned int msdc_do_command(struct msdc_host
*host
,
368 struct mmc_command
*cmd
,
370 unsigned long timeout
);
372 static int msdc_tune_cmdrsp(struct msdc_host
*host
,struct mmc_command
*cmd
);
374 #ifdef MT6575_SD_DEBUG
375 static void msdc_dump_card_status(struct msdc_host
*host
, u32 status
)
377 static char *state
[] = {
395 if (status
& R1_OUT_OF_RANGE
)
396 N_MSG(RSP
, "[CARD_STATUS] Out of Range");
397 if (status
& R1_ADDRESS_ERROR
)
398 N_MSG(RSP
, "[CARD_STATUS] Address Error");
399 if (status
& R1_BLOCK_LEN_ERROR
)
400 N_MSG(RSP
, "[CARD_STATUS] Block Len Error");
401 if (status
& R1_ERASE_SEQ_ERROR
)
402 N_MSG(RSP
, "[CARD_STATUS] Erase Seq Error");
403 if (status
& R1_ERASE_PARAM
)
404 N_MSG(RSP
, "[CARD_STATUS] Erase Param");
405 if (status
& R1_WP_VIOLATION
)
406 N_MSG(RSP
, "[CARD_STATUS] WP Violation");
407 if (status
& R1_CARD_IS_LOCKED
)
408 N_MSG(RSP
, "[CARD_STATUS] Card is Locked");
409 if (status
& R1_LOCK_UNLOCK_FAILED
)
410 N_MSG(RSP
, "[CARD_STATUS] Lock/Unlock Failed");
411 if (status
& R1_COM_CRC_ERROR
)
412 N_MSG(RSP
, "[CARD_STATUS] Command CRC Error");
413 if (status
& R1_ILLEGAL_COMMAND
)
414 N_MSG(RSP
, "[CARD_STATUS] Illegal Command");
415 if (status
& R1_CARD_ECC_FAILED
)
416 N_MSG(RSP
, "[CARD_STATUS] Card ECC Failed");
417 if (status
& R1_CC_ERROR
)
418 N_MSG(RSP
, "[CARD_STATUS] CC Error");
419 if (status
& R1_ERROR
)
420 N_MSG(RSP
, "[CARD_STATUS] Error");
421 if (status
& R1_UNDERRUN
)
422 N_MSG(RSP
, "[CARD_STATUS] Underrun");
423 if (status
& R1_OVERRUN
)
424 N_MSG(RSP
, "[CARD_STATUS] Overrun");
425 if (status
& R1_CID_CSD_OVERWRITE
)
426 N_MSG(RSP
, "[CARD_STATUS] CID/CSD Overwrite");
427 if (status
& R1_WP_ERASE_SKIP
)
428 N_MSG(RSP
, "[CARD_STATUS] WP Eraser Skip");
429 if (status
& R1_CARD_ECC_DISABLED
)
430 N_MSG(RSP
, "[CARD_STATUS] Card ECC Disabled");
431 if (status
& R1_ERASE_RESET
)
432 N_MSG(RSP
, "[CARD_STATUS] Erase Reset");
433 if (status
& R1_READY_FOR_DATA
)
434 N_MSG(RSP
, "[CARD_STATUS] Ready for Data");
435 if (status
& R1_SWITCH_ERROR
)
436 N_MSG(RSP
, "[CARD_STATUS] Switch error");
437 if (status
& R1_APP_CMD
)
438 N_MSG(RSP
, "[CARD_STATUS] App Command");
440 N_MSG(RSP
, "[CARD_STATUS] '%s' State", state
[R1_CURRENT_STATE(status
)]);
443 static void msdc_dump_ocr_reg(struct msdc_host
*host
, u32 resp
)
446 N_MSG(RSP
, "[OCR] Low Voltage Range");
447 if (resp
& (1 << 15))
448 N_MSG(RSP
, "[OCR] 2.7-2.8 volt");
449 if (resp
& (1 << 16))
450 N_MSG(RSP
, "[OCR] 2.8-2.9 volt");
451 if (resp
& (1 << 17))
452 N_MSG(RSP
, "[OCR] 2.9-3.0 volt");
453 if (resp
& (1 << 18))
454 N_MSG(RSP
, "[OCR] 3.0-3.1 volt");
455 if (resp
& (1 << 19))
456 N_MSG(RSP
, "[OCR] 3.1-3.2 volt");
457 if (resp
& (1 << 20))
458 N_MSG(RSP
, "[OCR] 3.2-3.3 volt");
459 if (resp
& (1 << 21))
460 N_MSG(RSP
, "[OCR] 3.3-3.4 volt");
461 if (resp
& (1 << 22))
462 N_MSG(RSP
, "[OCR] 3.4-3.5 volt");
463 if (resp
& (1 << 23))
464 N_MSG(RSP
, "[OCR] 3.5-3.6 volt");
465 if (resp
& (1 << 24))
466 N_MSG(RSP
, "[OCR] Switching to 1.8V Accepted (S18A)");
467 if (resp
& (1 << 30))
468 N_MSG(RSP
, "[OCR] Card Capacity Status (CCS)");
469 if (resp
& (1 << 31))
470 N_MSG(RSP
, "[OCR] Card Power Up Status (Idle)");
472 N_MSG(RSP
, "[OCR] Card Power Up Status (Busy)");
475 static void msdc_dump_rca_resp(struct msdc_host
*host
, u32 resp
)
477 u32 status
= (((resp
>> 15) & 0x1) << 23) |
478 (((resp
>> 14) & 0x1) << 22) |
479 (((resp
>> 13) & 0x1) << 19) |
482 N_MSG(RSP
, "[RCA] 0x%.4x", resp
>> 16);
483 msdc_dump_card_status(host
, status
);
486 static void msdc_dump_io_resp(struct msdc_host
*host
, u32 resp
)
488 u32 flags
= (resp
>> 8) & 0xFF;
489 char *state
[] = {"DIS", "CMD", "TRN", "RFU"};
491 if (flags
& (1 << 7))
492 N_MSG(RSP
, "[IO] COM_CRC_ERR");
493 if (flags
& (1 << 6))
494 N_MSG(RSP
, "[IO] Illgal command");
495 if (flags
& (1 << 3))
496 N_MSG(RSP
, "[IO] Error");
497 if (flags
& (1 << 2))
498 N_MSG(RSP
, "[IO] RFU");
499 if (flags
& (1 << 1))
500 N_MSG(RSP
, "[IO] Function number error");
501 if (flags
& (1 << 0))
502 N_MSG(RSP
, "[IO] Out of range");
504 N_MSG(RSP
, "[IO] State: %s, Data:0x%x", state
[(resp
>> 12) & 0x3], resp
& 0xFF);
508 static void msdc_set_timeout(struct msdc_host
*host
, u32 ns
, u32 clks
)
510 u32 base
= host
->base
;
513 host
->timeout_ns
= ns
;
514 host
->timeout_clks
= clks
;
516 clk_ns
= 1000000000UL / host
->sclk
;
517 timeout
= ns
/ clk_ns
+ clks
;
518 timeout
= timeout
>> 16; /* in 65536 sclk cycle unit */
519 timeout
= timeout
> 1 ? timeout
- 1 : 0;
520 timeout
= timeout
> 255 ? 255 : timeout
;
522 sdr_set_field(SDC_CFG
, SDC_CFG_DTOC
, timeout
);
524 N_MSG(OPS
, "Set read data timeout: %dns %dclks -> %d x 65536 cycles",
525 ns
, clks
, timeout
+ 1);
528 /* msdc_eirq_sdio() will be called when EIRQ(for WIFI) */
529 static void msdc_eirq_sdio(void *data
)
531 struct msdc_host
*host
= (struct msdc_host
*)data
;
533 N_MSG(INT
, "SDIO EINT");
535 mmc_signal_sdio_irq(host
->mmc
);
538 /* msdc_eirq_cd will not be used! We not using EINT for card detection. */
539 static void msdc_eirq_cd(void *data
)
541 struct msdc_host
*host
= (struct msdc_host
*)data
;
543 N_MSG(INT
, "CD EINT");
546 tasklet_hi_schedule(&host
->card_tasklet
);
548 schedule_delayed_work(&host
->card_delaywork
, HZ
);
553 static void msdc_tasklet_card(unsigned long arg
)
555 struct msdc_host
*host
= (struct msdc_host
*)arg
;
557 static void msdc_tasklet_card(struct work_struct
*work
)
559 struct msdc_host
*host
= (struct msdc_host
*)container_of(work
,
560 struct msdc_host
, card_delaywork
.work
);
562 struct msdc_hw
*hw
= host
->hw
;
563 u32 base
= host
->base
;
568 spin_lock(&host
->lock
);
570 if (hw
->get_cd_status
) { // NULL
571 inserted
= hw
->get_cd_status();
573 status
= sdr_read32(MSDC_PS
);
575 inserted
= (status
& MSDC_PS_CDSTS
) ? 0 : 1;
577 inserted
= (status
& MSDC_PS_CDSTS
) ? 1 : 0;
579 if (host
->mmc
->caps
& MMC_CAP_NEEDS_POLL
)
583 change
= host
->card_inserted
^ inserted
;
584 host
->card_inserted
= inserted
;
586 if (change
&& !host
->suspend
) {
588 host
->mmc
->f_max
= HOST_MAX_MCLK
; // work around
590 mmc_detect_change(host
->mmc
, msecs_to_jiffies(20));
592 #else /* Make sure: handle the last interrupt */
593 host
->card_inserted
= inserted
;
595 if (!host
->suspend
) {
596 host
->mmc
->f_max
= HOST_MAX_MCLK
;
597 mmc_detect_change(host
->mmc
, msecs_to_jiffies(20));
600 IRQ_MSG("card found<%s>", inserted
? "inserted" : "removed");
603 spin_unlock(&host
->lock
);
606 #if 0 /* --- by chhung */
608 static u8 clk_src_bit
[4] = {
612 static void msdc_select_clksrc(struct msdc_host
* host
, unsigned char clksrc
)
615 u32 base
= host
->base
;
618 INIT_MSG("set clock source to <%d>", clksrc
);
620 val
= sdr_read32(MSDC_CLKSRC_REG
);
621 if (sdr_read32(MSDC_ECO_VER
) >= 4) {
622 val
&= ~(0x3 << clk_src_bit
[host
->id
]);
623 val
|= clksrc
<< clk_src_bit
[host
->id
];
625 val
&= ~0x3; val
|= clksrc
;
627 sdr_write32(MSDC_CLKSRC_REG
, val
);
629 host
->hclk
= hclks
[clksrc
];
630 host
->hw
->clk_src
= clksrc
;
632 #endif /* end of --- */
634 static void msdc_set_mclk(struct msdc_host
*host
, int ddr
, unsigned int hz
)
636 //struct msdc_hw *hw = host->hw;
637 u32 base
= host
->base
;
642 u32 hclk
= host
->hclk
;
643 //u8 clksrc = hw->clk_src;
645 if (!hz
) { // set mmc system clock to 0 ?
646 //ERR_MSG("set mclk to 0!!!");
651 msdc_irq_save(flags
);
653 #if defined (CONFIG_MT7621_FPGA) || defined (CONFIG_MT7628_FPGA)
654 mode
= 0x0; /* use divisor */
655 if (hz
>= (hclk
>> 1)) {
656 div
= 0; /* mean div = 1/2 */
657 sclk
= hclk
>> 1; /* sclk = clk / 2 */
659 div
= (hclk
+ ((hz
<< 2) - 1)) / (hz
<< 2);
660 sclk
= (hclk
>> 2) / div
;
664 mode
= 0x2; /* ddr mode and use divisor */
665 if (hz
>= (hclk
>> 2)) {
666 div
= 1; /* mean div = 1/4 */
667 sclk
= hclk
>> 2; /* sclk = clk / 4 */
669 div
= (hclk
+ ((hz
<< 2) - 1)) / (hz
<< 2);
670 sclk
= (hclk
>> 2) / div
;
672 } else if (hz
>= hclk
) { /* bug fix */
673 mode
= 0x1; /* no divisor and divisor is ignored */
677 mode
= 0x0; /* use divisor */
678 if (hz
>= (hclk
>> 1)) {
679 div
= 0; /* mean div = 1/2 */
680 sclk
= hclk
>> 1; /* sclk = clk / 2 */
682 div
= (hclk
+ ((hz
<< 2) - 1)) / (hz
<< 2);
683 sclk
= (hclk
>> 2) / div
;
687 /* set clock mode and divisor */
688 sdr_set_field(MSDC_CFG
, MSDC_CFG_CKMOD
, mode
);
689 sdr_set_field(MSDC_CFG
, MSDC_CFG_CKDIV
, div
);
691 /* wait clock stable */
692 while (!(sdr_read32(MSDC_CFG
) & MSDC_CFG_CKSTB
));
696 msdc_set_timeout(host
, host
->timeout_ns
, host
->timeout_clks
); // need?
698 INIT_MSG("================");
699 INIT_MSG("!!! Set<%dKHz> Source<%dKHz> -> sclk<%dKHz>", hz
/1000, hclk
/1000, sclk
/1000);
700 INIT_MSG("================");
702 msdc_irq_restore(flags
);
705 /* Fix me. when need to abort */
706 static void msdc_abort_data(struct msdc_host
*host
)
708 u32 base
= host
->base
;
709 struct mmc_command
*stop
= host
->mrq
->stop
;
711 ERR_MSG("Need to Abort. dma<%d>", host
->dma_xfer
);
717 // need to check FIFO count 0 ?
719 if (stop
) { /* try to stop, but may not success */
720 ERR_MSG("stop when abort CMD<%d>", stop
->opcode
);
721 (void)msdc_do_command(host
, stop
, 0, CMD_TIMEOUT
);
724 //if (host->mclk >= 25000000) {
725 // msdc_set_mclk(host, 0, host->mclk >> 1);
729 #if 0 /* --- by chhung */
730 static void msdc_pin_config(struct msdc_host
*host
, int mode
)
732 struct msdc_hw
*hw
= host
->hw
;
733 u32 base
= host
->base
;
734 int pull
= (mode
== MSDC_PIN_PULL_UP
) ? GPIO_PULL_UP
: GPIO_PULL_DOWN
;
737 if (hw
->flags
& MSDC_WP_PIN_EN
) {
738 if (hw
->config_gpio_pin
) /* NULL */
739 hw
->config_gpio_pin(MSDC_WP_PIN
, pull
);
743 case MSDC_PIN_PULL_UP
:
744 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 1); /* Check & FIXME */
745 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */
746 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPU
, 1);
747 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPD
, 0);
748 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPU
, 1);
749 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPD
, 0);
751 case MSDC_PIN_PULL_DOWN
:
752 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */
753 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 1); /* Check & FIXME */
754 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPU
, 0);
755 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPD
, 1);
756 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPU
, 0);
757 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPD
, 1);
759 case MSDC_PIN_PULL_NONE
:
761 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */
762 //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */
763 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPU
, 0);
764 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDPD
, 0);
765 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPU
, 0);
766 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATPD
, 0);
770 N_MSG(CFG
, "Pins mode(%d), down(%d), up(%d)",
771 mode
, MSDC_PIN_PULL_DOWN
, MSDC_PIN_PULL_UP
);
774 void msdc_pin_reset(struct msdc_host
*host
, int mode
)
776 struct msdc_hw
*hw
= (struct msdc_hw
*)host
->hw
;
777 u32 base
= host
->base
;
778 int pull
= (mode
== MSDC_PIN_PULL_UP
) ? GPIO_PULL_UP
: GPIO_PULL_DOWN
;
780 /* Config reset pin */
781 if (hw
->flags
& MSDC_RST_PIN_EN
) {
782 if (hw
->config_gpio_pin
) /* NULL */
783 hw
->config_gpio_pin(MSDC_RST_PIN
, pull
);
785 if (mode
== MSDC_PIN_PULL_UP
) {
786 sdr_clr_bits(EMMC_IOCON
, EMMC_IOCON_BOOTRST
);
788 sdr_set_bits(EMMC_IOCON
, EMMC_IOCON_BOOTRST
);
793 static void msdc_core_power(struct msdc_host
*host
, int on
)
795 N_MSG(CFG
, "Turn %s %s power (copower: %d -> %d)",
796 on
? "on" : "off", "core", host
->core_power
, on
);
798 if (on
&& host
->core_power
== 0) {
800 host
->core_power
= 1;
802 } else if (!on
&& host
->core_power
== 1) {
803 msdc_vcore_off(host
);
804 host
->core_power
= 0;
809 static void msdc_host_power(struct msdc_host
*host
, int on
)
811 N_MSG(CFG
, "Turn %s %s power ", on
? "on" : "off", "host");
814 //msdc_core_power(host, 1); // need do card detection.
815 msdc_pin_reset(host
, MSDC_PIN_PULL_UP
);
817 msdc_pin_reset(host
, MSDC_PIN_PULL_DOWN
);
818 //msdc_core_power(host, 0);
822 static void msdc_card_power(struct msdc_host
*host
, int on
)
824 N_MSG(CFG
, "Turn %s %s power ", on
? "on" : "off", "card");
827 msdc_pin_config(host
, MSDC_PIN_PULL_UP
);
828 if (host
->hw
->ext_power_on
) {
829 host
->hw
->ext_power_on();
831 //msdc_vdd_on(host); // need todo card detection.
835 if (host
->hw
->ext_power_off
) {
836 host
->hw
->ext_power_off();
838 //msdc_vdd_off(host);
840 msdc_pin_config(host
, MSDC_PIN_PULL_DOWN
);
845 static void msdc_set_power_mode(struct msdc_host
*host
, u8 mode
)
847 N_MSG(CFG
, "Set power mode(%d)", mode
);
849 if (host
->power_mode
== MMC_POWER_OFF
&& mode
!= MMC_POWER_OFF
) {
850 msdc_host_power(host
, 1);
851 msdc_card_power(host
, 1);
852 } else if (host
->power_mode
!= MMC_POWER_OFF
&& mode
== MMC_POWER_OFF
) {
853 msdc_card_power(host
, 0);
854 msdc_host_power(host
, 0);
856 host
->power_mode
= mode
;
858 #endif /* end of --- */
862 register as callback function of WIFI(combo_sdio_register_pm) .
863 can called by msdc_drv_suspend/resume too.
865 static void msdc_pm(pm_message_t state
, void *data
)
867 struct msdc_host
*host
= (struct msdc_host
*)data
;
868 int evt
= state
.event
;
870 if (evt
== PM_EVENT_USER_RESUME
|| evt
== PM_EVENT_USER_SUSPEND
) {
871 INIT_MSG("USR_%s: suspend<%d> power<%d>",
872 evt
== PM_EVENT_USER_RESUME
? "EVENT_USER_RESUME" : "EVENT_USER_SUSPEND",
873 host
->suspend
, host
->power_mode
);
876 if (evt
== PM_EVENT_SUSPEND
|| evt
== PM_EVENT_USER_SUSPEND
) {
877 if (host
->suspend
) /* already suspend */ /* default 0*/
880 /* for memory card. already power off by mmc */
881 if (evt
== PM_EVENT_SUSPEND
&& host
->power_mode
== MMC_POWER_OFF
)
885 host
->pm_state
= state
; /* default PMSG_RESUME */
887 INIT_MSG("%s Suspend", evt
== PM_EVENT_SUSPEND
? "PM" : "USR");
888 if(host
->hw
->flags
& MSDC_SYS_SUSPEND
) /* set for card */
889 (void)mmc_suspend_host(host
->mmc
);
891 // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* just for double confirm */ /* --- by chhung */
892 mmc_remove_host(host
->mmc
);
894 } else if (evt
== PM_EVENT_RESUME
|| evt
== PM_EVENT_USER_RESUME
) {
896 //ERR_MSG("warning: already resume");
900 /* No PM resume when USR suspend */
901 if (evt
== PM_EVENT_RESUME
&& host
->pm_state
.event
== PM_EVENT_USER_SUSPEND
) {
902 ERR_MSG("PM Resume when in USR Suspend"); /* won't happen. */
907 host
->pm_state
= state
;
909 INIT_MSG("%s Resume", evt
== PM_EVENT_RESUME
? "PM" : "USR");
910 if(host
->hw
->flags
& MSDC_SYS_SUSPEND
) { /* will not set for WIFI */
911 (void)mmc_resume_host(host
->mmc
);
914 // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* --- by chhung */
915 mmc_add_host(host
->mmc
);
921 /*--------------------------------------------------------------------------*/
922 /* mmc_host_ops members */
923 /*--------------------------------------------------------------------------*/
924 static unsigned int msdc_command_start(struct msdc_host
*host
,
925 struct mmc_command
*cmd
,
926 int tune
, /* not used */
927 unsigned long timeout
)
929 u32 base
= host
->base
;
930 u32 opcode
= cmd
->opcode
;
932 u32 wints
= MSDC_INT_CMDRDY
| MSDC_INT_RSPCRCERR
| MSDC_INT_CMDTMO
|
933 MSDC_INT_ACMDRDY
| MSDC_INT_ACMDCRCERR
| MSDC_INT_ACMDTMO
|
934 MSDC_INT_ACMD19_DONE
;
939 /* Protocol layer does not provide response type, but our hardware needs
940 * to know exact type, not just size!
942 if (opcode
== MMC_SEND_OP_COND
|| opcode
== SD_APP_OP_COND
)
944 else if (opcode
== MMC_SET_RELATIVE_ADDR
|| opcode
== SD_SEND_RELATIVE_ADDR
)
945 resp
= (mmc_cmd_type(cmd
) == MMC_CMD_BCR
) ? RESP_R6
: RESP_R1
;
946 else if (opcode
== MMC_FAST_IO
)
948 else if (opcode
== MMC_GO_IRQ_STATE
)
950 else if (opcode
== MMC_SELECT_CARD
)
951 resp
= (cmd
->arg
!= 0) ? RESP_R1B
: RESP_NONE
;
952 else if (opcode
== SD_IO_RW_DIRECT
|| opcode
== SD_IO_RW_EXTENDED
)
953 resp
= RESP_R1
; /* SDIO workaround. */
954 else if (opcode
== SD_SEND_IF_COND
&& (mmc_cmd_type(cmd
) == MMC_CMD_BCR
))
957 switch (mmc_resp_type(cmd
)) {
979 * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 |
980 * stop << 14 | rw << 13 | dtype << 11 | rsptyp << 7 | brk << 6 | opcode
982 rawcmd
= opcode
| msdc_rsp
[resp
] << 7 | host
->blksz
<< 16;
984 if (opcode
== MMC_READ_MULTIPLE_BLOCK
) {
986 } else if (opcode
== MMC_READ_SINGLE_BLOCK
) {
988 } else if (opcode
== MMC_WRITE_MULTIPLE_BLOCK
) {
989 rawcmd
|= ((2 << 11) | (1 << 13));
990 } else if (opcode
== MMC_WRITE_BLOCK
) {
991 rawcmd
|= ((1 << 11) | (1 << 13));
992 } else if (opcode
== SD_IO_RW_EXTENDED
) {
993 if (cmd
->data
->flags
& MMC_DATA_WRITE
)
995 if (cmd
->data
->blocks
> 1)
999 } else if (opcode
== SD_IO_RW_DIRECT
&& cmd
->flags
== (unsigned int)-1) {
1000 rawcmd
|= (1 << 14);
1001 } else if ((opcode
== SD_APP_SEND_SCR
) ||
1002 (opcode
== SD_APP_SEND_NUM_WR_BLKS
) ||
1003 (opcode
== SD_SWITCH
&& (mmc_cmd_type(cmd
) == MMC_CMD_ADTC
)) ||
1004 (opcode
== SD_APP_SD_STATUS
&& (mmc_cmd_type(cmd
) == MMC_CMD_ADTC
)) ||
1005 (opcode
== MMC_SEND_EXT_CSD
&& (mmc_cmd_type(cmd
) == MMC_CMD_ADTC
))) {
1006 rawcmd
|= (1 << 11);
1007 } else if (opcode
== MMC_STOP_TRANSMISSION
) {
1008 rawcmd
|= (1 << 14);
1009 rawcmd
&= ~(0x0FFF << 16);
1012 N_MSG(CMD
, "CMD<%d><0x%.8x> Arg<0x%.8x>", opcode
, rawcmd
, cmd
->arg
);
1014 tmo
= jiffies
+ timeout
;
1016 if (opcode
== MMC_SEND_STATUS
) {
1018 if (!sdc_is_cmd_busy())
1021 if (time_after(jiffies
, tmo
)) {
1022 ERR_MSG("XXX cmd_busy timeout: before CMD<%d>", opcode
);
1023 cmd
->error
= (unsigned int)-ETIMEDOUT
;
1032 if (time_after(jiffies
, tmo
)) {
1033 ERR_MSG("XXX sdc_busy timeout: before CMD<%d>", opcode
);
1034 cmd
->error
= (unsigned int)-ETIMEDOUT
;
1041 //BUG_ON(in_interrupt());
1043 host
->cmd_rsp
= resp
;
1045 init_completion(&host
->cmd_done
);
1047 sdr_set_bits(MSDC_INTEN
, wints
);
1048 sdc_send_cmd(rawcmd
, cmd
->arg
);
1054 static unsigned int msdc_command_resp(struct msdc_host
*host
,
1055 struct mmc_command
*cmd
,
1057 unsigned long timeout
)
1059 u32 base
= host
->base
;
1060 u32 opcode
= cmd
->opcode
;
1063 u32 wints
= MSDC_INT_CMDRDY
| MSDC_INT_RSPCRCERR
| MSDC_INT_CMDTMO
|
1064 MSDC_INT_ACMDRDY
| MSDC_INT_ACMDCRCERR
| MSDC_INT_ACMDTMO
|
1065 MSDC_INT_ACMD19_DONE
;
1067 resp
= host
->cmd_rsp
;
1069 BUG_ON(in_interrupt());
1070 //init_completion(&host->cmd_done);
1071 //sdr_set_bits(MSDC_INTEN, wints);
1073 spin_unlock(&host
->lock
);
1074 if(!wait_for_completion_timeout(&host
->cmd_done
, 10*timeout
)){
1075 ERR_MSG("XXX CMD<%d> wait_for_completion timeout ARG<0x%.8x>", opcode
, cmd
->arg
);
1076 cmd
->error
= (unsigned int)-ETIMEDOUT
;
1079 spin_lock(&host
->lock
);
1081 sdr_clr_bits(MSDC_INTEN
, wints
);
1085 #ifdef MT6575_SD_DEBUG
1088 N_MSG(RSP
, "CMD_RSP(%d): %d RSP(%d)", opcode
, cmd
->error
, resp
);
1091 N_MSG(RSP
, "CMD_RSP(%d): %d RSP(%d)= %.8x %.8x %.8x %.8x",
1092 opcode
, cmd
->error
, resp
, cmd
->resp
[0], cmd
->resp
[1],
1093 cmd
->resp
[2], cmd
->resp
[3]);
1095 default: /* Response types 1, 3, 4, 5, 6, 7(1b) */
1096 N_MSG(RSP
, "CMD_RSP(%d): %d RSP(%d)= 0x%.8x",
1097 opcode
, cmd
->error
, resp
, cmd
->resp
[0]);
1098 if (cmd
->error
== 0) {
1102 msdc_dump_card_status(host
, cmd
->resp
[0]);
1105 msdc_dump_ocr_reg(host
, cmd
->resp
[0]);
1108 msdc_dump_io_resp(host
, cmd
->resp
[0]);
1111 msdc_dump_rca_resp(host
, cmd
->resp
[0]);
1119 /* do we need to save card's RCA when SD_SEND_RELATIVE_ADDR */
1125 /* memory card CRC */
1126 if(host
->hw
->flags
& MSDC_REMOVABLE
&& cmd
->error
== (unsigned int)(-EIO
) ) {
1127 if (sdr_read32(SDC_CMD
) & 0x1800) { /* check if has data phase */
1128 msdc_abort_data(host
);
1130 /* do basic: reset*/
1135 cmd
->error
= msdc_tune_cmdrsp(host
,cmd
);
1139 /* if (resp == RESP_R1B) {
1140 while ((sdr_read32(MSDC_PS) & 0x10000) != 0x10000);
1142 /* CMD12 Error Handle */
1147 static unsigned int msdc_do_command(struct msdc_host
*host
,
1148 struct mmc_command
*cmd
,
1150 unsigned long timeout
)
1152 if (msdc_command_start(host
, cmd
, tune
, timeout
))
1155 if (msdc_command_resp(host
, cmd
, tune
, timeout
))
1160 N_MSG(CMD
, " return<%d> resp<0x%.8x>", cmd
->error
, cmd
->resp
[0]);
1164 /* The abort condition when PIO read/write
1167 static int msdc_pio_abort(struct msdc_host
*host
, struct mmc_data
*data
, unsigned long tmo
)
1170 u32 base
= host
->base
;
1172 if (atomic_read(&host
->abort
)) {
1176 if (time_after(jiffies
, tmo
)) {
1177 data
->error
= (unsigned int)-ETIMEDOUT
;
1178 ERR_MSG("XXX PIO Data Timeout: CMD<%d>", host
->mrq
->cmd
->opcode
);
1186 ERR_MSG("msdc pio find abort");
1192 Need to add a timeout, or WDT timeout, system reboot.
1194 // pio mode data read/write
1195 static int msdc_pio_read(struct msdc_host
*host
, struct mmc_data
*data
)
1197 struct scatterlist
*sg
= data
->sg
;
1198 u32 base
= host
->base
;
1199 u32 num
= data
->sg_len
;
1203 u32 count
, size
= 0;
1204 u32 wints
= MSDC_INTEN_DATTMO
| MSDC_INTEN_DATCRCERR
;
1205 unsigned long tmo
= jiffies
+ DAT_TIMEOUT
;
1207 sdr_set_bits(MSDC_INTEN
, wints
);
1209 left
= sg_dma_len(sg
);
1212 if ((left
>= MSDC_FIFO_THD
) && (msdc_rxfifocnt() >= MSDC_FIFO_THD
)) {
1213 count
= MSDC_FIFO_THD
>> 2;
1215 *ptr
++ = msdc_fifo_read32();
1217 left
-= MSDC_FIFO_THD
;
1218 } else if ((left
< MSDC_FIFO_THD
) && msdc_rxfifocnt() >= left
) {
1220 *ptr
++ = msdc_fifo_read32();
1226 * u8ptr
++ = msdc_fifo_read8();
1231 if (msdc_pio_abort(host
, data
, tmo
)) {
1235 size
+= sg_dma_len(sg
);
1236 sg
= sg_next(sg
); num
--;
1239 data
->bytes_xfered
+= size
;
1240 N_MSG(FIO
, " PIO Read<%d>bytes", size
);
1242 sdr_clr_bits(MSDC_INTEN
, wints
);
1243 if(data
->error
) ERR_MSG("read pio data->error<%d> left<%d> size<%d>", data
->error
, left
, size
);
1247 /* please make sure won't using PIO when size >= 512
1248 which means, memory card block read/write won't using pio
1249 then don't need to handle the CMD12 when data error.
1251 static int msdc_pio_write(struct msdc_host
* host
, struct mmc_data
*data
)
1253 u32 base
= host
->base
;
1254 struct scatterlist
*sg
= data
->sg
;
1255 u32 num
= data
->sg_len
;
1259 u32 count
, size
= 0;
1260 u32 wints
= MSDC_INTEN_DATTMO
| MSDC_INTEN_DATCRCERR
;
1261 unsigned long tmo
= jiffies
+ DAT_TIMEOUT
;
1263 sdr_set_bits(MSDC_INTEN
, wints
);
1265 left
= sg_dma_len(sg
);
1269 if (left
>= MSDC_FIFO_SZ
&& msdc_txfifocnt() == 0) {
1270 count
= MSDC_FIFO_SZ
>> 2;
1272 msdc_fifo_write32(*ptr
); ptr
++;
1274 left
-= MSDC_FIFO_SZ
;
1275 } else if (left
< MSDC_FIFO_SZ
&& msdc_txfifocnt() == 0) {
1277 msdc_fifo_write32(*ptr
); ptr
++;
1283 msdc_fifo_write8(*u8ptr
); u8ptr
++;
1288 if (msdc_pio_abort(host
, data
, tmo
)) {
1292 size
+= sg_dma_len(sg
);
1293 sg
= sg_next(sg
); num
--;
1296 data
->bytes_xfered
+= size
;
1297 N_MSG(FIO
, " PIO Write<%d>bytes", size
);
1298 if(data
->error
) ERR_MSG("write pio data->error<%d>", data
->error
);
1300 sdr_clr_bits(MSDC_INTEN
, wints
);
1304 #if 0 /* --- by chhung */
1305 // DMA resume / start / stop
1306 static void msdc_dma_resume(struct msdc_host
*host
)
1308 u32 base
= host
->base
;
1310 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_RESUME
, 1);
1312 N_MSG(DMA
, "DMA resume");
1314 #endif /* end of --- */
1316 static void msdc_dma_start(struct msdc_host
*host
)
1318 u32 base
= host
->base
;
1319 u32 wints
= MSDC_INTEN_XFER_COMPL
| MSDC_INTEN_DATTMO
| MSDC_INTEN_DATCRCERR
;
1321 sdr_set_bits(MSDC_INTEN
, wints
);
1322 //dsb(); /* --- by chhung */
1323 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_START
, 1);
1325 N_MSG(DMA
, "DMA start");
1328 static void msdc_dma_stop(struct msdc_host
*host
)
1330 u32 base
= host
->base
;
1332 u32 wints
= MSDC_INTEN_XFER_COMPL
| MSDC_INTEN_DATTMO
| MSDC_INTEN_DATCRCERR
;
1334 N_MSG(DMA
, "DMA status: 0x%.8x",sdr_read32(MSDC_DMA_CFG
));
1335 //while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS);
1337 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_STOP
, 1);
1338 while (sdr_read32(MSDC_DMA_CFG
) & MSDC_DMA_CFG_STS
);
1340 //dsb(); /* --- by chhung */
1341 sdr_clr_bits(MSDC_INTEN
, wints
); /* Not just xfer_comp */
1343 N_MSG(DMA
, "DMA stop");
1346 #if 0 /* --- by chhung */
1347 /* dump a gpd list */
1348 static void msdc_dma_dump(struct msdc_host
*host
, struct msdc_dma
*dma
)
1350 gpd_t
*gpd
= dma
->gpd
;
1356 if (dma
->mode
!= MSDC_MODE_DMA_DESC
) {
1360 ERR_MSG("try to dump gpd and bd");
1363 ERR_MSG(".gpd<0x%.8x> gpd_phy<0x%.8x>", (int)gpd
, (int)dma
->gpd_addr
);
1364 ERR_MSG("...hwo <%d>", gpd
->hwo
);
1365 ERR_MSG("...bdp <%d>", gpd
->bdp
);
1366 ERR_MSG("...chksum<0x%.8x>", gpd
->chksum
);
1367 //ERR_MSG("...intr <0x%.8x>", gpd->intr );
1368 ERR_MSG("...next <0x%.8x>", (int)gpd
->next
);
1369 ERR_MSG("...ptr <0x%.8x>", (int)gpd
->ptr
);
1370 ERR_MSG("...buflen<0x%.8x>", gpd
->buflen
);
1371 //ERR_MSG("...extlen<0x%.8x>", gpd->extlen );
1372 //ERR_MSG("...arg <0x%.8x>", gpd->arg );
1373 //ERR_MSG("...blknum<0x%.8x>", gpd->blknum );
1374 //ERR_MSG("...cmd <0x%.8x>", gpd->cmd );
1377 ERR_MSG(".bd<0x%.8x> bd_phy<0x%.8x> gpd_ptr<0x%.8x>", (int)bd
, (int)dma
->bd_addr
, (int)gpd
->ptr
);
1379 p_to_v
= ((u32
)bd
- (u32
)dma
->bd_addr
);
1381 ERR_MSG(".bd[%d]", i
); i
++;
1382 ERR_MSG("...eol <%d>", ptr
->eol
);
1383 ERR_MSG("...chksum<0x%.8x>", ptr
->chksum
);
1384 //ERR_MSG("...blkpad<0x%.8x>", ptr->blkpad );
1385 //ERR_MSG("...dwpad <0x%.8x>", ptr->dwpad );
1386 ERR_MSG("...next <0x%.8x>", (int)ptr
->next
);
1387 ERR_MSG("...ptr <0x%.8x>", (int)ptr
->ptr
);
1388 ERR_MSG("...buflen<0x%.8x>", (int)ptr
->buflen
);
1390 if (ptr
->eol
== 1) {
1394 /* find the next bd, virtual address of ptr->next */
1395 /* don't need to enable when use malloc */
1396 //BUG_ON( (ptr->next + p_to_v)!=(ptr+1) );
1397 //ERR_MSG(".next bd<0x%.8x><0x%.8x>", (ptr->next + p_to_v), (ptr+1));
1401 ERR_MSG("dump gpd and bd finished");
1403 #endif /* end of --- */
1406 static u8
msdc_dma_calcs(u8
*buf
, u32 len
)
1409 for (i
= 0; i
< len
; i
++) {
1412 return 0xFF - (u8
)sum
;
1415 /* gpd bd setup + dma registers */
1416 static int msdc_dma_config(struct msdc_host
*host
, struct msdc_dma
*dma
)
1418 u32 base
= host
->base
;
1419 u32 sglen
= dma
->sglen
;
1420 //u32 i, j, num, bdlen, arg, xfersz;
1422 u8 blkpad
, dwpad
, chksum
;
1423 struct scatterlist
*sg
= dma
->sg
;
1427 switch (dma
->mode
) {
1428 case MSDC_MODE_DMA_BASIC
:
1429 BUG_ON(dma
->xfersz
> 65535);
1430 BUG_ON(dma
->sglen
!= 1);
1431 sdr_write32(MSDC_DMA_SA
, PHYSADDR(sg_dma_address(sg
)));
1432 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_LASTBUF
, 1);
1433 //#if defined (CONFIG_RALINK_MT7620)
1434 if (ralink_soc
== MT762X_SOC_MT7620A
)
1435 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_XFERSZ
, sg_dma_len(sg
));
1436 //#elif defined (CONFIG_RALINK_MT7621) || defined (CONFIG_RALINK_MT7628)
1438 sdr_write32((volatile u32
*)(RALINK_MSDC_BASE
+0xa8), sg_dma_len(sg
));
1440 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_BRUSTSZ
, dma
->burstsz
);
1441 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_MODE
, 0);
1443 case MSDC_MODE_DMA_DESC
:
1444 blkpad
= (dma
->flags
& DMA_FLAG_PAD_BLOCK
) ? 1 : 0;
1445 dwpad
= (dma
->flags
& DMA_FLAG_PAD_DWORD
) ? 1 : 0;
1446 chksum
= (dma
->flags
& DMA_FLAG_EN_CHKSUM
) ? 1 : 0;
1448 /* calculate the required number of gpd */
1449 num
= (sglen
+ MAX_BD_PER_GPD
- 1) / MAX_BD_PER_GPD
;
1458 gpd
->hwo
= 1; /* hw will clear it */
1460 gpd
->chksum
= 0; /* need to clear first. */
1461 gpd
->chksum
= (chksum
? msdc_dma_calcs((u8
*)gpd
, 16) : 0);
1464 for (j
= 0; j
< bdlen
; j
++) {
1465 msdc_init_bd(&bd
[j
], blkpad
, dwpad
, sg_dma_address(sg
), sg_dma_len(sg
));
1466 if(j
== bdlen
- 1) {
1467 bd
[j
].eol
= 1; /* the last bd */
1471 bd
[j
].chksum
= 0; /* checksume need to clear first */
1472 bd
[j
].chksum
= (chksum
? msdc_dma_calcs((u8
*)(&bd
[j
]), 16) : 0);
1477 dma
->used_bd
+= bdlen
;
1479 sdr_set_field(MSDC_DMA_CFG
, MSDC_DMA_CFG_DECSEN
, chksum
);
1480 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_BRUSTSZ
, dma
->burstsz
);
1481 sdr_set_field(MSDC_DMA_CTRL
, MSDC_DMA_CTRL_MODE
, 1);
1483 sdr_write32(MSDC_DMA_SA
, PHYSADDR((u32
)dma
->gpd_addr
));
1490 N_MSG(DMA
, "DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL
));
1491 N_MSG(DMA
, "DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG
));
1492 N_MSG(DMA
, "DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA
));
1497 static void msdc_dma_setup(struct msdc_host
*host
, struct msdc_dma
*dma
,
1498 struct scatterlist
*sg
, unsigned int sglen
)
1500 BUG_ON(sglen
> MAX_BD_NUM
); /* not support currently */
1503 dma
->flags
= DMA_FLAG_EN_CHKSUM
;
1504 //dma->flags = DMA_FLAG_NONE; /* CHECKME */
1506 dma
->xfersz
= host
->xfer_size
;
1507 dma
->burstsz
= MSDC_BRUST_64B
;
1509 if (sglen
== 1 && sg_dma_len(sg
) <= MAX_DMA_CNT
)
1510 dma
->mode
= MSDC_MODE_DMA_BASIC
;
1512 dma
->mode
= MSDC_MODE_DMA_DESC
;
1514 N_MSG(DMA
, "DMA mode<%d> sglen<%d> xfersz<%d>", dma
->mode
, dma
->sglen
, dma
->xfersz
);
1516 msdc_dma_config(host
, dma
);
1518 /*if (dma->mode == MSDC_MODE_DMA_DESC) {
1519 //msdc_dma_dump(host, dma);
1523 /* set block number before send command */
1524 static void msdc_set_blknum(struct msdc_host
*host
, u32 blknum
)
1526 u32 base
= host
->base
;
1528 sdr_write32(SDC_BLK_NUM
, blknum
);
1531 static int msdc_do_request(struct mmc_host
*mmc
, struct mmc_request
*mrq
)
1533 struct msdc_host
*host
= mmc_priv(mmc
);
1534 struct mmc_command
*cmd
;
1535 struct mmc_data
*data
;
1536 u32 base
= host
->base
;
1538 unsigned int left
=0;
1539 int dma
= 0, read
= 1, dir
= DMA_FROM_DEVICE
, send_type
=0;
1544 BUG_ON(mmc
== NULL
);
1545 BUG_ON(mrq
== NULL
);
1548 atomic_set(&host
->abort
, 0);
1551 data
= mrq
->cmd
->data
;
1553 #if 0 /* --- by chhung */
1555 N_MSG(OPS
, "enable clock!");
1556 msdc_ungate_clock(host
->id
);
1558 #endif /* end of --- */
1562 if (msdc_do_command(host
, cmd
, 1, CMD_TIMEOUT
) != 0) {
1566 BUG_ON(data
->blksz
> HOST_MAX_BLKSZ
);
1570 read
= data
->flags
& MMC_DATA_READ
? 1 : 0;
1572 host
->xfer_size
= data
->blocks
* data
->blksz
;
1573 host
->blksz
= data
->blksz
;
1575 /* deside the transfer mode */
1576 if (drv_mode
[host
->id
] == MODE_PIO
) {
1577 host
->dma_xfer
= dma
= 0;
1578 } else if (drv_mode
[host
->id
] == MODE_DMA
) {
1579 host
->dma_xfer
= dma
= 1;
1580 } else if (drv_mode
[host
->id
] == MODE_SIZE_DEP
) {
1581 host
->dma_xfer
= dma
= ((host
->xfer_size
>= dma_size
[host
->id
]) ? 1 : 0);
1585 if ((host
->timeout_ns
!= data
->timeout_ns
) ||
1586 (host
->timeout_clks
!= data
->timeout_clks
)) {
1587 msdc_set_timeout(host
, data
->timeout_ns
, data
->timeout_clks
);
1591 msdc_set_blknum(host
, data
->blocks
);
1592 //msdc_clr_fifo(); /* no need */
1595 msdc_dma_on(); /* enable DMA mode first!! */
1596 init_completion(&host
->xfer_done
);
1598 /* start the command first*/
1599 if (msdc_command_start(host
, cmd
, 1, CMD_TIMEOUT
) != 0)
1602 dir
= read
? DMA_FROM_DEVICE
: DMA_TO_DEVICE
;
1603 (void)dma_map_sg(mmc_dev(mmc
), data
->sg
, data
->sg_len
, dir
);
1604 msdc_dma_setup(host
, &host
->dma
, data
->sg
, data
->sg_len
);
1606 /* then wait command done */
1607 if (msdc_command_resp(host
, cmd
, 1, CMD_TIMEOUT
) != 0)
1610 /* for read, the data coming too fast, then CRC error
1611 start DMA no business with CRC. */
1612 //init_completion(&host->xfer_done);
1613 msdc_dma_start(host
);
1615 spin_unlock(&host
->lock
);
1616 if(!wait_for_completion_timeout(&host
->xfer_done
, DAT_TIMEOUT
)){
1617 ERR_MSG("XXX CMD<%d> wait xfer_done<%d> timeout!!", cmd
->opcode
, data
->blocks
* data
->blksz
);
1618 ERR_MSG(" DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA
));
1619 ERR_MSG(" DMA_CA = 0x%x", sdr_read32(MSDC_DMA_CA
));
1620 ERR_MSG(" DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL
));
1621 ERR_MSG(" DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG
));
1622 data
->error
= (unsigned int)-ETIMEDOUT
;
1628 spin_lock(&host
->lock
);
1629 msdc_dma_stop(host
);
1631 /* Firstly: send command */
1632 if (msdc_do_command(host
, cmd
, 1, CMD_TIMEOUT
) != 0) {
1636 /* Secondly: pio data phase */
1638 if (msdc_pio_read(host
, data
)){
1642 if (msdc_pio_write(host
, data
)) {
1647 /* For write case: make sure contents in fifo flushed to device */
1650 left
=msdc_txfifocnt();
1654 if (msdc_pio_abort(host
, data
, jiffies
+ DAT_TIMEOUT
)) {
1656 /* Fix me: what about if data error, when stop ? how to? */
1660 /* Fix me: read case: need to check CRC error */
1663 /* For write case: SDCBUSY and Xfer_Comp will assert when DAT0 not busy.
1664 For read case : SDCBUSY and Xfer_Comp will assert when last byte read out from FIFO.
1667 /* try not to wait xfer_comp interrupt.
1668 the next command will check SDC_BUSY.
1669 SDC_BUSY means xfer_comp assert
1674 /* Last: stop transfer */
1676 if (msdc_do_command(host
, data
->stop
, 0, CMD_TIMEOUT
) != 0) {
1688 host
->dma
.used_bd
= 0;
1689 host
->dma
.used_gpd
= 0;
1690 dma_unmap_sg(mmc_dev(mmc
), data
->sg
, data
->sg_len
, dir
);
1694 #if 0 // don't stop twice!
1695 if(host
->hw
->flags
& MSDC_REMOVABLE
&& data
->error
) {
1696 msdc_abort_data(host
);
1697 /* reset in IRQ, stop command has issued. -> No need */
1701 N_MSG(OPS
, "CMD<%d> data<%s %s> blksz<%d> block<%d> error<%d>",cmd
->opcode
, (dma
? "dma":"pio"),
1702 (read
? "read ":"write") ,data
->blksz
, data
->blocks
, data
->error
);
1705 #if 0 /* --- by chhung */
1708 if(send_type
==SND_CMD
) {
1709 if(cmd
->opcode
== MMC_SEND_STATUS
) {
1710 if((cmd
->resp
[0] & CARD_READY_FOR_DATA
) ||(CARD_CURRENT_STATE(cmd
->resp
[0]) != 7)){
1711 N_MSG(OPS
,"disable clock, CMD13 IDLE");
1712 msdc_gate_clock(host
->id
);
1715 N_MSG(OPS
,"disable clock, CMD<%d>", cmd
->opcode
);
1716 msdc_gate_clock(host
->id
);
1720 N_MSG(OPS
,"disable clock!!! Read CMD<%d>",cmd
->opcode
);
1721 msdc_gate_clock(host
->id
);
1726 msdc_gate_clock(host
->id
);
1728 #endif /* end of --- */
1730 if (mrq
->cmd
->error
) host
->error
= 0x001;
1731 if (mrq
->data
&& mrq
->data
->error
) host
->error
|= 0x010;
1732 if (mrq
->stop
&& mrq
->stop
->error
) host
->error
|= 0x100;
1734 //if (host->error) ERR_MSG("host->error<%d>", host->error);
1739 static int msdc_app_cmd(struct mmc_host
*mmc
, struct msdc_host
*host
)
1741 struct mmc_command cmd
;
1742 struct mmc_request mrq
;
1745 memset(&cmd
, 0, sizeof(struct mmc_command
));
1746 cmd
.opcode
= MMC_APP_CMD
;
1747 #if 0 /* bug: we meet mmc->card is null when ACMD6 */
1748 cmd
.arg
= mmc
->card
->rca
<< 16;
1750 cmd
.arg
= host
->app_cmd_arg
;
1752 cmd
.flags
= MMC_RSP_SPI_R1
| MMC_RSP_R1
| MMC_CMD_AC
;
1754 memset(&mrq
, 0, sizeof(struct mmc_request
));
1755 mrq
.cmd
= &cmd
; cmd
.mrq
= &mrq
;
1758 err
= msdc_do_command(host
, &cmd
, 0, CMD_TIMEOUT
);
1762 static int msdc_tune_cmdrsp(struct msdc_host
*host
, struct mmc_command
*cmd
)
1765 u32 base
= host
->base
;
1766 u32 rsmpl
, cur_rsmpl
, orig_rsmpl
;
1767 u32 rrdly
, cur_rrdly
= 0xffffffff, orig_rrdly
;
1770 /* ==== don't support 3.0 now ====
1772 2: PAD_CMD_RESP_RXDLY[26:22]
1773 ==========================*/
1775 // save the previous tune result
1776 sdr_get_field(MSDC_IOCON
, MSDC_IOCON_RSPL
, orig_rsmpl
);
1777 sdr_get_field(MSDC_PAD_TUNE
, MSDC_PAD_TUNE_CMDRRDLY
, orig_rrdly
);
1781 for (rsmpl
= 0; rsmpl
< 2; rsmpl
++) {
1782 /* Lv1: R_SMPL[1] */
1783 cur_rsmpl
= (orig_rsmpl
+ rsmpl
) % 2;
1788 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_RSPL
, cur_rsmpl
);
1790 if (host
->app_cmd
) {
1791 result
= msdc_app_cmd(host
->mmc
, host
);
1793 ERR_MSG("TUNE_CMD app_cmd<%d> failed: RESP_RXDLY<%d>,R_SMPL<%d>",
1794 host
->mrq
->cmd
->opcode
, cur_rrdly
, cur_rsmpl
);
1798 result
= msdc_do_command(host
, cmd
, 0, CMD_TIMEOUT
); // not tune.
1799 ERR_MSG("TUNE_CMD<%d> %s PAD_CMD_RESP_RXDLY[26:22]<%d> R_SMPL[1]<%d>", cmd
->opcode
,
1800 (result
== 0) ? "PASS" : "FAIL", cur_rrdly
, cur_rsmpl
);
1805 if (result
!= (unsigned int)(-EIO
)) {
1806 ERR_MSG("TUNE_CMD<%d> Error<%d> not -EIO", cmd
->opcode
, result
);
1811 if (sdr_read32(SDC_CMD
) & 0x1800) { /* check if has data phase */
1812 msdc_abort_data(host
);
1816 /* Lv2: PAD_CMD_RESP_RXDLY[26:22] */
1817 cur_rrdly
= (orig_rrdly
+ rrdly
+ 1) % 32;
1818 sdr_set_field(MSDC_PAD_TUNE
, MSDC_PAD_TUNE_CMDRRDLY
, cur_rrdly
);
1819 }while (++rrdly
< 32);
1824 /* Support SD2.0 Only */
1825 static int msdc_tune_bread(struct mmc_host
*mmc
, struct mmc_request
*mrq
)
1827 struct msdc_host
*host
= mmc_priv(mmc
);
1828 u32 base
= host
->base
;
1831 u32 rxdly
, cur_rxdly0
, cur_rxdly1
;
1832 u32 dsmpl
, cur_dsmpl
, orig_dsmpl
;
1833 u32 cur_dat0
, cur_dat1
, cur_dat2
, cur_dat3
;
1834 u32 cur_dat4
, cur_dat5
, cur_dat6
, cur_dat7
;
1835 u32 orig_dat0
, orig_dat1
, orig_dat2
, orig_dat3
;
1836 u32 orig_dat4
, orig_dat5
, orig_dat6
, orig_dat7
;
1840 sdr_get_field(MSDC_IOCON
, MSDC_IOCON_DSPL
, orig_dsmpl
);
1842 /* Tune Method 2. */
1843 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_DDLSEL
, 1);
1847 for (dsmpl
= 0; dsmpl
< 2; dsmpl
++) {
1848 cur_dsmpl
= (orig_dsmpl
+ dsmpl
) % 2;
1853 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_DSPL
, cur_dsmpl
);
1855 if (host
->app_cmd
) {
1856 result
= msdc_app_cmd(host
->mmc
, host
);
1858 ERR_MSG("TUNE_BREAD app_cmd<%d> failed", host
->mrq
->cmd
->opcode
);
1862 result
= msdc_do_request(mmc
,mrq
);
1864 sdr_get_field(SDC_DCRC_STS
, SDC_DCRC_STS_POS
|SDC_DCRC_STS_NEG
, dcrc
); /* RO */
1865 if (!ddr
) dcrc
&= ~SDC_DCRC_STS_NEG
;
1866 ERR_MSG("TUNE_BREAD<%s> dcrc<0x%x> DATRDDLY0/1<0x%x><0x%x> dsmpl<0x%x>",
1867 (result
== 0 && dcrc
== 0) ? "PASS" : "FAIL", dcrc
,
1868 sdr_read32(MSDC_DAT_RDDLY0
), sdr_read32(MSDC_DAT_RDDLY1
), cur_dsmpl
);
1870 /* Fix me: result is 0, but dcrc is still exist */
1871 if (result
== 0 && dcrc
== 0) {
1874 /* there is a case: command timeout, and data phase not processed */
1875 if (mrq
->data
->error
!= 0 && mrq
->data
->error
!= (unsigned int)(-EIO
)) {
1876 ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>",
1877 result
, mrq
->cmd
->error
, mrq
->data
->error
);
1883 cur_rxdly0
= sdr_read32(MSDC_DAT_RDDLY0
);
1884 cur_rxdly1
= sdr_read32(MSDC_DAT_RDDLY1
);
1886 /* E1 ECO. YD: Reverse */
1887 if (sdr_read32(MSDC_ECO_VER
) >= 4) {
1888 orig_dat0
= (cur_rxdly0
>> 24) & 0x1F;
1889 orig_dat1
= (cur_rxdly0
>> 16) & 0x1F;
1890 orig_dat2
= (cur_rxdly0
>> 8) & 0x1F;
1891 orig_dat3
= (cur_rxdly0
>> 0) & 0x1F;
1892 orig_dat4
= (cur_rxdly1
>> 24) & 0x1F;
1893 orig_dat5
= (cur_rxdly1
>> 16) & 0x1F;
1894 orig_dat6
= (cur_rxdly1
>> 8) & 0x1F;
1895 orig_dat7
= (cur_rxdly1
>> 0) & 0x1F;
1897 orig_dat0
= (cur_rxdly0
>> 0) & 0x1F;
1898 orig_dat1
= (cur_rxdly0
>> 8) & 0x1F;
1899 orig_dat2
= (cur_rxdly0
>> 16) & 0x1F;
1900 orig_dat3
= (cur_rxdly0
>> 24) & 0x1F;
1901 orig_dat4
= (cur_rxdly1
>> 0) & 0x1F;
1902 orig_dat5
= (cur_rxdly1
>> 8) & 0x1F;
1903 orig_dat6
= (cur_rxdly1
>> 16) & 0x1F;
1904 orig_dat7
= (cur_rxdly1
>> 24) & 0x1F;
1908 cur_dat0
= (dcrc
& (1 << 0) || dcrc
& (1 << 8)) ? ((orig_dat0
+ 1) % 32) : orig_dat0
;
1909 cur_dat1
= (dcrc
& (1 << 1) || dcrc
& (1 << 9)) ? ((orig_dat1
+ 1) % 32) : orig_dat1
;
1910 cur_dat2
= (dcrc
& (1 << 2) || dcrc
& (1 << 10)) ? ((orig_dat2
+ 1) % 32) : orig_dat2
;
1911 cur_dat3
= (dcrc
& (1 << 3) || dcrc
& (1 << 11)) ? ((orig_dat3
+ 1) % 32) : orig_dat3
;
1913 cur_dat0
= (dcrc
& (1 << 0)) ? ((orig_dat0
+ 1) % 32) : orig_dat0
;
1914 cur_dat1
= (dcrc
& (1 << 1)) ? ((orig_dat1
+ 1) % 32) : orig_dat1
;
1915 cur_dat2
= (dcrc
& (1 << 2)) ? ((orig_dat2
+ 1) % 32) : orig_dat2
;
1916 cur_dat3
= (dcrc
& (1 << 3)) ? ((orig_dat3
+ 1) % 32) : orig_dat3
;
1918 cur_dat4
= (dcrc
& (1 << 4)) ? ((orig_dat4
+ 1) % 32) : orig_dat4
;
1919 cur_dat5
= (dcrc
& (1 << 5)) ? ((orig_dat5
+ 1) % 32) : orig_dat5
;
1920 cur_dat6
= (dcrc
& (1 << 6)) ? ((orig_dat6
+ 1) % 32) : orig_dat6
;
1921 cur_dat7
= (dcrc
& (1 << 7)) ? ((orig_dat7
+ 1) % 32) : orig_dat7
;
1923 cur_rxdly0
= (cur_dat0
<< 24) | (cur_dat1
<< 16) | (cur_dat2
<< 8) | (cur_dat3
<< 0);
1924 cur_rxdly1
= (cur_dat4
<< 24) | (cur_dat5
<< 16) | (cur_dat6
<< 8) | (cur_dat7
<< 0);
1926 sdr_write32(MSDC_DAT_RDDLY0
, cur_rxdly0
);
1927 sdr_write32(MSDC_DAT_RDDLY1
, cur_rxdly1
);
1929 } while (++rxdly
< 32);
1935 static int msdc_tune_bwrite(struct mmc_host
*mmc
,struct mmc_request
*mrq
)
1937 struct msdc_host
*host
= mmc_priv(mmc
);
1938 u32 base
= host
->base
;
1940 u32 wrrdly
, cur_wrrdly
= 0xffffffff, orig_wrrdly
;
1941 u32 dsmpl
, cur_dsmpl
, orig_dsmpl
;
1942 u32 rxdly
, cur_rxdly0
;
1943 u32 orig_dat0
, orig_dat1
, orig_dat2
, orig_dat3
;
1944 u32 cur_dat0
, cur_dat1
, cur_dat2
, cur_dat3
;
1948 // MSDC_IOCON_DDR50CKD need to check. [Fix me]
1950 sdr_get_field(MSDC_PAD_TUNE
, MSDC_PAD_TUNE_DATWRDLY
, orig_wrrdly
);
1951 sdr_get_field(MSDC_IOCON
, MSDC_IOCON_DSPL
, orig_dsmpl
);
1953 /* Tune Method 2. just DAT0 */
1954 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_DDLSEL
, 1);
1955 cur_rxdly0
= sdr_read32(MSDC_DAT_RDDLY0
);
1957 /* E1 ECO. YD: Reverse */
1958 if (sdr_read32(MSDC_ECO_VER
) >= 4) {
1959 orig_dat0
= (cur_rxdly0
>> 24) & 0x1F;
1960 orig_dat1
= (cur_rxdly0
>> 16) & 0x1F;
1961 orig_dat2
= (cur_rxdly0
>> 8) & 0x1F;
1962 orig_dat3
= (cur_rxdly0
>> 0) & 0x1F;
1964 orig_dat0
= (cur_rxdly0
>> 0) & 0x1F;
1965 orig_dat1
= (cur_rxdly0
>> 8) & 0x1F;
1966 orig_dat2
= (cur_rxdly0
>> 16) & 0x1F;
1967 orig_dat3
= (cur_rxdly0
>> 24) & 0x1F;
1974 for (dsmpl
= 0; dsmpl
< 2; dsmpl
++) {
1975 cur_dsmpl
= (orig_dsmpl
+ dsmpl
) % 2;
1980 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_DSPL
, cur_dsmpl
);
1982 if (host
->app_cmd
) {
1983 result
= msdc_app_cmd(host
->mmc
, host
);
1985 ERR_MSG("TUNE_BWRITE app_cmd<%d> failed", host
->mrq
->cmd
->opcode
);
1989 result
= msdc_do_request(mmc
,mrq
);
1991 ERR_MSG("TUNE_BWRITE<%s> DSPL<%d> DATWRDLY<%d> MSDC_DAT_RDDLY0<0x%x>",
1992 result
== 0 ? "PASS" : "FAIL",
1993 cur_dsmpl
, cur_wrrdly
, cur_rxdly0
);
1999 /* there is a case: command timeout, and data phase not processed */
2000 if (mrq
->data
->error
!= (unsigned int)(-EIO
)) {
2001 ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>",
2002 result
, mrq
->cmd
->error
, mrq
->data
->error
);
2007 cur_wrrdly
= (orig_wrrdly
+ wrrdly
+ 1) % 32;
2008 sdr_set_field(MSDC_PAD_TUNE
, MSDC_PAD_TUNE_DATWRDLY
, cur_wrrdly
);
2009 } while (++wrrdly
< 32);
2011 cur_dat0
= (orig_dat0
+ rxdly
) % 32; /* only adjust bit-1 for crc */
2012 cur_dat1
= orig_dat1
;
2013 cur_dat2
= orig_dat2
;
2014 cur_dat3
= orig_dat3
;
2016 cur_rxdly0
= (cur_dat0
<< 24) | (cur_dat1
<< 16) | (cur_dat2
<< 8) | (cur_dat3
<< 0);
2017 sdr_write32(MSDC_DAT_RDDLY0
, cur_rxdly0
);
2018 } while (++rxdly
< 32);
2024 static int msdc_get_card_status(struct mmc_host
*mmc
, struct msdc_host
*host
, u32
*status
)
2026 struct mmc_command cmd
;
2027 struct mmc_request mrq
;
2030 memset(&cmd
, 0, sizeof(struct mmc_command
));
2031 cmd
.opcode
= MMC_SEND_STATUS
;
2033 cmd
.arg
= mmc
->card
->rca
<< 16;
2035 ERR_MSG("cmd13 mmc card is null");
2036 cmd
.arg
= host
->app_cmd_arg
;
2038 cmd
.flags
= MMC_RSP_SPI_R2
| MMC_RSP_R1
| MMC_CMD_AC
;
2040 memset(&mrq
, 0, sizeof(struct mmc_request
));
2041 mrq
.cmd
= &cmd
; cmd
.mrq
= &mrq
;
2044 err
= msdc_do_command(host
, &cmd
, 1, CMD_TIMEOUT
);
2047 *status
= cmd
.resp
[0];
2053 static int msdc_check_busy(struct mmc_host
*mmc
, struct msdc_host
*host
)
2059 err
= msdc_get_card_status(mmc
, host
, &status
);
2060 if (err
) return err
;
2062 ERR_MSG("cmd<13> resp<0x%x>", status
);
2063 } while (R1_CURRENT_STATE(status
) == 7);
2068 /* failed when msdc_do_request */
2069 static int msdc_tune_request(struct mmc_host
*mmc
, struct mmc_request
*mrq
)
2071 struct msdc_host
*host
= mmc_priv(mmc
);
2072 struct mmc_command
*cmd
;
2073 struct mmc_data
*data
;
2074 //u32 base = host->base;
2078 data
= mrq
->cmd
->data
;
2080 read
= data
->flags
& MMC_DATA_READ
? 1 : 0;
2083 if (data
->error
== (unsigned int)(-EIO
)) {
2084 ret
= msdc_tune_bread(mmc
,mrq
);
2087 ret
= msdc_check_busy(mmc
, host
);
2089 ERR_MSG("XXX cmd13 wait program done failed");
2093 /* Fix me: don't care card status? */
2094 ret
= msdc_tune_bwrite(mmc
,mrq
);
2101 static void msdc_ops_request(struct mmc_host
*mmc
,struct mmc_request
*mrq
)
2103 struct msdc_host
*host
= mmc_priv(mmc
);
2105 //=== for sdio profile ===
2106 #if 0 /* --- by chhung */
2107 u32 old_H32
, old_L32
, new_H32
, new_L32
;
2108 u32 ticks
= 0, opcode
= 0, sizes
= 0, bRx
= 0;
2109 #endif /* end of --- */
2112 ERR_MSG("XXX host->mrq<0x%.8x>", (int)host
->mrq
);
2116 if (!is_card_present(host
) || host
->power_mode
== MMC_POWER_OFF
) {
2117 ERR_MSG("cmd<%d> card<%d> power<%d>", mrq
->cmd
->opcode
, is_card_present(host
), host
->power_mode
);
2118 mrq
->cmd
->error
= (unsigned int)-ENOMEDIUM
;
2121 mrq
->done(mrq
); // call done directly.
2123 mrq
->cmd
->retries
= 0; // please don't retry.
2124 mmc_request_done(mmc
, mrq
);
2130 /* start to process */
2131 spin_lock(&host
->lock
);
2132 #if 0 /* --- by chhung */
2133 if (sdio_pro_enable
) { //=== for sdio profile ===
2134 if (mrq
->cmd
->opcode
== 52 || mrq
->cmd
->opcode
== 53) {
2135 GPT_GetCounter64(&old_L32
, &old_H32
);
2138 #endif /* end of --- */
2142 if (msdc_do_request(mmc
,mrq
)) {
2143 if(host
->hw
->flags
& MSDC_REMOVABLE
&& ralink_soc
== MT762X_SOC_MT7621AT
&& mrq
->data
&& mrq
->data
->error
) {
2144 msdc_tune_request(mmc
,mrq
);
2148 /* ==== when request done, check if app_cmd ==== */
2149 if (mrq
->cmd
->opcode
== MMC_APP_CMD
) {
2151 host
->app_cmd_arg
= mrq
->cmd
->arg
; /* save the RCA */
2154 //host->app_cmd_arg = 0;
2159 #if 0 /* --- by chhung */
2160 //=== for sdio profile ===
2161 if (sdio_pro_enable
) {
2162 if (mrq
->cmd
->opcode
== 52 || mrq
->cmd
->opcode
== 53) {
2163 GPT_GetCounter64(&new_L32
, &new_H32
);
2164 ticks
= msdc_time_calc(old_L32
, old_H32
, new_L32
, new_H32
);
2166 opcode
= mrq
->cmd
->opcode
;
2167 if (mrq
->cmd
->data
) {
2168 sizes
= mrq
->cmd
->data
->blocks
* mrq
->cmd
->data
->blksz
;
2169 bRx
= mrq
->cmd
->data
->flags
& MMC_DATA_READ
? 1 : 0 ;
2171 bRx
= mrq
->cmd
->arg
& 0x80000000 ? 1 : 0;
2174 if (!mrq
->cmd
->error
) {
2175 msdc_performance(opcode
, sizes
, bRx
, ticks
);
2179 #endif /* end of --- */
2180 spin_unlock(&host
->lock
);
2182 mmc_request_done(mmc
, mrq
);
2187 /* called by ops.set_ios */
2188 static void msdc_set_buswidth(struct msdc_host
*host
, u32 width
)
2190 u32 base
= host
->base
;
2191 u32 val
= sdr_read32(SDC_CFG
);
2193 val
&= ~SDC_CFG_BUSWIDTH
;
2197 case MMC_BUS_WIDTH_1
:
2199 val
|= (MSDC_BUS_1BITS
<< 16);
2201 case MMC_BUS_WIDTH_4
:
2202 val
|= (MSDC_BUS_4BITS
<< 16);
2204 case MMC_BUS_WIDTH_8
:
2205 val
|= (MSDC_BUS_8BITS
<< 16);
2209 sdr_write32(SDC_CFG
, val
);
2211 N_MSG(CFG
, "Bus Width = %d", width
);
2215 static void msdc_ops_set_ios(struct mmc_host
*mmc
, struct mmc_ios
*ios
)
2217 struct msdc_host
*host
= mmc_priv(mmc
);
2218 struct msdc_hw
*hw
=host
->hw
;
2219 u32 base
= host
->base
;
2222 #ifdef MT6575_SD_DEBUG
2223 static char *vdd
[] = {
2224 "1.50v", "1.55v", "1.60v", "1.65v", "1.70v", "1.80v", "1.90v",
2225 "2.00v", "2.10v", "2.20v", "2.30v", "2.40v", "2.50v", "2.60v",
2226 "2.70v", "2.80v", "2.90v", "3.00v", "3.10v", "3.20v", "3.30v",
2227 "3.40v", "3.50v", "3.60v"
2229 static char *power_mode
[] = {
2232 static char *bus_mode
[] = {
2233 "UNKNOWN", "OPENDRAIN", "PUSHPULL"
2235 static char *timing
[] = {
2236 "LEGACY", "MMC_HS", "SD_HS"
2239 printk("SET_IOS: CLK(%dkHz), BUS(%s), BW(%u), PWR(%s), VDD(%s), TIMING(%s)",
2240 ios
->clock
/ 1000, bus_mode
[ios
->bus_mode
],
2241 (ios
->bus_width
== MMC_BUS_WIDTH_4
) ? 4 : 1,
2242 power_mode
[ios
->power_mode
], vdd
[ios
->vdd
], timing
[ios
->timing
]);
2245 msdc_set_buswidth(host
, ios
->bus_width
);
2247 /* Power control ??? */
2248 switch (ios
->power_mode
) {
2251 // msdc_set_power_mode(host, ios->power_mode); /* --- by chhung */
2254 host
->power_mode
= MMC_POWER_ON
;
2261 if (host
->mclk
!= ios
->clock
) {
2262 if(ios
->clock
> 25000000) {
2263 //if (!(host->hw->flags & MSDC_REMOVABLE)) {
2264 INIT_MSG("SD data latch edge<%d>", hw
->data_edge
);
2265 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_RSPL
, hw
->cmd_edge
);
2266 sdr_set_field(MSDC_IOCON
, MSDC_IOCON_DSPL
, hw
->data_edge
);
2267 //} /* for tuning debug */
2268 } else { /* default value */
2269 sdr_write32(MSDC_IOCON
, 0x00000000);
2270 // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000);
2271 sdr_write32(MSDC_DAT_RDDLY0
, 0x10101010); // for MT7620 E2 and afterward
2272 sdr_write32(MSDC_DAT_RDDLY1
, 0x00000000);
2273 // sdr_write32(MSDC_PAD_TUNE, 0x00000000);
2274 sdr_write32(MSDC_PAD_TUNE
, 0x84101010); // for MT7620 E2 and afterward
2276 msdc_set_mclk(host
, ddr
, ios
->clock
);
2281 static int msdc_ops_get_ro(struct mmc_host
*mmc
)
2283 struct msdc_host
*host
= mmc_priv(mmc
);
2284 u32 base
= host
->base
;
2285 unsigned long flags
;
2288 if (host
->hw
->flags
& MSDC_WP_PIN_EN
) { /* set for card */
2289 spin_lock_irqsave(&host
->lock
, flags
);
2290 ro
= (sdr_read32(MSDC_PS
) >> 31);
2291 spin_unlock_irqrestore(&host
->lock
, flags
);
2297 static int msdc_ops_get_cd(struct mmc_host
*mmc
)
2299 struct msdc_host
*host
= mmc_priv(mmc
);
2300 u32 base
= host
->base
;
2301 unsigned long flags
;
2304 /* for sdio, MSDC_REMOVABLE not set, always return 1 */
2305 if (!(host
->hw
->flags
& MSDC_REMOVABLE
)) {
2306 /* For sdio, read H/W always get<1>, but may timeout some times */
2308 host
->card_inserted
= 1;
2311 host
->card_inserted
= (host
->pm_state
.event
== PM_EVENT_USER_RESUME
) ? 1 : 0;
2312 INIT_MSG("sdio ops_get_cd<%d>", host
->card_inserted
);
2313 return host
->card_inserted
;
2317 /* MSDC_CD_PIN_EN set for card */
2318 if (host
->hw
->flags
& MSDC_CD_PIN_EN
) {
2319 spin_lock_irqsave(&host
->lock
, flags
);
2321 present
= host
->card_inserted
; /* why not read from H/W: Fix me*/
2325 present
= (sdr_read32(MSDC_PS
) & MSDC_PS_CDSTS
) ? 0 : 1;
2327 present
= (sdr_read32(MSDC_PS
) & MSDC_PS_CDSTS
) ? 1 : 0;
2328 if (host
->mmc
->caps
& MMC_CAP_NEEDS_POLL
)
2330 host
->card_inserted
= present
;
2332 spin_unlock_irqrestore(&host
->lock
, flags
);
2334 present
= 0; /* TODO? Check DAT3 pins for card detection */
2337 INIT_MSG("ops_get_cd return<%d>", present
);
2341 /* ops.enable_sdio_irq */
2342 static void msdc_ops_enable_sdio_irq(struct mmc_host
*mmc
, int enable
)
2344 struct msdc_host
*host
= mmc_priv(mmc
);
2345 struct msdc_hw
*hw
= host
->hw
;
2346 u32 base
= host
->base
;
2349 if (hw
->flags
& MSDC_EXT_SDIO_IRQ
) { /* yes for sdio */
2351 hw
->enable_sdio_eirq(); /* combo_sdio_enable_eirq */
2353 hw
->disable_sdio_eirq(); /* combo_sdio_disable_eirq */
2356 ERR_MSG("XXX "); /* so never enter here */
2357 tmp
= sdr_read32(SDC_CFG
);
2358 /* FIXME. Need to interrupt gap detection */
2360 tmp
|= (SDC_CFG_SDIOIDE
| SDC_CFG_SDIOINTWKUP
);
2362 tmp
&= ~(SDC_CFG_SDIOIDE
| SDC_CFG_SDIOINTWKUP
);
2364 sdr_write32(SDC_CFG
, tmp
);
2368 static struct mmc_host_ops mt_msdc_ops
= {
2369 .request
= msdc_ops_request
,
2370 .set_ios
= msdc_ops_set_ios
,
2371 .get_ro
= msdc_ops_get_ro
,
2372 .get_cd
= msdc_ops_get_cd
,
2373 .enable_sdio_irq
= msdc_ops_enable_sdio_irq
,
2376 /*--------------------------------------------------------------------------*/
2377 /* interrupt handler */
2378 /*--------------------------------------------------------------------------*/
2379 static irqreturn_t
msdc_irq(int irq
, void *dev_id
)
2381 struct msdc_host
*host
= (struct msdc_host
*)dev_id
;
2382 struct mmc_data
*data
= host
->data
;
2383 struct mmc_command
*cmd
= host
->cmd
;
2384 u32 base
= host
->base
;
2386 u32 cmdsts
= MSDC_INT_RSPCRCERR
| MSDC_INT_CMDTMO
| MSDC_INT_CMDRDY
|
2387 MSDC_INT_ACMDCRCERR
| MSDC_INT_ACMDTMO
| MSDC_INT_ACMDRDY
|
2388 MSDC_INT_ACMD19_DONE
;
2389 u32 datsts
= MSDC_INT_DATCRCERR
|MSDC_INT_DATTMO
;
2391 u32 intsts
= sdr_read32(MSDC_INT
);
2392 u32 inten
= sdr_read32(MSDC_INTEN
); inten
&= intsts
;
2394 sdr_write32(MSDC_INT
, intsts
); /* clear interrupts */
2395 /* MSG will cause fatal error */
2397 /* card change interrupt */
2398 if (intsts
& MSDC_INT_CDSC
){
2401 IRQ_MSG("MSDC_INT_CDSC irq<0x%.8x>", intsts
);
2402 #if 0 /* ---/+++ by chhung: fix slot mechanical bounce issue */
2403 tasklet_hi_schedule(&host
->card_tasklet
);
2405 schedule_delayed_work(&host
->card_delaywork
, HZ
);
2407 /* tuning when plug card ? */
2410 /* sdio interrupt */
2411 if (intsts
& MSDC_INT_SDIOIRQ
){
2412 IRQ_MSG("XXX MSDC_INT_SDIOIRQ"); /* seems not sdio irq */
2413 //mmc_signal_sdio_irq(host->mmc);
2416 /* transfer complete interrupt */
2418 if (inten
& MSDC_INT_XFER_COMPL
) {
2419 data
->bytes_xfered
= host
->dma
.xfersz
;
2420 complete(&host
->xfer_done
);
2423 if (intsts
& datsts
) {
2424 /* do basic reset, or stop command will sdc_busy */
2428 atomic_set(&host
->abort
, 1); /* For PIO mode exit */
2430 if (intsts
& MSDC_INT_DATTMO
){
2431 IRQ_MSG("XXX CMD<%d> MSDC_INT_DATTMO", host
->mrq
->cmd
->opcode
);
2432 data
->error
= (unsigned int)-ETIMEDOUT
;
2434 else if (intsts
& MSDC_INT_DATCRCERR
){
2435 IRQ_MSG("XXX CMD<%d> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", host
->mrq
->cmd
->opcode
, sdr_read32(SDC_DCRC_STS
));
2436 data
->error
= (unsigned int)-EIO
;
2439 //if(sdr_read32(MSDC_INTEN) & MSDC_INT_XFER_COMPL) {
2440 if (host
->dma_xfer
) {
2441 complete(&host
->xfer_done
); /* Read CRC come fast, XFER_COMPL not enabled */
2442 } /* PIO mode can't do complete, because not init */
2446 /* command interrupts */
2447 if ((cmd
!= NULL
) && (intsts
& cmdsts
)) {
2448 if ((intsts
& MSDC_INT_CMDRDY
) || (intsts
& MSDC_INT_ACMDRDY
) ||
2449 (intsts
& MSDC_INT_ACMD19_DONE
)) {
2450 u32
*rsp
= &cmd
->resp
[0];
2452 switch (host
->cmd_rsp
) {
2456 *rsp
++ = sdr_read32(SDC_RESP3
); *rsp
++ = sdr_read32(SDC_RESP2
);
2457 *rsp
++ = sdr_read32(SDC_RESP1
); *rsp
++ = sdr_read32(SDC_RESP0
);
2459 default: /* Response types 1, 3, 4, 5, 6, 7(1b) */
2460 if ((intsts
& MSDC_INT_ACMDRDY
) || (intsts
& MSDC_INT_ACMD19_DONE
)) {
2461 *rsp
= sdr_read32(SDC_ACMD_RESP
);
2463 *rsp
= sdr_read32(SDC_RESP0
);
2467 } else if ((intsts
& MSDC_INT_RSPCRCERR
) || (intsts
& MSDC_INT_ACMDCRCERR
)) {
2468 if(intsts
& MSDC_INT_ACMDCRCERR
){
2469 IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDCRCERR",cmd
->opcode
);
2472 IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR",cmd
->opcode
);
2474 cmd
->error
= (unsigned int)-EIO
;
2475 } else if ((intsts
& MSDC_INT_CMDTMO
) || (intsts
& MSDC_INT_ACMDTMO
)) {
2476 if(intsts
& MSDC_INT_ACMDTMO
){
2477 IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDTMO",cmd
->opcode
);
2480 IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO",cmd
->opcode
);
2482 cmd
->error
= (unsigned int)-ETIMEDOUT
;
2487 complete(&host
->cmd_done
);
2490 /* mmc irq interrupts */
2491 if (intsts
& MSDC_INT_MMCIRQ
) {
2492 printk(KERN_INFO
"msdc[%d] MMCIRQ: SDC_CSTS=0x%.8x\r\n", host
->id
, sdr_read32(SDC_CSTS
));
2495 #ifdef MT6575_SD_DEBUG
2497 msdc_int_reg
*int_reg
= (msdc_int_reg
*)&intsts
;
2498 N_MSG(INT
, "IRQ_EVT(0x%x): MMCIRQ(%d) CDSC(%d), ACRDY(%d), ACTMO(%d), ACCRE(%d) AC19DN(%d)",
2505 int_reg
->atocmd19done
);
2506 N_MSG(INT
, "IRQ_EVT(0x%x): SDIO(%d) CMDRDY(%d), CMDTMO(%d), RSPCRC(%d), CSTA(%d)",
2513 N_MSG(INT
, "IRQ_EVT(0x%x): XFCMP(%d) DXDONE(%d), DATTMO(%d), DATCRC(%d), DMAEMP(%d)",
2519 int_reg
->dmaqempty
);
2527 /*--------------------------------------------------------------------------*/
2528 /* platform_driver members */
2529 /*--------------------------------------------------------------------------*/
2530 /* called by msdc_drv_probe/remove */
2531 static void msdc_enable_cd_irq(struct msdc_host
*host
, int enable
)
2533 struct msdc_hw
*hw
= host
->hw
;
2534 u32 base
= host
->base
;
2536 /* for sdio, not set */
2537 if ((hw
->flags
& MSDC_CD_PIN_EN
) == 0) {
2538 /* Pull down card detection pin since it is not avaiable */
2540 if (hw->config_gpio_pin)
2541 hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN);
2543 sdr_clr_bits(MSDC_PS
, MSDC_PS_CDEN
);
2544 sdr_clr_bits(MSDC_INTEN
, MSDC_INTEN_CDSC
);
2545 sdr_clr_bits(SDC_CFG
, SDC_CFG_INSWKUP
);
2549 N_MSG(CFG
, "CD IRQ Eanable(%d)", enable
);
2552 if (hw
->enable_cd_eirq
) { /* not set, never enter */
2553 hw
->enable_cd_eirq();
2555 /* card detection circuit relies on the core power so that the core power
2556 * shouldn't be turned off. Here adds a reference count to keep
2557 * the core power alive.
2559 //msdc_vcore_on(host); //did in msdc_init_hw()
2561 if (hw
->config_gpio_pin
) /* NULL */
2562 hw
->config_gpio_pin(MSDC_CD_PIN
, GPIO_PULL_UP
);
2564 sdr_set_field(MSDC_PS
, MSDC_PS_CDDEBOUNCE
, DEFAULT_DEBOUNCE
);
2565 sdr_set_bits(MSDC_PS
, MSDC_PS_CDEN
);
2566 sdr_set_bits(MSDC_INTEN
, MSDC_INTEN_CDSC
);
2567 sdr_set_bits(SDC_CFG
, SDC_CFG_INSWKUP
); /* not in document! Fix me */
2570 if (hw
->disable_cd_eirq
) {
2571 hw
->disable_cd_eirq();
2573 if (hw
->config_gpio_pin
) /* NULL */
2574 hw
->config_gpio_pin(MSDC_CD_PIN
, GPIO_PULL_DOWN
);
2576 sdr_clr_bits(SDC_CFG
, SDC_CFG_INSWKUP
);
2577 sdr_clr_bits(MSDC_PS
, MSDC_PS_CDEN
);
2578 sdr_clr_bits(MSDC_INTEN
, MSDC_INTEN_CDSC
);
2580 /* Here decreases a reference count to core power since card
2581 * detection circuit is shutdown.
2583 //msdc_vcore_off(host);
2588 /* called by msdc_drv_probe */
2589 static void msdc_init_hw(struct msdc_host
*host
)
2591 u32 base
= host
->base
;
2592 struct msdc_hw
*hw
= host
->hw
;
2595 #if 0 /* --- by chhung */
2596 msdc_vcore_on(host
);
2597 msdc_pin_reset(host
, MSDC_PIN_PULL_UP
);
2598 msdc_select_clksrc(host
, hw
->clk_src
);
2599 enable_clock(PERI_MSDC0_PDN
+ host
->id
, "SD");
2601 #endif /* end of --- */
2602 /* Configure to MMC/SD mode */
2603 sdr_set_field(MSDC_CFG
, MSDC_CFG_MODE
, MSDC_SDMMC
);
2609 /* Disable card detection */
2610 sdr_clr_bits(MSDC_PS
, MSDC_PS_CDEN
);
2612 /* Disable and clear all interrupts */
2613 sdr_clr_bits(MSDC_INTEN
, sdr_read32(MSDC_INTEN
));
2614 sdr_write32(MSDC_INT
, sdr_read32(MSDC_INT
));
2617 /* reset tuning parameter */
2618 sdr_write32(MSDC_PAD_CTL0
, 0x00090000);
2619 sdr_write32(MSDC_PAD_CTL1
, 0x000A0000);
2620 sdr_write32(MSDC_PAD_CTL2
, 0x000A0000);
2621 // sdr_write32(MSDC_PAD_TUNE, 0x00000000);
2622 sdr_write32(MSDC_PAD_TUNE
, 0x84101010); // for MT7620 E2 and afterward
2623 // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000);
2624 sdr_write32(MSDC_DAT_RDDLY0
, 0x10101010); // for MT7620 E2 and afterward
2625 sdr_write32(MSDC_DAT_RDDLY1
, 0x00000000);
2626 sdr_write32(MSDC_IOCON
, 0x00000000);
2627 #if 0 // use MT7620 default value: 0x403c004f
2628 sdr_write32(MSDC_PATCH_BIT0
, 0x003C000F); /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/
2631 if (sdr_read32(MSDC_ECO_VER
) >= 4) {
2632 if (host
->id
== 1) {
2633 sdr_set_field(MSDC_PATCH_BIT1
, MSDC_PATCH_BIT1_WRDAT_CRCS
, 1);
2634 sdr_set_field(MSDC_PATCH_BIT1
, MSDC_PATCH_BIT1_CMD_RSP
, 1);
2636 /* internal clock: latch read data */
2637 sdr_set_bits(MSDC_PATCH_BIT0
, MSDC_PATCH_BIT_CKGEN_CK
);
2642 /* for safety, should clear SDC_CFG.SDIO_INT_DET_EN & set SDC_CFG.SDIO in
2643 pre-loader,uboot,kernel drivers. and SDC_CFG.SDIO_INT_DET_EN will be only
2644 set when kernel driver wants to use SDIO bus interrupt */
2645 /* Configure to enable SDIO mode. it's must otherwise sdio cmd5 failed */
2646 sdr_set_bits(SDC_CFG
, SDC_CFG_SDIO
);
2648 /* disable detect SDIO device interupt function */
2649 sdr_clr_bits(SDC_CFG
, SDC_CFG_SDIOIDE
);
2651 /* eneable SMT for glitch filter */
2652 sdr_set_bits(MSDC_PAD_CTL0
, MSDC_PAD_CTL0_CLKSMT
);
2653 sdr_set_bits(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDSMT
);
2654 sdr_set_bits(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATSMT
);
2657 /* set clk, cmd, dat pad driving */
2658 sdr_set_field(MSDC_PAD_CTL0
, MSDC_PAD_CTL0_CLKDRVN
, hw
->clk_drv
);
2659 sdr_set_field(MSDC_PAD_CTL0
, MSDC_PAD_CTL0_CLKDRVP
, hw
->clk_drv
);
2660 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDDRVN
, hw
->cmd_drv
);
2661 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDDRVP
, hw
->cmd_drv
);
2662 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATDRVN
, hw
->dat_drv
);
2663 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATDRVP
, hw
->dat_drv
);
2665 sdr_set_field(MSDC_PAD_CTL0
, MSDC_PAD_CTL0_CLKDRVN
, 0);
2666 sdr_set_field(MSDC_PAD_CTL0
, MSDC_PAD_CTL0_CLKDRVP
, 0);
2667 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDDRVN
, 0);
2668 sdr_set_field(MSDC_PAD_CTL1
, MSDC_PAD_CTL1_CMDDRVP
, 0);
2669 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATDRVN
, 0);
2670 sdr_set_field(MSDC_PAD_CTL2
, MSDC_PAD_CTL2_DATDRVP
, 0);
2673 /* set sampling edge */
2675 /* write crc timeout detection */
2676 sdr_set_field(MSDC_PATCH_BIT0
, 1 << 30, 1);
2678 /* Configure to default data timeout */
2679 sdr_set_field(SDC_CFG
, SDC_CFG_DTOC
, DEFAULT_DTOC
);
2681 msdc_set_buswidth(host
, MMC_BUS_WIDTH_1
);
2683 N_MSG(FUC
, "init hardware done!");
2686 /* called by msdc_drv_remove */
2687 static void msdc_deinit_hw(struct msdc_host
*host
)
2689 u32 base
= host
->base
;
2691 /* Disable and clear all interrupts */
2692 sdr_clr_bits(MSDC_INTEN
, sdr_read32(MSDC_INTEN
));
2693 sdr_write32(MSDC_INT
, sdr_read32(MSDC_INT
));
2695 /* Disable card detection */
2696 msdc_enable_cd_irq(host
, 0);
2697 // msdc_set_power_mode(host, MMC_POWER_OFF); /* make sure power down */ /* --- by chhung */
2700 /* init gpd and bd list in msdc_drv_probe */
2701 static void msdc_init_gpd_bd(struct msdc_host
*host
, struct msdc_dma
*dma
)
2703 gpd_t
*gpd
= dma
->gpd
;
2707 /* we just support one gpd */
2708 int bdlen
= MAX_BD_PER_GPD
;
2710 /* init the 2 gpd */
2711 memset(gpd
, 0, sizeof(gpd_t
) * 2);
2712 //gpd->next = (void *)virt_to_phys(gpd + 1); /* pointer to a null gpd, bug! kmalloc <-> virt_to_phys */
2713 //gpd->next = (dma->gpd_addr + 1); /* bug */
2714 gpd
->next
= (void *)((u32
)dma
->gpd_addr
+ sizeof(gpd_t
));
2717 gpd
->bdp
= 1; /* hwo, cs, bd pointer */
2718 //gpd->ptr = (void*)virt_to_phys(bd);
2719 gpd
->ptr
= (void *)dma
->bd_addr
; /* physical address */
2721 memset(bd
, 0, sizeof(bd_t
) * bdlen
);
2722 ptr
= bd
+ bdlen
- 1;
2723 //ptr->eol = 1; /* 0 or 1 [Fix me]*/
2728 prev
->next
= (void *)(dma
->bd_addr
+ sizeof(bd_t
) *(ptr
- bd
));
2733 static int msdc_drv_probe(struct platform_device
*pdev
)
2735 struct resource
*res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2737 struct mmc_host
*mmc
;
2738 struct resource
*mem
;
2739 struct msdc_host
*host
;
2743 pdev
->dev
.platform_data
= &msdc0_hw
;
2745 if (of_property_read_bool(pdev
->dev
.of_node
, "mtk,wp-en"))
2746 msdc0_hw
.flags
|= MSDC_WP_PIN_EN
;
2748 /* Allocate MMC host for this device */
2749 mmc
= mmc_alloc_host(sizeof(struct msdc_host
), &pdev
->dev
);
2750 if (!mmc
) return -ENOMEM
;
2752 hw
= (struct msdc_hw
*)pdev
->dev
.platform_data
;
2753 mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2754 irq
= platform_get_irq(pdev
, 0);
2756 //BUG_ON((!hw) || (!mem) || (irq < 0)); /* --- by chhung */
2758 base
= devm_ioremap_resource(&pdev
->dev
, res
);
2760 return PTR_ERR(base
);
2762 /* Set host parameters to mmc */
2763 mmc
->ops
= &mt_msdc_ops
;
2764 mmc
->f_min
= HOST_MIN_MCLK
;
2765 mmc
->f_max
= HOST_MAX_MCLK
;
2766 mmc
->ocr_avail
= MSDC_OCR_AVAIL
;
2768 /* For sd card: MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED,
2769 For sdio : MSDC_EXT_SDIO_IRQ | MSDC_HIGHSPEED */
2770 if (hw
->flags
& MSDC_HIGHSPEED
) {
2771 mmc
->caps
= MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
;
2773 if (hw
->data_pins
== 4) { /* current data_pins are all 4*/
2774 mmc
->caps
|= MMC_CAP_4_BIT_DATA
;
2775 } else if (hw
->data_pins
== 8) {
2776 mmc
->caps
|= MMC_CAP_8_BIT_DATA
;
2778 if ((hw
->flags
& MSDC_SDIO_IRQ
) || (hw
->flags
& MSDC_EXT_SDIO_IRQ
))
2779 mmc
->caps
|= MMC_CAP_SDIO_IRQ
; /* yes for sdio */
2781 cd_active_low
= !of_property_read_bool(pdev
->dev
.of_node
, "mediatek,cd-high");
2782 mtk_sw_poll
= of_property_read_bool(pdev
->dev
.of_node
, "mediatek,cd-poll");
2785 mmc
->caps
|= MMC_CAP_NEEDS_POLL
;
2787 /* MMC core transfer sizes tunable parameters */
2788 #if LINUX_VERSION_CODE > KERNEL_VERSION(3,10,0)
2789 mmc
->max_segs
= MAX_HW_SGMTS
;
2791 mmc
->max_hw_segs
= MAX_HW_SGMTS
;
2792 mmc
->max_phys_segs
= MAX_PHY_SGMTS
;
2794 mmc
->max_seg_size
= MAX_SGMT_SZ
;
2795 mmc
->max_blk_size
= HOST_MAX_BLKSZ
;
2796 mmc
->max_req_size
= MAX_REQ_SZ
;
2797 mmc
->max_blk_count
= mmc
->max_req_size
;
2799 host
= mmc_priv(mmc
);