1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2013 BayHub Technology Ltd.
5 * Authors: Peter Guo <peter.guo@bayhubtech.com>
6 * Adam Lee <adam.lee@canonical.com>
7 * Ernest Zhang <ernest.zhang@bayhubtech.com>
10 #include <linux/pci.h>
11 #include <linux/mmc/host.h>
12 #include <linux/mmc/mmc.h>
13 #include <linux/delay.h>
14 #include <linux/iopoll.h>
17 #include "sdhci-pci.h"
20 * O2Micro device registers
23 #define O2_SD_MISC_REG5 0x64
24 #define O2_SD_LD0_CTRL 0x68
25 #define O2_SD_DEV_CTRL 0x88
26 #define O2_SD_LOCK_WP 0xD3
27 #define O2_SD_TEST_REG 0xD4
28 #define O2_SD_FUNC_REG0 0xDC
29 #define O2_SD_MULTI_VCC3V 0xEE
30 #define O2_SD_CLKREQ 0xEC
31 #define O2_SD_CAPS 0xE0
32 #define O2_SD_ADMA1 0xE2
33 #define O2_SD_ADMA2 0xE7
34 #define O2_SD_INF_MOD 0xF1
35 #define O2_SD_MISC_CTRL4 0xFC
36 #define O2_SD_TUNING_CTRL 0x300
37 #define O2_SD_PLL_SETTING 0x304
38 #define O2_SD_MISC_SETTING 0x308
39 #define O2_SD_CLK_SETTING 0x328
40 #define O2_SD_CAP_REG2 0x330
41 #define O2_SD_CAP_REG0 0x334
42 #define O2_SD_UHS1_CAP_SETTING 0x33C
43 #define O2_SD_DELAY_CTRL 0x350
44 #define O2_SD_UHS2_L1_CTRL 0x35C
45 #define O2_SD_FUNC_REG3 0x3E0
46 #define O2_SD_FUNC_REG4 0x3E4
47 #define O2_SD_LED_ENABLE BIT(6)
48 #define O2_SD_FREG0_LEDOFF BIT(13)
49 #define O2_SD_FREG4_ENABLE_CLK_SET BIT(22)
51 #define O2_SD_VENDOR_SETTING 0x110
52 #define O2_SD_VENDOR_SETTING2 0x1C8
53 #define O2_SD_HW_TUNING_DISABLE BIT(4)
55 #define O2_PLL_DLL_WDT_CONTROL1 0x1CC
56 #define O2_PLL_FORCE_ACTIVE BIT(18)
57 #define O2_PLL_LOCK_STATUS BIT(14)
58 #define O2_PLL_SOFT_RESET BIT(12)
59 #define O2_DLL_LOCK_STATUS BIT(11)
61 #define O2_SD_DETECT_SETTING 0x324
63 static const u32 dmdn_table
[] = {0x2B1C0000,
64 0x2C1A0000, 0x371B0000, 0x35100000};
65 #define DMDN_SZ ARRAY_SIZE(dmdn_table)
71 static void sdhci_o2_wait_card_detect_stable(struct sdhci_host
*host
)
77 timeout
= ktime_add_ms(ktime_get(), 50);
79 bool timedout
= ktime_after(ktime_get(), timeout
);
81 scratch32
= sdhci_readl(host
, SDHCI_PRESENT_STATE
);
82 if ((scratch32
& SDHCI_CARD_PRESENT
) >> SDHCI_CARD_PRES_SHIFT
83 == (scratch32
& SDHCI_CD_LVL
) >> SDHCI_CD_LVL_SHIFT
)
87 pr_err("%s: Card Detect debounce never finished.\n",
88 mmc_hostname(host
->mmc
));
96 static void sdhci_o2_enable_internal_clock(struct sdhci_host
*host
)
102 /* PLL software reset */
103 scratch32
= sdhci_readl(host
, O2_PLL_DLL_WDT_CONTROL1
);
104 scratch32
|= O2_PLL_SOFT_RESET
;
105 sdhci_writel(host
, scratch32
, O2_PLL_DLL_WDT_CONTROL1
);
107 scratch32
&= ~(O2_PLL_SOFT_RESET
);
108 sdhci_writel(host
, scratch32
, O2_PLL_DLL_WDT_CONTROL1
);
110 /* PLL force active */
111 scratch32
|= O2_PLL_FORCE_ACTIVE
;
112 sdhci_writel(host
, scratch32
, O2_PLL_DLL_WDT_CONTROL1
);
115 timeout
= ktime_add_ms(ktime_get(), 20);
117 bool timedout
= ktime_after(ktime_get(), timeout
);
119 scratch
= sdhci_readw(host
, O2_PLL_DLL_WDT_CONTROL1
);
120 if (scratch
& O2_PLL_LOCK_STATUS
)
123 pr_err("%s: Internal clock never stabilised.\n",
124 mmc_hostname(host
->mmc
));
125 sdhci_dumpregs(host
);
131 /* Wait for card detect finish */
133 sdhci_o2_wait_card_detect_stable(host
);
136 /* Cancel PLL force active */
137 scratch32
= sdhci_readl(host
, O2_PLL_DLL_WDT_CONTROL1
);
138 scratch32
&= ~O2_PLL_FORCE_ACTIVE
;
139 sdhci_writel(host
, scratch32
, O2_PLL_DLL_WDT_CONTROL1
);
142 static int sdhci_o2_get_cd(struct mmc_host
*mmc
)
144 struct sdhci_host
*host
= mmc_priv(mmc
);
146 if (!(sdhci_readw(host
, O2_PLL_DLL_WDT_CONTROL1
) & O2_PLL_LOCK_STATUS
))
147 sdhci_o2_enable_internal_clock(host
);
149 return !!(sdhci_readl(host
, SDHCI_PRESENT_STATE
) & SDHCI_CARD_PRESENT
);
152 static void o2_pci_set_baseclk(struct sdhci_pci_chip
*chip
, u32 value
)
156 pci_read_config_dword(chip
->pdev
,
157 O2_SD_PLL_SETTING
, &scratch_32
);
159 scratch_32
&= 0x0000FFFF;
162 pci_write_config_dword(chip
->pdev
,
163 O2_SD_PLL_SETTING
, scratch_32
);
166 static u32
sdhci_o2_pll_dll_wdt_control(struct sdhci_host
*host
)
168 return sdhci_readl(host
, O2_PLL_DLL_WDT_CONTROL1
);
172 * This function is used to detect dll lock status.
173 * Since the dll lock status bit will toggle randomly
174 * with very short interval which needs to be polled
175 * as fast as possible. Set sleep_us as 1 microsecond.
177 static int sdhci_o2_wait_dll_detect_lock(struct sdhci_host
*host
)
181 return readx_poll_timeout(sdhci_o2_pll_dll_wdt_control
, host
,
182 scratch32
, !(scratch32
& O2_DLL_LOCK_STATUS
), 1, 1000000);
185 static void sdhci_o2_set_tuning_mode(struct sdhci_host
*host
)
189 /* enable hardware tuning */
190 reg
= sdhci_readw(host
, O2_SD_VENDOR_SETTING
);
191 reg
&= ~O2_SD_HW_TUNING_DISABLE
;
192 sdhci_writew(host
, reg
, O2_SD_VENDOR_SETTING
);
195 static void __sdhci_o2_execute_tuning(struct sdhci_host
*host
, u32 opcode
)
199 sdhci_send_tuning(host
, opcode
);
201 for (i
= 0; i
< 150; i
++) {
202 u16 ctrl
= sdhci_readw(host
, SDHCI_HOST_CONTROL2
);
204 if (!(ctrl
& SDHCI_CTRL_EXEC_TUNING
)) {
205 if (ctrl
& SDHCI_CTRL_TUNED_CLK
) {
206 host
->tuning_done
= true;
209 pr_warn("%s: HW tuning failed !\n",
210 mmc_hostname(host
->mmc
));
217 pr_info("%s: Tuning failed, falling back to fixed sampling clock\n",
218 mmc_hostname(host
->mmc
));
219 sdhci_reset_tuning(host
);
223 * This function is used to fix o2 dll shift issue.
224 * It isn't necessary to detect card present before recovery.
225 * Firstly, it is used by bht emmc card, which is embedded.
226 * Second, before call recovery card present will be detected
227 * outside of the execute tuning function.
229 static int sdhci_o2_dll_recovery(struct sdhci_host
*host
)
234 struct sdhci_pci_slot
*slot
= sdhci_priv(host
);
235 struct sdhci_pci_chip
*chip
= slot
->chip
;
236 struct o2_host
*o2_host
= sdhci_pci_priv(slot
);
239 pci_read_config_byte(chip
->pdev
,
240 O2_SD_LOCK_WP
, &scratch_8
);
242 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch_8
);
243 while (o2_host
->dll_adjust_count
< DMDN_SZ
&& !ret
) {
245 sdhci_writeb(host
, 0, SDHCI_CLOCK_CONTROL
);
247 /* PLL software reset */
248 scratch_32
= sdhci_readl(host
, O2_PLL_DLL_WDT_CONTROL1
);
249 scratch_32
|= O2_PLL_SOFT_RESET
;
250 sdhci_writel(host
, scratch_32
, O2_PLL_DLL_WDT_CONTROL1
);
252 pci_read_config_dword(chip
->pdev
,
255 /* Enable Base Clk setting change */
256 scratch_32
|= O2_SD_FREG4_ENABLE_CLK_SET
;
257 pci_write_config_dword(chip
->pdev
, O2_SD_FUNC_REG4
, scratch_32
);
258 o2_pci_set_baseclk(chip
, dmdn_table
[o2_host
->dll_adjust_count
]);
260 /* Enable internal clock */
261 scratch_8
= SDHCI_CLOCK_INT_EN
;
262 sdhci_writeb(host
, scratch_8
, SDHCI_CLOCK_CONTROL
);
264 if (sdhci_o2_get_cd(host
->mmc
)) {
266 * need wait at least 5ms for dll status stable,
267 * after enable internal clock
269 usleep_range(5000, 6000);
270 if (sdhci_o2_wait_dll_detect_lock(host
)) {
271 scratch_8
|= SDHCI_CLOCK_CARD_EN
;
272 sdhci_writeb(host
, scratch_8
,
273 SDHCI_CLOCK_CONTROL
);
276 pr_warn("%s: DLL unlocked when dll_adjust_count is %d.\n",
277 mmc_hostname(host
->mmc
),
278 o2_host
->dll_adjust_count
);
281 pr_err("%s: card present detect failed.\n",
282 mmc_hostname(host
->mmc
));
286 o2_host
->dll_adjust_count
++;
288 if (!ret
&& o2_host
->dll_adjust_count
== DMDN_SZ
)
289 pr_err("%s: DLL adjust over max times\n",
290 mmc_hostname(host
->mmc
));
292 pci_read_config_byte(chip
->pdev
,
293 O2_SD_LOCK_WP
, &scratch_8
);
295 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch_8
);
299 static int sdhci_o2_execute_tuning(struct mmc_host
*mmc
, u32 opcode
)
301 struct sdhci_host
*host
= mmc_priv(mmc
);
302 int current_bus_width
= 0;
305 * This handler only implements the eMMC tuning that is specific to
306 * this controller. Fall back to the standard method for other TIMING.
308 if ((host
->timing
!= MMC_TIMING_MMC_HS200
) &&
309 (host
->timing
!= MMC_TIMING_UHS_SDR104
))
310 return sdhci_execute_tuning(mmc
, opcode
);
312 if (WARN_ON((opcode
!= MMC_SEND_TUNING_BLOCK_HS200
) &&
313 (opcode
!= MMC_SEND_TUNING_BLOCK
)))
316 * Judge the tuning reason, whether caused by dll shift
317 * If cause by dll shift, should call sdhci_o2_dll_recovery
319 if (!sdhci_o2_wait_dll_detect_lock(host
))
320 if (!sdhci_o2_dll_recovery(host
)) {
321 pr_err("%s: o2 dll recovery failed\n",
322 mmc_hostname(host
->mmc
));
326 * o2 sdhci host didn't support 8bit emmc tuning
328 if (mmc
->ios
.bus_width
== MMC_BUS_WIDTH_8
) {
329 current_bus_width
= mmc
->ios
.bus_width
;
330 mmc
->ios
.bus_width
= MMC_BUS_WIDTH_4
;
331 sdhci_set_bus_width(host
, MMC_BUS_WIDTH_4
);
334 sdhci_o2_set_tuning_mode(host
);
336 sdhci_start_tuning(host
);
338 __sdhci_o2_execute_tuning(host
, opcode
);
340 sdhci_end_tuning(host
);
342 if (current_bus_width
== MMC_BUS_WIDTH_8
) {
343 mmc
->ios
.bus_width
= MMC_BUS_WIDTH_8
;
344 sdhci_set_bus_width(host
, current_bus_width
);
347 sdhci_reset(host
, SDHCI_RESET_CMD
);
348 sdhci_reset(host
, SDHCI_RESET_DATA
);
350 host
->flags
&= ~SDHCI_HS400_TUNING
;
354 static void o2_pci_led_enable(struct sdhci_pci_chip
*chip
)
359 /* Set led of SD host function enable */
360 ret
= pci_read_config_dword(chip
->pdev
,
361 O2_SD_FUNC_REG0
, &scratch_32
);
365 scratch_32
&= ~O2_SD_FREG0_LEDOFF
;
366 pci_write_config_dword(chip
->pdev
,
367 O2_SD_FUNC_REG0
, scratch_32
);
369 ret
= pci_read_config_dword(chip
->pdev
,
370 O2_SD_TEST_REG
, &scratch_32
);
374 scratch_32
|= O2_SD_LED_ENABLE
;
375 pci_write_config_dword(chip
->pdev
,
376 O2_SD_TEST_REG
, scratch_32
);
379 static void sdhci_pci_o2_fujin2_pci_init(struct sdhci_pci_chip
*chip
)
383 /* Improve write performance for SD3.0 */
384 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_DEV_CTRL
, &scratch_32
);
387 scratch_32
&= ~((1 << 12) | (1 << 13) | (1 << 14));
388 pci_write_config_dword(chip
->pdev
, O2_SD_DEV_CTRL
, scratch_32
);
390 /* Enable Link abnormal reset generating Reset */
391 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_MISC_REG5
, &scratch_32
);
394 scratch_32
&= ~((1 << 19) | (1 << 11));
395 scratch_32
|= (1 << 10);
396 pci_write_config_dword(chip
->pdev
, O2_SD_MISC_REG5
, scratch_32
);
398 /* set card power over current protection */
399 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_TEST_REG
, &scratch_32
);
402 scratch_32
|= (1 << 4);
403 pci_write_config_dword(chip
->pdev
, O2_SD_TEST_REG
, scratch_32
);
405 /* adjust the output delay for SD mode */
406 pci_write_config_dword(chip
->pdev
, O2_SD_DELAY_CTRL
, 0x00002492);
408 /* Set the output voltage setting of Aux 1.2v LDO */
409 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_LD0_CTRL
, &scratch_32
);
412 scratch_32
&= ~(3 << 12);
413 pci_write_config_dword(chip
->pdev
, O2_SD_LD0_CTRL
, scratch_32
);
415 /* Set Max power supply capability of SD host */
416 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_CAP_REG0
, &scratch_32
);
419 scratch_32
&= ~(0x01FE);
420 scratch_32
|= 0x00CC;
421 pci_write_config_dword(chip
->pdev
, O2_SD_CAP_REG0
, scratch_32
);
422 /* Set DLL Tuning Window */
423 ret
= pci_read_config_dword(chip
->pdev
,
424 O2_SD_TUNING_CTRL
, &scratch_32
);
427 scratch_32
&= ~(0x000000FF);
428 scratch_32
|= 0x00000066;
429 pci_write_config_dword(chip
->pdev
, O2_SD_TUNING_CTRL
, scratch_32
);
431 /* Set UHS2 T_EIDLE */
432 ret
= pci_read_config_dword(chip
->pdev
,
433 O2_SD_UHS2_L1_CTRL
, &scratch_32
);
436 scratch_32
&= ~(0x000000FC);
437 scratch_32
|= 0x00000084;
438 pci_write_config_dword(chip
->pdev
, O2_SD_UHS2_L1_CTRL
, scratch_32
);
440 /* Set UHS2 Termination */
441 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_FUNC_REG3
, &scratch_32
);
444 scratch_32
&= ~((1 << 21) | (1 << 30));
446 pci_write_config_dword(chip
->pdev
, O2_SD_FUNC_REG3
, scratch_32
);
448 /* Set L1 Entrance Timer */
449 ret
= pci_read_config_dword(chip
->pdev
, O2_SD_CAPS
, &scratch_32
);
452 scratch_32
&= ~(0xf0000000);
453 scratch_32
|= 0x30000000;
454 pci_write_config_dword(chip
->pdev
, O2_SD_CAPS
, scratch_32
);
456 ret
= pci_read_config_dword(chip
->pdev
,
457 O2_SD_MISC_CTRL4
, &scratch_32
);
460 scratch_32
&= ~(0x000f0000);
461 scratch_32
|= 0x00080000;
462 pci_write_config_dword(chip
->pdev
, O2_SD_MISC_CTRL4
, scratch_32
);
465 static void sdhci_pci_o2_enable_msi(struct sdhci_pci_chip
*chip
,
466 struct sdhci_host
*host
)
470 ret
= pci_find_capability(chip
->pdev
, PCI_CAP_ID_MSI
);
472 pr_info("%s: unsupport msi, use INTx irq\n",
473 mmc_hostname(host
->mmc
));
477 ret
= pci_alloc_irq_vectors(chip
->pdev
, 1, 1,
478 PCI_IRQ_MSI
| PCI_IRQ_MSIX
);
480 pr_err("%s: enable PCI MSI failed, err=%d\n",
481 mmc_hostname(host
->mmc
), ret
);
485 host
->irq
= pci_irq_vector(chip
->pdev
, 0);
488 static void sdhci_o2_enable_clk(struct sdhci_host
*host
, u16 clk
)
490 /* Enable internal clock */
491 clk
|= SDHCI_CLOCK_INT_EN
;
492 sdhci_writew(host
, clk
, SDHCI_CLOCK_CONTROL
);
494 sdhci_o2_enable_internal_clock(host
);
495 if (sdhci_o2_get_cd(host
->mmc
)) {
496 clk
|= SDHCI_CLOCK_CARD_EN
;
497 sdhci_writew(host
, clk
, SDHCI_CLOCK_CONTROL
);
501 static void sdhci_pci_o2_set_clock(struct sdhci_host
*host
, unsigned int clock
)
506 struct sdhci_pci_slot
*slot
= sdhci_priv(host
);
507 struct sdhci_pci_chip
*chip
= slot
->chip
;
509 host
->mmc
->actual_clock
= 0;
511 sdhci_writew(host
, 0, SDHCI_CLOCK_CONTROL
);
516 if ((host
->timing
== MMC_TIMING_UHS_SDR104
) && (clock
== 200000000)) {
517 pci_read_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, &scratch
);
520 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
522 pci_read_config_dword(chip
->pdev
, O2_SD_PLL_SETTING
, &scratch_32
);
524 if ((scratch_32
& 0xFFFF0000) != 0x2c280000)
525 o2_pci_set_baseclk(chip
, 0x2c280000);
527 pci_read_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, &scratch
);
530 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
533 clk
= sdhci_calc_clk(host
, clock
, &host
->mmc
->actual_clock
);
534 sdhci_o2_enable_clk(host
, clk
);
537 static int sdhci_pci_o2_probe_slot(struct sdhci_pci_slot
*slot
)
539 struct sdhci_pci_chip
*chip
;
540 struct sdhci_host
*host
;
541 struct o2_host
*o2_host
= sdhci_pci_priv(slot
);
548 o2_host
->dll_adjust_count
= 0;
549 caps
= sdhci_readl(host
, SDHCI_CAPABILITIES
);
552 * mmc_select_bus_width() will test the bus to determine the actual bus
555 if (caps
& SDHCI_CAN_DO_8BIT
)
556 host
->mmc
->caps
|= MMC_CAP_8_BIT_DATA
;
558 switch (chip
->pdev
->device
) {
559 case PCI_DEVICE_ID_O2_SDS0
:
560 case PCI_DEVICE_ID_O2_SEABIRD0
:
561 case PCI_DEVICE_ID_O2_SEABIRD1
:
562 case PCI_DEVICE_ID_O2_SDS1
:
563 case PCI_DEVICE_ID_O2_FUJIN2
:
564 reg
= sdhci_readl(host
, O2_SD_VENDOR_SETTING
);
566 host
->quirks
|= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12
;
568 sdhci_pci_o2_enable_msi(chip
, host
);
570 if (chip
->pdev
->device
== PCI_DEVICE_ID_O2_SEABIRD0
) {
571 ret
= pci_read_config_dword(chip
->pdev
,
572 O2_SD_MISC_SETTING
, ®
);
575 if (reg
& (1 << 4)) {
576 pr_info("%s: emmc 1.8v flag is set, force 1.8v signaling voltage\n",
577 mmc_hostname(host
->mmc
));
578 host
->flags
&= ~SDHCI_SIGNALING_330
;
579 host
->flags
|= SDHCI_SIGNALING_180
;
580 host
->mmc
->caps2
|= MMC_CAP2_NO_SD
;
581 host
->mmc
->caps2
|= MMC_CAP2_NO_SDIO
;
582 pci_write_config_dword(chip
->pdev
,
583 O2_SD_DETECT_SETTING
, 3);
586 slot
->host
->mmc_host_ops
.get_cd
= sdhci_o2_get_cd
;
589 if (chip
->pdev
->device
== PCI_DEVICE_ID_O2_SEABIRD1
) {
590 slot
->host
->mmc_host_ops
.get_cd
= sdhci_o2_get_cd
;
591 host
->mmc
->caps2
|= MMC_CAP2_NO_SDIO
;
592 host
->quirks2
|= SDHCI_QUIRK2_PRESET_VALUE_BROKEN
;
595 host
->mmc_host_ops
.execute_tuning
= sdhci_o2_execute_tuning
;
597 if (chip
->pdev
->device
!= PCI_DEVICE_ID_O2_FUJIN2
)
599 /* set dll watch dog timer */
600 reg
= sdhci_readl(host
, O2_SD_VENDOR_SETTING2
);
602 sdhci_writel(host
, reg
, O2_SD_VENDOR_SETTING2
);
612 static int sdhci_pci_o2_probe(struct sdhci_pci_chip
*chip
)
618 switch (chip
->pdev
->device
) {
619 case PCI_DEVICE_ID_O2_8220
:
620 case PCI_DEVICE_ID_O2_8221
:
621 case PCI_DEVICE_ID_O2_8320
:
622 case PCI_DEVICE_ID_O2_8321
:
623 /* This extra setup is required due to broken ADMA. */
624 ret
= pci_read_config_byte(chip
->pdev
,
625 O2_SD_LOCK_WP
, &scratch
);
629 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
631 /* Set Multi 3 to VCC3V# */
632 pci_write_config_byte(chip
->pdev
, O2_SD_MULTI_VCC3V
, 0x08);
634 /* Disable CLK_REQ# support after media DET */
635 ret
= pci_read_config_byte(chip
->pdev
,
636 O2_SD_CLKREQ
, &scratch
);
640 pci_write_config_byte(chip
->pdev
, O2_SD_CLKREQ
, scratch
);
642 /* Choose capabilities, enable SDMA. We have to write 0x01
643 * to the capabilities register first to unlock it.
645 ret
= pci_read_config_byte(chip
->pdev
, O2_SD_CAPS
, &scratch
);
649 pci_write_config_byte(chip
->pdev
, O2_SD_CAPS
, scratch
);
650 pci_write_config_byte(chip
->pdev
, O2_SD_CAPS
, 0x73);
652 /* Disable ADMA1/2 */
653 pci_write_config_byte(chip
->pdev
, O2_SD_ADMA1
, 0x39);
654 pci_write_config_byte(chip
->pdev
, O2_SD_ADMA2
, 0x08);
656 /* Disable the infinite transfer mode */
657 ret
= pci_read_config_byte(chip
->pdev
,
658 O2_SD_INF_MOD
, &scratch
);
662 pci_write_config_byte(chip
->pdev
, O2_SD_INF_MOD
, scratch
);
665 ret
= pci_read_config_byte(chip
->pdev
,
666 O2_SD_LOCK_WP
, &scratch
);
670 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
672 case PCI_DEVICE_ID_O2_SDS0
:
673 case PCI_DEVICE_ID_O2_SDS1
:
674 case PCI_DEVICE_ID_O2_FUJIN2
:
676 ret
= pci_read_config_byte(chip
->pdev
,
677 O2_SD_LOCK_WP
, &scratch
);
682 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
684 /* DevId=8520 subId= 0x11 or 0x12 Type Chip support */
685 if (chip
->pdev
->device
== PCI_DEVICE_ID_O2_FUJIN2
) {
686 ret
= pci_read_config_dword(chip
->pdev
,
689 scratch_32
= ((scratch_32
& 0xFF000000) >> 24);
691 /* Check Whether subId is 0x11 or 0x12 */
692 if ((scratch_32
== 0x11) || (scratch_32
== 0x12)) {
693 scratch_32
= 0x25100000;
695 o2_pci_set_baseclk(chip
, scratch_32
);
696 ret
= pci_read_config_dword(chip
->pdev
,
700 /* Enable Base Clk setting change */
701 scratch_32
|= O2_SD_FREG4_ENABLE_CLK_SET
;
702 pci_write_config_dword(chip
->pdev
,
706 /* Set Tuning Window to 4 */
707 pci_write_config_byte(chip
->pdev
,
708 O2_SD_TUNING_CTRL
, 0x44);
714 /* Enable 8520 led function */
715 o2_pci_led_enable(chip
);
717 /* Set timeout CLK */
718 ret
= pci_read_config_dword(chip
->pdev
,
719 O2_SD_CLK_SETTING
, &scratch_32
);
723 scratch_32
&= ~(0xFF00);
724 scratch_32
|= 0x07E0C800;
725 pci_write_config_dword(chip
->pdev
,
726 O2_SD_CLK_SETTING
, scratch_32
);
728 ret
= pci_read_config_dword(chip
->pdev
,
729 O2_SD_CLKREQ
, &scratch_32
);
733 pci_write_config_dword(chip
->pdev
, O2_SD_CLKREQ
, scratch_32
);
735 ret
= pci_read_config_dword(chip
->pdev
,
736 O2_SD_PLL_SETTING
, &scratch_32
);
740 scratch_32
&= ~(0x1F3F070E);
741 scratch_32
|= 0x18270106;
742 pci_write_config_dword(chip
->pdev
,
743 O2_SD_PLL_SETTING
, scratch_32
);
745 /* Disable UHS1 funciton */
746 ret
= pci_read_config_dword(chip
->pdev
,
747 O2_SD_CAP_REG2
, &scratch_32
);
750 scratch_32
&= ~(0xE0);
751 pci_write_config_dword(chip
->pdev
,
752 O2_SD_CAP_REG2
, scratch_32
);
754 if (chip
->pdev
->device
== PCI_DEVICE_ID_O2_FUJIN2
)
755 sdhci_pci_o2_fujin2_pci_init(chip
);
758 ret
= pci_read_config_byte(chip
->pdev
,
759 O2_SD_LOCK_WP
, &scratch
);
763 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
765 case PCI_DEVICE_ID_O2_SEABIRD0
:
766 case PCI_DEVICE_ID_O2_SEABIRD1
:
768 ret
= pci_read_config_byte(chip
->pdev
,
769 O2_SD_LOCK_WP
, &scratch
);
774 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
776 ret
= pci_read_config_dword(chip
->pdev
,
777 O2_SD_PLL_SETTING
, &scratch_32
);
779 if ((scratch_32
& 0xff000000) == 0x01000000) {
780 scratch_32
&= 0x0000FFFF;
781 scratch_32
|= 0x1F340000;
783 pci_write_config_dword(chip
->pdev
,
784 O2_SD_PLL_SETTING
, scratch_32
);
786 scratch_32
&= 0x0000FFFF;
787 scratch_32
|= 0x25100000;
789 pci_write_config_dword(chip
->pdev
,
790 O2_SD_PLL_SETTING
, scratch_32
);
792 ret
= pci_read_config_dword(chip
->pdev
,
795 scratch_32
|= (1 << 22);
796 pci_write_config_dword(chip
->pdev
,
797 O2_SD_FUNC_REG4
, scratch_32
);
800 /* Set Tuning Windows to 5 */
801 pci_write_config_byte(chip
->pdev
,
802 O2_SD_TUNING_CTRL
, 0x55);
804 ret
= pci_read_config_byte(chip
->pdev
,
805 O2_SD_LOCK_WP
, &scratch
);
809 pci_write_config_byte(chip
->pdev
, O2_SD_LOCK_WP
, scratch
);
816 #ifdef CONFIG_PM_SLEEP
817 static int sdhci_pci_o2_resume(struct sdhci_pci_chip
*chip
)
819 sdhci_pci_o2_probe(chip
);
820 return sdhci_pci_resume_host(chip
);
824 static const struct sdhci_ops sdhci_pci_o2_ops
= {
825 .set_clock
= sdhci_pci_o2_set_clock
,
826 .enable_dma
= sdhci_pci_enable_dma
,
827 .set_bus_width
= sdhci_set_bus_width
,
828 .reset
= sdhci_reset
,
829 .set_uhs_signaling
= sdhci_set_uhs_signaling
,
832 const struct sdhci_pci_fixes sdhci_o2
= {
833 .probe
= sdhci_pci_o2_probe
,
834 .quirks
= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC
,
835 .quirks2
= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD
,
836 .probe_slot
= sdhci_pci_o2_probe_slot
,
837 #ifdef CONFIG_PM_SLEEP
838 .resume
= sdhci_pci_o2_resume
,
840 .ops
= &sdhci_pci_o2_ops
,
841 .priv_size
= sizeof(struct o2_host
),