Commit | Line | Data |
---|---|---|
1f52c659 HN |
1 | /* |
2 | * Koelsch board support | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Electronics Corporation | |
379bfd71 | 5 | * Copyright (C) 2013-2014 Renesas Solutions Corp. |
1f52c659 | 6 | * Copyright (C) 2013 Magnus Damm |
379bfd71 | 7 | * Copyright (C) 2014 Cogent Embedded, Inc. |
1f52c659 HN |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; version 2 of the License. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with this program; if not, write to the Free Software | |
20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
21 | */ | |
22 | ||
784c33a0 | 23 | #include <linux/dma-mapping.h> |
721319d1 MD |
24 | #include <linux/gpio.h> |
25 | #include <linux/gpio_keys.h> | |
26 | #include <linux/input.h> | |
29d9f010 | 27 | #include <linux/irq.h> |
1f52c659 | 28 | #include <linux/kernel.h> |
87a2934e | 29 | #include <linux/leds.h> |
d12e699f MD |
30 | #include <linux/mfd/tmio.h> |
31 | #include <linux/mmc/host.h> | |
32 | #include <linux/mmc/sh_mobile_sdhi.h> | |
bcca4e8e GU |
33 | #include <linux/mtd/mtd.h> |
34 | #include <linux/mtd/partitions.h> | |
974faba7 | 35 | #include <linux/phy.h> |
85ef14da | 36 | #include <linux/pinctrl/machine.h> |
87a2934e | 37 | #include <linux/platform_data/gpio-rcar.h> |
784c33a0 | 38 | #include <linux/platform_data/rcar-du.h> |
1f52c659 | 39 | #include <linux/platform_device.h> |
d12e699f MD |
40 | #include <linux/regulator/driver.h> |
41 | #include <linux/regulator/fixed.h> | |
42 | #include <linux/regulator/gpio-regulator.h> | |
43 | #include <linux/regulator/machine.h> | |
974faba7 | 44 | #include <linux/sh_eth.h> |
bcca4e8e GU |
45 | #include <linux/spi/flash.h> |
46 | #include <linux/spi/rspi.h> | |
47 | #include <linux/spi/spi.h> | |
1f52c659 | 48 | #include <mach/common.h> |
784c33a0 | 49 | #include <mach/irqs.h> |
1f52c659 | 50 | #include <mach/r8a7791.h> |
f9c9eb7e | 51 | #include <mach/rcar-gen2.h> |
1f52c659 HN |
52 | #include <asm/mach-types.h> |
53 | #include <asm/mach/arch.h> | |
54 | ||
784c33a0 LP |
55 | /* DU */ |
56 | static struct rcar_du_encoder_data koelsch_du_encoders[] = { | |
57 | { | |
58 | .type = RCAR_DU_ENCODER_NONE, | |
59 | .output = RCAR_DU_OUTPUT_LVDS0, | |
60 | .connector.lvds.panel = { | |
61 | .width_mm = 210, | |
62 | .height_mm = 158, | |
63 | .mode = { | |
64 | .clock = 65000, | |
65 | .hdisplay = 1024, | |
66 | .hsync_start = 1048, | |
67 | .hsync_end = 1184, | |
68 | .htotal = 1344, | |
69 | .vdisplay = 768, | |
70 | .vsync_start = 771, | |
71 | .vsync_end = 777, | |
72 | .vtotal = 806, | |
73 | .flags = 0, | |
74 | }, | |
75 | }, | |
76 | }, | |
77 | }; | |
78 | ||
79 | static const struct rcar_du_platform_data koelsch_du_pdata __initconst = { | |
80 | .encoders = koelsch_du_encoders, | |
81 | .num_encoders = ARRAY_SIZE(koelsch_du_encoders), | |
82 | }; | |
83 | ||
84 | static const struct resource du_resources[] __initconst = { | |
85 | DEFINE_RES_MEM(0xfeb00000, 0x40000), | |
86 | DEFINE_RES_MEM_NAMED(0xfeb90000, 0x1c, "lvds.0"), | |
87 | DEFINE_RES_IRQ(gic_spi(256)), | |
88 | DEFINE_RES_IRQ(gic_spi(268)), | |
89 | }; | |
90 | ||
91 | static void __init koelsch_add_du_device(void) | |
92 | { | |
93 | struct platform_device_info info = { | |
94 | .name = "rcar-du-r8a7791", | |
95 | .id = -1, | |
96 | .res = du_resources, | |
97 | .num_res = ARRAY_SIZE(du_resources), | |
98 | .data = &koelsch_du_pdata, | |
99 | .size_data = sizeof(koelsch_du_pdata), | |
100 | .dma_mask = DMA_BIT_MASK(32), | |
101 | }; | |
102 | ||
103 | platform_device_register_full(&info); | |
104 | } | |
105 | ||
974faba7 SS |
106 | /* Ether */ |
107 | static const struct sh_eth_plat_data ether_pdata __initconst = { | |
108 | .phy = 0x1, | |
29d9f010 | 109 | .phy_irq = irq_pin(0), |
974faba7 SS |
110 | .edmac_endian = EDMAC_LITTLE_ENDIAN, |
111 | .phy_interface = PHY_INTERFACE_MODE_RMII, | |
112 | .ether_link_active_low = 1, | |
113 | }; | |
114 | ||
115 | static const struct resource ether_resources[] __initconst = { | |
116 | DEFINE_RES_MEM(0xee700000, 0x400), | |
117 | DEFINE_RES_IRQ(gic_spi(162)), | |
118 | }; | |
119 | ||
379bfd71 SS |
120 | static const struct platform_device_info ether_info __initconst = { |
121 | .parent = &platform_bus, | |
122 | .name = "r8a7791-ether", | |
123 | .id = -1, | |
124 | .res = ether_resources, | |
125 | .num_res = ARRAY_SIZE(ether_resources), | |
126 | .data = ðer_pdata, | |
127 | .size_data = sizeof(ether_pdata), | |
128 | .dma_mask = DMA_BIT_MASK(32), | |
129 | }; | |
130 | ||
87a2934e MD |
131 | /* LEDS */ |
132 | static struct gpio_led koelsch_leds[] = { | |
133 | { | |
134 | .name = "led8", | |
135 | .gpio = RCAR_GP_PIN(2, 21), | |
136 | .default_state = LEDS_GPIO_DEFSTATE_ON, | |
137 | }, { | |
138 | .name = "led7", | |
139 | .gpio = RCAR_GP_PIN(2, 20), | |
140 | .default_state = LEDS_GPIO_DEFSTATE_ON, | |
141 | }, { | |
142 | .name = "led6", | |
143 | .gpio = RCAR_GP_PIN(2, 19), | |
144 | .default_state = LEDS_GPIO_DEFSTATE_ON, | |
145 | }, | |
146 | }; | |
147 | ||
148 | static const struct gpio_led_platform_data koelsch_leds_pdata __initconst = { | |
149 | .leds = koelsch_leds, | |
150 | .num_leds = ARRAY_SIZE(koelsch_leds), | |
151 | }; | |
152 | ||
721319d1 MD |
153 | /* GPIO KEY */ |
154 | #define GPIO_KEY(c, g, d, ...) \ | |
478e2f9c | 155 | { .code = c, .gpio = g, .desc = d, .active_low = 1, \ |
e209456e | 156 | .wakeup = 1, .debounce_interval = 20 } |
721319d1 MD |
157 | |
158 | static struct gpio_keys_button gpio_buttons[] = { | |
159 | GPIO_KEY(KEY_4, RCAR_GP_PIN(5, 3), "SW2-pin4"), | |
160 | GPIO_KEY(KEY_3, RCAR_GP_PIN(5, 2), "SW2-pin3"), | |
161 | GPIO_KEY(KEY_2, RCAR_GP_PIN(5, 1), "SW2-pin2"), | |
162 | GPIO_KEY(KEY_1, RCAR_GP_PIN(5, 0), "SW2-pin1"), | |
159a282d MD |
163 | GPIO_KEY(KEY_G, RCAR_GP_PIN(7, 6), "SW36"), |
164 | GPIO_KEY(KEY_F, RCAR_GP_PIN(7, 5), "SW35"), | |
165 | GPIO_KEY(KEY_E, RCAR_GP_PIN(7, 4), "SW34"), | |
166 | GPIO_KEY(KEY_D, RCAR_GP_PIN(7, 3), "SW33"), | |
167 | GPIO_KEY(KEY_C, RCAR_GP_PIN(7, 2), "SW32"), | |
168 | GPIO_KEY(KEY_B, RCAR_GP_PIN(7, 1), "SW31"), | |
169 | GPIO_KEY(KEY_A, RCAR_GP_PIN(7, 0), "SW30"), | |
721319d1 MD |
170 | }; |
171 | ||
172 | static const struct gpio_keys_platform_data koelsch_keys_pdata __initconst = { | |
173 | .buttons = gpio_buttons, | |
174 | .nbuttons = ARRAY_SIZE(gpio_buttons), | |
175 | }; | |
176 | ||
bcca4e8e GU |
177 | /* QSPI */ |
178 | static const struct resource qspi_resources[] __initconst = { | |
179 | DEFINE_RES_MEM(0xe6b10000, 0x1000), | |
180 | DEFINE_RES_IRQ_NAMED(gic_spi(184), "mux"), | |
181 | }; | |
182 | ||
183 | static const struct rspi_plat_data qspi_pdata __initconst = { | |
184 | .num_chipselect = 1, | |
185 | }; | |
186 | ||
187 | /* SPI Flash memory (Spansion S25FL512SAGMFIG11 64 MiB) */ | |
188 | static struct mtd_partition spi_flash_part[] = { | |
189 | { | |
190 | .name = "loader", | |
191 | .offset = 0x00000000, | |
192 | .size = 512 * 1024, | |
193 | .mask_flags = MTD_WRITEABLE, | |
194 | }, | |
195 | { | |
196 | .name = "bootenv", | |
197 | .offset = MTDPART_OFS_APPEND, | |
198 | .size = 512 * 1024, | |
199 | .mask_flags = MTD_WRITEABLE, | |
200 | }, | |
201 | { | |
202 | .name = "data", | |
203 | .offset = MTDPART_OFS_APPEND, | |
204 | .size = MTDPART_SIZ_FULL, | |
205 | }, | |
206 | }; | |
207 | ||
208 | static const struct flash_platform_data spi_flash_data = { | |
209 | .name = "m25p80", | |
210 | .parts = spi_flash_part, | |
211 | .nr_parts = ARRAY_SIZE(spi_flash_part), | |
212 | .type = "s25fl512s", | |
213 | }; | |
214 | ||
215 | static const struct spi_board_info spi_info[] __initconst = { | |
216 | { | |
217 | .modalias = "m25p80", | |
218 | .platform_data = &spi_flash_data, | |
219 | .mode = SPI_MODE_0, | |
220 | .max_speed_hz = 30000000, | |
221 | .bus_num = 0, | |
222 | .chip_select = 0, | |
223 | }, | |
224 | }; | |
225 | ||
4fc0a0b9 VB |
226 | /* SATA0 */ |
227 | static const struct resource sata0_resources[] __initconst = { | |
228 | DEFINE_RES_MEM(0xee300000, 0x2000), | |
229 | DEFINE_RES_IRQ(gic_spi(105)), | |
230 | }; | |
231 | ||
232 | static const struct platform_device_info sata0_info __initconst = { | |
233 | .parent = &platform_bus, | |
234 | .name = "sata-r8a7791", | |
235 | .id = 0, | |
236 | .res = sata0_resources, | |
237 | .num_res = ARRAY_SIZE(sata0_resources), | |
238 | .dma_mask = DMA_BIT_MASK(32), | |
239 | }; | |
240 | ||
12c1d5a5 VB |
241 | /* I2C */ |
242 | static const struct resource i2c_resources[] __initconst = { | |
243 | /* I2C0 */ | |
244 | DEFINE_RES_MEM(0xE6508000, 0x40), | |
245 | DEFINE_RES_IRQ(gic_spi(287)), | |
246 | /* I2C1 */ | |
247 | DEFINE_RES_MEM(0xE6518000, 0x40), | |
248 | DEFINE_RES_IRQ(gic_spi(288)), | |
249 | /* I2C2 */ | |
250 | DEFINE_RES_MEM(0xE6530000, 0x40), | |
251 | DEFINE_RES_IRQ(gic_spi(286)), | |
252 | /* I2C3 */ | |
253 | DEFINE_RES_MEM(0xE6540000, 0x40), | |
254 | DEFINE_RES_IRQ(gic_spi(290)), | |
255 | /* I2C4 */ | |
256 | DEFINE_RES_MEM(0xE6520000, 0x40), | |
257 | DEFINE_RES_IRQ(gic_spi(19)), | |
258 | /* I2C5 */ | |
259 | DEFINE_RES_MEM(0xE6528000, 0x40), | |
260 | DEFINE_RES_IRQ(gic_spi(20)), | |
261 | }; | |
262 | ||
263 | static void __init koelsch_add_i2c(unsigned idx) | |
264 | { | |
265 | unsigned res_idx = idx * 2; | |
266 | ||
267 | BUG_ON(res_idx >= ARRAY_SIZE(i2c_resources)); | |
268 | ||
269 | platform_device_register_simple("i2c-rcar_gen2", idx, | |
270 | i2c_resources + res_idx, 2); | |
271 | } | |
272 | ||
d12e699f MD |
273 | #define SDHI_REGULATOR(idx, vdd_pin, vccq_pin) \ |
274 | static struct regulator_consumer_supply vcc_sdhi##idx##_consumer = \ | |
275 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi." #idx); \ | |
276 | \ | |
277 | static struct regulator_init_data vcc_sdhi##idx##_init_data = { \ | |
278 | .constraints = { \ | |
279 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, \ | |
280 | }, \ | |
281 | .consumer_supplies = &vcc_sdhi##idx##_consumer, \ | |
282 | .num_consumer_supplies = 1, \ | |
283 | }; \ | |
284 | \ | |
285 | static const struct fixed_voltage_config vcc_sdhi##idx##_info __initconst = {\ | |
286 | .supply_name = "SDHI" #idx "Vcc", \ | |
287 | .microvolts = 3300000, \ | |
288 | .gpio = vdd_pin, \ | |
289 | .enable_high = 1, \ | |
290 | .init_data = &vcc_sdhi##idx##_init_data, \ | |
291 | }; \ | |
292 | \ | |
293 | static struct regulator_consumer_supply vccq_sdhi##idx##_consumer = \ | |
294 | REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi." #idx); \ | |
295 | \ | |
296 | static struct regulator_init_data vccq_sdhi##idx##_init_data = { \ | |
297 | .constraints = { \ | |
298 | .input_uV = 3300000, \ | |
299 | .min_uV = 1800000, \ | |
300 | .max_uV = 3300000, \ | |
301 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \ | |
302 | REGULATOR_CHANGE_STATUS, \ | |
303 | }, \ | |
304 | .consumer_supplies = &vccq_sdhi##idx##_consumer, \ | |
305 | .num_consumer_supplies = 1, \ | |
306 | }; \ | |
307 | \ | |
308 | static struct gpio vccq_sdhi##idx##_gpio = \ | |
309 | { vccq_pin, GPIOF_OUT_INIT_HIGH, "vccq-sdhi" #idx }; \ | |
310 | \ | |
311 | static struct gpio_regulator_state vccq_sdhi##idx##_states[] = { \ | |
312 | { .value = 1800000, .gpios = 0 }, \ | |
313 | { .value = 3300000, .gpios = 1 }, \ | |
314 | }; \ | |
315 | \ | |
316 | static const struct gpio_regulator_config vccq_sdhi##idx##_info __initconst = {\ | |
317 | .supply_name = "vqmmc", \ | |
318 | .gpios = &vccq_sdhi##idx##_gpio, \ | |
319 | .nr_gpios = 1, \ | |
320 | .states = vccq_sdhi##idx##_states, \ | |
321 | .nr_states = ARRAY_SIZE(vccq_sdhi##idx##_states), \ | |
322 | .type = REGULATOR_VOLTAGE, \ | |
323 | .init_data = &vccq_sdhi##idx##_init_data, \ | |
324 | }; | |
325 | ||
326 | SDHI_REGULATOR(0, RCAR_GP_PIN(7, 17), RCAR_GP_PIN(2, 12)); | |
327 | SDHI_REGULATOR(1, RCAR_GP_PIN(7, 18), RCAR_GP_PIN(2, 13)); | |
328 | SDHI_REGULATOR(2, RCAR_GP_PIN(7, 19), RCAR_GP_PIN(2, 26)); | |
329 | ||
330 | /* SDHI0 */ | |
331 | static struct sh_mobile_sdhi_info sdhi0_info __initdata = { | |
332 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | | |
333 | MMC_CAP_POWER_OFF_CARD, | |
334 | .tmio_caps2 = MMC_CAP2_NO_MULTI_READ, | |
335 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, | |
336 | }; | |
337 | ||
338 | static struct resource sdhi0_resources[] __initdata = { | |
339 | DEFINE_RES_MEM(0xee100000, 0x200), | |
340 | DEFINE_RES_IRQ(gic_spi(165)), | |
341 | }; | |
342 | ||
343 | /* SDHI1 */ | |
344 | static struct sh_mobile_sdhi_info sdhi1_info __initdata = { | |
345 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | | |
346 | MMC_CAP_POWER_OFF_CARD, | |
347 | .tmio_caps2 = MMC_CAP2_NO_MULTI_READ, | |
348 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, | |
349 | }; | |
350 | ||
351 | static struct resource sdhi1_resources[] __initdata = { | |
352 | DEFINE_RES_MEM(0xee140000, 0x100), | |
353 | DEFINE_RES_IRQ(gic_spi(167)), | |
354 | }; | |
355 | ||
356 | /* SDHI2 */ | |
357 | static struct sh_mobile_sdhi_info sdhi2_info __initdata = { | |
358 | .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | | |
359 | MMC_CAP_POWER_OFF_CARD, | |
360 | .tmio_caps2 = MMC_CAP2_NO_MULTI_READ, | |
361 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | | |
362 | TMIO_MMC_WRPROTECT_DISABLE, | |
363 | }; | |
364 | ||
365 | static struct resource sdhi2_resources[] __initdata = { | |
366 | DEFINE_RES_MEM(0xee160000, 0x100), | |
367 | DEFINE_RES_IRQ(gic_spi(168)), | |
368 | }; | |
369 | ||
85ef14da | 370 | static const struct pinctrl_map koelsch_pinctrl_map[] = { |
784c33a0 LP |
371 | /* DU */ |
372 | PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791", | |
373 | "du_rgb666", "du"), | |
374 | PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791", | |
375 | "du_sync", "du"), | |
376 | PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791", | |
377 | "du_clk_out_0", "du"), | |
974faba7 SS |
378 | /* Ether */ |
379 | PIN_MAP_MUX_GROUP_DEFAULT("r8a7791-ether", "pfc-r8a7791", | |
380 | "eth_link", "eth"), | |
381 | PIN_MAP_MUX_GROUP_DEFAULT("r8a7791-ether", "pfc-r8a7791", | |
382 | "eth_mdio", "eth"), | |
383 | PIN_MAP_MUX_GROUP_DEFAULT("r8a7791-ether", "pfc-r8a7791", | |
384 | "eth_rmii", "eth"), | |
385 | PIN_MAP_MUX_GROUP_DEFAULT("r8a7791-ether", "pfc-r8a7791", | |
386 | "intc_irq0", "intc"), | |
bcca4e8e GU |
387 | /* QSPI */ |
388 | PIN_MAP_MUX_GROUP_DEFAULT("qspi.0", "pfc-r8a7791", | |
389 | "qspi_ctrl", "qspi"), | |
390 | PIN_MAP_MUX_GROUP_DEFAULT("qspi.0", "pfc-r8a7791", | |
391 | "qspi_data4", "qspi"), | |
85ef14da MD |
392 | /* SCIF0 (CN19: DEBUG SERIAL0) */ |
393 | PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.6", "pfc-r8a7791", | |
394 | "scif0_data_d", "scif0"), | |
395 | /* SCIF1 (CN20: DEBUG SERIAL1) */ | |
396 | PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.7", "pfc-r8a7791", | |
397 | "scif1_data_d", "scif1"), | |
12c1d5a5 VB |
398 | /* I2C1 */ |
399 | PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.1", "pfc-r8a7791", | |
400 | "i2c1_e", "i2c1"), | |
401 | /* I2C2 */ | |
402 | PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.2", "pfc-r8a7791", | |
403 | "i2c2", "i2c2"), | |
404 | /* I2C4 */ | |
405 | PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.4", "pfc-r8a7791", | |
406 | "i2c4_c", "i2c4"), | |
d12e699f MD |
407 | /* SDHI0 */ |
408 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791", | |
409 | "sdhi0_data4", "sdhi0"), | |
410 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791", | |
411 | "sdhi0_ctrl", "sdhi0"), | |
412 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791", | |
413 | "sdhi0_cd", "sdhi0"), | |
414 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791", | |
415 | "sdhi0_wp", "sdhi0"), | |
416 | /* SDHI2 */ | |
417 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791", | |
418 | "sdhi1_data4", "sdhi1"), | |
419 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791", | |
420 | "sdhi1_ctrl", "sdhi1"), | |
421 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791", | |
422 | "sdhi1_cd", "sdhi1"), | |
423 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791", | |
424 | "sdhi1_wp", "sdhi1"), | |
425 | /* SDHI2 */ | |
426 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791", | |
427 | "sdhi2_data4", "sdhi2"), | |
428 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791", | |
429 | "sdhi2_ctrl", "sdhi2"), | |
430 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791", | |
431 | "sdhi2_cd", "sdhi2"), | |
85ef14da MD |
432 | }; |
433 | ||
1f52c659 HN |
434 | static void __init koelsch_add_standard_devices(void) |
435 | { | |
436 | r8a7791_clock_init(); | |
85ef14da MD |
437 | pinctrl_register_mappings(koelsch_pinctrl_map, |
438 | ARRAY_SIZE(koelsch_pinctrl_map)); | |
1a534ece | 439 | r8a7791_pinmux_init(); |
0749bead | 440 | r8a7791_add_standard_devices(); |
379bfd71 | 441 | platform_device_register_full(ðer_info); |
87a2934e MD |
442 | platform_device_register_data(&platform_bus, "leds-gpio", -1, |
443 | &koelsch_leds_pdata, | |
444 | sizeof(koelsch_leds_pdata)); | |
721319d1 MD |
445 | platform_device_register_data(&platform_bus, "gpio-keys", -1, |
446 | &koelsch_keys_pdata, | |
447 | sizeof(koelsch_keys_pdata)); | |
bcca4e8e GU |
448 | platform_device_register_resndata(&platform_bus, "qspi", 0, |
449 | qspi_resources, | |
450 | ARRAY_SIZE(qspi_resources), | |
451 | &qspi_pdata, sizeof(qspi_pdata)); | |
452 | spi_register_board_info(spi_info, ARRAY_SIZE(spi_info)); | |
784c33a0 LP |
453 | |
454 | koelsch_add_du_device(); | |
4fc0a0b9 VB |
455 | |
456 | platform_device_register_full(&sata0_info); | |
12c1d5a5 VB |
457 | |
458 | koelsch_add_i2c(1); | |
459 | koelsch_add_i2c(2); | |
460 | koelsch_add_i2c(4); | |
461 | koelsch_add_i2c(5); | |
d12e699f MD |
462 | |
463 | platform_device_register_data(&platform_bus, "reg-fixed-voltage", 0, | |
464 | &vcc_sdhi0_info, sizeof(struct fixed_voltage_config)); | |
465 | platform_device_register_data(&platform_bus, "reg-fixed-voltage", 1, | |
466 | &vcc_sdhi1_info, sizeof(struct fixed_voltage_config)); | |
467 | platform_device_register_data(&platform_bus, "reg-fixed-voltage", 2, | |
468 | &vcc_sdhi2_info, sizeof(struct fixed_voltage_config)); | |
469 | platform_device_register_data(&platform_bus, "gpio-regulator", 0, | |
470 | &vccq_sdhi0_info, sizeof(struct gpio_regulator_config)); | |
471 | platform_device_register_data(&platform_bus, "gpio-regulator", 1, | |
472 | &vccq_sdhi1_info, sizeof(struct gpio_regulator_config)); | |
473 | platform_device_register_data(&platform_bus, "gpio-regulator", 2, | |
474 | &vccq_sdhi2_info, sizeof(struct gpio_regulator_config)); | |
475 | ||
476 | platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 0, | |
477 | sdhi0_resources, ARRAY_SIZE(sdhi0_resources), | |
478 | &sdhi0_info, sizeof(struct sh_mobile_sdhi_info)); | |
479 | ||
480 | platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 1, | |
481 | sdhi1_resources, ARRAY_SIZE(sdhi1_resources), | |
482 | &sdhi1_info, sizeof(struct sh_mobile_sdhi_info)); | |
483 | ||
484 | platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 2, | |
485 | sdhi2_resources, ARRAY_SIZE(sdhi2_resources), | |
486 | &sdhi2_info, sizeof(struct sh_mobile_sdhi_info)); | |
487 | ||
1f52c659 HN |
488 | } |
489 | ||
974faba7 SS |
490 | /* |
491 | * Ether LEDs on the Koelsch board are named LINK and ACTIVE which corresponds | |
492 | * to non-default 01 setting of the Micrel KSZ8041 PHY control register 1 bits | |
493 | * 14-15. We have to set them back to 01 from the default 00 value each time | |
494 | * the PHY is reset. It's also important because the PHY's LED0 signal is | |
495 | * connected to SoC's ETH_LINK signal and in the PHY's default mode it will | |
496 | * bounce on and off after each packet, which we apparently want to avoid. | |
497 | */ | |
498 | static int koelsch_ksz8041_fixup(struct phy_device *phydev) | |
499 | { | |
500 | u16 phyctrl1 = phy_read(phydev, 0x1e); | |
501 | ||
502 | phyctrl1 &= ~0xc000; | |
503 | phyctrl1 |= 0x4000; | |
504 | return phy_write(phydev, 0x1e, phyctrl1); | |
505 | } | |
506 | ||
507 | static void __init koelsch_init(void) | |
508 | { | |
509 | koelsch_add_standard_devices(); | |
510 | ||
29d9f010 SS |
511 | irq_set_irq_type(irq_pin(0), IRQ_TYPE_LEVEL_LOW); |
512 | ||
974faba7 SS |
513 | if (IS_ENABLED(CONFIG_PHYLIB)) |
514 | phy_register_fixup_for_id("r8a7791-ether-ff:01", | |
515 | koelsch_ksz8041_fixup); | |
516 | } | |
517 | ||
1f52c659 HN |
518 | static const char * const koelsch_boards_compat_dt[] __initconst = { |
519 | "renesas,koelsch", | |
520 | NULL, | |
521 | }; | |
522 | ||
523 | DT_MACHINE_START(KOELSCH_DT, "koelsch") | |
b6d5a1b1 | 524 | .smp = smp_ops(r8a7791_smp_ops), |
1f52c659 | 525 | .init_early = r8a7791_init_early, |
f9c9eb7e | 526 | .init_time = rcar_gen2_timer_init, |
974faba7 | 527 | .init_machine = koelsch_init, |
6dc00ab9 | 528 | .init_late = shmobile_init_late, |
1f52c659 HN |
529 | .dt_compat = koelsch_boards_compat_dt, |
530 | MACHINE_END |