Commit | Line | Data |
---|---|---|
78ded168 MD |
1 | /* |
2 | * APE6EVM board support | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Solutions Corp. | |
5 | * Copyright (C) 2013 Magnus Damm | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; version 2 of the License. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
20 | ||
15351a7a | 21 | #include <linux/gpio.h> |
5c6db1a4 SH |
22 | #include <linux/gpio_keys.h> |
23 | #include <linux/input.h> | |
78ded168 | 24 | #include <linux/interrupt.h> |
78ded168 | 25 | #include <linux/kernel.h> |
f79d68da | 26 | #include <linux/mfd/tmio.h> |
87116132 GL |
27 | #include <linux/mmc/host.h> |
28 | #include <linux/mmc/sh_mmcif.h> | |
f79d68da | 29 | #include <linux/mmc/sh_mobile_sdhi.h> |
2c56055c | 30 | #include <linux/pinctrl/machine.h> |
78ded168 | 31 | #include <linux/platform_device.h> |
15351a7a MD |
32 | #include <linux/regulator/fixed.h> |
33 | #include <linux/regulator/machine.h> | |
b8568a04 | 34 | #include <linux/sh_clk.h> |
15351a7a | 35 | #include <linux/smsc911x.h> |
fac49568 | 36 | |
78ded168 MD |
37 | #include <asm/mach-types.h> |
38 | #include <asm/mach/arch.h> | |
39 | ||
fd44aa5e | 40 | #include "common.h" |
b6bab126 | 41 | #include "irqs.h" |
fac49568 | 42 | #include "r8a73a4.h" |
78ded168 | 43 | |
9adad788 SH |
44 | /* LEDS */ |
45 | static struct gpio_led ape6evm_leds[] = { | |
46 | { | |
47 | .name = "gnss-en", | |
48 | .gpio = 28, | |
49 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
50 | }, { | |
51 | .name = "nfc-nrst", | |
52 | .gpio = 126, | |
53 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
54 | }, { | |
55 | .name = "gnss-nrst", | |
56 | .gpio = 132, | |
57 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
58 | }, { | |
59 | .name = "bt-wakeup", | |
60 | .gpio = 232, | |
61 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
62 | }, { | |
63 | .name = "strobe", | |
64 | .gpio = 250, | |
65 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
66 | }, { | |
67 | .name = "bbresetout", | |
68 | .gpio = 288, | |
69 | .default_state = LEDS_GPIO_DEFSTATE_OFF, | |
70 | }, | |
71 | }; | |
72 | ||
73 | static __initdata struct gpio_led_platform_data ape6evm_leds_pdata = { | |
74 | .leds = ape6evm_leds, | |
75 | .num_leds = ARRAY_SIZE(ape6evm_leds), | |
76 | }; | |
77 | ||
5c6db1a4 SH |
78 | /* GPIO KEY */ |
79 | #define GPIO_KEY(c, g, d, ...) \ | |
80 | { .code = c, .gpio = g, .desc = d, .active_low = 1 } | |
81 | ||
82 | static struct gpio_keys_button gpio_buttons[] = { | |
83 | GPIO_KEY(KEY_0, 324, "S16"), | |
84 | GPIO_KEY(KEY_MENU, 325, "S17"), | |
85 | GPIO_KEY(KEY_HOME, 326, "S18"), | |
86 | GPIO_KEY(KEY_BACK, 327, "S19"), | |
87 | GPIO_KEY(KEY_VOLUMEUP, 328, "S20"), | |
88 | GPIO_KEY(KEY_VOLUMEDOWN, 329, "S21"), | |
89 | }; | |
90 | ||
40fca03c | 91 | static struct gpio_keys_platform_data ape6evm_keys_pdata __initdata = { |
5c6db1a4 SH |
92 | .buttons = gpio_buttons, |
93 | .nbuttons = ARRAY_SIZE(gpio_buttons), | |
94 | }; | |
95 | ||
15351a7a MD |
96 | /* Dummy supplies, where voltage doesn't matter */ |
97 | static struct regulator_consumer_supply dummy_supplies[] = { | |
98 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | |
99 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | |
100 | }; | |
101 | ||
102 | /* SMSC LAN9220 */ | |
23f1751c | 103 | static const struct resource lan9220_res[] __initconst = { |
15351a7a MD |
104 | DEFINE_RES_MEM(0x08000000, 0x1000), |
105 | { | |
106 | .start = irq_pin(40), /* IRQ40 */ | |
107 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH, | |
108 | }, | |
109 | }; | |
110 | ||
23f1751c | 111 | static const struct smsc911x_platform_config lan9220_data __initconst = { |
15351a7a MD |
112 | .flags = SMSC911X_USE_32BIT, |
113 | .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, | |
114 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, | |
115 | }; | |
116 | ||
87116132 | 117 | /* |
8b98126d GL |
118 | * MMC0 power supplies: |
119 | * Both Vcc and VccQ to eMMC on APE6EVM are supplied by a tps80032 voltage | |
120 | * regulator. Until support for it is added to this file we simulate the | |
121 | * Vcc supply by a fixed always-on regulator | |
87116132 | 122 | */ |
8b98126d | 123 | static struct regulator_consumer_supply vcc_mmc0_consumers[] = |
87116132 GL |
124 | { |
125 | REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), | |
8b98126d GL |
126 | }; |
127 | ||
128 | /* | |
129 | * SDHI0 power supplies: | |
130 | * Vcc to SDHI0 on APE6EVM is supplied by a GPIO-switchable regulator. VccQ is | |
131 | * provided by the same tps80032 regulator as both MMC0 voltages - see comment | |
132 | * above | |
133 | */ | |
134 | static struct regulator_consumer_supply vcc_sdhi0_consumers[] = | |
135 | { | |
f79d68da | 136 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), |
8b98126d GL |
137 | }; |
138 | ||
139 | static struct regulator_init_data vcc_sdhi0_init_data = { | |
140 | .constraints = { | |
141 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | |
142 | }, | |
143 | .num_consumer_supplies = ARRAY_SIZE(vcc_sdhi0_consumers), | |
144 | .consumer_supplies = vcc_sdhi0_consumers, | |
145 | }; | |
146 | ||
147 | static const struct fixed_voltage_config vcc_sdhi0_info __initconst = { | |
148 | .supply_name = "SDHI0 Vcc", | |
149 | .microvolts = 3300000, | |
150 | .gpio = 76, | |
151 | .enable_high = 1, | |
152 | .init_data = &vcc_sdhi0_init_data, | |
153 | }; | |
154 | ||
155 | /* | |
156 | * SDHI1 power supplies: | |
157 | * Vcc and VccQ to SDHI1 on APE6EVM are both fixed at 3.3V | |
158 | */ | |
159 | static struct regulator_consumer_supply vcc_sdhi1_consumers[] = | |
160 | { | |
f79d68da | 161 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), |
87116132 GL |
162 | }; |
163 | ||
164 | /* MMCIF */ | |
23f1751c | 165 | static const struct sh_mmcif_plat_data mmcif0_pdata __initconst = { |
87116132 | 166 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, |
7a2a7a37 GL |
167 | .slave_id_tx = SHDMA_SLAVE_MMCIF0_TX, |
168 | .slave_id_rx = SHDMA_SLAVE_MMCIF0_RX, | |
a2eeabcc | 169 | .ccs_unsupported = true, |
87116132 GL |
170 | }; |
171 | ||
23f1751c | 172 | static const struct resource mmcif0_resources[] __initconst = { |
61a4fd12 | 173 | DEFINE_RES_MEM(0xee200000, 0x100), |
87116132 GL |
174 | DEFINE_RES_IRQ(gic_spi(169)), |
175 | }; | |
176 | ||
f79d68da | 177 | /* SDHI0 */ |
23f1751c | 178 | static const struct sh_mobile_sdhi_info sdhi0_pdata __initconst = { |
f79d68da GL |
179 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE, |
180 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ, | |
181 | }; | |
182 | ||
23f1751c | 183 | static const struct resource sdhi0_resources[] __initconst = { |
e33e6968 | 184 | DEFINE_RES_MEM(0xee100000, 0x100), |
f79d68da GL |
185 | DEFINE_RES_IRQ(gic_spi(165)), |
186 | }; | |
187 | ||
188 | /* SDHI1 */ | |
23f1751c | 189 | static const struct sh_mobile_sdhi_info sdhi1_pdata __initconst = { |
f79d68da GL |
190 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE, |
191 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | | |
192 | MMC_CAP_NEEDS_POLL, | |
193 | }; | |
194 | ||
23f1751c | 195 | static const struct resource sdhi1_resources[] __initconst = { |
e33e6968 | 196 | DEFINE_RES_MEM(0xee120000, 0x100), |
f79d68da GL |
197 | DEFINE_RES_IRQ(gic_spi(166)), |
198 | }; | |
199 | ||
23f1751c | 200 | static const struct pinctrl_map ape6evm_pinctrl_map[] __initconst = { |
2c56055c MD |
201 | /* SCIFA0 console */ |
202 | PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a73a4", | |
203 | "scifa0_data", "scifa0"), | |
15351a7a MD |
204 | /* SMSC */ |
205 | PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a73a4", | |
206 | "irqc_irq40", "irqc"), | |
87116132 GL |
207 | /* MMCIF0 */ |
208 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a73a4", | |
209 | "mmc0_data8", "mmc0"), | |
210 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a73a4", | |
211 | "mmc0_ctrl", "mmc0"), | |
f79d68da GL |
212 | /* SDHI0: uSD: no WP */ |
213 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4", | |
214 | "sdhi0_data4", "sdhi0"), | |
215 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4", | |
216 | "sdhi0_ctrl", "sdhi0"), | |
217 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4", | |
218 | "sdhi0_cd", "sdhi0"), | |
219 | /* SDHI1 */ | |
220 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a73a4", | |
221 | "sdhi1_data4", "sdhi1"), | |
222 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a73a4", | |
223 | "sdhi1_ctrl", "sdhi1"), | |
2c56055c MD |
224 | }; |
225 | ||
78ded168 MD |
226 | static void __init ape6evm_add_standard_devices(void) |
227 | { | |
b8568a04 KM |
228 | |
229 | struct clk *parent; | |
230 | struct clk *mp; | |
231 | ||
78ded168 | 232 | r8a73a4_clock_init(); |
b8568a04 KM |
233 | |
234 | /* MP clock parent = extal2 */ | |
235 | parent = clk_get(NULL, "extal2"); | |
236 | mp = clk_get(NULL, "mp"); | |
237 | BUG_ON(IS_ERR(parent) || IS_ERR(mp)); | |
238 | ||
239 | clk_set_parent(mp, parent); | |
240 | clk_put(parent); | |
241 | clk_put(mp); | |
242 | ||
2c56055c MD |
243 | pinctrl_register_mappings(ape6evm_pinctrl_map, |
244 | ARRAY_SIZE(ape6evm_pinctrl_map)); | |
245 | r8a73a4_pinmux_init(); | |
78ded168 | 246 | r8a73a4_add_standard_devices(); |
15351a7a MD |
247 | |
248 | /* LAN9220 ethernet */ | |
249 | gpio_request_one(270, GPIOF_OUT_INIT_HIGH, NULL); /* smsc9220 RESET */ | |
250 | ||
251 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | |
252 | ||
d2168146 | 253 | platform_device_register_resndata(NULL, "smsc911x", -1, |
15351a7a MD |
254 | lan9220_res, ARRAY_SIZE(lan9220_res), |
255 | &lan9220_data, sizeof(lan9220_data)); | |
8b98126d GL |
256 | |
257 | regulator_register_always_on(1, "MMC0 Vcc", vcc_mmc0_consumers, | |
258 | ARRAY_SIZE(vcc_mmc0_consumers), 2800000); | |
d2168146 | 259 | platform_device_register_resndata(NULL, "sh_mmcif", 0, |
87116132 GL |
260 | mmcif0_resources, ARRAY_SIZE(mmcif0_resources), |
261 | &mmcif0_pdata, sizeof(mmcif0_pdata)); | |
d2168146 | 262 | platform_device_register_data(NULL, "reg-fixed-voltage", 2, |
8b98126d | 263 | &vcc_sdhi0_info, sizeof(vcc_sdhi0_info)); |
d2168146 | 264 | platform_device_register_resndata(NULL, "sh_mobile_sdhi", 0, |
f79d68da GL |
265 | sdhi0_resources, ARRAY_SIZE(sdhi0_resources), |
266 | &sdhi0_pdata, sizeof(sdhi0_pdata)); | |
8b98126d GL |
267 | regulator_register_always_on(3, "SDHI1 Vcc", vcc_sdhi1_consumers, |
268 | ARRAY_SIZE(vcc_sdhi1_consumers), 3300000); | |
d2168146 | 269 | platform_device_register_resndata(NULL, "sh_mobile_sdhi", 1, |
f79d68da GL |
270 | sdhi1_resources, ARRAY_SIZE(sdhi1_resources), |
271 | &sdhi1_pdata, sizeof(sdhi1_pdata)); | |
d2168146 | 272 | platform_device_register_data(NULL, "gpio-keys", -1, |
5c6db1a4 SH |
273 | &ape6evm_keys_pdata, |
274 | sizeof(ape6evm_keys_pdata)); | |
d2168146 | 275 | platform_device_register_data(NULL, "leds-gpio", -1, |
9adad788 SH |
276 | &ape6evm_leds_pdata, |
277 | sizeof(ape6evm_leds_pdata)); | |
78ded168 MD |
278 | } |
279 | ||
280 | static const char *ape6evm_boards_compat_dt[] __initdata = { | |
281 | "renesas,ape6evm", | |
282 | NULL, | |
283 | }; | |
284 | ||
285 | DT_MACHINE_START(APE6EVM_DT, "ape6evm") | |
911f7cec | 286 | .init_early = shmobile_init_delay, |
78ded168 | 287 | .init_machine = ape6evm_add_standard_devices, |
509c42a5 | 288 | .init_late = shmobile_init_late, |
78ded168 MD |
289 | .dt_compat = ape6evm_boards_compat_dt, |
290 | MACHINE_END |