xref: /arm-trusted-firmware/plat/brcm/board/stingray/driver/plat_emmc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016 - 2020, Broadcom
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <lib/mmio.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <platform_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #define ICFG_IPROC_IOPAD_CTRL_4 (IPROC_ROOT + 0x9c0)
14*91f16700Schasinglulu #define ICFG_IPROC_IOPAD_CTRL_5 (IPROC_ROOT + 0x9c4)
15*91f16700Schasinglulu #define ICFG_IPROC_IOPAD_CTRL_6 (IPROC_ROOT + 0x9c8)
16*91f16700Schasinglulu #define ICFG_IPROC_IOPAD_CTRL_7 (IPROC_ROOT + 0x9cc)
17*91f16700Schasinglulu 
18*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CD_IND_R 30
19*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CD_SRC_R 31
20*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CD_HYS_R 29
21*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CD_PULL_R 28
22*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CD_DRIVE_R 24
23*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CLK_SDCARD_SRC_R 23
24*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CLK_SDCARD_HYS_R 21
25*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_CLK_SDCARD_DRIVE_R 17
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA0_SRC_R 15
28*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA0_HYS_R 13
29*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA0_DRIVE_R 9
30*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA1_SRC_R 7
31*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA1_HYS_R 5
32*91f16700Schasinglulu #define IOPAD_CTRL4_SDIO0_DATA1_DRIVE_R 1
33*91f16700Schasinglulu 
34*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA2_SRC_R 31
35*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA2_HYS_R 29
36*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA2_DRIVE_R 25
37*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA3_SRC_R 23
38*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA3_IND_R 22
39*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA3_HYS_R 21
40*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA3_DRIVE_R 17
41*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA4_SRC_R 15
42*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA4_HYS_R 13
43*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA4_DRIVE_R 9
44*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA5_SRC_R 7
45*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA5_HYS_R 5
46*91f16700Schasinglulu #define IOPAD_CTRL5_SDIO0_DATA5_DRIVE_R 1
47*91f16700Schasinglulu 
48*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA6_SRC_R 31
49*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA6_HYS_R 29
50*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA6_DRIVE_R 25
51*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA7_SRC_R 23
52*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA7_HYS_R 21
53*91f16700Schasinglulu #define IOPAD_CTRL6_SDIO0_DATA7_DRIVE_R 17
54*91f16700Schasinglulu 
55*91f16700Schasinglulu void emmc_soft_reset(void)
56*91f16700Schasinglulu {
57*91f16700Schasinglulu 	uint32_t val = 0;
58*91f16700Schasinglulu 
59*91f16700Schasinglulu 	val = (BIT(IOPAD_CTRL6_SDIO0_DATA7_SRC_R) |
60*91f16700Schasinglulu 	       BIT(IOPAD_CTRL6_SDIO0_DATA7_HYS_R) |
61*91f16700Schasinglulu 	       BIT(IOPAD_CTRL6_SDIO0_DATA7_DRIVE_R) |
62*91f16700Schasinglulu 	       BIT(IOPAD_CTRL6_SDIO0_DATA6_SRC_R) |
63*91f16700Schasinglulu 	       BIT(IOPAD_CTRL6_SDIO0_DATA6_HYS_R) |
64*91f16700Schasinglulu 	       BIT(IOPAD_CTRL6_SDIO0_DATA6_DRIVE_R));
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 	mmio_write_32(ICFG_IPROC_IOPAD_CTRL_6, val);
67*91f16700Schasinglulu 
68*91f16700Schasinglulu 	val = (BIT(IOPAD_CTRL5_SDIO0_DATA3_SRC_R) |
69*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA3_HYS_R) |
70*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA3_DRIVE_R) |
71*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA4_SRC_R) |
72*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA4_HYS_R) |
73*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA4_DRIVE_R) |
74*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA5_SRC_R) |
75*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA5_HYS_R) |
76*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA5_DRIVE_R));
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 	mmio_write_32(ICFG_IPROC_IOPAD_CTRL_5, val);
79*91f16700Schasinglulu 
80*91f16700Schasinglulu 	val = (BIT(IOPAD_CTRL4_SDIO0_DATA0_SRC_R) |
81*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_DATA0_HYS_R) |
82*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_DATA0_DRIVE_R) |
83*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_DATA1_SRC_R) |
84*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_DATA1_HYS_R) |
85*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_DATA1_DRIVE_R) |
86*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA2_SRC_R) |
87*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA2_HYS_R) |
88*91f16700Schasinglulu 	       BIT(IOPAD_CTRL5_SDIO0_DATA2_DRIVE_R));
89*91f16700Schasinglulu 
90*91f16700Schasinglulu 	mmio_write_32(ICFG_IPROC_IOPAD_CTRL_6, val);
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 	val = (BIT(IOPAD_CTRL4_SDIO0_CLK_SDCARD_SRC_R) |
93*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_CLK_SDCARD_HYS_R) |
94*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_CLK_SDCARD_DRIVE_R) |
95*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_CD_SRC_R) |
96*91f16700Schasinglulu 	       BIT(IOPAD_CTRL4_SDIO0_CD_HYS_R));
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	/*
99*91f16700Schasinglulu 	 * set pull-down, clear pull-up=0
100*91f16700Schasinglulu 	 * bit 12: pull-down  bit 11: pull-up
101*91f16700Schasinglulu 	 * Note:  In emulation, this pull-down setting was not
102*91f16700Schasinglulu 	 * sufficient.  Board design likely requires pull down on
103*91f16700Schasinglulu 	 * this pin for eMMC.
104*91f16700Schasinglulu 	 */
105*91f16700Schasinglulu 
106*91f16700Schasinglulu 	val |= BIT(IOPAD_CTRL4_SDIO0_CD_PULL_R);
107*91f16700Schasinglulu 
108*91f16700Schasinglulu 	mmio_write_32(ICFG_IPROC_IOPAD_CTRL_4, val);
109*91f16700Schasinglulu }
110