aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/mop500-regulators.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ux500/mop500-regulators.c')
-rw-r--r--arch/arm/mach-ux500/mop500-regulators.c453
1 files changed, 453 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/mop500-regulators.c b/arch/arm/mach-ux500/mop500-regulators.c
new file mode 100644
index 00000000000..ae588be3aa5
--- /dev/null
+++ b/arch/arm/mach-ux500/mop500-regulators.c
@@ -0,0 +1,453 @@
+/*
+ * Copyright (C) 2009 ST-Ericsson SA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <linux/regulator/machine.h>
+
+#include <mach/devices.h>
+
+/* U8500 Power section */
+#ifdef CONFIG_REGULATOR
+
+#define U8500_VAPE_REGULATOR_MIN_VOLTAGE (1800000)
+#define U8500_VAPE_REGULATOR_MAX_VOLTAGE (2000000)
+
+/* tying VAPE regulator to symbolic consumer devices */
+static struct regulator_consumer_supply db8500_vape_consumers[] = {
+ {
+ .supply = "v-ape",
+ },
+};
+
+/* VAPE supply, for interconnect */
+static struct regulator_init_data db8500_vape_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "DB8500-VAPE",
+ .min_uV = U8500_VAPE_REGULATOR_MIN_VOLTAGE,
+ .max_uV = U8500_VAPE_REGULATOR_MAX_VOLTAGE,
+ .input_uV = 1, /* notional, for set_mode* */
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE|REGULATOR_CHANGE_DRMS,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(db8500_vape_consumers),
+ .consumer_supplies = db8500_vape_consumers,
+};
+
+static struct platform_device db8500_vape_regulator_dev = {
+ .name = "db8500-regulator",
+ .id = 0,
+ .dev = {
+ .platform_data = &db8500_vape_init,
+ },
+};
+
+/* VANA Supply, for analogue part of displays */
+#define U8500_VANA_REGULATOR_MIN_VOLTAGE (0)
+#define U8500_VANA_REGULATOR_MAX_VOLTAGE (1200000)
+
+static struct regulator_consumer_supply db8500_vana_consumers[] = {
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELA
+ {
+ .dev = &u8500_mcde0_device.dev,
+ .supply = "v-ana",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELB
+ {
+ .dev = &u8500_mcde1_device.dev,
+ .supply = "v-ana",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELC0
+ {
+ .dev = &u8500_mcde2_device.dev,
+ .supply = "v-ana",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELC1
+ {
+ .dev = &u8500_mcde3_device.dev,
+ .supply = "v-ana",
+ },
+#endif
+};
+
+static struct regulator_init_data db8500_vana_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "VANA",
+ .min_uV = U8500_VANA_REGULATOR_MIN_VOLTAGE,
+ .max_uV = U8500_VANA_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL |
+ REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(db8500_vana_consumers),
+ .consumer_supplies = db8500_vana_consumers,
+};
+
+static struct platform_device db8500_vana_regulator_dev = {
+ .name = "db8500-regulator",
+ .id = 1,
+ .dev = {
+ .platform_data = &db8500_vana_init,
+ },
+};
+
+#ifdef CONFIG_SENSORS1P_MOP
+extern struct platform_device sensors1p_device;
+#endif
+
+/* VAUX1 supply */
+#define AB8500_VAUXN_LDO_MIN_VOLTAGE (1100000)
+#define AB8500_VAUXN_LDO_MAX_VOLTAGE (3300000)
+
+static struct regulator_consumer_supply ab8500_vaux1_consumers[] = {
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELA
+ {
+ .dev = &u8500_mcde0_device.dev,
+ .supply = "v-mcde",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELB
+ {
+ .dev = &u8500_mcde1_device.dev,
+ .supply = "v-mcde",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELC0
+ {
+ .dev = &u8500_mcde2_device.dev,
+ .supply = "v-mcde",
+ },
+#endif
+#ifdef CONFIG_FB_U8500_MCDE_CHANNELC1
+ {
+ .dev = &u8500_mcde3_device.dev,
+ .supply = "v-mcde",
+ },
+#endif
+#ifdef CONFIG_SENSORS1P_MOP
+ {
+ .dev = &sensors1p_device.dev,
+ .supply = "v-proximity",
+ },
+ {
+ .dev = &sensors1p_device.dev,
+ .supply = "v-hal",
+ },
+#endif
+
+};
+
+static struct regulator_init_data ab8500_vaux1_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VAUX1",
+ .min_uV = AB8500_VAUXN_LDO_MIN_VOLTAGE,
+ .max_uV = AB8500_VAUXN_LDO_MIN_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
+ .consumer_supplies = ab8500_vaux1_consumers,
+};
+
+/* as the vaux2 is not a u8500 specific regulator, it is named
+ * as the ab8500 series */
+static struct platform_device ab8500_vaux1_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 0,
+ .dev = {
+ .platform_data = &ab8500_vaux1_init,
+ },
+};
+
+/* VAUX2 supply */
+/* supply for on-board eMMC */
+static struct regulator_consumer_supply ab8500_vaux2_consumers[] = {
+ {
+ .dev = &ux500_sdi4_device.dev,
+ .supply = "v-eMMC",
+ }
+};
+
+static struct regulator_init_data ab8500_vaux2_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VAUX2",
+ .min_uV = AB8500_VAUXN_LDO_MIN_VOLTAGE,
+ .max_uV = AB8500_VAUXN_LDO_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers),
+ .consumer_supplies = ab8500_vaux2_consumers,
+};
+
+static struct platform_device ab8500_vaux2_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 1,
+ .dev = {
+ .platform_data = &ab8500_vaux2_init,
+ },
+};
+
+/* supply for tvout, gpadc, TVOUT LDO */
+#define AB8500_VTVOUT_LDO_MIN_VOLTAGE (0)
+#define AB8500_VTVOUT_LDO_MAX_VOLTAGE (2000000)
+
+static struct regulator_consumer_supply ab8500_vtvout_consumers[] = {
+ {
+ .supply = "v-tvout",
+ },
+ {
+ .supply = "ab8500-gpadc",
+ }
+};
+
+static struct regulator_init_data ab8500_vtvout_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VTVOUT",
+ .min_uV = AB8500_VTVOUT_LDO_MIN_VOLTAGE,
+ .max_uV = AB8500_VTVOUT_LDO_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vtvout_consumers),
+ .consumer_supplies = ab8500_vtvout_consumers,
+};
+
+static struct platform_device ab8500_vtvout_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 2,
+ .dev = {
+ .platform_data = &ab8500_vtvout_init,
+ },
+};
+
+/* supply for usb, VBUS LDO */
+#define AB8500_VBUS_REGULATOR_MIN_VOLTAGE (0)
+#define AB8500_VBUS_REGULATOR_MAX_VOLTAGE (5000000)
+
+static struct regulator_consumer_supply ab8500_vbus_consumers[] = {
+ {
+ .supply = "v-bus",
+ }
+};
+
+static struct regulator_init_data ab8500_vbus_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VBUS",
+ .min_uV = AB8500_VBUS_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VBUS_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vbus_consumers),
+ .consumer_supplies = ab8500_vbus_consumers,
+};
+
+static struct platform_device ab8500_vbus_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 3,
+ .dev = {
+ .platform_data = &ab8500_vbus_init,
+ },
+};
+
+/* supply for ab8500-vaudio, VAUDIO LDO */
+#define AB8500_VAUDIO_REGULATOR_MIN_VOLTAGE (1925000)
+#define AB8500_VAUDIO_REGULATOR_MAX_VOLTAGE (2075000)
+
+static struct regulator_consumer_supply ab8500_vaudio_consumers[] = {
+ {
+ .supply = "v-audio",
+ }
+};
+
+static struct regulator_init_data ab8500_vaudio_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VAUDIO",
+ .min_uV = AB8500_VAUDIO_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VAUDIO_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vaudio_consumers),
+ .consumer_supplies = ab8500_vaudio_consumers,
+};
+
+static struct platform_device ab8500_vaudio_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 4,
+ .dev = {
+ .platform_data = &ab8500_vaudio_init,
+ },
+};
+
+/* supply for v-anamic1 VAMic1-LDO */
+#define AB8500_VAMIC1_REGULATOR_MIN_VOLTAGE (2000000)
+#define AB8500_VAMIC1_REGULATOR_MAX_VOLTAGE (2100000)
+
+static struct regulator_consumer_supply ab8500_vamic1_consumers[] = {
+ {
+ .supply = "v-amic1",
+ }
+};
+
+static struct regulator_init_data ab8500_vamic1_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VAMIC1",
+ .min_uV = AB8500_VAMIC1_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VAMIC1_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers),
+ .consumer_supplies = ab8500_vamic1_consumers,
+};
+
+static struct platform_device ab8500_vamic1_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 5,
+ .dev = {
+ .platform_data = &ab8500_vamic1_init,
+ },
+};
+
+/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
+static struct regulator_consumer_supply ab8500_vamic2_consumers[] = {
+ {
+ .supply = "v-amic2",
+ }
+};
+
+static struct regulator_init_data ab8500_vamic2_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VAMIC2",
+ .min_uV = AB8500_VAMIC1_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VAMIC1_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers),
+ .consumer_supplies = ab8500_vamic2_consumers,
+};
+
+static struct platform_device ab8500_vamic2_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 6,
+ .dev = {
+ .platform_data = &ab8500_vamic2_init,
+ },
+};
+
+/* supply for v-dmic, VDMIC LDO */
+#define AB8500_VDMIC_REGULATOR_MIN_VOLTAGE (1700000)
+#define AB8500_VDMIC_REGULATOR_MAX_VOLTAGE (1950000)
+
+static struct regulator_consumer_supply ab8500_vdmic_consumers[] = {
+ {
+ .supply = "v-dmic",
+ }
+};
+
+static struct regulator_init_data ab8500_vdmic_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VDMIC",
+ .min_uV = AB8500_VDMIC_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VDMIC_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers),
+ .consumer_supplies = ab8500_vdmic_consumers,
+};
+
+static struct platform_device ab8500_vdmic_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 7,
+ .dev = {
+ .platform_data = &ab8500_vdmic_init,
+ },
+};
+
+/* supply for v-intcore12, VINTCORE12 LDO */
+#define AB8500_VINTCORE_REGULATOR_MIN_VOLTAGE (1200000)
+#define AB8500_VINTCORE_REGULATOR_MAX_VOLTAGE (1350000)
+
+static struct regulator_consumer_supply ab8500_vintcore_consumers[] = {
+ {
+ .supply = "v-intcore",
+ }
+};
+
+static struct regulator_init_data ab8500_vintcore_init = {
+ .supply_regulator_dev = NULL,
+ .constraints = {
+ .name = "AB8500-VINTCORE",
+ .min_uV = AB8500_VINTCORE_REGULATOR_MIN_VOLTAGE,
+ .max_uV = AB8500_VINTCORE_REGULATOR_MAX_VOLTAGE,
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|
+ REGULATOR_CHANGE_MODE,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL|REGULATOR_MODE_IDLE,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers),
+ .consumer_supplies = ab8500_vintcore_consumers,
+};
+
+static struct platform_device ab8500_vintcore_regulator_dev = {
+ .name = "ab8500-regulator",
+ .id = 8,
+ .dev = {
+ .platform_data = &ab8500_vintcore_init,
+ },
+};
+static struct platform_device *u8500_regulators[] = {
+ &db8500_vape_regulator_dev,
+ &db8500_vana_regulator_dev,
+ &ab8500_vaux1_regulator_dev,
+ &ab8500_vaux2_regulator_dev,
+ &ab8500_vtvout_regulator_dev,
+ &ab8500_vbus_regulator_dev,
+ &ab8500_vaudio_regulator_dev,
+ &ab8500_vamic1_regulator_dev,
+ &ab8500_vamic2_regulator_dev,
+ &ab8500_vdmic_regulator_dev,
+ &ab8500_vintcore_regulator_dev,
+};
+
+#endif
+
+/* FIXME: move this to the appropriate file */
+void __init u8500_init_regulators(void)
+{
+#ifdef CONFIG_REGULATOR
+ /* we want the on-chip regulator before any device registration */
+ platform_add_devices(u8500_regulators, ARRAY_SIZE(u8500_regulators));
+#endif
+}