aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-shmobile
diff options
context:
space:
mode:
authorMagnus Damm <damm@opensource.se>2014-02-11 23:26:21 -0500
committerSimon Horman <horms+renesas@verge.net.au>2014-02-13 00:08:43 -0500
commitd12e699f44b8277b7b72b546c69948a2f20514f8 (patch)
treefaa019fa3021afc96a211f418d020bd9372482be /arch/arm/mach-shmobile
parent03fec7dee502d43114f384a1588ce84a3c9bf38d (diff)
ARM: shmobile: Add SDHI devices for legacy Koelsch
Add SDHI0, SDHI1 and SDHI2 as platform devices to the legacy Koelsch board code. Also include regulators that are needed to control VCCQ and VDD. Signed-off-by: Magnus Damm <damm@opensource.se> Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Diffstat (limited to 'arch/arm/mach-shmobile')
-rw-r--r--arch/arm/mach-shmobile/board-koelsch.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/arch/arm/mach-shmobile/board-koelsch.c b/arch/arm/mach-shmobile/board-koelsch.c
index d42637db596a..893d47c7d7a6 100644
--- a/arch/arm/mach-shmobile/board-koelsch.c
+++ b/arch/arm/mach-shmobile/board-koelsch.c
@@ -26,6 +26,9 @@
26#include <linux/irq.h> 26#include <linux/irq.h>
27#include <linux/kernel.h> 27#include <linux/kernel.h>
28#include <linux/leds.h> 28#include <linux/leds.h>
29#include <linux/mfd/tmio.h>
30#include <linux/mmc/host.h>
31#include <linux/mmc/sh_mobile_sdhi.h>
29#include <linux/mtd/mtd.h> 32#include <linux/mtd/mtd.h>
30#include <linux/mtd/partitions.h> 33#include <linux/mtd/partitions.h>
31#include <linux/phy.h> 34#include <linux/phy.h>
@@ -33,6 +36,10 @@
33#include <linux/platform_data/gpio-rcar.h> 36#include <linux/platform_data/gpio-rcar.h>
34#include <linux/platform_data/rcar-du.h> 37#include <linux/platform_data/rcar-du.h>
35#include <linux/platform_device.h> 38#include <linux/platform_device.h>
39#include <linux/regulator/driver.h>
40#include <linux/regulator/fixed.h>
41#include <linux/regulator/gpio-regulator.h>
42#include <linux/regulator/machine.h>
36#include <linux/sh_eth.h> 43#include <linux/sh_eth.h>
37#include <linux/spi/flash.h> 44#include <linux/spi/flash.h>
38#include <linux/spi/rspi.h> 45#include <linux/spi/rspi.h>
@@ -251,6 +258,103 @@ static void __init koelsch_add_i2c(unsigned idx)
251 i2c_resources + res_idx, 2); 258 i2c_resources + res_idx, 2);
252} 259}
253 260
261#define SDHI_REGULATOR(idx, vdd_pin, vccq_pin) \
262static struct regulator_consumer_supply vcc_sdhi##idx##_consumer = \
263 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi." #idx); \
264 \
265static struct regulator_init_data vcc_sdhi##idx##_init_data = { \
266 .constraints = { \
267 .valid_ops_mask = REGULATOR_CHANGE_STATUS, \
268 }, \
269 .consumer_supplies = &vcc_sdhi##idx##_consumer, \
270 .num_consumer_supplies = 1, \
271}; \
272 \
273static const struct fixed_voltage_config vcc_sdhi##idx##_info __initconst = {\
274 .supply_name = "SDHI" #idx "Vcc", \
275 .microvolts = 3300000, \
276 .gpio = vdd_pin, \
277 .enable_high = 1, \
278 .init_data = &vcc_sdhi##idx##_init_data, \
279}; \
280 \
281static struct regulator_consumer_supply vccq_sdhi##idx##_consumer = \
282 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi." #idx); \
283 \
284static struct regulator_init_data vccq_sdhi##idx##_init_data = { \
285 .constraints = { \
286 .input_uV = 3300000, \
287 .min_uV = 1800000, \
288 .max_uV = 3300000, \
289 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | \
290 REGULATOR_CHANGE_STATUS, \
291 }, \
292 .consumer_supplies = &vccq_sdhi##idx##_consumer, \
293 .num_consumer_supplies = 1, \
294}; \
295 \
296static struct gpio vccq_sdhi##idx##_gpio = \
297 { vccq_pin, GPIOF_OUT_INIT_HIGH, "vccq-sdhi" #idx }; \
298 \
299static struct gpio_regulator_state vccq_sdhi##idx##_states[] = { \
300 { .value = 1800000, .gpios = 0 }, \
301 { .value = 3300000, .gpios = 1 }, \
302}; \
303 \
304static const struct gpio_regulator_config vccq_sdhi##idx##_info __initconst = {\
305 .supply_name = "vqmmc", \
306 .gpios = &vccq_sdhi##idx##_gpio, \
307 .nr_gpios = 1, \
308 .states = vccq_sdhi##idx##_states, \
309 .nr_states = ARRAY_SIZE(vccq_sdhi##idx##_states), \
310 .type = REGULATOR_VOLTAGE, \
311 .init_data = &vccq_sdhi##idx##_init_data, \
312};
313
314SDHI_REGULATOR(0, RCAR_GP_PIN(7, 17), RCAR_GP_PIN(2, 12));
315SDHI_REGULATOR(1, RCAR_GP_PIN(7, 18), RCAR_GP_PIN(2, 13));
316SDHI_REGULATOR(2, RCAR_GP_PIN(7, 19), RCAR_GP_PIN(2, 26));
317
318/* SDHI0 */
319static struct sh_mobile_sdhi_info sdhi0_info __initdata = {
320 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
321 MMC_CAP_POWER_OFF_CARD,
322 .tmio_caps2 = MMC_CAP2_NO_MULTI_READ,
323 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
324};
325
326static struct resource sdhi0_resources[] __initdata = {
327 DEFINE_RES_MEM(0xee100000, 0x200),
328 DEFINE_RES_IRQ(gic_spi(165)),
329};
330
331/* SDHI1 */
332static struct sh_mobile_sdhi_info sdhi1_info __initdata = {
333 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
334 MMC_CAP_POWER_OFF_CARD,
335 .tmio_caps2 = MMC_CAP2_NO_MULTI_READ,
336 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
337};
338
339static struct resource sdhi1_resources[] __initdata = {
340 DEFINE_RES_MEM(0xee140000, 0x100),
341 DEFINE_RES_IRQ(gic_spi(167)),
342};
343
344/* SDHI2 */
345static struct sh_mobile_sdhi_info sdhi2_info __initdata = {
346 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
347 MMC_CAP_POWER_OFF_CARD,
348 .tmio_caps2 = MMC_CAP2_NO_MULTI_READ,
349 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT |
350 TMIO_MMC_WRPROTECT_DISABLE,
351};
352
353static struct resource sdhi2_resources[] __initdata = {
354 DEFINE_RES_MEM(0xee160000, 0x100),
355 DEFINE_RES_IRQ(gic_spi(168)),
356};
357
254static const struct pinctrl_map koelsch_pinctrl_map[] = { 358static const struct pinctrl_map koelsch_pinctrl_map[] = {
255 /* DU */ 359 /* DU */
256 PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791", 360 PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7791", "pfc-r8a7791",
@@ -288,6 +392,31 @@ static const struct pinctrl_map koelsch_pinctrl_map[] = {
288 /* I2C4 */ 392 /* I2C4 */
289 PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.4", "pfc-r8a7791", 393 PIN_MAP_MUX_GROUP_DEFAULT("i2c-rcar_gen2.4", "pfc-r8a7791",
290 "i2c4_c", "i2c4"), 394 "i2c4_c", "i2c4"),
395 /* SDHI0 */
396 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791",
397 "sdhi0_data4", "sdhi0"),
398 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791",
399 "sdhi0_ctrl", "sdhi0"),
400 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791",
401 "sdhi0_cd", "sdhi0"),
402 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7791",
403 "sdhi0_wp", "sdhi0"),
404 /* SDHI2 */
405 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791",
406 "sdhi1_data4", "sdhi1"),
407 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791",
408 "sdhi1_ctrl", "sdhi1"),
409 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791",
410 "sdhi1_cd", "sdhi1"),
411 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7791",
412 "sdhi1_wp", "sdhi1"),
413 /* SDHI2 */
414 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791",
415 "sdhi2_data4", "sdhi2"),
416 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791",
417 "sdhi2_ctrl", "sdhi2"),
418 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-r8a7791",
419 "sdhi2_cd", "sdhi2"),
291}; 420};
292 421
293static void __init koelsch_add_standard_devices(void) 422static void __init koelsch_add_standard_devices(void)
@@ -321,6 +450,32 @@ static void __init koelsch_add_standard_devices(void)
321 koelsch_add_i2c(2); 450 koelsch_add_i2c(2);
322 koelsch_add_i2c(4); 451 koelsch_add_i2c(4);
323 koelsch_add_i2c(5); 452 koelsch_add_i2c(5);
453
454 platform_device_register_data(&platform_bus, "reg-fixed-voltage", 0,
455 &vcc_sdhi0_info, sizeof(struct fixed_voltage_config));
456 platform_device_register_data(&platform_bus, "reg-fixed-voltage", 1,
457 &vcc_sdhi1_info, sizeof(struct fixed_voltage_config));
458 platform_device_register_data(&platform_bus, "reg-fixed-voltage", 2,
459 &vcc_sdhi2_info, sizeof(struct fixed_voltage_config));
460 platform_device_register_data(&platform_bus, "gpio-regulator", 0,
461 &vccq_sdhi0_info, sizeof(struct gpio_regulator_config));
462 platform_device_register_data(&platform_bus, "gpio-regulator", 1,
463 &vccq_sdhi1_info, sizeof(struct gpio_regulator_config));
464 platform_device_register_data(&platform_bus, "gpio-regulator", 2,
465 &vccq_sdhi2_info, sizeof(struct gpio_regulator_config));
466
467 platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 0,
468 sdhi0_resources, ARRAY_SIZE(sdhi0_resources),
469 &sdhi0_info, sizeof(struct sh_mobile_sdhi_info));
470
471 platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 1,
472 sdhi1_resources, ARRAY_SIZE(sdhi1_resources),
473 &sdhi1_info, sizeof(struct sh_mobile_sdhi_info));
474
475 platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 2,
476 sdhi2_resources, ARRAY_SIZE(sdhi2_resources),
477 &sdhi2_info, sizeof(struct sh_mobile_sdhi_info));
478
324} 479}
325 480
326/* 481/*