diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2012-06-29 03:32:29 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2012-06-30 16:39:00 -0400 |
commit | 6add9691cca71de0eab38e21a1c45812ba204b98 (patch) | |
tree | 28f8458ed6c3197e6930738d8b256b609d901319 /arch/arm | |
parent | 21503a86db5015b74cceb54c41ed8862107ddaec (diff) |
ARM: mach-shmobile: add fixed voltage regulators to ag5evm
On ag5evm provide 1.8V, 2.8V, and 3.3V supplies for its SD/MMC-card
interfaces and a dummy regulator for the smsc911x driver.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-shmobile/board-ag5evm.c | 82 |
1 files changed, 79 insertions, 3 deletions
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 5a6f22f05e99..d82c010fdfc6 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/dma-mapping.h> | 29 | #include <linux/dma-mapping.h> |
30 | #include <linux/regulator/fixed.h> | ||
31 | #include <linux/regulator/machine.h> | ||
30 | #include <linux/serial_sci.h> | 32 | #include <linux/serial_sci.h> |
31 | #include <linux/smsc911x.h> | 33 | #include <linux/smsc911x.h> |
32 | #include <linux/gpio.h> | 34 | #include <linux/gpio.h> |
@@ -52,6 +54,12 @@ | |||
52 | #include <asm/hardware/cache-l2x0.h> | 54 | #include <asm/hardware/cache-l2x0.h> |
53 | #include <asm/traps.h> | 55 | #include <asm/traps.h> |
54 | 56 | ||
57 | /* Dummy supplies, where voltage doesn't matter */ | ||
58 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
59 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
60 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
61 | }; | ||
62 | |||
55 | static struct resource smsc9220_resources[] = { | 63 | static struct resource smsc9220_resources[] = { |
56 | [0] = { | 64 | [0] = { |
57 | .start = 0x14000000, | 65 | .start = 0x14000000, |
@@ -142,6 +150,13 @@ static struct platform_device fsi_device = { | |||
142 | .resource = fsi_resources, | 150 | .resource = fsi_resources, |
143 | }; | 151 | }; |
144 | 152 | ||
153 | /* Fixed 1.8V regulator to be used by MMCIF */ | ||
154 | static struct regulator_consumer_supply fixed1v8_power_consumers[] = | ||
155 | { | ||
156 | REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), | ||
157 | REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), | ||
158 | }; | ||
159 | |||
145 | static struct resource sh_mmcif_resources[] = { | 160 | static struct resource sh_mmcif_resources[] = { |
146 | [0] = { | 161 | [0] = { |
147 | .name = "MMCIF", | 162 | .name = "MMCIF", |
@@ -364,6 +379,13 @@ static struct platform_device mipidsi0_device = { | |||
364 | }, | 379 | }, |
365 | }; | 380 | }; |
366 | 381 | ||
382 | /* Fixed 2.8V regulators to be used by SDHI0 */ | ||
383 | static struct regulator_consumer_supply fixed2v8_power_consumers[] = | ||
384 | { | ||
385 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), | ||
386 | REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), | ||
387 | }; | ||
388 | |||
367 | /* SDHI0 */ | 389 | /* SDHI0 */ |
368 | static struct sh_mobile_sdhi_info sdhi0_info = { | 390 | static struct sh_mobile_sdhi_info sdhi0_info = { |
369 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, | 391 | .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, |
@@ -408,8 +430,57 @@ static struct platform_device sdhi0_device = { | |||
408 | }, | 430 | }, |
409 | }; | 431 | }; |
410 | 432 | ||
411 | void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state) | 433 | /* Fixed 3.3V regulator to be used by SDHI1 */ |
434 | static struct regulator_consumer_supply cn4_power_consumers[] = | ||
412 | { | 435 | { |
436 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), | ||
437 | REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), | ||
438 | }; | ||
439 | |||
440 | static struct regulator_init_data cn4_power_init_data = { | ||
441 | .constraints = { | ||
442 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
443 | }, | ||
444 | .num_consumer_supplies = ARRAY_SIZE(cn4_power_consumers), | ||
445 | .consumer_supplies = cn4_power_consumers, | ||
446 | }; | ||
447 | |||
448 | static struct fixed_voltage_config cn4_power_info = { | ||
449 | .supply_name = "CN4 SD/MMC Vdd", | ||
450 | .microvolts = 3300000, | ||
451 | .gpio = GPIO_PORT114, | ||
452 | .enable_high = 1, | ||
453 | .init_data = &cn4_power_init_data, | ||
454 | }; | ||
455 | |||
456 | static struct platform_device cn4_power = { | ||
457 | .name = "reg-fixed-voltage", | ||
458 | .id = 2, | ||
459 | .dev = { | ||
460 | .platform_data = &cn4_power_info, | ||
461 | }, | ||
462 | }; | ||
463 | |||
464 | static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state) | ||
465 | { | ||
466 | static int power_gpio = -EINVAL; | ||
467 | |||
468 | if (power_gpio < 0) { | ||
469 | int ret = gpio_request(GPIO_PORT114, "sdhi1_power"); | ||
470 | if (!ret) { | ||
471 | power_gpio = GPIO_PORT114; | ||
472 | gpio_direction_output(power_gpio, 0); | ||
473 | } | ||
474 | } | ||
475 | |||
476 | /* | ||
477 | * If requesting the GPIO above failed, it means, that the regulator got | ||
478 | * probed and grabbed the GPIO, but we don't know, whether the sdhi | ||
479 | * driver already uses the regulator. If it doesn't, we have to toggle | ||
480 | * the GPIO ourselves, even though it is now owned by the fixed | ||
481 | * regulator driver. We have to live with the race in case the driver | ||
482 | * gets unloaded and the GPIO freed between these two steps. | ||
483 | */ | ||
413 | gpio_set_value(GPIO_PORT114, state); | 484 | gpio_set_value(GPIO_PORT114, state); |
414 | } | 485 | } |
415 | 486 | ||
@@ -455,6 +526,7 @@ static struct platform_device sdhi1_device = { | |||
455 | }; | 526 | }; |
456 | 527 | ||
457 | static struct platform_device *ag5evm_devices[] __initdata = { | 528 | static struct platform_device *ag5evm_devices[] __initdata = { |
529 | &cn4_power, | ||
458 | ð_device, | 530 | ð_device, |
459 | &keysc_device, | 531 | &keysc_device, |
460 | &fsi_device, | 532 | &fsi_device, |
@@ -468,6 +540,12 @@ static struct platform_device *ag5evm_devices[] __initdata = { | |||
468 | 540 | ||
469 | static void __init ag5evm_init(void) | 541 | static void __init ag5evm_init(void) |
470 | { | 542 | { |
543 | regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers, | ||
544 | ARRAY_SIZE(fixed1v8_power_consumers), 1800000); | ||
545 | regulator_register_always_on(1, "fixed-2.8V", fixed2v8_power_consumers, | ||
546 | ARRAY_SIZE(fixed2v8_power_consumers), 3300000); | ||
547 | regulator_register_fixed(3, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
548 | |||
471 | sh73a0_pinmux_init(); | 549 | sh73a0_pinmux_init(); |
472 | 550 | ||
473 | /* enable SCIFA2 */ | 551 | /* enable SCIFA2 */ |
@@ -562,8 +640,6 @@ static void __init ag5evm_init(void) | |||
562 | gpio_request(GPIO_FN_SDHID1_2_PU, NULL); | 640 | gpio_request(GPIO_FN_SDHID1_2_PU, NULL); |
563 | gpio_request(GPIO_FN_SDHID1_1_PU, NULL); | 641 | gpio_request(GPIO_FN_SDHID1_1_PU, NULL); |
564 | gpio_request(GPIO_FN_SDHID1_0_PU, NULL); | 642 | gpio_request(GPIO_FN_SDHID1_0_PU, NULL); |
565 | gpio_request(GPIO_PORT114, "sdhi1_power"); | ||
566 | gpio_direction_output(GPIO_PORT114, 0); | ||
567 | 643 | ||
568 | #ifdef CONFIG_CACHE_L2X0 | 644 | #ifdef CONFIG_CACHE_L2X0 |
569 | /* Shared attribute override enable, 64K*8way */ | 645 | /* Shared attribute override enable, 64K*8way */ |