]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - arch/arm/cpu/armv8/hisilicon/pinmux.c
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2015 Linaro.
4 * Peter Griffin <peter.griffin@linaro.org>
11 #include <asm/arch/pinmux.h>
13 struct hi6220_pinmux0_regs
*pmx0
=
14 (struct hi6220_pinmux0_regs
*)HI6220_PINMUX0_BASE
;
16 struct hi6220_pinmux1_regs
*pmx1
=
17 (struct hi6220_pinmux1_regs
*)HI6220_PINMUX1_BASE
;
19 static void hi6220_uart_config(int peripheral
)
23 writel(MUX_M0
, &pmx0
->iomg
[48]); /* UART0_RXD */
24 writel(MUX_M0
, &pmx0
->iomg
[49]); /* UART0_TXD */
26 writel(DRIVE1_02MA
| PULL_UP
, &pmx1
->iocfg
[49]); /* UART0_RXD */
27 writel(DRIVE1_02MA
| PULL_UP
, &pmx1
->iocfg
[50]); /* UART0_TXD */
31 writel(MUX_M0
, &pmx0
->iomg
[50]); /* UART1_CTS_N */
32 writel(MUX_M0
, &pmx0
->iomg
[51]); /* UART1_RTS_N */
33 writel(MUX_M0
, &pmx0
->iomg
[52]); /* UART1_RXD */
34 writel(MUX_M0
, &pmx0
->iomg
[53]); /* UART1_TXD */
36 writel(DRIVE1_02MA
| PULL_UP
, &pmx1
->iocfg
[51]); /*UART1_CTS_N*/
37 writel(DRIVE1_02MA
| PULL_UP
, &pmx1
->iocfg
[53]); /* UART1_RXD */
38 writel(DRIVE1_02MA
, &pmx1
->iocfg
[52]); /* UART1_RTS_N */
39 writel(DRIVE1_02MA
, &pmx1
->iocfg
[54]); /* UART1_TXD */
43 writel(MUX_M0
, &pmx0
->iomg
[54]); /* UART2_CTS_N */
44 writel(MUX_M0
, &pmx0
->iomg
[55]); /* UART2_RTS_N */
45 writel(MUX_M0
, &pmx0
->iomg
[56]); /* UART2_RXD */
46 writel(MUX_M0
, &pmx0
->iomg
[57]); /* UART2_TXD */
48 writel(DRIVE1_02MA
, &pmx1
->iocfg
[55]); /* UART2_CTS_N */
49 writel(DRIVE1_02MA
, &pmx1
->iocfg
[56]); /* UART2_RTS_N */
50 writel(DRIVE1_02MA
, &pmx1
->iocfg
[57]); /* UART2_RXD */
51 writel(DRIVE1_02MA
, &pmx1
->iocfg
[58]); /* UART2_TXD */
55 writel(MUX_M1
, &pmx0
->iomg
[96]); /* UART3_CTS_N */
56 writel(MUX_M1
, &pmx0
->iomg
[97]); /* UART3_RTS_N */
57 writel(MUX_M1
, &pmx0
->iomg
[98]); /* UART3_RXD */
58 writel(MUX_M1
, &pmx0
->iomg
[99]); /* UART3_TXD */
61 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[100]);
63 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[101]);
65 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[102]);
67 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[103]);
71 writel(MUX_M1
, &pmx0
->iomg
[116]); /* UART4_CTS_N */
72 writel(MUX_M1
, &pmx0
->iomg
[117]); /* UART4_RTS_N */
73 writel(MUX_M1
, &pmx0
->iomg
[118]); /* UART4_RXD */
74 writel(MUX_M1
, &pmx0
->iomg
[119]); /* UART4_TXD */
77 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[120]);
79 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[121]);
81 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[122]);
83 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[123]);
86 writel(MUX_M1
, &pmx0
->iomg
[114]); /* UART5_RXD */
87 writel(MUX_M1
, &pmx0
->iomg
[115]); /* UART5_TXD */
90 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[118]);
92 writel(DRIVE1_02MA
| PULL_DOWN
, &pmx1
->iocfg
[119]);
97 debug("%s: invalid peripheral %d", __func__
, peripheral
);
102 static int hi6220_mmc_config(int peripheral
)
106 switch (peripheral
) {
107 case PERIPH_ID_SDMMC0
:
109 /* eMMC pinmux config */
110 writel(MUX_M0
, &pmx0
->iomg
[64]); /* EMMC_CLK */
111 writel(MUX_M0
, &pmx0
->iomg
[65]); /* EMMC_CMD */
112 writel(MUX_M0
, &pmx0
->iomg
[66]); /* EMMC_DATA0 */
113 writel(MUX_M0
, &pmx0
->iomg
[67]); /* EMMC_DATA1 */
114 writel(MUX_M0
, &pmx0
->iomg
[68]); /* EMMC_DATA2 */
115 writel(MUX_M0
, &pmx0
->iomg
[69]); /* EMMC_DATA3 */
116 writel(MUX_M0
, &pmx0
->iomg
[70]); /* EMMC_DATA4 */
117 writel(MUX_M0
, &pmx0
->iomg
[71]); /* EMMC_DATA5 */
118 writel(MUX_M0
, &pmx0
->iomg
[72]); /* EMMC_DATA6 */
119 writel(MUX_M0
, &pmx0
->iomg
[73]); /* EMMC_DATA7 */
121 /*eMMC configure up/down/drive */
122 writel(DRIVE1_08MA
, &pmx1
->iocfg
[65]); /* EMMC_CLK */
124 tmp
= DRIVE1_04MA
| PULL_UP
;
125 writel(tmp
, &pmx1
->iocfg
[65]); /* EMMC_CMD */
126 writel(tmp
, &pmx1
->iocfg
[66]); /* EMMC_DATA0 */
127 writel(tmp
, &pmx1
->iocfg
[67]); /* EMMC_DATA1 */
128 writel(tmp
, &pmx1
->iocfg
[68]); /* EMMC_DATA2 */
129 writel(tmp
, &pmx1
->iocfg
[69]); /* EMMC_DATA3 */
130 writel(tmp
, &pmx1
->iocfg
[70]); /* EMMC_DATA4 */
131 writel(tmp
, &pmx1
->iocfg
[71]); /* EMMC_DATA5 */
132 writel(tmp
, &pmx1
->iocfg
[72]); /* EMMC_DATA6 */
133 writel(tmp
, &pmx1
->iocfg
[73]); /* EMMC_DATA7 */
135 writel(DRIVE1_04MA
, &pmx1
->iocfg
[73]); /* EMMC_RST_N */
138 case PERIPH_ID_SDMMC1
:
140 writel(MUX_M0
, &pmx0
->iomg
[3]); /* SD_CLK */
141 writel(MUX_M0
, &pmx0
->iomg
[4]); /* SD_CMD */
142 writel(MUX_M0
, &pmx0
->iomg
[5]); /* SD_DATA0 */
143 writel(MUX_M0
, &pmx0
->iomg
[6]); /* SD_DATA1 */
144 writel(MUX_M0
, &pmx0
->iomg
[7]); /* SD_DATA2 */
145 writel(MUX_M0
, &pmx0
->iomg
[8]); /* SD_DATA3 */
147 writel(DRIVE1_10MA
| BIT(2), &pmx1
->iocfg
[3]); /*SD_CLK*/
148 writel(DRIVE1_08MA
| BIT(2), &pmx1
->iocfg
[4]); /*SD_CMD*/
149 writel(DRIVE1_08MA
| BIT(2), &pmx1
->iocfg
[5]); /*SD_DATA0*/
150 writel(DRIVE1_08MA
| BIT(2), &pmx1
->iocfg
[6]); /*SD_DATA1*/
151 writel(DRIVE1_08MA
| BIT(2), &pmx1
->iocfg
[7]); /*SD_DATA2*/
152 writel(DRIVE1_08MA
| BIT(2), &pmx1
->iocfg
[8]); /*SD_DATA3*/
156 debug("%s: invalid peripheral %d", __func__
, peripheral
);
163 int hi6220_pinmux_config(int peripheral
)
165 switch (peripheral
) {
166 case PERIPH_ID_UART0
:
167 case PERIPH_ID_UART1
:
168 case PERIPH_ID_UART2
:
169 case PERIPH_ID_UART3
:
170 hi6220_uart_config(peripheral
);
172 case PERIPH_ID_SDMMC0
:
173 case PERIPH_ID_SDMMC1
:
174 return hi6220_mmc_config(peripheral
);
176 debug("%s: invalid peripheral %d", __func__
, peripheral
);