1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#include "../../mach/exynos/mux.h"
14#include <platsupport/plat/gpio.h>
15
16static struct mux_feature_data i2c0_data[] = {
17    { .port = GPD1, .pin = 0, MUXVALUE_CPD(2, PUD_PULLUP, DRV1X)},
18    { .port = GPD1, .pin = 1, MUXVALUE_CPD(2, PUD_PULLUP, DRV1X)},
19    { .port = GPIOPORT_NONE }
20};
21static struct mux_feature_data i2c1_data[] = {
22    { .port = GPD1, .pin = 2, MUXVALUE_CPD(2, PUD_PULLUP, DRV1X)},
23    { .port = GPD1, .pin = 3, MUXVALUE_CPD(2, PUD_PULLUP, DRV1X)},
24    { .port = GPIOPORT_NONE }
25};
26
27static struct mux_feature_data i2c2_data[] = {
28    { .port = GPA0, .pin = 6, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
29    { .port = GPA0, .pin = 7, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
30    { .port = GPIOPORT_NONE }
31};
32
33static struct mux_feature_data i2c3_data[] = {
34    { .port = GPA1, .pin = 2, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
35    { .port = GPA1, .pin = 3, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
36    { .port = GPIOPORT_NONE }
37};
38
39static struct mux_feature_data i2c4_data[] = {
40    { .port = GPB,  .pin = 0, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
41    { .port = GPB,  .pin = 1, MUXVALUE_CPD(2, PUD_PULLUP, DRV1X)},
42    { .port = GPIOPORT_NONE }
43};
44
45static struct mux_feature_data i2c5_data[] = {
46    { .port = GPB,  .pin = 2, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
47    { .port = GPB,  .pin = 3, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
48    { .port = GPIOPORT_NONE }
49};
50
51static struct mux_feature_data i2c6_data[] = {
52    { .port = GPC1, .pin = 3, MUXVALUE_CPD(4, PUD_PULLUP, DRV1X)},
53    { .port = GPC1, .pin = 4, MUXVALUE_CPD(4, PUD_PULLUP, DRV1X)},
54    { .port = GPIOPORT_NONE }
55};
56
57static struct mux_feature_data i2c7_data[] = {
58    { .port = GPD0, .pin = 2, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
59    { .port = GPD0, .pin = 3, MUXVALUE_CPD(3, PUD_PULLUP, DRV1X)},
60    { .port = GPIOPORT_NONE }
61};
62
63/* SPI */
64static struct mux_feature_data spi0_data[] = {
65    { .port = GPB, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
66    { .port = GPB, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
67    { .port = GPB, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
68    { .port = GPB, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
69    { .port = GPIOPORT_NONE }
70};
71static struct mux_feature_data spi1_data[] = {
72    { .port = GPB, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
73    { .port = GPB, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
74    { .port = GPB, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
75    { .port = GPB, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
76    { .port = GPIOPORT_NONE }
77};
78static struct mux_feature_data spi2_data[] = {
79    { .port = GPC1, .pin = 1, .value = MUXVALUE_CPD(5, PUD_PULLUP, DRV3X)},
80    { .port = GPC1, .pin = 2, .value = MUXVALUE_CPD(5, PUD_PULLUP, DRV3X)},
81    { .port = GPC1, .pin = 3, .value = MUXVALUE_CPD(5, PUD_PULLUP, DRV3X)},
82    { .port = GPC1, .pin = 4, .value = MUXVALUE_CPD(5, PUD_PULLUP, DRV3X)},
83    { .port = GPIOPORT_NONE }
84};
85
86/* UART */
87static struct mux_feature_data uart0_data[] = {
88    { .port = GPA0, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
89    { .port = GPA0, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
90    { .port = GPIOPORT_NONE }
91};
92static struct mux_feature_data uart0_flow_data[] = {
93    { .port = GPA0, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
94    { .port = GPA0, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
95    { .port = GPIOPORT_NONE }
96};
97static struct mux_feature_data uart1_data[] = {
98    { .port = GPA0, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
99    { .port = GPA0, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
100    { .port = GPIOPORT_NONE }
101};
102static struct mux_feature_data uart1_flow_data[] = {
103    { .port = GPA0, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
104    { .port = GPA0, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
105    { .port = GPIOPORT_NONE }
106};
107static struct mux_feature_data uart2_data[] = {
108    { .port = GPA1, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
109    { .port = GPA1, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
110    { .port = GPIOPORT_NONE }
111};
112static struct mux_feature_data uart2_flow_data[] = {
113    { .port = GPA1, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
114    { .port = GPA1, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
115    { .port = GPIOPORT_NONE }
116};
117static struct mux_feature_data uart3_data[] = {
118    { .port = GPA1, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
119    { .port = GPA1, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
120    { .port = GPIOPORT_NONE }
121};
122static struct mux_feature_data uart3_flow_data[] = {
123    { .port = GPA1, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
124    { .port = GPA1, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
125    { .port = GPIOPORT_NONE }
126};
127
128/* EBI */
129static struct mux_feature_data srom_data[] = {
130    /* SROM_CSn[3:0] */
131    { .port = GPY0, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
132    { .port = GPY0, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
133    { .port = GPY0, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
134    { .port = GPY0, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
135    /* SROM_WAITn */
136    { .port = GPY1, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
137    /* Terminate the list */
138    { .port = GPIOPORT_NONE }
139};
140
141static struct mux_feature_data ebi_data[] = {
142    /* EBI_OEn */
143    { .port = GPY0, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
144    /* EBI_WEn */
145    { .port = GPY0, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
146    /* EBI_BE[1:0] */
147    { .port = GPY1, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
148    { .port = GPY1, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
149    /* EBI_ADDR[15:0] */
150    { .port = GPY3, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
151    { .port = GPY3, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
152    { .port = GPY3, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
153    { .port = GPY3, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
154    { .port = GPY3, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
155    { .port = GPY3, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
156    { .port = GPY3, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
157    { .port = GPY3, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
158    { .port = GPY4, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
159    { .port = GPY4, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
160    { .port = GPY4, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
161    { .port = GPY4, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
162    { .port = GPY4, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
163    { .port = GPY4, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
164    { .port = GPY4, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
165    { .port = GPY4, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
166    /* EBI_DATA[15:0] */
167    { .port = GPY5, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
168    { .port = GPY5, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
169    { .port = GPY5, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
170    { .port = GPY5, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
171    { .port = GPY5, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
172    { .port = GPY5, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
173    { .port = GPY5, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
174    { .port = GPY5, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
175    { .port = GPY6, .pin = 0, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
176    { .port = GPY6, .pin = 1, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
177    { .port = GPY6, .pin = 2, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
178    { .port = GPY6, .pin = 3, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
179    { .port = GPY6, .pin = 4, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
180    { .port = GPY6, .pin = 5, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
181    { .port = GPY6, .pin = 6, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
182    { .port = GPY6, .pin = 7, .value = MUXVALUE_CPD(2, PUD_PULLUP, DRV3X)},
183    /* Terminate the list */
184    { .port = GPIOPORT_NONE }
185};
186
187struct mux_feature_data* feature_data[] = {
188    [MUX_I2C0]       = i2c0_data,
189    [MUX_I2C1]       = i2c1_data,
190    [MUX_I2C2]       = i2c2_data,
191    [MUX_I2C3]       = i2c3_data,
192    [MUX_I2C4]       = i2c4_data,
193    [MUX_I2C5]       = i2c5_data,
194    [MUX_I2C6]       = i2c6_data,
195    [MUX_I2C7]       = i2c7_data,
196    [MUX_SPI0]       = spi0_data,
197    [MUX_SPI1]       = spi1_data,
198    [MUX_SPI2]       = spi2_data,
199    [MUX_UART0]      = uart0_data,
200    [MUX_UART1]      = uart1_data,
201    [MUX_UART2]      = uart2_data,
202    [MUX_UART3]      = uart3_data,
203    [MUX_UART0_FLOW] = uart0_flow_data,
204    [MUX_UART1_FLOW] = uart1_flow_data,
205    [MUX_UART2_FLOW] = uart2_flow_data,
206    [MUX_UART3_FLOW] = uart3_flow_data,
207    [MUX_EBI]        = ebi_data,
208    [MUX_SROM]       = srom_data,
209};
210