msm: fsm9xxx_board: Add xo-fsm9xxx devices

Acked-by: Kaushik Sikdar <ksikdar@qualcomm.com>
Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-fsm9xxx.c b/arch/arm/mach-msm/board-fsm9xxx.c
index 2f90d78..5d619ea 100644
--- a/arch/arm/mach-msm/board-fsm9xxx.c
+++ b/arch/arm/mach-msm/board-fsm9xxx.c
@@ -380,6 +380,51 @@
 };
 #endif
 
+#define XO_CONSUMERS(_id) \
+	static struct regulator_consumer_supply xo_consumers_##_id[]
+
+/*
+ * Consumer specific regulator names:
+ *                       regulator name         consumer dev_name
+ */
+XO_CONSUMERS(A0) = {
+	REGULATOR_SUPPLY("8058_xo_a0", NULL),
+	REGULATOR_SUPPLY("a0_clk_buffer", "fsm_xo_driver"),
+};
+XO_CONSUMERS(A1) = {
+	REGULATOR_SUPPLY("8058_xo_a1", NULL),
+	REGULATOR_SUPPLY("a1_clk_buffer", "fsm_xo_driver"),
+};
+
+#define PM8058_XO_INIT(_id, _modes, _ops, _always_on) \
+	[PM8058_XO_ID_##_id] = { \
+		.init_data = { \
+			.constraints = { \
+				.valid_modes_mask = _modes, \
+				.valid_ops_mask = _ops, \
+				.always_on = _always_on, \
+			}, \
+			.num_consumer_supplies = \
+				ARRAY_SIZE(xo_consumers_##_id),\
+			.consumer_supplies = xo_consumers_##_id, \
+		}, \
+	}
+
+#define PM8058_XO_INIT_AX(_id) \
+	PM8058_XO_INIT(_id, REGULATOR_MODE_NORMAL, REGULATOR_CHANGE_STATUS, 0)
+
+static struct pm8058_xo_pdata pm8058_xo_init_pdata[PM8058_XO_ID_MAX] = {
+	PM8058_XO_INIT_AX(A0),
+	PM8058_XO_INIT_AX(A1),
+};
+
+#define PM8058_XO(_id) { \
+	.name = PM8058_XO_BUFFER_DEV_NAME, \
+	.id = _id, \
+	.platform_data = &pm8058_xo_init_pdata[_id], \
+	.pdata_size = sizeof(pm8058_xo_init_pdata[_id]), \
+}
+
 /* Put sub devices with fixed location first in sub_devices array */
 static struct mfd_cell pm8058_subdevs[] = {
 	{	.name = "pm8058-mpp",
@@ -785,6 +830,7 @@
 	&qcrypto_device,
 	&qcedev_device,
 	&ota_qcrypto_device,
+	&fsm_xo_device,
 };
 
 static struct msm_acpu_clock_platform_data fsm9xxx_clock_data = {
diff --git a/arch/arm/mach-msm/devices-fsm9xxx.c b/arch/arm/mach-msm/devices-fsm9xxx.c
index fdcd2f2..86f2e18 100644
--- a/arch/arm/mach-msm/devices-fsm9xxx.c
+++ b/arch/arm/mach-msm/devices-fsm9xxx.c
@@ -369,3 +369,12 @@
 
 #endif
 
+/*
+ * XO
+ */
+
+struct platform_device fsm_xo_device = {
+	.name   = "fsm_xo_driver",
+	.id     = -1,
+};
+
diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h
index 872a189..4fad98a 100644
--- a/arch/arm/mach-msm/devices.h
+++ b/arch/arm/mach-msm/devices.h
@@ -130,6 +130,8 @@
 
 extern struct platform_device fsm_qfp_fuse_device;
 
+extern struct platform_device fsm_xo_device;
+
 extern struct platform_device qfec_device;
 
 extern struct clk_lookup msm_clocks_7x01a[];