@@ -27,6 +27,8 @@ enum dw_mci_exynos_type {
2727 DW_MCI_TYPE_EXYNOS5420_SMU ,
2828 DW_MCI_TYPE_EXYNOS7 ,
2929 DW_MCI_TYPE_EXYNOS7_SMU ,
30+ DW_MCI_TYPE_EXYNOS7870 ,
31+ DW_MCI_TYPE_EXYNOS7870_SMU ,
3032 DW_MCI_TYPE_ARTPEC8 ,
3133};
3234
@@ -69,6 +71,12 @@ static struct dw_mci_exynos_compatible {
6971 }, {
7072 .compatible = "samsung,exynos7-dw-mshc-smu" ,
7173 .ctrl_type = DW_MCI_TYPE_EXYNOS7_SMU ,
74+ }, {
75+ .compatible = "samsung,exynos7870-dw-mshc" ,
76+ .ctrl_type = DW_MCI_TYPE_EXYNOS7870 ,
77+ }, {
78+ .compatible = "samsung,exynos7870-dw-mshc-smu" ,
79+ .ctrl_type = DW_MCI_TYPE_EXYNOS7870_SMU ,
7280 }, {
7381 .compatible = "axis,artpec8-dw-mshc" ,
7482 .ctrl_type = DW_MCI_TYPE_ARTPEC8 ,
@@ -85,6 +93,8 @@ static inline u8 dw_mci_exynos_get_ciu_div(struct dw_mci *host)
8593 return EXYNOS4210_FIXED_CIU_CLK_DIV ;
8694 else if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
8795 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
96+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
97+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
8898 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
8999 return SDMMC_CLKSEL_GET_DIV (mci_readl (host , CLKSEL64 )) + 1 ;
90100 else
@@ -100,7 +110,8 @@ static void dw_mci_exynos_config_smu(struct dw_mci *host)
100110 * set for non-ecryption mode at this time.
101111 */
102112 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS5420_SMU ||
103- priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ) {
113+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
114+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ) {
104115 mci_writel (host , MPSBEGIN0 , 0 );
105116 mci_writel (host , MPSEND0 , SDMMC_ENDING_SEC_NR_MAX );
106117 mci_writel (host , MPSCTRL0 , SDMMC_MPSCTRL_SECURE_WRITE_BIT |
@@ -126,6 +137,12 @@ static int dw_mci_exynos_priv_init(struct dw_mci *host)
126137 DQS_CTRL_GET_RD_DELAY (priv -> saved_strobe_ctrl );
127138 }
128139
140+ if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
141+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ) {
142+ /* Quirk needed for certain Exynos SoCs */
143+ host -> quirks |= DW_MMC_QUIRK_FIFO64_32 ;
144+ }
145+
129146 if (priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 ) {
130147 /* Quirk needed for the ARTPEC-8 SoC */
131148 host -> quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT ;
@@ -143,6 +160,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
143160
144161 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
145162 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
163+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
164+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
146165 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
147166 clksel = mci_readl (host , CLKSEL64 );
148167 else
@@ -152,6 +171,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
152171
153172 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
154173 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
174+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
175+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
155176 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
156177 mci_writel (host , CLKSEL64 , clksel );
157178 else
@@ -222,6 +243,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev)
222243
223244 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
224245 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
246+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
247+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
225248 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
226249 clksel = mci_readl (host , CLKSEL64 );
227250 else
@@ -230,6 +253,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev)
230253 if (clksel & SDMMC_CLKSEL_WAKEUP_INT ) {
231254 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
232255 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
256+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
257+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
233258 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
234259 mci_writel (host , CLKSEL64 , clksel );
235260 else
@@ -409,6 +434,8 @@ static inline u8 dw_mci_exynos_get_clksmpl(struct dw_mci *host)
409434
410435 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
411436 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
437+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
438+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
412439 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
413440 return SDMMC_CLKSEL_CCLK_SAMPLE (mci_readl (host , CLKSEL64 ));
414441 else
@@ -422,13 +449,17 @@ static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample)
422449
423450 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
424451 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
452+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
453+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
425454 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
426455 clksel = mci_readl (host , CLKSEL64 );
427456 else
428457 clksel = mci_readl (host , CLKSEL );
429458 clksel = SDMMC_CLKSEL_UP_SAMPLE (clksel , sample );
430459 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
431460 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
461+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
462+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
432463 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
433464 mci_writel (host , CLKSEL64 , clksel );
434465 else
@@ -443,6 +474,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host)
443474
444475 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
445476 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
477+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
478+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
446479 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
447480 clksel = mci_readl (host , CLKSEL64 );
448481 else
@@ -453,6 +486,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host)
453486
454487 if (priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
455488 priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
489+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
490+ priv -> ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
456491 priv -> ctrl_type == DW_MCI_TYPE_ARTPEC8 )
457492 mci_writel (host , CLKSEL64 , clksel );
458493 else
@@ -632,6 +667,10 @@ static const struct of_device_id dw_mci_exynos_match[] = {
632667 .data = & exynos_drv_data , },
633668 { .compatible = "samsung,exynos7-dw-mshc-smu" ,
634669 .data = & exynos_drv_data , },
670+ { .compatible = "samsung,exynos7870-dw-mshc" ,
671+ .data = & exynos_drv_data , },
672+ { .compatible = "samsung,exynos7870-dw-mshc-smu" ,
673+ .data = & exynos_drv_data , },
635674 { .compatible = "axis,artpec8-dw-mshc" ,
636675 .data = & artpec_drv_data , },
637676 {},
0 commit comments