Merge "leds: pm8xxx: Add PWM feature in leds-pm8xxx" into msm-3.0
diff --git a/arch/arm/mach-msm/board-9615.c b/arch/arm/mach-msm/board-9615.c
index d1d848c..5f0480b 100644
--- a/arch/arm/mach-msm/board-9615.c
+++ b/arch/arm/mach-msm/board-9615.c
@@ -235,6 +235,7 @@
 
 #define GPIO_SDCARD_PWR_EN	18
 #define GPIO_SDC1_HW_DET	80
+#define GPIO_SDC2_DAT1_WAKEUP	26
 
 /* MDM9x15 have 2 SDCC controllers */
 enum sdcc_controllers {
@@ -434,6 +435,9 @@
 	.pclk_src_dfab	= 1,
 	.sdcc_v4_sup    = true,
 	.pin_data	= &mmc_slot_pin_data[SDCC2],
+#ifdef CONFIG_MMC_MSM_SDIO_SUPPORT
+	.sdiowakeup_irq = MSM_GPIO_TO_INT(GPIO_SDC2_DAT1_WAKEUP),
+#endif
 };
 static struct mmc_platform_data *msm9615_sdc2_pdata = &sdc2_data;
 #else
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index 19e4224..06118f8 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -2930,17 +2930,16 @@
 static void __init msm8960_init_buses(void)
 {
 #ifdef CONFIG_MSM_BUS_SCALING
-	msm_bus_apps_fabric_pdata.rpm_enabled = 1;
-	msm_bus_sys_fabric_pdata.rpm_enabled = 1;
-	msm_bus_mm_fabric_pdata.rpm_enabled = 1;
-	msm_bus_sys_fpb_pdata.rpm_enabled = 1;
-	msm_bus_cpss_fpb_pdata.rpm_enabled = 1;
-	msm_bus_apps_fabric.dev.platform_data = &msm_bus_apps_fabric_pdata;
-	msm_bus_sys_fabric.dev.platform_data = &msm_bus_sys_fabric_pdata;
-	msm_bus_mm_fabric.dev.platform_data = &msm_bus_mm_fabric_pdata;
-	msm_bus_sys_fpb.dev.platform_data = &msm_bus_sys_fpb_pdata;
-	msm_bus_cpss_fpb.dev.platform_data = &msm_bus_cpss_fpb_pdata;
 	msm_bus_rpm_set_mt_mask();
+	msm_bus_8960_apps_fabric_pdata.rpm_enabled = 1;
+	msm_bus_8960_sys_fabric_pdata.rpm_enabled = 1;
+	msm_bus_8960_mm_fabric_pdata.rpm_enabled = 1;
+	msm_bus_apps_fabric.dev.platform_data =
+		&msm_bus_8960_apps_fabric_pdata;
+	msm_bus_sys_fabric.dev.platform_data = &msm_bus_8960_sys_fabric_pdata;
+	msm_bus_mm_fabric.dev.platform_data = &msm_bus_8960_mm_fabric_pdata;
+	msm_bus_sys_fpb.dev.platform_data = &msm_bus_8960_sys_fpb_pdata;
+	msm_bus_cpss_fpb.dev.platform_data = &msm_bus_8960_cpss_fpb_pdata;
 #endif
 }
 
diff --git a/arch/arm/mach-msm/devices-msm8x60.h b/arch/arm/mach-msm/devices-msm8x60.h
index 9fbe818..6b7d141 100644
--- a/arch/arm/mach-msm/devices-msm8x60.h
+++ b/arch/arm/mach-msm/devices-msm8x60.h
@@ -51,6 +51,7 @@
 extern struct platform_device msm_bus_mm_fabric;
 extern struct platform_device msm_bus_sys_fpb;
 extern struct platform_device msm_bus_cpss_fpb;
+extern struct platform_device msm_bus_def_fab;
 
 extern struct platform_device msm_device_smd;
 extern struct platform_device msm_device_gpio;
diff --git a/arch/arm/mach-msm/include/mach/msm_bus_board.h b/arch/arm/mach-msm/include/mach/msm_bus_board.h
index 644e1b1..2eb504a 100644
--- a/arch/arm/mach-msm/include/mach/msm_bus_board.h
+++ b/arch/arm/mach-msm/include/mach/msm_bus_board.h
@@ -36,6 +36,7 @@
 	const unsigned int nslaves;
 	const unsigned int ntieredslaves;
 	bool il_flag;
+	const struct msm_bus_board_algorithm *board_algo;
 };
 
 enum msm_bus_bw_tier_type {
@@ -55,12 +56,23 @@
 extern struct msm_bus_fabric_registration msm_bus_mm_fabric_pdata;
 extern struct msm_bus_fabric_registration msm_bus_sys_fpb_pdata;
 extern struct msm_bus_fabric_registration msm_bus_cpss_fpb_pdata;
+extern struct msm_bus_fabric_registration msm_bus_def_fab_pdata;
 
-void msm_bus_board_assign_iids(struct msm_bus_fabric_registration
-	*fabreg, int fabid);
-int msm_bus_board_get_iid(int id);
+extern struct msm_bus_fabric_registration msm_bus_8960_apps_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8960_sys_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8960_mm_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8960_sys_fpb_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8960_cpss_fpb_pdata;
+
+extern struct msm_bus_fabric_registration msm_bus_8064_apps_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8064_sys_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8064_mm_fabric_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8064_sys_fpb_pdata;
+extern struct msm_bus_fabric_registration msm_bus_8064_cpss_fpb_pdata;
+
 void msm_bus_rpm_set_mt_mask(void);
 int msm_bus_board_rpm_get_il_ids(uint16_t *id);
+int msm_bus_board_get_iid(int id);
 
 /*
  * These macros specify the convention followed for allocating
@@ -124,6 +136,7 @@
 
 /* Topology related enums */
 enum msm_bus_fabric_type {
+	MSM_BUS_FAB_DEFAULT = 0,
 	MSM_BUS_FAB_APPSS = 0,
 	MSM_BUS_FAB_SYSTEM = 1024,
 	MSM_BUS_FAB_MMSS = 2048,
@@ -180,7 +193,15 @@
 	MSM_BUS_MASTER_MSS_SW_PROC,
 	MSM_BUS_MASTER_MSS_FW_PROC,
 	MSM_BUS_MMSS_MASTER_UNUSED_2,
+	MSM_BUS_MASTER_GSS_NAV,
+	MSM_BUS_MASTER_PCIE,
+	MSM_BUS_MASTER_SATA,
+	MSM_BUS_MASTER_CRYPTO,
 
+	MSM_BUS_MASTER_VIDEO_CAP,
+	MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
+	MSM_BUS_MASTER_VIDEO_ENC,
+	MSM_BUS_MASTER_VIDEO_DEC,
 	MSM_BUS_MASTER_LAST = MSM_BUS_MMSS_MASTER_UNUSED_2,
 
 	MSM_BUS_SYSTEM_FPB_MASTER_SYSTEM =
@@ -263,6 +284,8 @@
 	MSM_BUS_SLAVE_MSM_DIMEM,
 	MSM_BUS_SLAVE_MSM_TCSR,
 	MSM_BUS_SLAVE_MSM_PRNG,
+	MSM_BUS_SLAVE_GSS,
+	MSM_BUS_SLAVE_SATA,
 	MSM_BUS_SLAVE_LAST = MSM_BUS_SLAVE_MSM_PRNG,
 
 	MSM_BUS_SYSTEM_FPB_SLAVE_SYSTEM =
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_arb.c b/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
index 7565eb3..56bc71d 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_arb.c
@@ -394,7 +394,7 @@
 	int ret = 0;
 	struct msm_bus_fabric_device *fabdev = to_msm_bus_fabric_device(dev);
 	MSM_BUS_DBG("Committing: fabid: %d\n", fabdev->id);
-	ret = fabdev->algo->commit(fabdev, (int)data);
+	ret = fabdev->algo->commit(fabdev);
 	return ret;
 }
 
@@ -556,7 +556,7 @@
 	client->curr = index;
 	ctx = ACTIVE_CTX;
 	msm_bus_dbg_client_data(client->pdata, index, cl);
-	bus_for_each_dev(&msm_bus_type, NULL, (void *)ctx, msm_bus_commit_fn);
+	bus_for_each_dev(&msm_bus_type, NULL, NULL, msm_bus_commit_fn);
 
 err:
 	mutex_unlock(&msm_bus_lock);
@@ -613,6 +613,19 @@
 	return 0;
 }
 
+int msm_bus_board_get_iid(int id)
+{
+	struct msm_bus_fabric_device *deffab;
+
+	deffab = msm_bus_get_fabric_device(MSM_BUS_FAB_DEFAULT);
+	if (!deffab) {
+		MSM_BUS_ERR("Error finding default fabric\n");
+		return -ENXIO;
+	}
+
+	return deffab->board_algo->get_iid(id);
+}
+
 void msm_bus_scale_client_reset_pnodes(uint32_t cl)
 {
 	int i, src, pnode, index;
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c
index 13b59ed..fde2322 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_board_8660.c
@@ -805,80 +805,8 @@
 	},
 };
 
-struct msm_bus_fabric_registration msm_bus_apps_fabric_pdata = {
-	.id = MSM_BUS_FAB_APPSS,
-	.name = "msm_apps_fab",
-	.info = apps_fabric_info,
-	.len = ARRAY_SIZE(apps_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "afab_clk",
-	.fabclk[ACTIVE_CTX] = "afab_a_clk",
-	.haltid = MSM_RPM_ID_APPS_FABRIC_HALT_0,
-	.offset = MSM_RPM_ID_APPS_FABRIC_ARB_0,
-	.nmasters = 4,
-	.nslaves = 4,
-	.ntieredslaves = 2,
-};
-
-struct msm_bus_fabric_registration msm_bus_sys_fabric_pdata = {
-	.id = MSM_BUS_FAB_SYSTEM,
-	.name = "msm_sys_fab",
-	system_fabric_info,
-	ARRAY_SIZE(system_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "sfab_clk",
-	.fabclk[ACTIVE_CTX] = "sfab_a_clk",
-	.haltid = MSM_RPM_ID_SYSTEM_FABRIC_HALT_0,
-	.offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0,
-	.nmasters = 17,
-	.nslaves = 9,
-	.ntieredslaves = 2,
-};
-
-struct msm_bus_fabric_registration msm_bus_mm_fabric_pdata = {
-	.id = MSM_BUS_FAB_MMSS,
-	.name = "msm_mm_fab",
-	mmss_fabric_info,
-	ARRAY_SIZE(mmss_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "mmfab_clk",
-	.fabclk[ACTIVE_CTX] = "mmfab_a_clk",
-	.haltid = MSM_RPM_ID_MM_FABRIC_HALT_0,
-	.offset = MSM_RPM_ID_MM_FABRIC_ARB_0,
-	.nmasters = 14,
-	.nslaves = 4,
-	.ntieredslaves = 3,
-};
-
-struct msm_bus_fabric_registration msm_bus_sys_fpb_pdata = {
-	.id = MSM_BUS_FAB_SYSTEM_FPB,
-	.name = "msm_sys_fpb",
-	sys_fpb_fabric_info,
-	ARRAY_SIZE(sys_fpb_fabric_info),
-	.ahb = 1,
-	.fabclk[DUAL_CTX] = "sfpb_clk",
-	.fabclk[ACTIVE_CTX] = "sfpb_a_clk",
-	.nmasters = 0,
-	.nslaves = 0,
-	.ntieredslaves = 0,
-};
-
-struct msm_bus_fabric_registration msm_bus_cpss_fpb_pdata = {
-	.id = MSM_BUS_FAB_CPSS_FPB,
-	.name = "msm_cpss_fpb",
-	cpss_fpb_fabric_info,
-	ARRAY_SIZE(cpss_fpb_fabric_info),
-	.ahb = 1,
-	.fabclk[DUAL_CTX] = "cfpb_clk",
-	.fabclk[ACTIVE_CTX] = "cfpb_a_clk",
-	.nmasters = 0,
-	.nslaves = 0,
-	.ntieredslaves = 0,
-};
-
-static void msm_bus_board_get_ids(
-	struct msm_bus_fabric_registration *fabreg,
-	int fabid)
+static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration
+	*fabreg, int fabid)
 {
 	int i;
 	for (i = 0; i < fabreg->len; i++) {
@@ -895,17 +823,93 @@
 	}
 }
 
-void msm_bus_board_assign_iids(struct msm_bus_fabric_registration *fabreg,
-	int fabid)
-{
-	msm_bus_board_get_ids(fabreg, fabid);
-}
-int msm_bus_board_get_iid(int id)
+static int msm_bus_board_8660_get_iid(int id)
 {
 	return ((id < SLAVE_ID_KEY) ? master_iids[id] : slave_iids[id -
 		SLAVE_ID_KEY]);
 }
 
+static struct msm_bus_board_algorithm msm_bus_board_algo = {
+	.get_iid = msm_bus_board_8660_get_iid,
+	.assign_iids = msm_bus_board_assign_iids,
+};
+
+struct msm_bus_fabric_registration msm_bus_apps_fabric_pdata = {
+	.id = MSM_BUS_FAB_APPSS,
+	.name = "msm_apps_fab",
+	.info = apps_fabric_info,
+	.len = ARRAY_SIZE(apps_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "afab_clk",
+	.fabclk[ACTIVE_CTX] = "afab_a_clk",
+	.haltid = MSM_RPM_ID_APPS_FABRIC_HALT_0,
+	.offset = MSM_RPM_ID_APPS_FABRIC_ARB_0,
+	.nmasters = 4,
+	.nslaves = 4,
+	.ntieredslaves = 2,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_sys_fabric_pdata = {
+	.id = MSM_BUS_FAB_SYSTEM,
+	.name = "msm_sys_fab",
+	system_fabric_info,
+	ARRAY_SIZE(system_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "sfab_clk",
+	.fabclk[ACTIVE_CTX] = "sfab_a_clk",
+	.haltid = MSM_RPM_ID_SYSTEM_FABRIC_HALT_0,
+	.offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0,
+	.nmasters = 17,
+	.nslaves = 9,
+	.ntieredslaves = 2,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_mm_fabric_pdata = {
+	.id = MSM_BUS_FAB_MMSS,
+	.name = "msm_mm_fab",
+	mmss_fabric_info,
+	ARRAY_SIZE(mmss_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "mmfab_clk",
+	.fabclk[ACTIVE_CTX] = "mmfab_a_clk",
+	.haltid = MSM_RPM_ID_MM_FABRIC_HALT_0,
+	.offset = MSM_RPM_ID_MM_FABRIC_ARB_0,
+	.nmasters = 14,
+	.nslaves = 4,
+	.ntieredslaves = 3,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_sys_fpb_pdata = {
+	.id = MSM_BUS_FAB_SYSTEM_FPB,
+	.name = "msm_sys_fpb",
+	sys_fpb_fabric_info,
+	ARRAY_SIZE(sys_fpb_fabric_info),
+	.ahb = 1,
+	.fabclk[DUAL_CTX] = "sfpb_clk",
+	.fabclk[ACTIVE_CTX] = "sfpb_a_clk",
+	.nmasters = 0,
+	.nslaves = 0,
+	.ntieredslaves = 0,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_cpss_fpb_pdata = {
+	.id = MSM_BUS_FAB_CPSS_FPB,
+	.name = "msm_cpss_fpb",
+	cpss_fpb_fabric_info,
+	ARRAY_SIZE(cpss_fpb_fabric_info),
+	.ahb = 1,
+	.fabclk[DUAL_CTX] = "cfpb_clk",
+	.fabclk[ACTIVE_CTX] = "cfpb_a_clk",
+	.nmasters = 0,
+	.nslaves = 0,
+	.ntieredslaves = 0,
+	.board_algo = &msm_bus_board_algo,
+};
+
 int msm_bus_board_rpm_get_il_ids(uint16_t id[])
 {
 	return -ENXIO;
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c b/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c
index 8ab1899..47f3c81 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_board_8960.c
@@ -832,80 +832,8 @@
 	},
 };
 
-struct msm_bus_fabric_registration msm_bus_apps_fabric_pdata = {
-	.id = MSM_BUS_FAB_APPSS,
-	.name = "msm_apps_fab",
-	.info = apps_fabric_info,
-	.len = ARRAY_SIZE(apps_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "afab_clk",
-	.fabclk[ACTIVE_CTX] = "afab_a_clk",
-	.haltid = MSM_RPM_ID_APPS_FABRIC_CFG_HALT_0,
-	.offset = MSM_RPM_ID_APPS_FABRIC_ARB_0,
-	.nmasters = 6,
-	.nslaves = 5,
-	.ntieredslaves = 3,
-};
-
-struct msm_bus_fabric_registration msm_bus_sys_fabric_pdata = {
-	.id = MSM_BUS_FAB_SYSTEM,
-	.name = "msm_sys_fab",
-	system_fabric_info,
-	ARRAY_SIZE(system_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "sfab_clk",
-	.fabclk[ACTIVE_CTX] = "sfab_a_clk",
-	.haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0,
-	.offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0,
-	.nmasters = 15,
-	.nslaves = 12,
-	.ntieredslaves = 3,
-};
-
-struct msm_bus_fabric_registration msm_bus_mm_fabric_pdata = {
-	.id = MSM_BUS_FAB_MMSS,
-	.name = "msm_mm_fab",
-	mmss_fabric_info,
-	ARRAY_SIZE(mmss_fabric_info),
-	.ahb = 0,
-	.fabclk[DUAL_CTX] = "mmfab_clk",
-	.fabclk[ACTIVE_CTX] = "mmfab_a_clk",
-	.haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0,
-	.offset = MSM_RPM_ID_MM_FABRIC_ARB_0,
-	.nmasters = 14,
-	.nslaves = 4,
-	.ntieredslaves = 3,
-};
-
-struct msm_bus_fabric_registration msm_bus_sys_fpb_pdata = {
-	.id = MSM_BUS_FAB_SYSTEM_FPB,
-	.name = "msm_sys_fpb",
-	sys_fpb_fabric_info,
-	ARRAY_SIZE(sys_fpb_fabric_info),
-	.ahb = 1,
-	.fabclk[DUAL_CTX] = "sfpb_clk",
-	.fabclk[ACTIVE_CTX] = "sfpb_a_clk",
-	.nmasters = 0,
-	.nslaves = 0,
-	.ntieredslaves = 0,
-};
-
-struct msm_bus_fabric_registration msm_bus_cpss_fpb_pdata = {
-	.id = MSM_BUS_FAB_CPSS_FPB,
-	.name = "msm_cpss_fpb",
-	cpss_fpb_fabric_info,
-	ARRAY_SIZE(cpss_fpb_fabric_info),
-	.ahb = 1,
-	.fabclk[DUAL_CTX] = "cfpb_clk",
-	.fabclk[ACTIVE_CTX] = "cfpb_a_clk",
-	.nmasters = 0,
-	.nslaves = 0,
-	.ntieredslaves = 0,
-};
-
-static void msm_bus_board_get_ids(
-	struct msm_bus_fabric_registration *fabreg,
-	int fabid)
+static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration
+	*fabreg, int fabid)
 {
 	int i;
 	for (i = 0; i < fabreg->len; i++) {
@@ -922,12 +850,7 @@
 	}
 }
 
-void msm_bus_board_assign_iids(struct msm_bus_fabric_registration *fabreg,
-	int fabid)
-{
-	msm_bus_board_get_ids(fabreg, fabid);
-}
-int msm_bus_board_get_iid(int id)
+static int msm_bus_board_8960_get_iid(int id)
 {
 	if ((id < SLAVE_ID_KEY && id >= NMASTERS) ||
 		id >= (SLAVE_ID_KEY + NSLAVES)) {
@@ -939,6 +862,87 @@
 		SLAVE_ID_KEY]);
 }
 
+static struct msm_bus_board_algorithm msm_bus_board_algo = {
+	.get_iid = msm_bus_board_8960_get_iid,
+	.assign_iids = msm_bus_board_assign_iids,
+};
+
+struct msm_bus_fabric_registration msm_bus_8960_apps_fabric_pdata = {
+	.id = MSM_BUS_FAB_APPSS,
+	.name = "msm_apps_fab",
+	.info = apps_fabric_info,
+	.len = ARRAY_SIZE(apps_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "afab_clk",
+	.fabclk[ACTIVE_CTX] = "afab_a_clk",
+	.haltid = MSM_RPM_ID_APPS_FABRIC_CFG_HALT_0,
+	.offset = MSM_RPM_ID_APPS_FABRIC_ARB_0,
+	.nmasters = 6,
+	.nslaves = 5,
+	.ntieredslaves = 3,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_8960_sys_fabric_pdata = {
+	.id = MSM_BUS_FAB_SYSTEM,
+	.name = "msm_sys_fab",
+	system_fabric_info,
+	ARRAY_SIZE(system_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "sfab_clk",
+	.fabclk[ACTIVE_CTX] = "sfab_a_clk",
+	.haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0,
+	.offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0,
+	.nmasters = 15,
+	.nslaves = 12,
+	.ntieredslaves = 3,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_8960_mm_fabric_pdata = {
+	.id = MSM_BUS_FAB_MMSS,
+	.name = "msm_mm_fab",
+	mmss_fabric_info,
+	ARRAY_SIZE(mmss_fabric_info),
+	.ahb = 0,
+	.fabclk[DUAL_CTX] = "mmfab_clk",
+	.fabclk[ACTIVE_CTX] = "mmfab_a_clk",
+	.haltid = MSM_RPM_ID_MMSS_FABRIC_CFG_HALT_0,
+	.offset = MSM_RPM_ID_MM_FABRIC_ARB_0,
+	.nmasters = 14,
+	.nslaves = 4,
+	.ntieredslaves = 3,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_8960_sys_fpb_pdata = {
+	.id = MSM_BUS_FAB_SYSTEM_FPB,
+	.name = "msm_sys_fpb",
+	sys_fpb_fabric_info,
+	ARRAY_SIZE(sys_fpb_fabric_info),
+	.ahb = 1,
+	.fabclk[DUAL_CTX] = "sfpb_clk",
+	.fabclk[ACTIVE_CTX] = "sfpb_a_clk",
+	.nmasters = 0,
+	.nslaves = 0,
+	.ntieredslaves = 0,
+	.board_algo = &msm_bus_board_algo,
+};
+
+struct msm_bus_fabric_registration msm_bus_8960_cpss_fpb_pdata = {
+	.id = MSM_BUS_FAB_CPSS_FPB,
+	.name = "msm_cpss_fpb",
+	cpss_fpb_fabric_info,
+	ARRAY_SIZE(cpss_fpb_fabric_info),
+	.ahb = 1,
+	.fabclk[DUAL_CTX] = "cfpb_clk",
+	.fabclk[ACTIVE_CTX] = "cfpb_a_clk",
+	.nmasters = 0,
+	.nslaves = 0,
+	.ntieredslaves = 0,
+	.board_algo = &msm_bus_board_algo,
+};
+
 int msm_bus_board_rpm_get_il_ids(uint16_t id[])
 {
 	id[0] = MSM_RPM_STATUS_ID_EBI1_CH0_RANGE;
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_core.h b/arch/arm/mach-msm/msm_bus/msm_bus_core.h
index 56a5b8da..8a46026 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_core.h
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_core.h
@@ -107,6 +107,7 @@
 	const char *name;
 	struct device dev;
 	const struct msm_bus_fab_algorithm *algo;
+	const struct msm_bus_board_algorithm *board_algo;
 	int visited;
 };
 #define to_msm_bus_fabric_device(d) container_of(d, \
@@ -121,8 +122,7 @@
 		unsigned int cl_active_flag);
 	int (*port_halt)(struct msm_bus_fabric_device *fabdev, int portid);
 	int (*port_unhalt)(struct msm_bus_fabric_device *fabdev, int portid);
-	int (*commit)(struct msm_bus_fabric_device *fabdev,
-		int active_only);
+	int (*commit)(struct msm_bus_fabric_device *fabdev);
 	struct msm_bus_inode_info *(*find_node)(struct msm_bus_fabric_device
 		*fabdev, int id);
 	struct msm_bus_inode_info *(*find_gw_node)(struct msm_bus_fabric_device
@@ -133,6 +133,12 @@
 		long int add_bw, int *master_tiers, int ctx);
 };
 
+struct msm_bus_board_algorithm {
+	void (*assign_iids)(struct msm_bus_fabric_registration *fabreg,
+		int fabid);
+	int (*get_iid)(int id);
+};
+
 /**
  * Used to store the list of fabrics and other info to be
  * maintained outside the fabric structure.
@@ -160,8 +166,7 @@
 struct msm_rpm_iv_pair *allocate_rpm_data(struct msm_bus_fabric_registration
 	*fab_pdata);
 int msm_bus_rpm_commit(struct msm_bus_fabric_registration
-	*fab_pdata, int ctx, struct msm_rpm_iv_pair *rpm_data,
-	void *cdata);
+	*fab_pdata, struct msm_rpm_iv_pair *rpm_data, void **cdata);
 void free_commit_data(void *cdata);
 void msm_bus_rpm_update_bw(struct msm_bus_inode_info *hop,
 	struct msm_bus_inode_info *info,
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_fabric.c b/arch/arm/mach-msm/msm_bus/msm_bus_fabric.c
index fe6dbed..1747425 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_fabric.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_fabric.c
@@ -418,13 +418,10 @@
  * msm_bus_fabric_rpm_commit() - Commit the arbitration data to RPM
  * @fabric: Fabric for which the data should be committed
  * */
-static int msm_bus_fabric_rpm_commit(struct msm_bus_fabric_device *fabdev,
-	int ctx)
-
+static int msm_bus_fabric_rpm_commit(struct msm_bus_fabric_device *fabdev)
 {
 	int status = 0;
 	struct msm_bus_fabric *fabric = to_msm_bus_fabric(fabdev);
-	void *cdata;
 
 	/*
 	 * For a non-zero bandwidth request, clocks should be enabled before
@@ -441,9 +438,8 @@
 		goto skip_arb;
 	}
 
-	cdata = fabric->cdata[ctx];
-	status = msm_bus_rpm_commit(fabric->pdata, ctx,
-		fabric->rpm_data, cdata);
+	status = msm_bus_rpm_commit(fabric->pdata, fabric->rpm_data,
+		(void **)fabric->cdata);
 	if (status)
 		MSM_BUS_DBG("Error committing arb data for fabric: %d\n",
 			fabric->fabdev.id);
@@ -653,7 +649,9 @@
 	pdata->il_flag = msm_bus_rpm_is_mem_interleaved();
 	fabric->ahb = pdata->ahb;
 	fabric->pdata = pdata;
-	msm_bus_board_assign_iids(fabric->pdata, fabric->fabdev.id);
+	fabric->pdata->board_algo->assign_iids(fabric->pdata,
+		fabric->fabdev.id);
+	fabric->fabdev.board_algo = fabric->pdata->board_algo;
 
 	for (ctx = 0; ctx < NUM_CTX; ctx++) {
 		if (pdata->fabclk[ctx]) {
diff --git a/arch/arm/mach-msm/msm_bus/msm_bus_rpm.c b/arch/arm/mach-msm/msm_bus/msm_bus_rpm.c
index 332d3c1..84e2da5 100644
--- a/arch/arm/mach-msm/msm_bus/msm_bus_rpm.c
+++ b/arch/arm/mach-msm/msm_bus/msm_bus_rpm.c
@@ -325,16 +325,35 @@
 
 #define RPM_SHIFT_VAL 16
 #define RPM_SHIFT(n) ((n) << RPM_SHIFT_VAL)
-/**
- * msm_bus_rpm_commit() - Commit the arbitration data to RPM
- * @fabric: Fabric for which the data should be committed
- * */
-int msm_bus_rpm_commit(struct msm_bus_fabric_registration
+static int msm_bus_rpm_compare_cdata(
+	struct msm_bus_fabric_registration *fab_pdata,
+	struct commit_data *cd1, struct commit_data *cd2)
+{
+	size_t n;
+	int ret;
+	n = sizeof(uint16_t) * fab_pdata->nslaves;
+	ret = memcmp(cd1->bwsum, cd2->bwsum, n);
+	if (ret) {
+		MSM_BUS_DBG("Commit Data bwsum not equal\n");
+		return ret;
+	}
+
+	n = sizeof(uint16_t *) * ((fab_pdata->ntieredslaves *
+		fab_pdata->nmasters) + 1);
+	ret = memcmp(cd1->arb, cd2->arb, n);
+	if (ret) {
+		MSM_BUS_DBG("Commit Data arb[%d] not equal\n", i);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int msm_bus_rpm_commit_arb(struct msm_bus_fabric_registration
 	*fab_pdata, int ctx, struct msm_rpm_iv_pair *rpm_data,
-	void *cdata)
+	struct commit_data *cd, bool valid)
 {
 	int i, j, offset = 0, status = 0, count, index = 0;
-	struct commit_data *cd = (struct commit_data *)cdata;
 	/*
 	 * count is the number of 2-byte words required to commit the
 	 * data to rpm. This is calculated by the following formula.
@@ -398,12 +417,33 @@
 		nmasters, fab_pdata->nslaves, fab_pdata->ntieredslaves,
 		MSM_BUS_DBG_OP);
 	if (fab_pdata->rpm_enabled) {
-		if (ctx == ACTIVE_CTX)
-			status = msm_rpm_set(MSM_RPM_CTX_SET_0, rpm_data,
-				count);
+		if (valid) {
+			if (ctx == ACTIVE_CTX) {
+				status = msm_rpm_set(MSM_RPM_CTX_SET_0,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_set returned: %d\n",
+					status);
+			} else if (ctx == DUAL_CTX) {
+				status = msm_rpm_set(MSM_RPM_CTX_SET_SLEEP,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_set returned: %d\n",
+					status);
+			}
+		} else {
+			if (ctx == ACTIVE_CTX) {
+				status = msm_rpm_clear(MSM_RPM_CTX_SET_0,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_clear returned: %d\n",
+					status);
+			} else if (ctx == DUAL_CTX) {
+				status = msm_rpm_clear(MSM_RPM_CTX_SET_SLEEP,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_clear returned: %d\n",
+					status);
+			}
+		}
 	}
 
-	MSM_BUS_DBG("msm_rpm_set returned: %d\n", status);
 	return status;
 }
 
@@ -571,14 +611,37 @@
 	return rpm_data;
 }
 
-int msm_bus_rpm_commit(struct msm_bus_fabric_registration
-	*fab_pdata, int ctx, struct msm_rpm_iv_pair *rpm_data,
-	void *cdata)
+static int msm_bus_rpm_compare_cdata(
+	struct msm_bus_fabric_registration *fab_pdata,
+	struct commit_data *cd1, struct commit_data *cd2)
 {
+	size_t n;
+	int i, ret;
+	n = sizeof(uint16_t) * fab_pdata->nslaves;
+	ret = memcmp(cd1->bwsum, cd2->bwsum, n);
+	if (ret) {
+		MSM_BUS_DBG("Commit Data bwsum not equal\n");
+		return ret;
+	}
 
+	n = sizeof(uint8_t *) * ((fab_pdata->ntieredslaves *
+		fab_pdata->nmasters) + 1);
+	for (i = 0; i < NUM_TIERS; i++) {
+		ret = memcmp(cd1->arb[i], cd2->arb[i], n);
+		if (ret) {
+			MSM_BUS_DBG("Commit Data arb[%d] not equal\n", i);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+static int msm_bus_rpm_commit_arb(struct msm_bus_fabric_registration
+	*fab_pdata, int ctx, struct msm_rpm_iv_pair *rpm_data,
+	struct commit_data *cd, bool valid)
+{
 	int i, j, k, offset = 0, status = 0, count, index = 0;
-	struct commit_data *cd = (struct commit_data *)cdata;
-
 	/*
 	 * count is the number of 2-byte words required to commit the
 	 * data to rpm. This is calculated by the following formula.
@@ -646,16 +709,37 @@
 	}
 
 	MSM_FAB_DBG("calling msm_rpm_set:  %d\n", status);
-	msm_bus_dbg_commit_data(fab_pdata->name, cdata, fab_pdata->
+	msm_bus_dbg_commit_data(fab_pdata->name, (void *)cd, fab_pdata->
 		nmasters, fab_pdata->nslaves, fab_pdata->ntieredslaves,
 		MSM_BUS_DBG_OP);
 	if (fab_pdata->rpm_enabled) {
-		if (ctx == ACTIVE_CTX)
-			status = msm_rpm_set(MSM_RPM_CTX_SET_0, rpm_data,
-				count);
+		if (valid) {
+			if (ctx == ACTIVE_CTX) {
+				status = msm_rpm_set(MSM_RPM_CTX_SET_0,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_set returned: %d\n",
+					status);
+			} else if (ctx == DUAL_CTX) {
+				status = msm_rpm_set(MSM_RPM_CTX_SET_SLEEP,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_set returned: %d\n",
+					status);
+			}
+		} else {
+			if (ctx == ACTIVE_CTX) {
+				status = msm_rpm_clear(MSM_RPM_CTX_SET_0,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_clear returned: %d\n",
+					status);
+			} else if (ctx == DUAL_CTX) {
+				status = msm_rpm_clear(MSM_RPM_CTX_SET_SLEEP,
+					rpm_data, count);
+				MSM_BUS_DBG("msm_rpm_clear returned: %d\n",
+					status);
+			}
+		}
 	}
 
-	MSM_FAB_DBG("msm_rpm_set returned: %d\n", status);
 	return status;
 }
 
@@ -771,3 +855,47 @@
 	}
 }
 #endif
+
+/**
+* msm_bus_rpm_commit() - Commit the arbitration data to RPM
+* @fabric: Fabric for which the data should be committed
+**/
+int msm_bus_rpm_commit(struct msm_bus_fabric_registration
+	*fab_pdata, struct msm_rpm_iv_pair *rpm_data,
+	void **cdata)
+{
+
+	int ret;
+	bool valid;
+	struct commit_data *dual_cd, *act_cd;
+	dual_cd = (struct commit_data *)cdata[DUAL_CTX];
+	act_cd = (struct commit_data *)cdata[ACTIVE_CTX];
+
+	/*
+	 * If the arb data for active set and sleep set is
+	 * different, commit both sets.
+	 * If the arb data for active set and sleep set is
+	 * the same, invalidate the sleep set.
+	 */
+	ret = msm_bus_rpm_compare_cdata(fab_pdata, act_cd, dual_cd);
+	if (!ret)
+		/* Invalidate sleep set.*/
+		valid = false;
+	else
+		valid = true;
+
+	ret = msm_bus_rpm_commit_arb(fab_pdata, DUAL_CTX, rpm_data,
+		dual_cd, valid);
+	if (ret)
+		MSM_BUS_ERR("Error comiting fabric:%d in %d ctx\n",
+			fab_pdata->id, DUAL_CTX);
+
+	valid = true;
+	ret = msm_bus_rpm_commit_arb(fab_pdata, ACTIVE_CTX, rpm_data, act_cd,
+		valid);
+	if (ret)
+		MSM_BUS_ERR("Error comiting fabric:%d in %d ctx\n",
+			fab_pdata->id, ACTIVE_CTX);
+
+	return ret;
+}
diff --git a/arch/arm/mach-msm/rpm_resources.c b/arch/arm/mach-msm/rpm_resources.c
index 33b07bf..f2b3e88 100644
--- a/arch/arm/mach-msm/rpm_resources.c
+++ b/arch/arm/mach-msm/rpm_resources.c
@@ -914,9 +914,9 @@
 		} else if ((sleep_us >> 10) > level->time_overhead_us) {
 			power = level->steady_state_power;
 		} else {
-			power = (sleep_us - level->time_overhead_us);
-			power *= level->steady_state_power;
-			power /= sleep_us;
+			power = level->steady_state_power;
+			power -= (level->time_overhead_us *
+					level->steady_state_power)/sleep_us;
 			power += level->energy_overhead / sleep_us;
 		}
 
diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c
index 8e4d98c..7db146c 100644
--- a/arch/arm/mach-msm/timer.c
+++ b/arch/arm/mach-msm/timer.c
@@ -42,29 +42,13 @@
 static int msm_timer_debug_mask;
 module_param_named(debug_mask, msm_timer_debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
 
-#if defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_MSM8X60) || \
-	defined(CONFIG_ARCH_MSM8960) || defined(CONFIG_ARCH_FSM9XXX) || \
-	defined(CONFIG_ARCH_APQ8064) || defined(CONFIG_ARCH_MSM9615)
-#define MSM_GPT_BASE (MSM_TMR_BASE + 0x4)
-#define MSM_DGT_BASE (MSM_TMR_BASE + 0x24)
-#else
-#define MSM_GPT_BASE MSM_TMR_BASE
-#define MSM_DGT_BASE (MSM_TMR_BASE + 0x10)
-#endif
-
 #ifdef CONFIG_MSM7X00A_USE_GP_TIMER
 	#define DG_TIMER_RATING 100
-	#define MSM_GLOBAL_TIMER MSM_CLOCK_GPT
 #else
 	#define DG_TIMER_RATING 300
-	#define MSM_GLOBAL_TIMER MSM_CLOCK_DGT
 #endif
 
-#if defined(CONFIG_CPU_V6) || defined(CONFIG_ARCH_MSM7X27A)
 #define MSM_DGT_SHIFT (5)
-#else
-#define MSM_DGT_SHIFT (0)
-#endif
 
 #define TIMER_MATCH_VAL         0x0000
 #define TIMER_COUNT_VAL         0x0004
@@ -88,43 +72,15 @@
  * access to come from the CPU0 region.
  */
 static int global_timer_offset;
-
-#if defined(CONFIG_MSM_DIRECT_SCLK_ACCESS)
-#define MPM_SCLK_COUNT_VAL    0x0024
-#endif
+static int msm_global_timer;
 
 #define NR_TIMERS ARRAY_SIZE(msm_clocks)
 
-#if defined(CONFIG_ARCH_QSD8X50) || defined(CONFIG_ARCH_FSM9XXX)
-#define DGT_HZ 4800000	/* Uses TCXO/4 (19.2 MHz / 4) */
-#elif defined(CONFIG_ARCH_MSM7X30)
-#define DGT_HZ 6144000	/* Uses LPXO/4 (24.576 MHz / 4) */
-#elif defined(CONFIG_ARCH_MSM8X60) || defined(CONFIG_ARCH_MSM8960) || \
-	defined(CONFIG_ARCH_APQ8064) || defined(CONFIG_ARCH_MSM9615)
-/* Uses PXO/4 (24.576 MHz / 4) on V1, (27 MHz / 4) on V2 */
-#define DGT_HZ 6750000
-#else
-#define DGT_HZ 19200000	/* Uses TCXO (19.2 MHz) */
-#endif
-
 #define GPT_HZ 32768
 #define SCLK_HZ 32768
 
-#if defined(CONFIG_MSM_N_WAY_SMSM)
-/* Time Master State Bits */
-#define MASTER_BITS_PER_CPU        1
-#define MASTER_TIME_PENDING \
-	(0x01UL << (MASTER_BITS_PER_CPU * SMSM_APPS_STATE))
 
-/* Time Slave State Bits */
-#define SLAVE_TIME_REQUEST         0x0400
-#define SLAVE_TIME_POLL            0x0800
-#define SLAVE_TIME_INIT            0x1000
-#endif
-
-#ifdef CONFIG_SMP
 static struct msm_clock *clockevent_to_clock(struct clock_event_device *evt);
-#endif
 static irqreturn_t msm_timer_interrupt(int irq, void *dev_id);
 static cycle_t msm_gpt_read(struct clocksource *cs);
 static cycle_t msm_dgt_read(struct clocksource *cs);
@@ -203,7 +159,7 @@
 			.dev_id  = &msm_clocks[0].clockevent,
 			.irq     = INT_GP_TIMER_EXP
 		},
-		.regbase = MSM_GPT_BASE,
+		.regbase = MSM_TMR_BASE + 0x4,
 		.freq = GPT_HZ,
 		.index = MSM_CLOCK_GPT,
 		.flags =
@@ -219,7 +175,7 @@
 		.clockevent = {
 			.name           = "dg_timer",
 			.features       = CLOCK_EVT_FEAT_ONESHOT,
-			.shift          = 32 + MSM_DGT_SHIFT,
+			.shift          = 32,
 			.rating         = DG_TIMER_RATING,
 			.set_next_event = msm_timer_set_next_event,
 			.set_mode       = msm_timer_set_mode,
@@ -228,8 +184,8 @@
 			.name           = "dg_timer",
 			.rating         = DG_TIMER_RATING,
 			.read           = msm_dgt_read,
-			.mask           = CLOCKSOURCE_MASK((32-MSM_DGT_SHIFT)),
-			.shift          = 24 - MSM_DGT_SHIFT,
+			.mask           = CLOCKSOURCE_MASK(32),
+			.shift          = 24,
 			.flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 		},
 		.irq = {
@@ -240,10 +196,8 @@
 			.dev_id  = &msm_clocks[1].clockevent,
 			.irq     = INT_DEBUG_TIMER_EXP
 		},
-		.regbase = MSM_DGT_BASE,
-		.freq = DGT_HZ >> MSM_DGT_SHIFT,
+		.regbase = MSM_TMR_BASE + 0x24,
 		.index = MSM_CLOCK_DGT,
-		.shift = MSM_DGT_SHIFT,
 		.write_delay = 9,
 	}
 };
@@ -317,22 +271,23 @@
 		&per_cpu(msm_clocks_percpu, 0)[MSM_CLOCK_DGT];
 
 	if (clock_state->stopped)
-		return clock_state->stopped_tick >> MSM_DGT_SHIFT;
+		return clock_state->stopped_tick >> clock->shift;
 
 	return (msm_read_timer_count(clock, GLOBAL_TIMER) +
-		clock_state->sleep_offset) >> MSM_DGT_SHIFT;
+		clock_state->sleep_offset) >> clock->shift;
 }
 
-#ifdef CONFIG_SMP
 static struct msm_clock *clockevent_to_clock(struct clock_event_device *evt)
 {
+#ifdef CONFIG_SMP
 	int i;
 	for (i = 0; i < NR_TIMERS; i++)
 		if (evt == &(msm_clocks[i].clockevent))
 			return &msm_clocks[i];
-	return &msm_clocks[MSM_GLOBAL_TIMER];
-}
+	return &msm_clocks[msm_global_timer];
 #endif
+	return container_of(evt, struct msm_clock, clockevent);
+}
 
 static int msm_timer_set_next_event(unsigned long cycles,
 				    struct clock_event_device *evt)
@@ -344,11 +299,7 @@
 	uint32_t alarm;
 	int late;
 
-#ifdef CONFIG_SMP
 	clock = clockevent_to_clock(evt);
-#else
-	clock = container_of(evt, struct msm_clock, clockevent);
-#endif
 	clock_state = &__get_cpu_var(msm_clocks_percpu)[clock->index];
 	if (clock_state->stopped)
 		return 0;
@@ -385,11 +336,7 @@
 	struct msm_clock_percpu_data *clock_state, *gpt_state;
 	unsigned long irq_flags;
 
-#ifdef CONFIG_SMP
 	clock = clockevent_to_clock(evt);
-#else
-	clock = container_of(evt, struct msm_clock, clockevent);
-#endif
 	clock_state = &__get_cpu_var(msm_clocks_percpu)[clock->index];
 	gpt_state = &__get_cpu_var(msm_clocks_percpu)[MSM_CLOCK_GPT];
 
@@ -453,6 +400,8 @@
 	return MSM_TMR_BASE + global_timer_offset;
 }
 
+#define MPM_SCLK_COUNT_VAL    0x0024
+
 #ifdef CONFIG_PM
 /*
  * Retrieve the cycle count from sclk and optionally synchronize local clock
@@ -511,6 +460,17 @@
 	return t1;
 }
 #elif defined(CONFIG_MSM_N_WAY_SMSM)
+
+/* Time Master State Bits */
+#define MASTER_BITS_PER_CPU        1
+#define MASTER_TIME_PENDING \
+	(0x01UL << (MASTER_BITS_PER_CPU * SMSM_APPS_STATE))
+
+/* Time Slave State Bits */
+#define SLAVE_TIME_REQUEST         0x0400
+#define SLAVE_TIME_POLL            0x0800
+#define SLAVE_TIME_INIT            0x1000
+
 static uint32_t msm_timer_do_sync_to_sclk(
 	void (*time_start)(struct msm_timer_sync_data_t *data),
 	bool (*time_expired)(struct msm_timer_sync_data_t *data),
@@ -973,7 +933,7 @@
 
 unsigned long long notrace sched_clock(void)
 {
-	struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];
+	struct msm_clock *clock = &msm_clocks[msm_global_timer];
 	struct clocksource *cs = &clock->clocksource;
 	u32 cyc = cs->read(cs);
 	return cyc_to_sched_clock(&cd, cyc, ((u32)~0 >> clock->shift));
@@ -981,7 +941,7 @@
 
 static void notrace msm_update_sched_clock(void)
 {
-	struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];
+	struct msm_clock *clock = &msm_clocks[msm_global_timer];
 	struct clocksource *cs = &clock->clocksource;
 	u32 cyc = cs->read(cs);
 	update_sched_clock(&cd, cyc, ((u32)~0) >> clock->shift);
@@ -998,7 +958,7 @@
 
 static void __init msm_sched_clock_init(void)
 {
-	struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];
+	struct msm_clock *clock = &msm_clocks[msm_global_timer];
 
 	init_sched_clock(&cd, msm_update_sched_clock, 32 - clock->shift,
 			 clock->freq);
@@ -1007,11 +967,41 @@
 {
 	int i;
 	int res;
+	struct msm_clock *dgt = &msm_clocks[MSM_CLOCK_DGT];
+	struct msm_clock *gpt = &msm_clocks[MSM_CLOCK_GPT];
 
-#if defined(CONFIG_ARCH_MSM8X60) || defined(CONFIG_ARCH_MSM8960) || \
-	defined(CONFIG_ARCH_APQ8064) || defined(CONFIG_ARCH_MSM9615)
-	__raw_writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
-#endif
+	if (cpu_is_msm7x01() || cpu_is_msm7x25() || cpu_is_msm7x27() ||
+	    cpu_is_msm7x25a() || cpu_is_msm7x27a() || cpu_is_msm7x25aa() ||
+	    cpu_is_msm7x27aa()) {
+		dgt->shift = MSM_DGT_SHIFT;
+		dgt->freq = 19200000 >> MSM_DGT_SHIFT;
+		dgt->clockevent.shift = 32 + MSM_DGT_SHIFT;
+		dgt->clocksource.mask = CLOCKSOURCE_MASK(32 - MSM_DGT_SHIFT);
+		dgt->clocksource.shift = 24 - MSM_DGT_SHIFT;
+		gpt->regbase = MSM_TMR_BASE;
+		dgt->regbase = MSM_TMR_BASE + 0x10;
+	} else if (cpu_is_qsd8x50()) {
+		dgt->freq = 4800000;
+		gpt->regbase = MSM_TMR_BASE;
+		dgt->regbase = MSM_TMR_BASE + 0x10;
+	} else if (cpu_is_fsm9xxx())
+		dgt->freq = 4800000;
+	else if (cpu_is_msm7x30() || cpu_is_msm8x55())
+		dgt->freq = 6144000;
+	else if (cpu_is_msm8x60() || cpu_is_msm8960() || cpu_is_msm9615() ||
+		 cpu_is_apq8064() || cpu_is_msm8x30()) {
+		dgt->freq = 6750000;
+		__raw_writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
+	} else {
+		WARN_ON("Timer running on unknown hardware. Configure this! "
+			"Assuming default configuration.\n");
+		dgt->freq = 6750000;
+	}
+
+	if (msm_clocks[MSM_CLOCK_GPT].clocksource.rating > DG_TIMER_RATING)
+		msm_global_timer = MSM_CLOCK_GPT;
+	else
+		msm_global_timer = MSM_CLOCK_DGT;
 
 	for (i = 0; i < ARRAY_SIZE(msm_clocks); i++) {
 		struct msm_clock *clock = &msm_clocks[i];
@@ -1072,7 +1062,7 @@
 {
 	unsigned long flags;
 	static DEFINE_PER_CPU(bool, first_boot) = true;
-	struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];
+	struct msm_clock *clock = &msm_clocks[msm_global_timer];
 
 	/* Use existing clock_event for cpu 0 */
 	if (!smp_processor_id())
diff --git a/sound/soc/msm/msm-pcm-routing.c b/sound/soc/msm/msm-pcm-routing.c
index 3eb9a42..3c92514 100644
--- a/sound/soc/msm/msm-pcm-routing.c
+++ b/sound/soc/msm/msm-pcm-routing.c
@@ -360,7 +360,8 @@
 static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
 				struct snd_ctl_elem_value *ucontrol)
 {
-	struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
+	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
+	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
 
 	pr_debug("%s: FM Switch enable %ld\n", __func__,
 			ucontrol->value.integer.value[0]);
@@ -710,7 +711,7 @@
 	SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
 	/* Switch Definitions */
-	SND_SOC_DAPM_SWITCH("SBUS_0_RX", SND_SOC_NOPM, 0, 0,
+	SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
 				&fm_switch_mixer_controls),
 	/* Mixer definitions */
 	SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
@@ -843,7 +844,8 @@
 	{"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
 
 	{"VOIP_UL", NULL, "Voip_Tx Mixer"},
-	{"SLIMBUS_0_RX", "Switch", "SLIM0_DL_HL"},
+	{"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
+	{"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
 	{"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
 	{"INT_FM_RX", NULL, "INTFM_DL_HL"},
 	{"INTFM_UL_HL", NULL, "INT_FM_TX"},