Merge "msm: rpmrs: Fix overflow error during power calculations" into msm-3.0
diff --git a/arch/arm/configs/msm9615_defconfig b/arch/arm/configs/msm9615_defconfig
index f28d420..7ef47c8 100644
--- a/arch/arm/configs/msm9615_defconfig
+++ b/arch/arm/configs/msm9615_defconfig
@@ -99,7 +99,8 @@
 CONFIG_SPI_SPIDEV=m
 CONFIG_DEBUG_GPIO=y
 CONFIG_GPIO_SYSFS=y
-# CONFIG_HWMON is not set
+CONFIG_HWMON=y
+CONFIG_SENSORS_PM8XXX_ADC=y
 CONFIG_THERMAL=y
 CONFIG_THERMAL_TSENS8960=y
 CONFIG_MFD_PM8018_CORE=y
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/pm-8x60.c b/arch/arm/mach-msm/pm-8x60.c
index c831d4b..911d546 100644
--- a/arch/arm/mach-msm/pm-8x60.c
+++ b/arch/arm/mach-msm/pm-8x60.c
@@ -279,7 +279,7 @@
 	ret = 0;
 
 mode_sysfs_add_cpu_exit:
-	if (!ret) {
+	if (ret) {
 		if (mode && mode->kobj)
 			kobject_del(mode->kobj);
 		kfree(mode);
diff --git a/sound/soc/msm/msm8960.c b/sound/soc/msm/msm8960.c
index 5e81e0f..0f08682 100644
--- a/sound/soc/msm/msm8960.c
+++ b/sound/soc/msm/msm8960.c
@@ -25,7 +25,7 @@
 #include <sound/jack.h>
 #include <asm/mach-types.h>
 #include "msm-pcm-routing.h"
-#include <../codecs/wcd9310.h>
+#include "../codecs/wcd9310.h"
 
 /* 8960 machine driver */