aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa
diff options
context:
space:
mode:
authorMike Rapoport <mike@compulab.co.il>2009-05-18 01:53:56 -0400
committerEric Miao <eric.y.miao@gmail.com>2009-06-16 09:03:33 -0400
commita37ed43115b70e832c7e8cc7dabd026d127ad9db (patch)
tree97ca0b17fb83adb055cb2c058dba79befcdb4208 /arch/arm/mach-pxa
parent3cb05c97ad38aab0858fc176fd1577ac4a947bad (diff)
[ARM] pxa/em-x270: add ability to control GPS and GPRS power
Register userspace-consumer devices to allow userspace control of voltage regulators supplying GPS and GPRS modules Signed-off-by: Mike Rapoport <mike@compulab.co.il> Signed-off-by: Eric Miao <eric.miao@marvell.com>
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r--arch/arm/mach-pxa/em-x270.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index b2d5a5394e47..5184a570ac5f 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -30,6 +30,7 @@
30#include <linux/apm-emulation.h> 30#include <linux/apm-emulation.h>
31#include <linux/i2c.h> 31#include <linux/i2c.h>
32#include <linux/i2c/pca953x.h> 32#include <linux/i2c/pca953x.h>
33#include <linux/regulator/userspace-consumer.h>
33 34
34#include <media/soc_camera.h> 35#include <media/soc_camera.h>
35 36
@@ -1038,6 +1039,52 @@ static void __init em_x270_init_camera(void)
1038static inline void em_x270_init_camera(void) {} 1039static inline void em_x270_init_camera(void) {}
1039#endif 1040#endif
1040 1041
1042static struct regulator_bulk_data em_x270_gps_consumer_supply = {
1043 .supply = "vcc gps",
1044};
1045
1046static struct regulator_userspace_consumer_data em_x270_gps_consumer_data = {
1047 .name = "vcc gps",
1048 .num_supplies = 1,
1049 .supplies = &em_x270_gps_consumer_supply,
1050};
1051
1052static struct platform_device em_x270_gps_userspace_consumer = {
1053 .name = "reg-userspace-consumer",
1054 .id = 0,
1055 .dev = {
1056 .platform_data = &em_x270_gps_consumer_data,
1057 },
1058};
1059
1060static struct regulator_bulk_data em_x270_gprs_consumer_supply = {
1061 .supply = "vcc gprs",
1062};
1063
1064static struct regulator_userspace_consumer_data em_x270_gprs_consumer_data = {
1065 .name = "vcc gprs",
1066 .num_supplies = 1,
1067 .supplies = &em_x270_gprs_consumer_supply
1068};
1069
1070static struct platform_device em_x270_gprs_userspace_consumer = {
1071 .name = "reg-userspace-consumer",
1072 .id = 1,
1073 .dev = {
1074 .platform_data = &em_x270_gprs_consumer_data,
1075 }
1076};
1077
1078static struct platform_device *em_x270_userspace_consumers[] = {
1079 &em_x270_gps_userspace_consumer,
1080 &em_x270_gprs_userspace_consumer,
1081};
1082
1083static void __init em_x270_userspace_consumers_init(void)
1084{
1085 platform_add_devices(ARRAY_AND_SIZE(em_x270_userspace_consumers));
1086}
1087
1041/* DA9030 related initializations */ 1088/* DA9030 related initializations */
1042#define REGULATOR_CONSUMER(_name, _dev, _supply) \ 1089#define REGULATOR_CONSUMER(_name, _dev, _supply) \
1043 static struct regulator_consumer_supply _name##_consumers[] = { \ 1090 static struct regulator_consumer_supply _name##_consumers[] = { \
@@ -1047,11 +1094,11 @@ static inline void em_x270_init_camera(void) {}
1047 }, \ 1094 }, \
1048 } 1095 }
1049 1096
1050REGULATOR_CONSUMER(ldo3, NULL, "vcc gps"); 1097REGULATOR_CONSUMER(ldo3, &em_x270_gps_userspace_consumer.dev, "vcc gps");
1051REGULATOR_CONSUMER(ldo5, NULL, "vcc cam"); 1098REGULATOR_CONSUMER(ldo5, NULL, "vcc cam");
1052REGULATOR_CONSUMER(ldo10, &pxa_device_mci.dev, "vcc sdio"); 1099REGULATOR_CONSUMER(ldo10, &pxa_device_mci.dev, "vcc sdio");
1053REGULATOR_CONSUMER(ldo12, NULL, "vcc usb"); 1100REGULATOR_CONSUMER(ldo12, NULL, "vcc usb");
1054REGULATOR_CONSUMER(ldo19, NULL, "vcc gprs"); 1101REGULATOR_CONSUMER(ldo19, &em_x270_gprs_userspace_consumer.dev, "vcc gprs");
1055 1102
1056#define REGULATOR_INIT(_ldo, _min_uV, _max_uV, _ops_mask) \ 1103#define REGULATOR_INIT(_ldo, _min_uV, _max_uV, _ops_mask) \
1057 static struct regulator_init_data _ldo##_data = { \ 1104 static struct regulator_init_data _ldo##_data = { \
@@ -1062,6 +1109,7 @@ REGULATOR_CONSUMER(ldo19, NULL, "vcc gprs");
1062 .enabled = 0, \ 1109 .enabled = 0, \
1063 }, \ 1110 }, \
1064 .valid_ops_mask = _ops_mask, \ 1111 .valid_ops_mask = _ops_mask, \
1112 .apply_uV = 1, \
1065 }, \ 1113 }, \
1066 .num_consumer_supplies = ARRAY_SIZE(_ldo##_consumers), \ 1114 .num_consumer_supplies = ARRAY_SIZE(_ldo##_consumers), \
1067 .consumer_supplies = _ldo##_consumers, \ 1115 .consumer_supplies = _ldo##_consumers, \
@@ -1240,6 +1288,7 @@ static void __init em_x270_init(void)
1240 em_x270_init_spi(); 1288 em_x270_init_spi();
1241 em_x270_init_i2c(); 1289 em_x270_init_i2c();
1242 em_x270_init_camera(); 1290 em_x270_init_camera();
1291 em_x270_userspace_consumers_init();
1243} 1292}
1244 1293
1245MACHINE_START(EM_X270, "Compulab EM-X270") 1294MACHINE_START(EM_X270, "Compulab EM-X270")