Merge "power: pm8921-charger: Bound lower AICL limit at 500 mA" into msm-3.0
diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile
index 3ef61f4..f14f1ea 100644
--- a/arch/arm/mach-msm/Makefile
+++ b/arch/arm/mach-msm/Makefile
@@ -87,7 +87,7 @@
ifdef CONFIG_DEBUG_FS
obj-$(CONFIG_MSM_IPC_LOGGING) += ipc_logging_debug.o
endif
-obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o remote_spinlock.o
+obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o remote_spinlock.o smd_private.o
obj-y += socinfo.o
ifndef CONFIG_ARCH_MSM9615
ifndef CONFIG_ARCH_APQ8064
diff --git a/arch/arm/mach-msm/board-8064-gpiomux.c b/arch/arm/mach-msm/board-8064-gpiomux.c
index 8464752..de6e0d2 100644
--- a/arch/arm/mach-msm/board-8064-gpiomux.c
+++ b/arch/arm/mach-msm/board-8064-gpiomux.c
@@ -71,6 +71,265 @@
};
#endif
+#ifdef CONFIG_MSM_VCAP
+static struct gpiomux_setting gpio_vcap_config[] = {
+ {
+ .func = GPIOMUX_FUNC_GPIO,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_1,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_2,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_3,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_4,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_5,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_6,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_7,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_8,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_9,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+ {
+ .func = GPIOMUX_FUNC_A,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_DOWN,
+ },
+};
+
+struct msm_gpiomux_config vcap_configs[] = {
+ {
+ .gpio = 20,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[7],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[7],
+ }
+ },
+ {
+ .gpio = 25,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 24,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[1],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[1],
+ }
+ },
+ {
+ .gpio = 23,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 19,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[8],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[8],
+ }
+ },
+ {
+ .gpio = 22,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 21,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[7],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[7],
+ }
+ },
+ {
+ .gpio = 12,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[6],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[6],
+ }
+ },
+ {
+ .gpio = 18,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[9],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[9],
+ }
+ },
+ {
+ .gpio = 11,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[10],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[10],
+ }
+ },
+ {
+ .gpio = 10,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[9],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[9],
+ }
+ },
+ {
+ .gpio = 9,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 26,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[1],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[1],
+ }
+ },
+ {
+ .gpio = 8,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[3],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[3],
+ }
+ },
+ {
+ .gpio = 7,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[7],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[7],
+ }
+ },
+ {
+ .gpio = 6,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[7],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[7],
+ }
+ },
+ {
+ .gpio = 80,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 86,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[1],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[1],
+ }
+ },
+ {
+ .gpio = 85,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[4],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[4],
+ }
+ },
+ {
+ .gpio = 84,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[3],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[3],
+ }
+ },
+ {
+ .gpio = 5,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 4,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[3],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[3],
+ }
+ },
+ {
+ .gpio = 3,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[6],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[6],
+ }
+ },
+ {
+ .gpio = 2,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[5],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[5],
+ }
+ },
+ {
+ .gpio = 82,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[4],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[4],
+ }
+ },
+ {
+ .gpio = 83,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[4],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[4],
+ }
+ },
+ {
+ .gpio = 87,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[2],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[2],
+ }
+ },
+ {
+ .gpio = 13,
+ .settings = {
+ [GPIOMUX_SUSPENDED] = &gpio_vcap_config[6],
+ [GPIOMUX_ACTIVE] = &gpio_vcap_config[6],
+ }
+ },
+};
+#endif
+
static struct gpiomux_setting gpio_i2c_config = {
.func = GPIOMUX_FUNC_1,
.drv = GPIOMUX_DRV_8MA,
@@ -658,6 +917,10 @@
machine_is_mpq8064_dtv()) {
msm_gpiomux_install(mpq8064_gsbi5_i2c_configs,
ARRAY_SIZE(mpq8064_gsbi5_i2c_configs));
+#ifdef CONFIG_MSM_VCAP
+ msm_gpiomux_install(vcap_configs,
+ ARRAY_SIZE(vcap_configs));
+#endif
} else {
#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
msm_gpiomux_install(apq8064_ethernet_configs,
diff --git a/arch/arm/mach-msm/board-8064-storage.c b/arch/arm/mach-msm/board-8064-storage.c
index cd8fba5..275c893 100644
--- a/arch/arm/mach-msm/board-8064-storage.c
+++ b/arch/arm/mach-msm/board-8064-storage.c
@@ -196,6 +196,9 @@
},
};
+#define MSM_MPM_PIN_SDC1_DAT1 17
+#define MSM_MPM_PIN_SDC3_DAT1 21
+
#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
static unsigned int sdc1_sup_clk_rates[] = {
400000, 24000000, 48000000, 96000000
@@ -215,6 +218,7 @@
.pin_data = &mmc_slot_pin_data[SDCC1],
.vreg_data = &mmc_slot_vreg_data[SDCC1],
.uhs_caps = MMC_CAP_1_8V_DDR | MMC_CAP_UHS_DDR50,
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
};
static struct mmc_platform_data *apq8064_sdc1_pdata = &sdc1_data;
#else
@@ -244,6 +248,7 @@
.uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_800),
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
};
static struct mmc_platform_data *apq8064_sdc3_pdata = &sdc3_data;
#else
diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c
index 5cb44b8..9e3b898 100644
--- a/arch/arm/mach-msm/board-8064.c
+++ b/arch/arm/mach-msm/board-8064.c
@@ -1068,6 +1068,7 @@
0,
};
+#ifndef CONFIG_MSM_VCAP
#define MXT_TS_GPIO_IRQ 6
#define MXT_TS_PWR_EN_GPIO PM8921_GPIO_PM_TO_SYS(23)
#define MXT_TS_RESET_GPIO 33
@@ -1119,6 +1120,7 @@
.irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ),
},
};
+#endif
#define CYTTSP_TS_GPIO_IRQ 6
#define CYTTSP_TS_GPIO_RESOUT 7
#define CYTTSP_TS_GPIO_SLEEP 33
@@ -1854,9 +1856,11 @@
static struct platform_device *common_devices[] __initdata = {
&apq8064_device_dmov,
+#ifndef CONFIG_MSM_VCAP
&apq8064_device_qup_i2c_gsbi1,
&apq8064_device_qup_i2c_gsbi3,
&apq8064_device_qup_i2c_gsbi4,
+#endif
&apq8064_device_qup_spi_gsbi5,
&apq8064_device_ext_5v_vreg,
&apq8064_device_ext_mpp8_vreg,
@@ -2054,6 +2058,9 @@
&mpq8064_device_ext_2p2_buck_vreg,
&mpq8064_device_ext_5v_buck_vreg,
&mpq8064_device_ext_3p3v_ldo_vreg,
+#ifdef CONFIG_MSM_VCAP
+ &msm8064_device_vcap,
+#endif
};
static struct msm_spi_platform_data apq8064_qup_spi_gsbi5_pdata = {
@@ -2279,14 +2286,6 @@
platform_device_register(&msm_dsps_device_8064);
}
-static void __init apq8064_clock_init(void)
-{
- if (machine_is_apq8064_rumi3())
- msm_clock_init(&apq8064_dummy_clock_init_data);
- else
- msm_clock_init(&apq8064_clock_init_data);
-}
-
#define I2C_SURF 1
#define I2C_FFA (1 << 1)
#define I2C_RUMI (1 << 2)
@@ -2310,12 +2309,14 @@
smb349_charger_i2c_info,
ARRAY_SIZE(smb349_charger_i2c_info)
},
+#ifndef CONFIG_MSM_VCAP
{
I2C_SURF | I2C_LIQUID,
APQ_8064_GSBI3_QUP_I2C_BUS_ID,
mxt_device_info,
ARRAY_SIZE(mxt_device_info),
},
+#endif
{
I2C_FFA,
APQ_8064_GSBI3_QUP_I2C_BUS_ID,
@@ -2495,7 +2496,7 @@
platform_device_register(&apq8064_device_rpm_regulator);
if (msm_xo_init())
pr_err("Failed to initialize XO votes\n");
- apq8064_clock_init();
+ msm_clock_init(&apq8064_clock_init_data);
apq8064_init_gpiomux();
apq8064_i2c_init();
register_i2c_devices();
diff --git a/arch/arm/mach-msm/board-8930-storage.c b/arch/arm/mach-msm/board-8930-storage.c
index 83fb5fd..ecebfa9 100644
--- a/arch/arm/mach-msm/board-8930-storage.c
+++ b/arch/arm/mach-msm/board-8930-storage.c
@@ -207,13 +207,18 @@
},
};
+#define MSM_MPM_PIN_SDC1_DAT1 17
+#define MSM_MPM_PIN_SDC3_DAT1 21
+
static unsigned int sdc1_sup_clk_rates[] = {
400000, 24000000, 48000000,
};
+#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
static unsigned int sdc3_sup_clk_rates[] = {
400000, 24000000, 48000000, 96000000, 192000000,
};
+#endif
#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
static struct mmc_platform_data msm8960_sdc1_data = {
@@ -228,7 +233,8 @@
.pclk_src_dfab = 1,
.nonremovable = 1,
.vreg_data = &mmc_slot_vreg_data[SDCC1],
- .pin_data = &mmc_slot_pin_data[SDCC1]
+ .pin_data = &mmc_slot_pin_data[SDCC1],
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
};
#endif
@@ -266,6 +272,7 @@
.uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_800),
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
};
#endif
diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c
index 6859b9f..8bbb596 100644
--- a/arch/arm/mach-msm/board-8930.c
+++ b/arch/arm/mach-msm/board-8930.c
@@ -1378,7 +1378,7 @@
/* T6 Object */
0, 0, 0, 0, 0, 0,
/* T38 Object */
- 15, 1, 0, 15, 12, 11, 0, 0,
+ 15, 2, 0, 15, 12, 11, 0, 0,
/* T7 Object */
48, 255, 25,
/* T8 Object */
diff --git a/arch/arm/mach-msm/board-8960-storage.c b/arch/arm/mach-msm/board-8960-storage.c
index b03da38..cd53f83 100644
--- a/arch/arm/mach-msm/board-8960-storage.c
+++ b/arch/arm/mach-msm/board-8960-storage.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -206,13 +206,18 @@
},
};
+#define MSM_MPM_PIN_SDC1_DAT1 17
+#define MSM_MPM_PIN_SDC3_DAT1 21
+
static unsigned int sdc1_sup_clk_rates[] = {
400000, 24000000, 48000000
};
+#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
static unsigned int sdc3_sup_clk_rates[] = {
400000, 24000000, 48000000, 96000000, 192000000
};
+#endif
#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
static struct mmc_platform_data msm8960_sdc1_data = {
@@ -228,6 +233,7 @@
.nonremovable = 1,
.vreg_data = &mmc_slot_vreg_data[SDCC1],
.pin_data = &mmc_slot_pin_data[SDCC1],
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
};
#endif
@@ -253,6 +259,7 @@
.uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_600),
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
};
#endif
diff --git a/arch/arm/mach-msm/board-8960.c b/arch/arm/mach-msm/board-8960.c
index 1ca25cc..6ed174c 100644
--- a/arch/arm/mach-msm/board-8960.c
+++ b/arch/arm/mach-msm/board-8960.c
@@ -3021,7 +3021,6 @@
BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data));
regulator_suppress_info_printing();
platform_device_register(&msm8960_device_rpm_regulator);
- msm_clock_init(&msm8960_dummy_clock_init_data);
msm8960_init_gpiomux();
msm8960_init_pmic();
msm8960_device_qup_spi_gsbi1.dev.platform_data =
@@ -3036,9 +3035,6 @@
msm8960_init_mmc();
register_i2c_devices();
- /* For 8960 Fusion 2.2 Primary IPC */
- if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE)
- msm_device_uart_dm9.dev.platform_data = &msm_uart_dm9_pdata;
msm8960_init_fb();
slim_register_board_info(msm_slim_devices,
@@ -3103,6 +3099,10 @@
else
platform_device_register(&msm8960_device_uart_gsbi5);
+ /* For 8960 Fusion 2.2 Primary IPC */
+ if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_SGLTE)
+ msm_device_uart_dm9.dev.platform_data = &msm_uart_dm9_pdata;
+
platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
msm8960_pm8921_gpio_mpp_init();
platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices));
diff --git a/arch/arm/mach-msm/board-9615-gpiomux.c b/arch/arm/mach-msm/board-9615-gpiomux.c
index 0e18918..c600d53 100644
--- a/arch/arm/mach-msm/board-9615-gpiomux.c
+++ b/arch/arm/mach-msm/board-9615-gpiomux.c
@@ -105,6 +105,20 @@
};
#endif
+static struct gpiomux_setting wlan_active_config = {
+ .func = GPIOMUX_FUNC_GPIO,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_NONE,
+ .dir = GPIOMUX_OUT_LOW,
+};
+
+static struct gpiomux_setting wlan_suspend_config = {
+ .func = GPIOMUX_FUNC_GPIO,
+ .drv = GPIOMUX_DRV_2MA,
+ .pull = GPIOMUX_PULL_NONE,
+ .dir = GPIOMUX_IN,
+};
+
static struct msm_gpiomux_config msm9615_audio_codec_configs[] __initdata = {
{
.gpio = 24,
@@ -306,6 +320,24 @@
};
#endif
+static struct msm_gpiomux_config msm9615_wlan_configs[] __initdata = {
+ {
+ .gpio = 2, /* WLAN_PM_ENABLE */
+ .settings = {
+ [GPIOMUX_ACTIVE] = &wlan_active_config,
+ [GPIOMUX_SUSPENDED] = &wlan_suspend_config,
+ },
+ },
+ {
+ .gpio = 21, /* WLAN_RESET_N */
+ .settings = {
+ [GPIOMUX_ACTIVE] = &wlan_active_config,
+ [GPIOMUX_SUSPENDED] = &wlan_suspend_config,
+ },
+ },
+};
+
+
int __init msm9615_init_gpiomux(void)
{
int rc;
@@ -332,6 +364,9 @@
msm_gpiomux_install(msm9615_audio_codec_configs,
ARRAY_SIZE(msm9615_audio_codec_configs));
+ msm_gpiomux_install(msm9615_wlan_configs,
+ ARRAY_SIZE(msm9615_wlan_configs));
+
#ifdef CONFIG_FB_MSM_EBI2
msm_gpiomux_install(msm9615_ebi2_lcdc_configs,
ARRAY_SIZE(msm9615_ebi2_lcdc_configs));
diff --git a/arch/arm/mach-msm/board-9615-storage.c b/arch/arm/mach-msm/board-9615-storage.c
index c73e5a9..6bf7c69 100644
--- a/arch/arm/mach-msm/board-9615-storage.c
+++ b/arch/arm/mach-msm/board-9615-storage.c
@@ -163,6 +163,8 @@
#endif
};
+#define MSM_MPM_PIN_SDC1_DAT1 17
+
#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
static unsigned int sdc1_sup_clk_rates[] = {
400000, 24000000, 48000000
@@ -183,7 +185,8 @@
#endif
.xpc_cap = 1,
.uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
- MMC_CAP_MAX_CURRENT_400)
+ MMC_CAP_MAX_CURRENT_400),
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
};
static struct mmc_platform_data *msm9615_sdc1_pdata = &sdc1_data;
#else
diff --git a/arch/arm/mach-msm/board-copper.c b/arch/arm/mach-msm/board-copper.c
index 3500448..28f5e7f 100644
--- a/arch/arm/mach-msm/board-copper.c
+++ b/arch/arm/mach-msm/board-copper.c
@@ -414,6 +414,10 @@
"spi_qsd.1", NULL),
OF_DEV_AUXDATA("qcom,spmi-pmic-arb", 0xFC4C0000, \
"spmi-pmic-arb.0", NULL),
+ OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF980B000, \
+ "msm_sdcc.1", NULL),
+ OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF984B000, \
+ "msm_sdcc.3", NULL),
{}
};
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c
index 7832b878..da362a0 100644
--- a/arch/arm/mach-msm/board-msm8x60.c
+++ b/arch/arm/mach-msm/board-msm8x60.c
@@ -8368,6 +8368,7 @@
.msmsdcc_fmax = 48000000,
.nonremovable = 0,
.pclk_src_dfab = 1,
+ .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
};
#endif
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index ca5a63d..873db2d 100644
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -4361,7 +4361,7 @@
.ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
}
static struct clk_freq_tbl clk_tbl_pcm[] = {
- F_PCM( 0, gnd, 1, 0, 0),
+ { .ns_val = BIT(10) /* external input */ },
F_PCM( 512000, pll4, 4, 1, 192),
F_PCM( 768000, pll4, 4, 1, 128),
F_PCM( 1024000, pll4, 4, 1, 96),
@@ -4389,7 +4389,7 @@
.ns_reg = LCC_PCM_NS_REG,
.md_reg = LCC_PCM_MD_REG,
.root_en_mask = BIT(9),
- .ns_mask = (BM(31, 16) | BM(6, 0)),
+ .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
.mnd_en_mask = BIT(8),
.set_rate = set_rate_mnd,
.freq_tbl = clk_tbl_pcm,
@@ -5038,11 +5038,14 @@
CLK_LOOKUP("bus_clk",
gfx3d_axi_clk_8064.c, "footswitch-8x60.2"),
CLK_LOOKUP("iface_clk", vcap_p_clk.c, ""),
+ CLK_LOOKUP("iface_clk", vcap_p_clk.c, "msm_vcap.0"),
CLK_LOOKUP("iface_clk", vcap_p_clk.c, "footswitch-8x60.10"),
CLK_LOOKUP("bus_clk", vcap_axi_clk.c, "footswitch-8x60.10"),
CLK_LOOKUP("core_clk", vcap_clk.c, ""),
+ CLK_LOOKUP("core_clk", vcap_clk.c, "msm_vcap.0"),
CLK_LOOKUP("core_clk", vcap_clk.c, "footswitch-8x60.10"),
CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, ""),
+ CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, "msm_vcap.0"),
CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"),
CLK_LOOKUP("mem_clk", imem_axi_clk.c, ""),
CLK_LOOKUP("ijpeg_clk", ijpeg_clk.c, ""),
diff --git a/arch/arm/mach-msm/clock-8x60.c b/arch/arm/mach-msm/clock-8x60.c
index 6c23c50..a1bbf53 100644
--- a/arch/arm/mach-msm/clock-8x60.c
+++ b/arch/arm/mach-msm/clock-8x60.c
@@ -3064,7 +3064,7 @@
.ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
}
static struct clk_freq_tbl clk_tbl_pcm[] = {
- F_PCM( 0, gnd, 1, 0, 0),
+ { .ns_val = BIT(10) /* external input */ },
F_PCM( 512000, pll4, 4, 1, 264),
F_PCM( 768000, pll4, 4, 1, 176),
F_PCM( 1024000, pll4, 4, 1, 132),
@@ -3092,7 +3092,7 @@
.ns_reg = LCC_PCM_NS_REG,
.md_reg = LCC_PCM_MD_REG,
.root_en_mask = BIT(9),
- .ns_mask = (BM(31, 16) | BM(6, 0)),
+ .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
.mnd_en_mask = BIT(8),
.set_rate = set_rate_mnd,
.freq_tbl = clk_tbl_pcm,
@@ -3576,7 +3576,7 @@
CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, ""),
CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "msm_serial_hsl.0"),
CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.5"),
- CLK_LOOKUP("ppss_pclk", ppss_p_clk.c, ""),
+ CLK_LOOKUP("iface_clk", ppss_p_clk.c, "msm_dsps"),
CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"),
CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.1"),
CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""),
diff --git a/arch/arm/mach-msm/clock-9615.c b/arch/arm/mach-msm/clock-9615.c
index b145278..3f25556 100644
--- a/arch/arm/mach-msm/clock-9615.c
+++ b/arch/arm/mach-msm/clock-9615.c
@@ -1254,7 +1254,7 @@
.ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
}
static struct clk_freq_tbl clk_tbl_pcm[] = {
- F_PCM( 0, gnd, 1, 0, 0),
+ { .ns_val = BIT(10) /* external input */ },
F_PCM( 512000, pll4, 4, 1, 192),
F_PCM( 768000, pll4, 4, 1, 128),
F_PCM( 1024000, pll4, 4, 1, 96),
@@ -1282,7 +1282,7 @@
.ns_reg = LCC_PCM_NS_REG,
.md_reg = LCC_PCM_MD_REG,
.root_en_mask = BIT(9),
- .ns_mask = (BM(31, 16) | BM(6, 0)),
+ .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
.mnd_en_mask = BIT(8),
.set_rate = set_rate_mnd,
.freq_tbl = clk_tbl_pcm,
diff --git a/arch/arm/mach-msm/clock.c b/arch/arm/mach-msm/clock.c
index 09bf036..fb5b580 100644
--- a/arch/arm/mach-msm/clock.c
+++ b/arch/arm/mach-msm/clock.c
@@ -132,8 +132,11 @@
{
int ret = 0;
struct clk *parent;
+
if (!clk)
return 0;
+ if (IS_ERR(clk))
+ return -EINVAL;
mutex_lock(&clk->prepare_lock);
if (clk->prepare_count == 0) {
@@ -174,6 +177,8 @@
if (!clk)
return 0;
+ if (IS_ERR(clk))
+ return -EINVAL;
spin_lock_irqsave(&clk->lock, flags);
if (WARN(!clk->warned && !clk->prepare_count,
@@ -230,7 +235,7 @@
{
unsigned long flags;
- if (!clk)
+ if (IS_ERR_OR_NULL(clk))
return;
spin_lock_irqsave(&clk->lock, flags);
@@ -259,7 +264,7 @@
void clk_unprepare(struct clk *clk)
{
- if (!clk)
+ if (IS_ERR_OR_NULL(clk))
return;
mutex_lock(&clk->prepare_lock);
@@ -290,6 +295,9 @@
int clk_reset(struct clk *clk, enum clk_reset_action action)
{
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
if (!clk->ops->reset)
return -ENOSYS;
@@ -299,6 +307,9 @@
unsigned long clk_get_rate(struct clk *clk)
{
+ if (IS_ERR_OR_NULL(clk))
+ return 0;
+
if (!clk->ops->get_rate)
return clk->rate;
@@ -311,6 +322,9 @@
unsigned long start_rate, flags;
int rc;
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
if (!clk->ops->set_rate)
return -ENOSYS;
@@ -347,6 +361,9 @@
long clk_round_rate(struct clk *clk, unsigned long rate)
{
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
if (!clk->ops->round_rate)
return -ENOSYS;
@@ -356,6 +373,9 @@
int clk_set_max_rate(struct clk *clk, unsigned long rate)
{
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
if (!clk->ops->set_max_rate)
return -ENOSYS;
@@ -374,6 +394,9 @@
struct clk *clk_get_parent(struct clk *clk)
{
+ if (IS_ERR_OR_NULL(clk))
+ return NULL;
+
if (!clk->ops->get_parent)
return NULL;
@@ -383,7 +406,7 @@
int clk_set_flags(struct clk *clk, unsigned long flags)
{
- if (clk == NULL || IS_ERR(clk))
+ if (IS_ERR_OR_NULL(clk))
return -EINVAL;
if (!clk->ops->set_flags)
return -ENOSYS;
diff --git a/arch/arm/mach-msm/clock.h b/arch/arm/mach-msm/clock.h
index fda7175..d5a3e8f 100644
--- a/arch/arm/mach-msm/clock.h
+++ b/arch/arm/mach-msm/clock.h
@@ -152,14 +152,12 @@
extern struct clock_init_data msm9615_clock_init_data;
extern struct clock_init_data apq8064_clock_init_data;
-extern struct clock_init_data apq8064_dummy_clock_init_data;
extern struct clock_init_data fsm9xxx_clock_init_data;
extern struct clock_init_data msm7x01a_clock_init_data;
extern struct clock_init_data msm7x27_clock_init_data;
extern struct clock_init_data msm7x27a_clock_init_data;
extern struct clock_init_data msm7x30_clock_init_data;
extern struct clock_init_data msm8960_clock_init_data;
-extern struct clock_init_data msm8960_dummy_clock_init_data;
extern struct clock_init_data msm8x60_clock_init_data;
extern struct clock_init_data qds8x50_clock_init_data;
extern struct clock_init_data msm8625_dummy_clock_init_data;
diff --git a/arch/arm/mach-msm/devices-8064.c b/arch/arm/mach-msm/devices-8064.c
index b760226..2dc8751 100644
--- a/arch/arm/mach-msm/devices-8064.c
+++ b/arch/arm/mach-msm/devices-8064.c
@@ -1533,199 +1533,6 @@
};
unsigned apq8064_num_fs_devices = ARRAY_SIZE(apq8064_fs_devices);
-static struct clk_lookup msm_clocks_8064_dummy[] = {
- CLK_DUMMY("pll2", PLL2, NULL, 0),
- CLK_DUMMY("pll8", PLL8, NULL, 0),
- CLK_DUMMY("pll4", PLL4, NULL, 0),
-
- CLK_DUMMY("afab_clk", AFAB_CLK, NULL, 0),
- CLK_DUMMY("afab_a_clk", AFAB_A_CLK, NULL, 0),
- CLK_DUMMY("cfpb_clk", CFPB_CLK, NULL, 0),
- CLK_DUMMY("cfpb_a_clk", CFPB_A_CLK, NULL, 0),
- CLK_DUMMY("dfab_clk", DFAB_CLK, NULL, 0),
- CLK_DUMMY("dfab_a_clk", DFAB_A_CLK, NULL, 0),
- CLK_DUMMY("ebi1_clk", EBI1_CLK, NULL, 0),
- CLK_DUMMY("ebi1_a_clk", EBI1_A_CLK, NULL, 0),
- CLK_DUMMY("mmfab_clk", MMFAB_CLK, NULL, 0),
- CLK_DUMMY("mmfab_a_clk", MMFAB_A_CLK, NULL, 0),
- CLK_DUMMY("mmfpb_clk", MMFPB_CLK, NULL, 0),
- CLK_DUMMY("mmfpb_a_clk", MMFPB_A_CLK, NULL, 0),
- CLK_DUMMY("sfab_clk", SFAB_CLK, NULL, 0),
- CLK_DUMMY("sfab_a_clk", SFAB_A_CLK, NULL, 0),
- CLK_DUMMY("sfpb_clk", SFPB_CLK, NULL, 0),
- CLK_DUMMY("sfpb_a_clk", SFPB_A_CLK, NULL, 0),
-
- CLK_DUMMY("core_clk", GSBI1_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI2_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI3_UART_CLK,
- NULL, OFF),
- CLK_DUMMY("core_clk", GSBI4_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI5_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI6_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI7_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI8_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI9_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI10_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI11_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI12_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI1_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI2_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI3_QUP_CLK, "qup_i2c.3", OFF),
- CLK_DUMMY("core_clk", GSBI4_QUP_CLK, "qup_i2c.4", OFF),
- CLK_DUMMY("core_clk", GSBI5_QUP_CLK, "spi_qsd.0", OFF),
- CLK_DUMMY("core_clk", GSBI6_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI7_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PDM_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", PMEM_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PRNG_CLK, "msm_rng.0", OFF),
- CLK_DUMMY("core_clk", SDC1_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC2_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC3_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC4_CLK, NULL, OFF),
- CLK_DUMMY("ref_clk", TSIF_REF_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", TSSC_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_HS1_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_HS3_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_HS4_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("phy_clk", USB_PHY0_CLK, NULL, OFF),
- CLK_DUMMY("src_clk", USB_FS1_SRC_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_FS1_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("sys_clk", USB_FS1_SYS_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", CE2_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", CE1_CORE_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", CE3_CORE_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", CE3_P_CLK, NULL, OFF),
- CLK_DUMMY("pcie_pclk", PCIE_P_CLK, NULL, OFF),
- CLK_DUMMY("pcie_alt_ref_clk", PCIE_ALT_REF_CLK, NULL, OFF),
- CLK_DUMMY("sata_rxoob_clk", SATA_RXOOB_CLK, NULL, OFF),
- CLK_DUMMY("sata_pmalive_clk", SATA_PMALIVE_CLK, NULL, OFF),
- CLK_DUMMY("ref_clk", SATA_PHY_REF_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI2_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI3_P_CLK, "qup_i2c.3", OFF),
- CLK_DUMMY("iface_clk", GSBI4_P_CLK, "qup_i2c.4", OFF),
- CLK_DUMMY("iface_clk", GSBI5_P_CLK, "spi_qsd.0", OFF),
- CLK_DUMMY("iface_clk", GSBI6_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI7_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", TSIF_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_FS1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_HS1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_HS3_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_HS4_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC2_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC3_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC4_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", ADM0_CLK, "msm_dmov", OFF),
- CLK_DUMMY("iface_clk", ADM0_P_CLK, "msm_dmov", OFF),
- CLK_DUMMY("iface_clk", PMIC_ARB0_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", PMIC_ARB1_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PMIC_SSBI2_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", RPM_MSG_RAM_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", AMP_CLK, NULL, OFF),
- CLK_DUMMY("cam_clk", CAM0_CLK, NULL, OFF),
- CLK_DUMMY("cam_clk", CAM1_CLK, NULL, OFF),
- CLK_DUMMY("csi_src_clk", CSI0_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi_src_clk", CSI1_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi_clk", CSI0_CLK, NULL, OFF),
- CLK_DUMMY("csi_clk", CSI1_CLK, NULL, OFF),
- CLK_DUMMY("csi_pix_clk", CSI_PIX_CLK, NULL, OFF),
- CLK_DUMMY("csi_rdi_clk", CSI_RDI_CLK, NULL, OFF),
- CLK_DUMMY("csiphy_timer_src_clk", CSIPHY_TIMER_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi0phy_timer_clk", CSIPHY0_TIMER_CLK, NULL, OFF),
- CLK_DUMMY("csi1phy_timer_clk", CSIPHY1_TIMER_CLK, NULL, OFF),
- CLK_DUMMY("dsi_byte_div_clk", DSI1_BYTE_CLK, NULL, OFF),
- CLK_DUMMY("dsi_byte_div_clk", DSI2_BYTE_CLK, NULL, OFF),
- CLK_DUMMY("dsi_esc_clk", DSI1_ESC_CLK, NULL, OFF),
- CLK_DUMMY("dsi_esc_clk", DSI2_ESC_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", VCAP_CLK, NULL, OFF),
- CLK_DUMMY("npl_clk", VCAP_NPL_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GFX3D_CLK, "kgsl-3d0.0", OFF),
- CLK_DUMMY("ijpeg_clk", IJPEG_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", IMEM_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", JPEGD_CLK, NULL, OFF),
- CLK_DUMMY("mdp_clk", MDP_CLK, NULL, OFF),
- CLK_DUMMY("mdp_vsync_clk", MDP_VSYNC_CLK, NULL, OFF),
- CLK_DUMMY("lut_mdp", LUT_MDP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", ROT_CLK, NULL, OFF),
- CLK_DUMMY("tv_src_clk", TV_SRC_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", VCODEC_CLK, NULL, OFF),
- CLK_DUMMY("mdp_tv_clk", MDP_TV_CLK, NULL, OFF),
- CLK_DUMMY("rgb_tv_clk", RGB_TV_CLK, NULL, OFF),
- CLK_DUMMY("npl_tv_clk", NPL_TV_CLK, NULL, OFF),
- CLK_DUMMY("hdmi_clk", HDMI_TV_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", HDMI_APP_CLK, "hdmi_msm.1", OFF),
- CLK_DUMMY("vpe_clk", VPE_CLK, NULL, OFF),
- CLK_DUMMY("vfe_clk", VFE_CLK, NULL, OFF),
- CLK_DUMMY("csi_vfe_clk", CSI0_VFE_CLK, NULL, OFF),
- CLK_DUMMY("vfe_axi_clk", VFE_AXI_CLK, NULL, OFF),
- CLK_DUMMY("ijpeg_axi_clk", IJPEG_AXI_CLK, NULL, OFF),
- CLK_DUMMY("mdp_axi_clk", MDP_AXI_CLK, NULL, OFF),
- CLK_DUMMY("bus_clk", ROT_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_clk", VCODEC_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_a_clk", VCODEC_AXI_A_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_b_clk", VCODEC_AXI_B_CLK, NULL, OFF),
- CLK_DUMMY("vpe_axi_clk", VPE_AXI_CLK, NULL, OFF),
- CLK_DUMMY("bus_clk", GFX3D_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcap_axi_clk", VCAP_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcap_ahb_clk", VCAP_AHB_CLK, NULL, OFF),
- CLK_DUMMY("amp_pclk", AMP_P_CLK, NULL, OFF),
- CLK_DUMMY("csi_pclk", CSI0_P_CLK, NULL, OFF),
- CLK_DUMMY("dsi_m_pclk", DSI1_M_P_CLK, NULL, OFF),
- CLK_DUMMY("dsi_s_pclk", DSI1_S_P_CLK, NULL, OFF),
- CLK_DUMMY("dsi_m_pclk", DSI2_M_P_CLK, NULL, OFF),
- CLK_DUMMY("dsi_s_pclk", DSI2_S_P_CLK, NULL, OFF),
- CLK_DUMMY("lvds_clk", LVDS_CLK, NULL, OFF),
- CLK_DUMMY("mdp_p2clk", MDP_P2CLK, NULL, OFF),
- CLK_DUMMY("dsi2_pixel_clk", DSI2_PIXEL_CLK, NULL, OFF),
- CLK_DUMMY("lvds_ref_clk", LVDS_REF_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GFX3D_P_CLK, "kgsl-3d0.0", OFF),
- CLK_DUMMY("master_iface_clk", HDMI_M_P_CLK, "hdmi_msm.1", OFF),
- CLK_DUMMY("slave_iface_clk", HDMI_S_P_CLK, "hdmi_msm.1", OFF),
- CLK_DUMMY("ijpeg_pclk", IJPEG_P_CLK, NULL, OFF),
- CLK_DUMMY("jpegd_pclk", JPEGD_P_CLK, NULL, OFF),
- CLK_DUMMY("mem_iface_clk", IMEM_P_CLK, NULL, OFF),
- CLK_DUMMY("mdp_pclk", MDP_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SMMU_P_CLK, "msm_smmu", OFF),
- CLK_DUMMY("iface_clk", ROT_P_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_pclk", VCODEC_P_CLK, NULL, OFF),
- CLK_DUMMY("vfe_pclk", VFE_P_CLK, NULL, OFF),
- CLK_DUMMY("vpe_pclk", VPE_P_CLK, NULL, OFF),
- CLK_DUMMY("mi2s_osr_clk", MI2S_OSR_CLK, NULL, OFF),
- CLK_DUMMY("mi2s_bit_clk", MI2S_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_osr_clk", CODEC_I2S_MIC_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_bit_clk", CODEC_I2S_MIC_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_osr_clk", SPARE_I2S_MIC_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_bit_clk", SPARE_I2S_MIC_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_osr_clk", CODEC_I2S_SPKR_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_bit_clk", CODEC_I2S_SPKR_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_osr_clk", SPARE_I2S_SPKR_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_bit_clk", SPARE_I2S_SPKR_BIT_CLK, NULL, OFF),
- CLK_DUMMY("pcm_clk", PCM_CLK, NULL, OFF),
- CLK_DUMMY("audio_slimbus_clk", AUDIO_SLIMBUS_CLK, NULL, OFF),
-
- CLK_DUMMY("dfab_dsps_clk", DFAB_DSPS_CLK, NULL, 0),
- CLK_DUMMY("core_clk", DFAB_USB_HS_CLK, NULL, 0),
- CLK_DUMMY("bus_clk", DFAB_SDC1_CLK, NULL, 0),
- CLK_DUMMY("bus_clk", DFAB_SDC2_CLK, NULL, 0),
- CLK_DUMMY("bus_clk", DFAB_SDC3_CLK, NULL, 0),
- CLK_DUMMY("bus_clk", DFAB_SDC4_CLK, NULL, 0),
- CLK_DUMMY("dfab_clk", DFAB_CLK, NULL, 0),
- CLK_DUMMY("dma_bam_pclk", DMA_BAM_P_CLK, NULL, 0),
- CLK_DUMMY("mem_clk", EBI1_ADM_CLK, "msm_dmov", 0),
- CLK_DUMMY("ce3_core_src_clk", CE3_SRC_CLK, "qce.0", OFF),
- CLK_DUMMY("ce3_core_src_clk", CE3_SRC_CLK, "qcrypto.0", OFF),
- CLK_DUMMY("core_clk", CE3_CORE_CLK, "qce.0", OFF),
- CLK_DUMMY("core_clk", CE3_CORE_CLK, "qcrypto.0", OFF),
- CLK_DUMMY("iface_clk", CE3_P_CLK, "qce0.0", OFF),
- CLK_DUMMY("iface_clk", CE3_P_CLK, "qcrypto.0", OFF),
-};
-
-struct clock_init_data apq8064_dummy_clock_init_data __initdata = {
- .table = msm_clocks_8064_dummy,
- .size = ARRAY_SIZE(msm_clocks_8064_dummy),
-};
-
struct msm_rpm_platform_data apq8064_rpm_data __initdata = {
.reg_base_addrs = {
[MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE,
@@ -2258,6 +2065,109 @@
},
};
+#ifdef CONFIG_MSM_VCAP
+#define VCAP_HW_BASE 0x05900000
+
+static struct msm_bus_vectors vcap_init_vectors[] = {
+ {
+ .src = MSM_BUS_MASTER_VIDEO_CAP,
+ .dst = MSM_BUS_SLAVE_EBI_CH0,
+ .ab = 0,
+ .ib = 0,
+ },
+};
+
+
+static struct msm_bus_vectors vcap_480_vectors[] = {
+ {
+ .src = MSM_BUS_MASTER_VIDEO_CAP,
+ .dst = MSM_BUS_SLAVE_EBI_CH0,
+ .ab = 1280 * 720 * 3 * 60 / 16,
+ .ib = 1280 * 720 * 3 * 60 / 16 * 1.5,
+ },
+};
+
+static struct msm_bus_vectors vcap_720_vectors[] = {
+ {
+ .src = MSM_BUS_MASTER_VIDEO_CAP,
+ .dst = MSM_BUS_SLAVE_EBI_CH0,
+ .ab = 1280 * 720 * 3 * 60 / 16,
+ .ib = 1280 * 720 * 3 * 60 / 16 * 1.5,
+ },
+};
+
+static struct msm_bus_vectors vcap_1080_vectors[] = {
+ {
+ .src = MSM_BUS_MASTER_VIDEO_CAP,
+ .dst = MSM_BUS_SLAVE_EBI_CH0,
+ .ab = 1920 * 1080 * 3 * 60 / 16,
+ .ib = 1920 * 1080 * 3 * 60 / 16 * 1.5,
+ },
+};
+
+static struct msm_bus_paths vcap_bus_usecases[] = {
+ {
+ ARRAY_SIZE(vcap_init_vectors),
+ vcap_init_vectors,
+ },
+ {
+ ARRAY_SIZE(vcap_480_vectors),
+ vcap_480_vectors,
+ },
+ {
+ ARRAY_SIZE(vcap_720_vectors),
+ vcap_720_vectors,
+ },
+ {
+ ARRAY_SIZE(vcap_1080_vectors),
+ vcap_1080_vectors,
+ },
+};
+
+static struct msm_bus_scale_pdata vcap_axi_client_pdata = {
+ vcap_bus_usecases,
+ ARRAY_SIZE(vcap_bus_usecases),
+};
+
+static struct resource msm_vcap_resources[] = {
+ {
+ .name = "vcap",
+ .start = VCAP_HW_BASE,
+ .end = VCAP_HW_BASE + SZ_1M - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .name = "vcap",
+ .start = VCAP_VC,
+ .end = VCAP_VC,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static unsigned vcap_gpios[] = {
+ 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 80, 82,
+ 83, 84, 85, 86, 87,
+};
+
+static struct vcap_platform_data vcap_pdata = {
+ .gpios = vcap_gpios,
+ .num_gpios = ARRAY_SIZE(vcap_gpios),
+ .bus_client_pdata = &vcap_axi_client_pdata
+};
+
+struct platform_device msm8064_device_vcap = {
+ .name = "msm_vcap",
+ .id = 0,
+ .resource = msm_vcap_resources,
+ .num_resources = ARRAY_SIZE(msm_vcap_resources),
+ .dev = {
+ .platform_data = &vcap_pdata,
+ },
+};
+#endif
+
static struct resource msm_cache_erp_resources[] = {
{
.name = "l1_irq",
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index ef14b93..894c13f 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -2336,200 +2336,6 @@
};
#endif
-static struct clk_lookup msm_clocks_8960_dummy[] = {
- CLK_DUMMY("pll2", PLL2, NULL, 0),
- CLK_DUMMY("pll8", PLL8, NULL, 0),
- CLK_DUMMY("pll4", PLL4, NULL, 0),
-
- CLK_DUMMY("afab_clk", AFAB_CLK, NULL, 0),
- CLK_DUMMY("afab_a_clk", AFAB_A_CLK, NULL, 0),
- CLK_DUMMY("cfpb_clk", CFPB_CLK, NULL, 0),
- CLK_DUMMY("cfpb_a_clk", CFPB_A_CLK, NULL, 0),
- CLK_DUMMY("dfab_clk", DFAB_CLK, NULL, 0),
- CLK_DUMMY("dfab_a_clk", DFAB_A_CLK, NULL, 0),
- CLK_DUMMY("ebi1_clk", EBI1_CLK, NULL, 0),
- CLK_DUMMY("ebi1_a_clk", EBI1_A_CLK, NULL, 0),
- CLK_DUMMY("mmfab_clk", MMFAB_CLK, NULL, 0),
- CLK_DUMMY("mmfab_a_clk", MMFAB_A_CLK, NULL, 0),
- CLK_DUMMY("mmfpb_clk", MMFPB_CLK, NULL, 0),
- CLK_DUMMY("mmfpb_a_clk", MMFPB_A_CLK, NULL, 0),
- CLK_DUMMY("sfab_clk", SFAB_CLK, NULL, 0),
- CLK_DUMMY("sfab_a_clk", SFAB_A_CLK, NULL, 0),
- CLK_DUMMY("sfpb_clk", SFPB_CLK, NULL, 0),
- CLK_DUMMY("sfpb_a_clk", SFPB_A_CLK, NULL, 0),
-
- CLK_DUMMY("core_clk", GSBI1_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI2_UART_CLK, "msm_serial_hsl.0", OFF),
- CLK_DUMMY("core_clk", GSBI3_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI4_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI5_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI6_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI7_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI8_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI9_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI10_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI11_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI12_UART_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI1_QUP_CLK, "spi_qsd.0", OFF),
- CLK_DUMMY("core_clk", GSBI2_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI3_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI4_QUP_CLK, "qup_i2c.4", OFF),
- CLK_DUMMY("core_clk", GSBI5_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI6_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI7_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI8_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI9_QUP_CLK, "qup_i2c.0", OFF),
- CLK_DUMMY("core_clk", GSBI10_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI11_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GSBI12_QUP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PDM_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", PMEM_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PRNG_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC1_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC2_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC3_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC4_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", SDC5_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", TSIF_REF_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", TSSC_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_HS1_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("phy_clk", USB_PHY0_CLK, NULL, OFF),
- CLK_DUMMY("src_clk", USB_FS1_SRC_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_FS1_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("sys_clk", USB_FS1_SYS_CLK, NULL, OFF),
- CLK_DUMMY("src_clk", USB_FS2_SRC_CLK, NULL, OFF),
- CLK_DUMMY("alt_core_clk", USB_FS2_XCVR_CLK, NULL, OFF),
- CLK_DUMMY("sys_clk", USB_FS2_SYS_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", CE2_CLK, "qce.0", OFF),
- CLK_DUMMY("core_clk", CE1_CORE_CLK, "qce.0", OFF),
- CLK_DUMMY("iface_clk", GSBI1_P_CLK, "spi_qsd.0", OFF),
- CLK_DUMMY("iface_clk", GSBI2_P_CLK,
- "msm_serial_hsl.0", OFF),
- CLK_DUMMY("iface_clk", GSBI3_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI4_P_CLK, "qup_i2c.4", OFF),
- CLK_DUMMY("iface_clk", GSBI5_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI6_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI7_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI8_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI9_P_CLK, "qup_i2c.0", OFF),
- CLK_DUMMY("iface_clk", GSBI10_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI11_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI12_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GSBI12_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", TSIF_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_FS1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_FS2_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", USB_HS1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC2_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC3_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC4_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SDC5_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", ADM0_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", ADM0_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", PMIC_ARB0_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", PMIC_ARB1_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", PMIC_SSBI2_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", RPM_MSG_RAM_P_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", AMP_CLK, NULL, OFF),
- CLK_DUMMY("cam_clk", CAM0_CLK, NULL, OFF),
- CLK_DUMMY("cam_clk", CAM1_CLK, NULL, OFF),
- CLK_DUMMY("csi_src_clk", CSI0_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi_src_clk", CSI1_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi_clk", CSI0_CLK, NULL, OFF),
- CLK_DUMMY("csi_clk", CSI1_CLK, NULL, OFF),
- CLK_DUMMY("csi_pix_clk", CSI_PIX_CLK, NULL, OFF),
- CLK_DUMMY("csi_rdi_clk", CSI_RDI_CLK, NULL, OFF),
- CLK_DUMMY("csiphy_timer_src_clk", CSIPHY_TIMER_SRC_CLK, NULL, OFF),
- CLK_DUMMY("csi0phy_timer_clk", CSIPHY0_TIMER_CLK, NULL, OFF),
- CLK_DUMMY("csi1phy_timer_clk", CSIPHY1_TIMER_CLK, NULL, OFF),
- CLK_DUMMY("dsi_byte_div_clk", DSI1_BYTE_CLK, "mipi_dsi.1", OFF),
- CLK_DUMMY("dsi_byte_div_clk", DSI2_BYTE_CLK, "mipi_dsi.2", OFF),
- CLK_DUMMY("dsi_esc_clk", DSI1_ESC_CLK, "mipi_dsi.1", OFF),
- CLK_DUMMY("dsi_esc_clk", DSI2_ESC_CLK, "mipi_dsi.2", OFF),
- CLK_DUMMY("core_clk", GFX2D0_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GFX2D1_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", GFX3D_CLK, NULL, OFF),
- CLK_DUMMY("ijpeg_clk", IJPEG_CLK, NULL, OFF),
- CLK_DUMMY("mem_clk", IMEM_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", JPEGD_CLK, NULL, OFF),
- CLK_DUMMY("mdp_clk", MDP_CLK, NULL, OFF),
- CLK_DUMMY("mdp_vsync_clk", MDP_VSYNC_CLK, NULL, OFF),
- CLK_DUMMY("lut_mdp", LUT_MDP_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", ROT_CLK, NULL, OFF),
- CLK_DUMMY("tv_src_clk", TV_SRC_CLK, NULL, OFF),
- CLK_DUMMY("tv_enc_clk", TV_ENC_CLK, NULL, OFF),
- CLK_DUMMY("tv_dac_clk", TV_DAC_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", VCODEC_CLK, NULL, OFF),
- CLK_DUMMY("mdp_tv_clk", MDP_TV_CLK, NULL, OFF),
- CLK_DUMMY("hdmi_clk", HDMI_TV_CLK, NULL, OFF),
- CLK_DUMMY("hdmi_app_clk", HDMI_APP_CLK, NULL, OFF),
- CLK_DUMMY("vpe_clk", VPE_CLK, NULL, OFF),
- CLK_DUMMY("vfe_clk", VFE_CLK, NULL, OFF),
- CLK_DUMMY("csi_vfe_clk", CSI0_VFE_CLK, NULL, OFF),
- CLK_DUMMY("vfe_axi_clk", VFE_AXI_CLK, NULL, OFF),
- CLK_DUMMY("ijpeg_axi_clk", IJPEG_AXI_CLK, NULL, OFF),
- CLK_DUMMY("mdp_axi_clk", MDP_AXI_CLK, NULL, OFF),
- CLK_DUMMY("bus_clk", ROT_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_clk", VCODEC_AXI_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_a_clk", VCODEC_AXI_A_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_axi_b_clk", VCODEC_AXI_B_CLK, NULL, OFF),
- CLK_DUMMY("vpe_axi_clk", VPE_AXI_CLK, NULL, OFF),
- CLK_DUMMY("amp_pclk", AMP_P_CLK, NULL, OFF),
- CLK_DUMMY("csi_pclk", CSI0_P_CLK, NULL, OFF),
- CLK_DUMMY("dsi_m_pclk", DSI1_M_P_CLK, "mipi_dsi.1", OFF),
- CLK_DUMMY("dsi_s_pclk", DSI1_S_P_CLK, "mipi_dsi.1", OFF),
- CLK_DUMMY("dsi_m_pclk", DSI2_M_P_CLK, "mipi_dsi.2", OFF),
- CLK_DUMMY("dsi_s_pclk", DSI2_S_P_CLK, "mipi_dsi.2", OFF),
- CLK_DUMMY("iface_clk", GFX2D0_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GFX2D1_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", GFX3D_P_CLK, NULL, OFF),
- CLK_DUMMY("hdmi_m_pclk", HDMI_M_P_CLK, NULL, OFF),
- CLK_DUMMY("hdmi_s_pclk", HDMI_S_P_CLK, NULL, OFF),
- CLK_DUMMY("ijpeg_pclk", IJPEG_P_CLK, NULL, OFF),
- CLK_DUMMY("jpegd_pclk", JPEGD_P_CLK, NULL, OFF),
- CLK_DUMMY("mem_iface_clk", IMEM_P_CLK, NULL, OFF),
- CLK_DUMMY("mdp_pclk", MDP_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", SMMU_P_CLK, NULL, OFF),
- CLK_DUMMY("iface_clk", ROT_P_CLK, NULL, OFF),
- CLK_DUMMY("tv_enc_pclk", TV_ENC_P_CLK, NULL, OFF),
- CLK_DUMMY("vcodec_pclk", VCODEC_P_CLK, NULL, OFF),
- CLK_DUMMY("vfe_pclk", VFE_P_CLK, NULL, OFF),
- CLK_DUMMY("vpe_pclk", VPE_P_CLK, NULL, OFF),
- CLK_DUMMY("mi2s_osr_clk", MI2S_OSR_CLK, NULL, OFF),
- CLK_DUMMY("mi2s_bit_clk", MI2S_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_osr_clk", CODEC_I2S_MIC_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_bit_clk", CODEC_I2S_MIC_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_osr_clk", SPARE_I2S_MIC_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_mic_bit_clk", SPARE_I2S_MIC_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_osr_clk", CODEC_I2S_SPKR_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_bit_clk", CODEC_I2S_SPKR_BIT_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_osr_clk", SPARE_I2S_SPKR_OSR_CLK, NULL, OFF),
- CLK_DUMMY("i2s_spkr_bit_clk", SPARE_I2S_SPKR_BIT_CLK, NULL, OFF),
- CLK_DUMMY("pcm_clk", PCM_CLK, NULL, OFF),
- CLK_DUMMY("core_clk", JPEGD_AXI_CLK, NULL, 0),
- CLK_DUMMY("core_clk", VFE_AXI_CLK, NULL, 0),
- CLK_DUMMY("core_clk", VCODEC_AXI_CLK, NULL, 0),
- CLK_DUMMY("core_clk", GFX3D_CLK, NULL, 0),
- CLK_DUMMY("core_clk", GFX2D0_CLK, NULL, 0),
- CLK_DUMMY("core_clk", GFX2D1_CLK, NULL, 0),
-
- CLK_DUMMY("dfab_dsps_clk", DFAB_DSPS_CLK, NULL, 0),
- CLK_DUMMY("core_clk", DFAB_USB_HS_CLK, "msm_otg", NULL),
- CLK_DUMMY("bus_clk", DFAB_SDC1_CLK, "msm_sdcc.1", 0),
- CLK_DUMMY("bus_clk", DFAB_SDC2_CLK, "msm_sdcc.2", 0),
- CLK_DUMMY("bus_clk", DFAB_SDC3_CLK, "msm_sdcc.3", 0),
- CLK_DUMMY("bus_clk", DFAB_SDC4_CLK, "msm_sdcc.4", 0),
- CLK_DUMMY("bus_clk", DFAB_SDC5_CLK, "msm_sdcc.5", 0),
- CLK_DUMMY("dfab_clk", DFAB_CLK, NULL, 0),
- CLK_DUMMY("dma_bam_pclk", DMA_BAM_P_CLK, NULL, 0),
-};
-
-struct clock_init_data msm8960_dummy_clock_init_data __initdata = {
- .table = msm_clocks_8960_dummy,
- .size = ARRAY_SIZE(msm_clocks_8960_dummy),
-};
-
#define LPASS_SLIMBUS_PHYS 0x28080000
#define LPASS_SLIMBUS_BAM_PHYS 0x28084000
#define LPASS_SLIMBUS_SLEW (MSM8960_TLMM_PHYS + 0x207C)
diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c
index 608ca27..614f6ff 100644
--- a/arch/arm/mach-msm/devices-msm8x60.c
+++ b/arch/arm/mach-msm/devices-msm8x60.c
@@ -1591,7 +1591,7 @@
static struct dsps_clk_info dsps_clks[] = {
{
- .name = "ppss_pclk",
+ .name = "iface_clk",
.rate = 0, /* no rate just on/off */
},
{
diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h
index 0c25434..48a38f0 100644
--- a/arch/arm/mach-msm/devices.h
+++ b/arch/arm/mach-msm/devices.h
@@ -171,6 +171,9 @@
extern struct platform_device msm_device_tssc;
extern struct platform_device msm_rotator_device;
+#ifdef CONFIG_MSM_VCAP
+extern struct platform_device msm8064_device_vcap;
+#endif
#ifdef CONFIG_MSM_BUS_SCALING
extern struct msm_bus_scale_pdata rotator_bus_scale_pdata;
diff --git a/arch/arm/mach-msm/gpio-v2.c b/arch/arm/mach-msm/gpio-v2.c
index d1766a3..4e21a86 100644
--- a/arch/arm/mach-msm/gpio-v2.c
+++ b/arch/arm/mach-msm/gpio-v2.c
@@ -490,6 +490,12 @@
.irq_disable = msm_gpio_irq_disable,
};
+/*
+ * This lock class tells lockdep that GPIO irqs are in a different
+ * category than their parents, so it won't report false recursion.
+ */
+static struct lock_class_key msm_gpio_lock_class;
+
static int __devinit msm_gpio_probe(void)
{
int i, irq, ret;
@@ -504,6 +510,7 @@
for (i = 0; i < msm_gpio.gpio_chip.ngpio; ++i) {
irq = msm_gpio_to_irq(&msm_gpio.gpio_chip, i);
+ irq_set_lockdep_class(irq, &msm_gpio_lock_class);
irq_set_chip_and_handler(irq, &msm_gpio_irq_chip,
handle_level_irq);
set_irq_flags(irq, IRQF_VALID);
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index 59e55de..e6a0175 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -210,6 +210,7 @@
#endif
#define CSI_EMBED_DATA 0x12
+#define CSI_RESERVED_DATA_0 0x13
#define CSI_YUV422_8 0x1E
#define CSI_RAW8 0x2A
#define CSI_RAW10 0x2B
diff --git a/arch/arm/mach-msm/include/mach/msm_smd.h b/arch/arm/mach-msm/include/mach/msm_smd.h
index d896013..4934c0f 100644
--- a/arch/arm/mach-msm/include/mach/msm_smd.h
+++ b/arch/arm/mach-msm/include/mach/msm_smd.h
@@ -132,10 +132,25 @@
int disable_smsm_reset_handshake;
};
+/*
+ * Shared Memory Regions
+ *
+ * the array of these regions is expected to be in ascending order by phys_addr
+ *
+ * @phys_addr: physical base address of the region
+ * @size: size of the region in bytes
+ */
+struct smd_smem_regions {
+ void *phys_addr;
+ unsigned size;
+};
+
struct smd_platform {
uint32_t num_ss_configs;
struct smd_subsystem_config *smd_ss_configs;
struct smd_subsystem_restart_config *smd_ssr_config;
+ uint32_t num_smem_areas;
+ struct smd_smem_regions *smd_smem_areas;
};
#ifdef CONFIG_MSM_SMD
diff --git a/arch/arm/mach-msm/ipc_router.c b/arch/arm/mach-msm/ipc_router.c
index 538dbbe..6fa435a 100644
--- a/arch/arm/mach-msm/ipc_router.c
+++ b/arch/arm/mach-msm/ipc_router.c
@@ -457,8 +457,12 @@
INIT_LIST_HEAD(&port_ptr->port_rx_q);
mutex_init(&port_ptr->port_rx_q_lock);
init_waitqueue_head(&port_ptr->port_rx_wait_q);
+ snprintf(port_ptr->rx_wakelock_name, MAX_WAKELOCK_NAME_SZ,
+ "msm_ipc_read%08x:%08x",
+ port_ptr->this_port.node_id,
+ port_ptr->this_port.port_id);
wake_lock_init(&port_ptr->port_rx_wake_lock,
- WAKE_LOCK_SUSPEND, "msm_ipc_read");
+ WAKE_LOCK_SUSPEND, port_ptr->rx_wakelock_name);
port_ptr->endpoint = endpoint;
port_ptr->notify = notify;
diff --git a/arch/arm/mach-msm/ipc_router.h b/arch/arm/mach-msm/ipc_router.h
index bd10ea7..a90be23 100644
--- a/arch/arm/mach-msm/ipc_router.h
+++ b/arch/arm/mach-msm/ipc_router.h
@@ -95,6 +95,7 @@
/* internals */
#define IPC_ROUTER_MAX_REMOTE_SERVERS 100
+#define MAX_WAKELOCK_NAME_SZ 32
struct rr_packet {
struct list_head list;
@@ -116,6 +117,7 @@
struct list_head port_rx_q;
struct mutex port_rx_q_lock;
+ char rx_wakelock_name[MAX_WAKELOCK_NAME_SZ];
struct wake_lock port_rx_wake_lock;
wait_queue_head_t port_rx_wait_q;
@@ -136,7 +138,7 @@
struct msm_ipc_sock {
struct sock sk;
struct msm_ipc_port *port;
- void *modem_pil;
+ void *default_pil;
};
enum write_data_type {
@@ -204,4 +206,15 @@
int msm_ipc_router_init_sockets(void);
void msm_ipc_router_exit_sockets(void);
+#if defined CONFIG_MSM_IPC_ROUTER_SMD_XPRT
+extern void *msm_ipc_load_default_node(void);
+
+extern void msm_ipc_unload_default_node(void *pil);
+#else
+static inline void *msm_ipc_load_default_node(void)
+{ return NULL; }
+
+static inline void msm_ipc_unload_default_node(void *pil) { }
+#endif
+
#endif
diff --git a/arch/arm/mach-msm/ipc_router_smd_xprt.c b/arch/arm/mach-msm/ipc_router_smd_xprt.c
index 0cde393..307b6ae 100644
--- a/arch/arm/mach-msm/ipc_router_smd_xprt.c
+++ b/arch/arm/mach-msm/ipc_router_smd_xprt.c
@@ -19,6 +19,7 @@
#include <linux/types.h>
#include <mach/msm_smd.h>
+#include <mach/peripheral-loader.h>
#include "ipc_router.h"
#include "smd_private.h"
@@ -442,6 +443,31 @@
return 0;
}
+void *msm_ipc_load_default_node(void)
+{
+ void *pil = NULL;
+ const char *peripheral;
+
+ peripheral = smd_edge_to_subsystem(SMD_APPS_MODEM);
+ if (peripheral && !strncmp(peripheral, "modem", 6)) {
+ pil = pil_get(peripheral);
+ if (IS_ERR(pil)) {
+ pr_err("%s: Failed to load %s\n",
+ __func__, peripheral);
+ pil = NULL;
+ }
+ }
+ return pil;
+}
+EXPORT_SYMBOL(msm_ipc_load_default_node);
+
+void msm_ipc_unload_default_node(void *pil)
+{
+ if (pil)
+ pil_put(pil);
+}
+EXPORT_SYMBOL(msm_ipc_unload_default_node);
+
static struct platform_driver msm_ipc_router_smd_remote_driver[] = {
{
.probe = msm_ipc_router_smd_remote_probe,
diff --git a/arch/arm/mach-msm/ipc_socket.c b/arch/arm/mach-msm/ipc_socket.c
index 6e8c99e..d1ed538 100644
--- a/arch/arm/mach-msm/ipc_socket.c
+++ b/arch/arm/mach-msm/ipc_socket.c
@@ -26,58 +26,15 @@
#include <net/sock.h>
-#include <mach/peripheral-loader.h>
-#include <mach/socinfo.h>
-
#include "ipc_router.h"
#define msm_ipc_sk(sk) ((struct msm_ipc_sock *)(sk))
#define msm_ipc_sk_port(sk) ((struct msm_ipc_port *)(msm_ipc_sk(sk)->port))
-#define MODEM_LOAD_TIMEOUT (10 * HZ)
static int sockets_enabled;
static struct proto msm_ipc_proto;
static const struct proto_ops msm_ipc_proto_ops;
-static void msm_ipc_router_unload_modem(void *pil)
-{
- if (pil)
- pil_put(pil);
-}
-
-static void *msm_ipc_router_load_modem(void)
-{
- void *pil = NULL;
- int rc;
-
- /* Load GNSS for Standalone 8064 but not for Fusion 3 */
- if (cpu_is_apq8064()) {
- if (socinfo_get_platform_subtype() == 0x0)
- pil = pil_get("gss");
- } else {
- pil = pil_get("modem");
- }
-
- if (IS_ERR(pil) || !pil) {
- pr_debug("%s: modem load failed\n", __func__);
- pil = NULL;
- } else {
- rc = wait_for_completion_interruptible_timeout(
- &msm_ipc_remote_router_up,
- MODEM_LOAD_TIMEOUT);
- if (!rc)
- rc = -ETIMEDOUT;
- if (rc < 0) {
- pr_err("%s: wait for remote router failed %d\n",
- __func__, rc);
- msm_ipc_router_unload_modem(pil);
- pil = NULL;
- }
- }
-
- return pil;
-}
-
static struct sk_buff_head *msm_ipc_router_build_msg(unsigned int num_sect,
struct iovec const *msg_sect,
size_t total_len)
@@ -244,9 +201,9 @@
sock_init_data(sock, sk);
sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO;
- pil = msm_ipc_router_load_modem();
+ pil = msm_ipc_load_default_node();
msm_ipc_sk(sk)->port = port_ptr;
- msm_ipc_sk(sk)->modem_pil = pil;
+ msm_ipc_sk(sk)->default_pil = pil;
return 0;
}
@@ -495,12 +452,12 @@
{
struct sock *sk = sock->sk;
struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
- void *pil = msm_ipc_sk(sk)->modem_pil;
+ void *pil = msm_ipc_sk(sk)->default_pil;
int ret;
lock_sock(sk);
ret = msm_ipc_router_close_port(port_ptr);
- msm_ipc_router_unload_modem(pil);
+ msm_ipc_unload_default_node(pil);
release_sock(sk);
sock_put(sk);
sock->sk = NULL;
diff --git a/arch/arm/mach-msm/pil-modem.c b/arch/arm/mach-msm/pil-modem.c
index 998e606..8344496 100644
--- a/arch/arm/mach-msm/pil-modem.c
+++ b/arch/arm/mach-msm/pil-modem.c
@@ -251,7 +251,7 @@
if (!drv->base)
return -ENOMEM;
- drv->xo = clk_get(&pdev->dev, "xo");
+ drv->xo = devm_clk_get(&pdev->dev, "xo");
if (IS_ERR(drv->xo))
return PTR_ERR(drv->xo);
@@ -274,7 +274,6 @@
}
drv->pil = msm_pil_register(desc);
if (IS_ERR(drv->pil)) {
- clk_put(drv->xo);
return PTR_ERR(drv->pil);
}
return 0;
@@ -284,7 +283,6 @@
{
struct modem_data *drv = platform_get_drvdata(pdev);
msm_pil_unregister(drv->pil);
- clk_put(drv->xo);
return 0;
}
diff --git a/arch/arm/mach-msm/pil-q6v3.c b/arch/arm/mach-msm/pil-q6v3.c
index 235d881..28b9dee 100644
--- a/arch/arm/mach-msm/pil-q6v3.c
+++ b/arch/arm/mach-msm/pil-q6v3.c
@@ -221,7 +221,7 @@
if (!drv)
return -ENOMEM;
- drv->pll = clk_get(&pdev->dev, "pll4");
+ drv->pll = devm_clk_get(&pdev->dev, "pll4");
if (IS_ERR(drv->pll))
return PTR_ERR(drv->pll);
diff --git a/arch/arm/mach-msm/pil-riva.c b/arch/arm/mach-msm/pil-riva.c
index ecbbcb9..8a16b43 100644
--- a/arch/arm/mach-msm/pil-riva.c
+++ b/arch/arm/mach-msm/pil-riva.c
@@ -318,14 +318,14 @@
if (ret) {
dev_err(&pdev->dev,
"failed to set pll supply voltage\n");
- goto err;
+ return ret;
}
ret = regulator_set_optimum_mode(drv->pll_supply, 100000);
if (ret < 0) {
dev_err(&pdev->dev,
"failed to set pll supply optimum mode\n");
- goto err;
+ return ret;
}
}
@@ -342,29 +342,20 @@
dev_info(&pdev->dev, "using non-secure boot\n");
}
- drv->xo = clk_get(&pdev->dev, "cxo");
- if (IS_ERR(drv->xo)) {
- ret = PTR_ERR(drv->xo);
- goto err;
- }
+ drv->xo = devm_clk_get(&pdev->dev, "cxo");
+ if (IS_ERR(drv->xo))
+ return PTR_ERR(drv->xo);
drv->pil = msm_pil_register(desc);
- if (IS_ERR(drv->pil)) {
- ret = PTR_ERR(drv->pil);
- goto err_register;
- }
+ if (IS_ERR(drv->pil))
+ return PTR_ERR(drv->pil);
return 0;
-err_register:
- clk_put(drv->xo);
-err:
- return ret;
}
static int __devexit pil_riva_remove(struct platform_device *pdev)
{
struct riva_data *drv = platform_get_drvdata(pdev);
msm_pil_unregister(drv->pil);
- clk_put(drv->xo);
return 0;
}
diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c
index 839f932..c1e4118 100644
--- a/arch/arm/mach-msm/smd.c
+++ b/arch/arm/mach-msm/smd.c
@@ -34,6 +34,7 @@
#include <linux/kfifo.h>
#include <linux/wakelock.h>
#include <linux/notifier.h>
+#include <linux/sort.h>
#include <mach/msm_smd.h>
#include <mach/msm_iomap.h>
#include <mach/system.h>
@@ -138,6 +139,7 @@
static irqreturn_t smsm_dsps_irq_handler(int irq, void *data);
static irqreturn_t smd_wcnss_irq_handler(int irq, void *data);
static irqreturn_t smsm_wcnss_irq_handler(int irq, void *data);
+static irqreturn_t smd_rpm_irq_handler(int irq, void *data);
static irqreturn_t smsm_irq_handler(int irq, void *data);
static struct interrupt_config private_intr_config[NUM_SMD_SUBSYSTEMS] = {
@@ -157,7 +159,21 @@
.smd.irq_handler = smd_wcnss_irq_handler,
.smsm.irq_handler = smsm_wcnss_irq_handler,
},
+ [SMD_RPM] = {
+ .smd.irq_handler = smd_rpm_irq_handler,
+ .smsm.irq_handler = NULL, /* does not support smsm */
+ },
};
+
+struct smem_area {
+ void *phys_addr;
+ unsigned size;
+ void __iomem *virt_addr;
+};
+static uint32_t num_smem_areas;
+static struct smem_area *smem_areas;
+static void *smem_range_check(void *base, unsigned offset);
+
struct interrupt_stat interrupt_stats[NUM_SMD_SUBSYSTEMS];
#define SMSM_STATE_ADDR(entry) (smsm_info.state + entry)
@@ -430,6 +446,18 @@
}
}
+static inline void notify_rpm_smd(void)
+{
+ static const struct interrupt_config_item *intr
+ = &private_intr_config[SMD_RPM].smd;
+
+ if (intr->out_base) {
+ ++interrupt_stats[SMD_RPM].smd_out_config_count;
+ smd_write_intr(intr->out_bit_pos,
+ intr->out_base + intr->out_offset);
+ }
+}
+
static inline void notify_modem_smsm(void)
{
static const struct interrupt_config_item *intr
@@ -608,9 +636,14 @@
struct smd_half_channel ch1;
};
+struct smd_shared_v2_word_access {
+ struct smd_half_channel_word_access ch0;
+ struct smd_half_channel_word_access ch1;
+};
+
struct smd_channel {
- volatile struct smd_half_channel *send;
- volatile struct smd_half_channel *recv;
+ volatile void *send; /* some variant of smd_half_channel */
+ volatile void *recv; /* some variant of smd_half_channel */
unsigned char *send_data;
unsigned char *recv_data;
unsigned fifo_size;
@@ -641,6 +674,12 @@
int pending_pkt_sz;
char is_pkt_ch;
+
+ /*
+ * private internal functions to access *send and *recv.
+ * never to be exported outside of smd
+ */
+ struct smd_half_channel_access *half_ch;
};
struct edge_to_pid {
@@ -668,6 +707,10 @@
[SMD_QDSP_Q6FW] = {SMD_Q6, SMD_MODEM_Q6_FW},
[SMD_DSPS_Q6FW] = {SMD_DSPS, SMD_MODEM_Q6_FW},
[SMD_WCNSS_Q6FW] = {SMD_WCNSS, SMD_MODEM_Q6_FW},
+ [SMD_APPS_RPM] = {SMD_APPS, SMD_RPM},
+ [SMD_MODEM_RPM] = {SMD_MODEM, SMD_RPM},
+ [SMD_QDSP_RPM] = {SMD_Q6, SMD_RPM},
+ [SMD_WCNSS_RPM] = {SMD_WCNSS, SMD_RPM},
};
struct restart_notifier_block {
@@ -686,6 +729,7 @@
static LIST_HEAD(smd_ch_list_dsp);
static LIST_HEAD(smd_ch_list_dsps);
static LIST_HEAD(smd_ch_list_wcnss);
+static LIST_HEAD(smd_ch_list_rpm);
static unsigned char smd_ch_allocated[64];
static struct work_struct probe_work;
@@ -721,8 +765,8 @@
/* channel should be allocated only if APPS
processor is involved */
type = SMD_CHANNEL_TYPE(shared[n].type);
- if ((type != SMD_APPS_MODEM) && (type != SMD_APPS_QDSP) &&
- (type != SMD_APPS_DSPS) && (type != SMD_APPS_WCNSS))
+ if (type >= ARRAY_SIZE(edge_to_pids) ||
+ edge_to_pids[type].local_pid != SMD_APPS)
continue;
if (!shared[n].ref_count)
continue;
@@ -941,14 +985,15 @@
/* how many bytes are available for reading */
static int smd_stream_read_avail(struct smd_channel *ch)
{
- return (ch->recv->head - ch->recv->tail) & ch->fifo_mask;
+ return (ch->half_ch->get_head(ch->recv) -
+ ch->half_ch->get_tail(ch->recv)) & ch->fifo_mask;
}
/* how many bytes we are free to write */
static int smd_stream_write_avail(struct smd_channel *ch)
{
- return ch->fifo_mask -
- ((ch->send->head - ch->send->tail) & ch->fifo_mask);
+ return ch->fifo_mask - ((ch->half_ch->get_head(ch->send) -
+ ch->half_ch->get_tail(ch->send)) & ch->fifo_mask);
}
static int smd_packet_read_avail(struct smd_channel *ch)
@@ -971,16 +1016,16 @@
static int ch_is_open(struct smd_channel *ch)
{
- return (ch->recv->state == SMD_SS_OPENED ||
- ch->recv->state == SMD_SS_FLUSHING)
- && (ch->send->state == SMD_SS_OPENED);
+ return (ch->half_ch->get_state(ch->recv) == SMD_SS_OPENED ||
+ ch->half_ch->get_state(ch->recv) == SMD_SS_FLUSHING)
+ && (ch->half_ch->get_state(ch->send) == SMD_SS_OPENED);
}
/* provide a pointer and length to readable data in the fifo */
static unsigned ch_read_buffer(struct smd_channel *ch, void **ptr)
{
- unsigned head = ch->recv->head;
- unsigned tail = ch->recv->tail;
+ unsigned head = ch->half_ch->get_head(ch->recv);
+ unsigned tail = ch->half_ch->get_tail(ch->recv);
*ptr = (void *) (ch->recv_data + tail);
if (tail <= head)
@@ -991,16 +1036,17 @@
static int read_intr_blocked(struct smd_channel *ch)
{
- return ch->recv->fBLOCKREADINTR;
+ return ch->half_ch->get_fBLOCKREADINTR(ch->recv);
}
/* advance the fifo read pointer after data from ch_read_buffer is consumed */
static void ch_read_done(struct smd_channel *ch, unsigned count)
{
BUG_ON(count > smd_stream_read_avail(ch));
- ch->recv->tail = (ch->recv->tail + count) & ch->fifo_mask;
+ ch->half_ch->set_tail(ch->recv,
+ (ch->half_ch->get_tail(ch->recv) + count) & ch->fifo_mask);
wmb();
- ch->send->fTAIL = 1;
+ ch->half_ch->set_fTAIL(ch->send, 1);
}
/* basic read interface to ch_read_{buffer,done} used
@@ -1072,8 +1118,8 @@
/* provide a pointer and length to next free space in the fifo */
static unsigned ch_write_buffer(struct smd_channel *ch, void **ptr)
{
- unsigned head = ch->send->head;
- unsigned tail = ch->send->tail;
+ unsigned head = ch->half_ch->get_head(ch->send);
+ unsigned tail = ch->half_ch->get_tail(ch->send);
*ptr = (void *) (ch->send_data + head);
if (head < tail) {
@@ -1092,24 +1138,25 @@
static void ch_write_done(struct smd_channel *ch, unsigned count)
{
BUG_ON(count > smd_stream_write_avail(ch));
- ch->send->head = (ch->send->head + count) & ch->fifo_mask;
+ ch->half_ch->set_head(ch->send,
+ (ch->half_ch->get_head(ch->send) + count) & ch->fifo_mask);
wmb();
- ch->send->fHEAD = 1;
+ ch->half_ch->set_fHEAD(ch->send, 1);
}
static void ch_set_state(struct smd_channel *ch, unsigned n)
{
if (n == SMD_SS_OPENED) {
- ch->send->fDSR = 1;
- ch->send->fCTS = 1;
- ch->send->fCD = 1;
+ ch->half_ch->set_fDSR(ch->send, 1);
+ ch->half_ch->set_fCTS(ch->send, 1);
+ ch->half_ch->set_fCD(ch->send, 1);
} else {
- ch->send->fDSR = 0;
- ch->send->fCTS = 0;
- ch->send->fCD = 0;
+ ch->half_ch->set_fDSR(ch->send, 0);
+ ch->half_ch->set_fCTS(ch->send, 0);
+ ch->half_ch->set_fCD(ch->send, 0);
}
- ch->send->state = n;
- ch->send->fSTATE = 1;
+ ch->half_ch->set_state(ch->send, n);
+ ch->half_ch->set_fSTATE(ch->send, 1);
ch->notify_other_cpu();
}
@@ -1131,16 +1178,16 @@
switch (next) {
case SMD_SS_OPENING:
- if (ch->send->state == SMD_SS_CLOSING ||
- ch->send->state == SMD_SS_CLOSED) {
- ch->recv->tail = 0;
- ch->send->head = 0;
- ch->send->fBLOCKREADINTR = 0;
+ if (ch->half_ch->get_state(ch->send) == SMD_SS_CLOSING ||
+ ch->half_ch->get_state(ch->send) == SMD_SS_CLOSED) {
+ ch->half_ch->set_tail(ch->recv, 0);
+ ch->half_ch->set_head(ch->send, 0);
+ ch->half_ch->set_fBLOCKREADINTR(ch->send, 0);
ch_set_state(ch, SMD_SS_OPENING);
}
break;
case SMD_SS_OPENED:
- if (ch->send->state == SMD_SS_OPENING) {
+ if (ch->half_ch->get_state(ch->send) == SMD_SS_OPENING) {
ch_set_state(ch, SMD_SS_OPENED);
ch->notify(ch->priv, SMD_EVENT_OPEN);
}
@@ -1150,7 +1197,7 @@
/* we should force them to close? */
break;
case SMD_SS_CLOSED:
- if (ch->send->state == SMD_SS_OPENED) {
+ if (ch->half_ch->get_state(ch->send) == SMD_SS_OPENED) {
ch_set_state(ch, SMD_SS_CLOSING);
ch->current_packet = 0;
ch->pending_pkt_sz = 0;
@@ -1158,7 +1205,7 @@
}
break;
case SMD_SS_CLOSING:
- if (ch->send->state == SMD_SS_CLOSED) {
+ if (ch->half_ch->get_state(ch->send) == SMD_SS_CLOSED) {
list_move(&ch->ch_list,
&smd_ch_to_close_list);
queue_work(channel_close_wq,
@@ -1177,9 +1224,9 @@
spin_lock_irqsave(&smd_lock, flags);
list_for_each_entry_safe(ch, index, &smd_ch_closing_list, ch_list) {
- if (ch->recv->fSTATE)
- ch->recv->fSTATE = 0;
- tmp = ch->recv->state;
+ if (ch->half_ch->get_fSTATE(ch->recv))
+ ch->half_ch->set_fSTATE(ch->recv, 0);
+ tmp = ch->half_ch->get_state(ch->recv);
if (tmp != ch->last_state)
smd_state_change(ch, ch->last_state, tmp);
}
@@ -1199,20 +1246,20 @@
state_change = 0;
ch_flags = 0;
if (ch_is_open(ch)) {
- if (ch->recv->fHEAD) {
- ch->recv->fHEAD = 0;
+ if (ch->half_ch->get_fHEAD(ch->recv)) {
+ ch->half_ch->set_fHEAD(ch->recv, 0);
ch_flags |= 1;
}
- if (ch->recv->fTAIL) {
- ch->recv->fTAIL = 0;
+ if (ch->half_ch->get_fTAIL(ch->recv)) {
+ ch->half_ch->set_fTAIL(ch->recv, 0);
ch_flags |= 2;
}
- if (ch->recv->fSTATE) {
- ch->recv->fSTATE = 0;
+ if (ch->half_ch->get_fSTATE(ch->recv)) {
+ ch->half_ch->set_fSTATE(ch->recv, 0);
ch_flags |= 4;
}
}
- tmp = ch->recv->state;
+ tmp = ch->half_ch->get_state(ch->recv);
if (tmp != ch->last_state) {
SMx_POWER_INFO("SMD ch%d '%s' State change %d->%d\n",
ch->n, ch->name, ch->last_state, tmp);
@@ -1273,12 +1320,22 @@
return IRQ_HANDLED;
}
+static irqreturn_t smd_rpm_irq_handler(int irq, void *data)
+{
+ SMx_POWER_INFO("SMD Int RPM->Apps\n");
+ ++interrupt_stats[SMD_RPM].smd_in_count;
+ handle_smd_irq(&smd_ch_list_rpm, notify_rpm_smd);
+ handle_smd_irq_closing_list();
+ return IRQ_HANDLED;
+}
+
static void smd_fake_irq_handler(unsigned long arg)
{
handle_smd_irq(&smd_ch_list_modem, notify_modem_smd);
handle_smd_irq(&smd_ch_list_dsp, notify_dsp_smd);
handle_smd_irq(&smd_ch_list_dsps, notify_dsps_smd);
handle_smd_irq(&smd_ch_list_wcnss, notify_wcnss_smd);
+ handle_smd_irq(&smd_ch_list_rpm, notify_rpm_smd);
handle_smd_irq_closing_list();
}
@@ -1287,9 +1344,11 @@
static inline int smd_need_int(struct smd_channel *ch)
{
if (ch_is_open(ch)) {
- if (ch->recv->fHEAD || ch->recv->fTAIL || ch->recv->fSTATE)
+ if (ch->half_ch->get_fHEAD(ch->recv) ||
+ ch->half_ch->get_fTAIL(ch->recv) ||
+ ch->half_ch->get_fSTATE(ch->recv))
return 1;
- if (ch->recv->state != ch->last_state)
+ if (ch->half_ch->get_state(ch->recv) != ch->last_state)
return 1;
}
return 0;
@@ -1504,15 +1563,32 @@
#if (defined(CONFIG_MSM_SMD_PKG4) || defined(CONFIG_MSM_SMD_PKG3))
static int smd_alloc_v2(struct smd_channel *ch)
{
- struct smd_shared_v2 *shared2;
void *buffer;
unsigned buffer_sz;
- shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
- if (!shared2) {
- SMD_INFO("smem_alloc failed ch=%d\n", ch->n);
- return -EINVAL;
+ if (is_word_access_ch(ch->type)) {
+ struct smd_shared_v2_word_access *shared2;
+ shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n,
+ sizeof(*shared2));
+ if (!shared2) {
+ SMD_INFO("smem_alloc failed ch=%d\n", ch->n);
+ return -EINVAL;
+ }
+ ch->send = &shared2->ch0;
+ ch->recv = &shared2->ch1;
+ } else {
+ struct smd_shared_v2 *shared2;
+ shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n,
+ sizeof(*shared2));
+ if (!shared2) {
+ SMD_INFO("smem_alloc failed ch=%d\n", ch->n);
+ return -EINVAL;
+ }
+ ch->send = &shared2->ch0;
+ ch->recv = &shared2->ch1;
}
+ ch->half_ch = get_half_ch_funcs(ch->type);
+
buffer = smem_get_entry(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
if (!buffer) {
SMD_INFO("smem_get_entry failed\n");
@@ -1525,11 +1601,10 @@
return -EINVAL;
}
buffer_sz /= 2;
- ch->send = &shared2->ch0;
- ch->recv = &shared2->ch1;
ch->send_data = buffer;
ch->recv_data = buffer + buffer_sz;
ch->fifo_size = buffer_sz;
+
return 0;
}
@@ -1557,6 +1632,7 @@
ch->send_data = shared1->data0;
ch->recv_data = shared1->data1;
ch->fifo_size = SMD_BUF_SIZE;
+ ch->half_ch = get_half_ch_funcs(ch->type);
return 0;
}
@@ -1572,6 +1648,7 @@
return -1;
}
ch->n = alloc_elm->cid;
+ ch->type = SMD_CHANNEL_TYPE(alloc_elm->type);
if (smd_alloc_v2(ch) && smd_alloc_v1(ch)) {
kfree(ch);
@@ -1579,16 +1656,18 @@
}
ch->fifo_mask = ch->fifo_size - 1;
- ch->type = SMD_CHANNEL_TYPE(alloc_elm->type);
+ /* probe_worker guarentees ch->type will be a valid type */
if (ch->type == SMD_APPS_MODEM)
ch->notify_other_cpu = notify_modem_smd;
else if (ch->type == SMD_APPS_QDSP)
ch->notify_other_cpu = notify_dsp_smd;
else if (ch->type == SMD_APPS_DSPS)
ch->notify_other_cpu = notify_dsps_smd;
- else
+ else if (ch->type == SMD_APPS_WCNSS)
ch->notify_other_cpu = notify_wcnss_smd;
+ else if (ch->type == SMD_APPS_RPM)
+ ch->notify_other_cpu = notify_rpm_smd;
if (smd_is_packet(alloc_elm)) {
ch->read = smd_packet_read;
@@ -1783,10 +1862,10 @@
if (edge == SMD_LOOPBACK_TYPE) {
ch->last_state = SMD_SS_OPENED;
- ch->send->state = SMD_SS_OPENED;
- ch->send->fDSR = 1;
- ch->send->fCTS = 1;
- ch->send->fCD = 1;
+ ch->half_ch->set_state(ch->send, SMD_SS_OPENED);
+ ch->half_ch->set_fDSR(ch->send, 1);
+ ch->half_ch->set_fCTS(ch->send, 1);
+ ch->half_ch->set_fCD(ch->send, 1);
}
*_ch = ch;
@@ -1802,6 +1881,8 @@
list_add(&ch->ch_list, &smd_ch_list_dsps);
else if (SMD_CHANNEL_TYPE(ch->type) == SMD_APPS_WCNSS)
list_add(&ch->ch_list, &smd_ch_list_wcnss);
+ else if (SMD_CHANNEL_TYPE(ch->type) == SMD_APPS_RPM)
+ list_add(&ch->ch_list, &smd_ch_list_rpm);
else
list_add(&ch->ch_list, &smd_ch_list_loopback);
@@ -1837,14 +1918,14 @@
spin_lock_irqsave(&smd_lock, flags);
list_del(&ch->ch_list);
if (ch->n == SMD_LOOPBACK_CID) {
- ch->send->fDSR = 0;
- ch->send->fCTS = 0;
- ch->send->fCD = 0;
- ch->send->state = SMD_SS_CLOSED;
+ ch->half_ch->set_fDSR(ch->send, 0);
+ ch->half_ch->set_fCTS(ch->send, 0);
+ ch->half_ch->set_fCD(ch->send, 0);
+ ch->half_ch->set_state(ch->send, SMD_SS_CLOSED);
} else
ch_set_state(ch, SMD_SS_CLOSED);
- if (ch->recv->state == SMD_SS_OPENED) {
+ if (ch->half_ch->get_state(ch->recv) == SMD_SS_OPENED) {
list_add(&ch->ch_list, &smd_ch_closing_list);
spin_unlock_irqrestore(&smd_lock, flags);
} else {
@@ -2031,14 +2112,14 @@
void smd_enable_read_intr(smd_channel_t *ch)
{
if (ch)
- ch->send->fBLOCKREADINTR = 0;
+ ch->half_ch->set_fBLOCKREADINTR(ch->send, 0);
}
EXPORT_SYMBOL(smd_enable_read_intr);
void smd_disable_read_intr(smd_channel_t *ch)
{
if (ch)
- ch->send->fBLOCKREADINTR = 1;
+ ch->half_ch->set_fBLOCKREADINTR(ch->send, 1);
}
EXPORT_SYMBOL(smd_disable_read_intr);
@@ -2070,12 +2151,12 @@
return -ENODEV;
}
- return (ch->recv->fDSR ? TIOCM_DSR : 0) |
- (ch->recv->fCTS ? TIOCM_CTS : 0) |
- (ch->recv->fCD ? TIOCM_CD : 0) |
- (ch->recv->fRI ? TIOCM_RI : 0) |
- (ch->send->fCTS ? TIOCM_RTS : 0) |
- (ch->send->fDSR ? TIOCM_DTR : 0);
+ return (ch->half_ch->get_fDSR(ch->recv) ? TIOCM_DSR : 0) |
+ (ch->half_ch->get_fCTS(ch->recv) ? TIOCM_CTS : 0) |
+ (ch->half_ch->get_fCD(ch->recv) ? TIOCM_CD : 0) |
+ (ch->half_ch->get_fRI(ch->recv) ? TIOCM_RI : 0) |
+ (ch->half_ch->get_fCTS(ch->send) ? TIOCM_RTS : 0) |
+ (ch->half_ch->get_fDSR(ch->send) ? TIOCM_DTR : 0);
}
EXPORT_SYMBOL(smd_tiocmget);
@@ -2089,18 +2170,18 @@
}
if (set & TIOCM_DTR)
- ch->send->fDSR = 1;
+ ch->half_ch->set_fDSR(ch->send, 1);
if (set & TIOCM_RTS)
- ch->send->fCTS = 1;
+ ch->half_ch->set_fCTS(ch->send, 1);
if (clear & TIOCM_DTR)
- ch->send->fDSR = 0;
+ ch->half_ch->set_fDSR(ch->send, 0);
if (clear & TIOCM_RTS)
- ch->send->fCTS = 0;
+ ch->half_ch->set_fCTS(ch->send, 0);
- ch->send->fSTATE = 1;
+ ch->half_ch->set_fSTATE(ch->send, 1);
barrier();
ch->notify_other_cpu();
@@ -2128,6 +2209,37 @@
/* -------------------------------------------------------------------------- */
+/*
+ * Shared Memory Range Check
+ *
+ * Takes a physical address and an offset and checks if the resulting physical
+ * address would fit into one of the aux smem regions. If so, returns the
+ * corresponding virtual address. Otherwise returns NULL. Expects the array
+ * of smem regions to be in ascending physical address order.
+ *
+ * @base: physical base address to check
+ * @offset: offset from the base to get the final address
+ */
+static void *smem_range_check(void *base, unsigned offset)
+{
+ int i;
+ void *phys_addr;
+ unsigned size;
+
+ for (i = 0; i < num_smem_areas; ++i) {
+ phys_addr = smem_areas[i].phys_addr;
+ size = smem_areas[i].size;
+ if (base < phys_addr)
+ return NULL;
+ if (base > phys_addr + size)
+ continue;
+ if (base >= phys_addr && base + offset < phys_addr + size)
+ return smem_areas[i].virt_addr + offset;
+ }
+
+ return NULL;
+}
+
/* smem_alloc returns the pointer to smem item if it is already allocated.
* Otherwise, it returns NULL.
*/
@@ -2203,7 +2315,12 @@
if (toc[id].allocated) {
*size = toc[id].size;
barrier();
- ret = (void *) (MSM_SHARED_RAM_BASE + toc[id].offset);
+ if (!(toc[id].reserved & BASE_ADDR_MASK))
+ ret = (void *) (MSM_SHARED_RAM_BASE + toc[id].offset);
+ else
+ ret = smem_range_check(
+ (void *)(toc[id].reserved & BASE_ADDR_MASK),
+ toc[id].offset);
} else {
*size = 0;
}
@@ -3114,6 +3231,14 @@
return ret;
}
+int sort_cmp_func(const void *a, const void *b)
+{
+ struct smem_area *left = (struct smem_area *)(a);
+ struct smem_area *right = (struct smem_area *)(b);
+
+ return left->phys_addr - right->phys_addr;
+}
+
int smd_core_platform_init(struct platform_device *pdev)
{
int i;
@@ -3123,6 +3248,8 @@
struct smd_subsystem_config *smd_ss_config_list;
struct smd_subsystem_config *cfg;
int err_ret = 0;
+ struct smd_smem_regions *smd_smem_areas;
+ int smem_idx = 0;
smd_platform_data = pdev->dev.platform_data;
num_ss = smd_platform_data->num_ss_configs;
@@ -3132,6 +3259,40 @@
disable_smsm_reset_handshake = smd_platform_data->
smd_ssr_config->disable_smsm_reset_handshake;
+ smd_smem_areas = smd_platform_data->smd_smem_areas;
+ if (smd_smem_areas) {
+ num_smem_areas = smd_platform_data->num_smem_areas;
+ smem_areas = kmalloc(sizeof(struct smem_area) * num_smem_areas,
+ GFP_KERNEL);
+ if (!smem_areas) {
+ pr_err("%s: smem_areas kmalloc failed\n", __func__);
+ err_ret = -ENOMEM;
+ goto smem_areas_alloc_fail;
+ }
+
+ for (smem_idx = 0; smem_idx < num_smem_areas; ++smem_idx) {
+ smem_areas[smem_idx].phys_addr =
+ smd_smem_areas[smem_idx].phys_addr;
+ smem_areas[smem_idx].size =
+ smd_smem_areas[smem_idx].size;
+ smem_areas[smem_idx].virt_addr = ioremap_nocache(
+ (unsigned long)(smem_areas[smem_idx].phys_addr),
+ smem_areas[smem_idx].size);
+ if (!smem_areas[smem_idx].virt_addr) {
+ pr_err("%s: ioremap_nocache() of addr:%p"
+ " size: %x\n", __func__,
+ smem_areas[smem_idx].phys_addr,
+ smem_areas[smem_idx].size);
+ err_ret = -ENOMEM;
+ ++smem_idx;
+ goto smem_failed;
+ }
+ }
+ sort(smem_areas, num_smem_areas,
+ sizeof(struct smem_area),
+ sort_cmp_func, NULL);
+ }
+
for (i = 0; i < num_ss; i++) {
cfg = &smd_ss_config_list[i];
@@ -3145,46 +3306,53 @@
err_ret = ret;
pr_err("smd: register irq failed on %s\n",
cfg->smd_int.irq_name);
- break;
+ goto intr_failed;
}
- ret = intr_init(
- &private_intr_config[cfg->irq_config_id].smsm,
- &cfg->smsm_int,
- pdev
- );
+ /* only init smsm structs if this edge supports smsm */
+ if (cfg->smsm_int.irq_id)
+ ret = intr_init(
+ &private_intr_config[cfg->irq_config_id].smsm,
+ &cfg->smsm_int,
+ pdev
+ );
if (ret < 0) {
err_ret = ret;
pr_err("smd: register irq failed on %s\n",
cfg->smsm_int.irq_name);
- break;
+ goto intr_failed;
}
- strncpy(edge_to_pids[cfg->edge].subsys_name,
+ if (cfg->subsys_name)
+ strlcpy(edge_to_pids[cfg->edge].subsys_name,
cfg->subsys_name, SMD_MAX_CH_NAME_LEN);
}
- if (err_ret < 0) {
- pr_err("smd: deregistering IRQs\n");
- for (i = 0; i < num_ss; ++i) {
- cfg = &smd_ss_config_list[i];
-
- if (cfg->smd_int.irq_id >= 0)
- free_irq(cfg->smd_int.irq_id,
- (void *)cfg->smd_int.dev_id
- );
- if (cfg->smsm_int.irq_id >= 0)
- free_irq(cfg->smsm_int.irq_id,
- (void *)cfg->smsm_int.dev_id
- );
- }
- return err_ret;
- }
SMD_INFO("smd_core_platform_init() done\n");
return 0;
+intr_failed:
+ pr_err("smd: deregistering IRQs\n");
+ for (i = 0; i < num_ss; ++i) {
+ cfg = &smd_ss_config_list[i];
+
+ if (cfg->smd_int.irq_id >= 0)
+ free_irq(cfg->smd_int.irq_id,
+ (void *)cfg->smd_int.dev_id
+ );
+ if (cfg->smsm_int.irq_id >= 0)
+ free_irq(cfg->smsm_int.irq_id,
+ (void *)cfg->smsm_int.dev_id
+ );
+ }
+smem_failed:
+ for (smem_idx = smem_idx - 1; smem_idx >= 0; --smem_idx)
+ iounmap(smem_areas[smem_idx].virt_addr);
+ kfree(smem_areas);
+smem_areas_alloc_fail:
+ return err_ret;
}
static int __devinit msm_smd_probe(struct platform_device *pdev)
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c
index 764102d..5dce1ac 100644
--- a/arch/arm/mach-msm/smd_debug.c
+++ b/arch/arm/mach-msm/smd_debug.c
@@ -248,8 +248,9 @@
}
static int dump_ch(char *buf, int max, int n,
- struct smd_half_channel *s,
- struct smd_half_channel *r,
+ void *half_ch_s,
+ void *half_ch_r,
+ struct smd_half_channel_access *half_ch_funcs,
unsigned size)
{
return scnprintf(
@@ -257,24 +258,28 @@
"ch%02d:"
" %8s(%04d/%04d) %c%c%c%c%c%c%c%c <->"
" %8s(%04d/%04d) %c%c%c%c%c%c%c%c : %5x\n", n,
- chstate(s->state), s->tail, s->head,
- s->fDSR ? 'D' : 'd',
- s->fCTS ? 'C' : 'c',
- s->fCD ? 'C' : 'c',
- s->fRI ? 'I' : 'i',
- s->fHEAD ? 'W' : 'w',
- s->fTAIL ? 'R' : 'r',
- s->fSTATE ? 'S' : 's',
- s->fBLOCKREADINTR ? 'B' : 'b',
- chstate(r->state), r->tail, r->head,
- r->fDSR ? 'D' : 'd',
- r->fCTS ? 'R' : 'r',
- r->fCD ? 'C' : 'c',
- r->fRI ? 'I' : 'i',
- r->fHEAD ? 'W' : 'w',
- r->fTAIL ? 'R' : 'r',
- r->fSTATE ? 'S' : 's',
- r->fBLOCKREADINTR ? 'B' : 'b',
+ chstate(half_ch_funcs->get_state(half_ch_s)),
+ half_ch_funcs->get_tail(half_ch_s),
+ half_ch_funcs->get_head(half_ch_s),
+ half_ch_funcs->get_fDSR(half_ch_s) ? 'D' : 'd',
+ half_ch_funcs->get_fCTS(half_ch_s) ? 'C' : 'c',
+ half_ch_funcs->get_fCD(half_ch_s) ? 'C' : 'c',
+ half_ch_funcs->get_fRI(half_ch_s) ? 'I' : 'i',
+ half_ch_funcs->get_fHEAD(half_ch_s) ? 'W' : 'w',
+ half_ch_funcs->get_fTAIL(half_ch_s) ? 'R' : 'r',
+ half_ch_funcs->get_fSTATE(half_ch_s) ? 'S' : 's',
+ half_ch_funcs->get_fBLOCKREADINTR(half_ch_s) ? 'B' : 'b',
+ chstate(half_ch_funcs->get_state(half_ch_r)),
+ half_ch_funcs->get_tail(half_ch_r),
+ half_ch_funcs->get_head(half_ch_r),
+ half_ch_funcs->get_fDSR(half_ch_r) ? 'D' : 'd',
+ half_ch_funcs->get_fCTS(half_ch_r) ? 'C' : 'c',
+ half_ch_funcs->get_fCD(half_ch_r) ? 'C' : 'c',
+ half_ch_funcs->get_fRI(half_ch_r) ? 'I' : 'i',
+ half_ch_funcs->get_fHEAD(half_ch_r) ? 'W' : 'w',
+ half_ch_funcs->get_fTAIL(half_ch_r) ? 'R' : 'r',
+ half_ch_funcs->get_fSTATE(half_ch_r) ? 'S' : 's',
+ half_ch_funcs->get_fBLOCKREADINTR(half_ch_r) ? 'B' : 'b',
size
);
}
@@ -542,19 +547,33 @@
{
void *shared;
int n, i = 0;
+ struct smd_alloc_elm *ch_tbl;
+ unsigned ch_type;
+ unsigned shared_size;
+
+ ch_tbl = smem_find(ID_CH_ALLOC_TBL, sizeof(*ch_tbl) * 64);
+ if (!ch_tbl)
+ goto fail;
for (n = 0; n < SMD_CHANNELS; n++) {
+ ch_type = SMD_CHANNEL_TYPE(ch_tbl[n].type);
+ if (is_word_access_ch(ch_type))
+ shared_size =
+ sizeof(struct smd_half_channel_word_access);
+ else
+ shared_size = sizeof(struct smd_half_channel);
shared = smem_find(ID_SMD_CHANNELS + n,
- 2 * (sizeof(struct smd_half_channel) +
- SMD_BUF_SIZE));
+ 2 * shared_size + SMD_BUF_SIZE);
if (shared == 0)
continue;
i += dump_ch(buf + i, max - i, n, shared,
- (shared + sizeof(struct smd_half_channel) +
- SMD_BUF_SIZE), SMD_BUF_SIZE);
+ (shared + shared_size +
+ SMD_BUF_SIZE), get_half_ch_funcs(ch_type),
+ SMD_BUF_SIZE);
}
+fail:
return i;
}
#else
@@ -563,10 +582,23 @@
void *shared, *buffer;
unsigned buffer_sz;
int n, i = 0;
+ struct smd_alloc_elm *ch_tbl;
+ unsigned ch_type;
+ unsigned shared_size;
+
+ ch_tbl = smem_find(ID_CH_ALLOC_TBL, sizeof(*ch_tbl) * 64);
+ if (!ch_tbl)
+ goto fail;
for (n = 0; n < SMD_CHANNELS; n++) {
- shared = smem_find(ID_SMD_CHANNELS + n,
- 2 * sizeof(struct smd_half_channel));
+ ch_type = SMD_CHANNEL_TYPE(ch_tbl[n].type);
+ if (is_word_access_ch(ch_type))
+ shared_size =
+ sizeof(struct smd_half_channel_word_access);
+ else
+ shared_size = sizeof(struct smd_half_channel);
+
+ shared = smem_find(ID_SMD_CHANNELS + n, 2 * shared_size);
if (shared == 0)
continue;
@@ -577,10 +609,12 @@
continue;
i += dump_ch(buf + i, max - i, n, shared,
- (shared + sizeof(struct smd_half_channel)),
+ (shared + shared_size),
+ get_half_ch_funcs(ch_type),
buffer_sz / 2);
}
+fail:
return i;
}
#endif
diff --git a/arch/arm/mach-msm/smd_private.c b/arch/arm/mach-msm/smd_private.c
new file mode 100644
index 0000000..5a78b6f
--- /dev/null
+++ b/arch/arm/mach-msm/smd_private.c
@@ -0,0 +1,303 @@
+/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "smd_private.h"
+
+void set_state(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel *)(half_channel))->state = data;
+}
+
+unsigned get_state(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->state;
+}
+
+void set_fDSR(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fDSR = data;
+}
+
+unsigned get_fDSR(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fDSR;
+}
+
+void set_fCTS(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fCTS = data;
+}
+
+unsigned get_fCTS(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fCTS;
+}
+
+void set_fCD(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fCD = data;
+}
+
+unsigned get_fCD(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fCD;
+}
+
+void set_fRI(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fRI = data;
+}
+
+unsigned get_fRI(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fRI;
+}
+
+void set_fHEAD(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fHEAD = data;
+}
+
+unsigned get_fHEAD(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fHEAD;
+}
+
+void set_fTAIL(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fTAIL = data;
+}
+
+unsigned get_fTAIL(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fTAIL;
+}
+
+void set_fSTATE(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fSTATE = data;
+}
+
+unsigned get_fSTATE(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fSTATE;
+}
+
+void set_fBLOCKREADINTR(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel *)(half_channel))->fBLOCKREADINTR = data;
+}
+
+unsigned get_fBLOCKREADINTR(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->fBLOCKREADINTR;
+}
+
+void set_tail(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel *)(half_channel))->tail = data;
+}
+
+unsigned get_tail(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->tail;
+}
+
+void set_head(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel *)(half_channel))->head = data;
+}
+
+unsigned get_head(volatile void *half_channel)
+{
+ return ((struct smd_half_channel *)(half_channel))->head;
+}
+
+void set_state_word_access(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->state = data;
+}
+
+unsigned get_state_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->state;
+}
+
+void set_fDSR_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fDSR = data;
+}
+
+unsigned get_fDSR_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fDSR;
+}
+
+void set_fCTS_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fCTS = data;
+}
+
+unsigned get_fCTS_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fCTS;
+}
+
+void set_fCD_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fCD = data;
+}
+
+unsigned get_fCD_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fCD;
+}
+
+void set_fRI_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fRI = data;
+}
+
+unsigned get_fRI_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fRI;
+}
+
+void set_fHEAD_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fHEAD = data;
+}
+
+unsigned get_fHEAD_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fHEAD;
+}
+
+void set_fTAIL_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fTAIL = data;
+}
+
+unsigned get_fTAIL_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fTAIL;
+}
+
+void set_fSTATE_word_access(volatile void *half_channel, unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->fSTATE = data;
+}
+
+unsigned get_fSTATE_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->fSTATE;
+}
+
+void set_fBLOCKREADINTR_word_access(volatile void *half_channel,
+ unsigned char data)
+{
+ ((struct smd_half_channel_word_access *)
+ (half_channel))->fBLOCKREADINTR = data;
+}
+
+unsigned get_fBLOCKREADINTR_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)
+ (half_channel))->fBLOCKREADINTR;
+}
+
+void set_tail_word_access(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->tail = data;
+}
+
+unsigned get_tail_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->tail;
+}
+
+void set_head_word_access(volatile void *half_channel, unsigned data)
+{
+ ((struct smd_half_channel_word_access *)(half_channel))->head = data;
+}
+
+unsigned get_head_word_access(volatile void *half_channel)
+{
+ return ((struct smd_half_channel_word_access *)(half_channel))->head;
+}
+
+int is_word_access_ch(unsigned ch_type)
+{
+ if (ch_type == SMD_APPS_RPM || ch_type == SMD_MODEM_RPM ||
+ ch_type == SMD_QDSP_RPM || ch_type == SMD_WCNSS_RPM)
+ return 1;
+ else
+ return 0;
+}
+
+struct smd_half_channel_access *get_half_ch_funcs(unsigned ch_type)
+{
+ static struct smd_half_channel_access byte_access = {
+ .set_state = set_state,
+ .get_state = get_state,
+ .set_fDSR = set_fDSR,
+ .get_fDSR = get_fDSR,
+ .set_fCTS = set_fCTS,
+ .get_fCTS = get_fCTS,
+ .set_fCD = set_fCD,
+ .get_fCD = get_fCD,
+ .set_fRI = set_fRI,
+ .get_fRI = get_fRI,
+ .set_fHEAD = set_fHEAD,
+ .get_fHEAD = get_fHEAD,
+ .set_fTAIL = set_fTAIL,
+ .get_fTAIL = get_fTAIL,
+ .set_fSTATE = set_fSTATE,
+ .get_fSTATE = get_fSTATE,
+ .set_fBLOCKREADINTR = set_fBLOCKREADINTR,
+ .get_fBLOCKREADINTR = get_fBLOCKREADINTR,
+ .set_tail = set_tail,
+ .get_tail = get_tail,
+ .set_head = set_head,
+ .get_head = get_head,
+ };
+ static struct smd_half_channel_access word_access = {
+ .set_state = set_state_word_access,
+ .get_state = get_state_word_access,
+ .set_fDSR = set_fDSR_word_access,
+ .get_fDSR = get_fDSR_word_access,
+ .set_fCTS = set_fCTS_word_access,
+ .get_fCTS = get_fCTS_word_access,
+ .set_fCD = set_fCD_word_access,
+ .get_fCD = get_fCD_word_access,
+ .set_fRI = set_fRI_word_access,
+ .get_fRI = get_fRI_word_access,
+ .set_fHEAD = set_fHEAD_word_access,
+ .get_fHEAD = get_fHEAD_word_access,
+ .set_fTAIL = set_fTAIL_word_access,
+ .get_fTAIL = get_fTAIL_word_access,
+ .set_fSTATE = set_fSTATE_word_access,
+ .get_fSTATE = get_fSTATE_word_access,
+ .set_fBLOCKREADINTR = set_fBLOCKREADINTR_word_access,
+ .get_fBLOCKREADINTR = get_fBLOCKREADINTR_word_access,
+ .set_tail = set_tail_word_access,
+ .get_tail = get_tail_word_access,
+ .set_head = set_head_word_access,
+ .get_head = get_head_word_access,
+ };
+
+ if (is_word_access_ch(ch_type))
+ return &word_access;
+ else
+ return &byte_access;
+}
+
diff --git a/arch/arm/mach-msm/smd_private.h b/arch/arm/mach-msm/smd_private.h
index e39c57b..6ffd5d2 100644
--- a/arch/arm/mach-msm/smd_private.h
+++ b/arch/arm/mach-msm/smd_private.h
@@ -44,8 +44,9 @@
unsigned allocated;
unsigned offset;
unsigned size;
- unsigned reserved;
+ unsigned reserved; /* bits 1:0 reserved, bits 31:2 aux smem base addr */
};
+#define BASE_ADDR_MASK 0xfffffffc
struct smem_proc_comm {
unsigned command;
@@ -134,6 +135,50 @@
unsigned head;
};
+struct smd_half_channel_word_access {
+ unsigned state;
+ unsigned fDSR;
+ unsigned fCTS;
+ unsigned fCD;
+ unsigned fRI;
+ unsigned fHEAD;
+ unsigned fTAIL;
+ unsigned fSTATE;
+ unsigned fBLOCKREADINTR;
+ unsigned tail;
+ unsigned head;
+};
+
+struct smd_half_channel_access {
+ void (*set_state)(volatile void *half_channel, unsigned data);
+ unsigned (*get_state)(volatile void *half_channel);
+ void (*set_fDSR)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fDSR)(volatile void *half_channel);
+ void (*set_fCTS)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fCTS)(volatile void *half_channel);
+ void (*set_fCD)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fCD)(volatile void *half_channel);
+ void (*set_fRI)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fRI)(volatile void *half_channel);
+ void (*set_fHEAD)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fHEAD)(volatile void *half_channel);
+ void (*set_fTAIL)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fTAIL)(volatile void *half_channel);
+ void (*set_fSTATE)(volatile void *half_channel, unsigned char data);
+ unsigned (*get_fSTATE)(volatile void *half_channel);
+ void (*set_fBLOCKREADINTR)(volatile void *half_channel,
+ unsigned char data);
+ unsigned (*get_fBLOCKREADINTR)(volatile void *half_channel);
+ void (*set_tail)(volatile void *half_channel, unsigned data);
+ unsigned (*get_tail)(volatile void *half_channel);
+ void (*set_head)(volatile void *half_channel, unsigned data);
+ unsigned (*get_head)(volatile void *half_channel);
+};
+
+int is_word_access_ch(unsigned ch_type);
+
+struct smd_half_channel_access *get_half_ch_funcs(unsigned ch_type);
+
struct smem_ram_ptn {
char name[16];
unsigned start;
diff --git a/drivers/char/diag/Makefile b/drivers/char/diag/Makefile
index c62b7fd..3181d29 100644
--- a/drivers/char/diag/Makefile
+++ b/drivers/char/diag/Makefile
@@ -1,4 +1,4 @@
obj-$(CONFIG_DIAG_CHAR) := diagchar.o
obj-$(CONFIG_DIAG_SDIO_PIPE) += diagfwd_sdio.o
obj-$(CONFIG_DIAG_HSIC_PIPE) += diagfwd_hsic.o
-diagchar-objs := diagchar_core.o diagchar_hdlc.o diagfwd.o diagmem.o diagfwd_cntl.o
+diagchar-objs := diagchar_core.o diagchar_hdlc.o diagfwd.o diagmem.o diagfwd_cntl.o diag_dci.o
diff --git a/drivers/char/diag/diag_dci.c b/drivers/char/diag/diag_dci.c
new file mode 100644
index 0000000..5cbf888
--- /dev/null
+++ b/drivers/char/diag/diag_dci.c
@@ -0,0 +1,335 @@
+/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/uaccess.h>
+#include <linux/diagchar.h>
+#include <linux/sched.h>
+#include <linux/err.h>
+#include <linux/workqueue.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <asm/current.h>
+#ifdef CONFIG_DIAG_OVER_USB
+#include <mach/usbdiag.h>
+#endif
+#include "diagchar_hdlc.h"
+#include "diagmem.h"
+#include "diagchar.h"
+#include "diagfwd.h"
+#include "diag_dci.h"
+
+unsigned int dci_max_reg = 100;
+unsigned int dci_max_clients = 10;
+
+static void diag_smd_dci_send_req(int proc_num)
+{
+ void *buf = NULL;
+ smd_channel_t *smd_ch = NULL;
+ int i, r, found = 1;
+ int cmd_code_len = 1;
+
+ if (driver->in_busy_dci)
+ return;
+
+ if (proc_num == MODEM_PROC) {
+ buf = driver->buf_in_dci;
+ smd_ch = driver->ch_dci;
+ }
+
+ if (!smd_ch || !buf)
+ return;
+
+ r = smd_read_avail(smd_ch);
+ if (r > IN_BUF_SIZE) {
+ if (r < MAX_IN_BUF_SIZE) {
+ pr_err("diag: SMD DCI sending pkt upto %d bytes", r);
+ buf = krealloc(buf, r, GFP_KERNEL);
+ } else {
+ pr_err("diag: DCI pkt > %d bytes", MAX_IN_BUF_SIZE);
+ return;
+ }
+ }
+ if (buf && r > 0) {
+ smd_read(smd_ch, buf, r);
+ pr_debug("diag: data received ---\n");
+ for (i = 0; i < r; i++)
+ pr_debug("\t %x \t", *(((unsigned char *)buf)+i));
+
+ if (*(uint8_t *)(buf+4) != DCI_CMD_CODE)
+ cmd_code_len = 4; /* delayed response */
+ driver->write_ptr_dci->length =
+ (int)(*(uint16_t *)(buf+2)) - (4+cmd_code_len);
+ pr_debug("diag: len = %d\n", (int)(*(uint16_t *)(buf+2))
+ - (4+cmd_code_len));
+ /* look up DCI client with tag */
+ for (i = 0; i < dci_max_reg; i++) {
+ if (driver->dci_tbl[i].tag ==
+ *(int *)(buf+(4+cmd_code_len))) {
+ found = 0;
+ break;
+ }
+ }
+ if (found)
+ pr_alert("diag: No matching PID for DCI data\n");
+ pr_debug("\n diag PID = %d", driver->dci_tbl[i].pid);
+ if (driver->dci_tbl[i].pid == 0)
+ pr_alert("diag: Receiving DCI process deleted\n");
+ *(int *)(buf+4+cmd_code_len) = driver->dci_tbl[i].uid;
+ /* update len after adding UID */
+ driver->write_ptr_dci->length =
+ driver->write_ptr_dci->length + 4;
+ pr_debug("diag: data receivd, wake process\n");
+ driver->in_busy_dci = 1;
+ diag_update_sleeping_process(driver->dci_tbl[i].pid,
+ DCI_DATA_TYPE);
+ /* delete immediate response entry */
+ if (driver->buf_in_dci[8+cmd_code_len] != 0x80)
+ driver->dci_tbl[i].pid = 0;
+ for (i = 0; i < dci_max_reg; i++)
+ if (driver->dci_tbl[i].pid != 0)
+ pr_debug("diag: PID = %d, UID = %d, tag = %d\n",
+ driver->dci_tbl[i].pid, driver->dci_tbl[i].uid,
+ driver->dci_tbl[i].tag);
+ pr_debug("diag: completed clearing table\n");
+ }
+}
+
+void diag_read_smd_dci_work_fn(struct work_struct *work)
+{
+ diag_smd_dci_send_req(MODEM_PROC);
+}
+
+static void diag_smd_dci_notify(void *ctxt, unsigned event)
+{
+ queue_work(driver->diag_wq, &(driver->diag_read_smd_dci_work));
+}
+
+static int diag_dci_probe(struct platform_device *pdev)
+{
+ int err = 0;
+
+ if (pdev->id == SMD_APPS_MODEM) {
+ err = smd_open("DIAG_2", &driver->ch_dci, driver,
+ diag_smd_dci_notify);
+ if (err)
+ pr_err("diag: cannot open DCI port, Id = %d, err ="
+ " %d\n", pdev->id, err);
+ }
+ return err;
+}
+
+
+int diag_send_dci_pkt(struct diag_master_table entry, unsigned char *buf,
+ int len, int index)
+{
+ int i;
+
+ /* remove UID from user space pkt before sending to peripheral */
+ buf = buf + 4;
+ len = len - 4;
+ mutex_lock(&driver->dci_mutex);
+ /* prepare DCI packet */
+ driver->apps_dci_buf[0] = CONTROL_CHAR; /* start */
+ driver->apps_dci_buf[1] = 1; /* version */
+ *(uint16_t *)(driver->apps_dci_buf + 2) = len + 4 + 1; /* length */
+ driver->apps_dci_buf[4] = DCI_CMD_CODE; /* DCI ID */
+ *(int *)(driver->apps_dci_buf + 5) = driver->dci_tbl[index].tag;
+ for (i = 0; i < len; i++)
+ driver->apps_dci_buf[i+9] = *(buf+i);
+ driver->apps_dci_buf[9+len] = CONTROL_CHAR; /* end */
+
+ if (entry.client_id == MODEM_PROC && driver->ch_dci) {
+ smd_write(driver->ch_dci, driver->apps_dci_buf, len + 10);
+ i = DIAG_DCI_NO_ERROR;
+ } else {
+ pr_alert("diag: check DCI channel\n");
+ i = DIAG_DCI_SEND_DATA_FAIL;
+ }
+ mutex_unlock(&driver->dci_mutex);
+ return i;
+}
+
+int diag_register_dci_transaction(int uid)
+{
+ int i, new_dci_client = 1, ret = -1;
+
+ for (i = 0; i < dci_max_reg; i++) {
+ if (driver->dci_tbl[i].pid == current->tgid) {
+ new_dci_client = 0;
+ break;
+ }
+ }
+ mutex_lock(&driver->dci_mutex);
+ if (new_dci_client)
+ driver->num_dci_client++;
+ if (driver->num_dci_client > MAX_DCI_CLIENT) {
+ pr_info("diag: Max DCI Client limit reached\n");
+ driver->num_dci_client--;
+ mutex_unlock(&driver->dci_mutex);
+ return ret;
+ }
+ /* Make an entry in kernel DCI table */
+ driver->dci_tag++;
+ for (i = 0; i < dci_max_reg; i++) {
+ if (driver->dci_tbl[i].pid == 0) {
+ driver->dci_tbl[i].pid = current->tgid;
+ driver->dci_tbl[i].uid = uid;
+ driver->dci_tbl[i].tag = driver->dci_tag;
+ ret = i;
+ break;
+ }
+ }
+ mutex_unlock(&driver->dci_mutex);
+ return ret;
+}
+
+int diag_process_dci_client(unsigned char *buf, int len)
+{
+ unsigned char *temp = buf;
+ uint16_t subsys_cmd_code;
+ int subsys_id, cmd_code, i, ret = -1, index = -1;
+ struct diag_master_table entry;
+
+ /* enter this UID into kernel table and return index */
+ index = diag_register_dci_transaction(*(int *)temp);
+ if (index < 0) {
+ pr_alert("diag: registering new DCI transaction failed\n");
+ return DIAG_DCI_NO_REG;
+ }
+ temp += 4;
+ /* Check for registered peripheral and fwd pkt to apropriate proc */
+ cmd_code = (int)(*(char *)buf);
+ temp++;
+ subsys_id = (int)(*(char *)temp);
+ temp++;
+ subsys_cmd_code = *(uint16_t *)temp;
+ temp += 2;
+ pr_debug("diag: %d %d %d", cmd_code, subsys_id, subsys_cmd_code);
+ for (i = 0; i < diag_max_reg; i++) {
+ entry = driver->table[i];
+ if (entry.process_id != NO_PROCESS) {
+ if (entry.cmd_code == cmd_code && entry.subsys_id ==
+ subsys_id && entry.cmd_code_lo <=
+ subsys_cmd_code &&
+ entry.cmd_code_hi >= subsys_cmd_code) {
+ ret = diag_send_dci_pkt(entry, buf, len, index);
+ } else if (entry.cmd_code == 255
+ && cmd_code == 75) {
+ if (entry.subsys_id ==
+ subsys_id &&
+ entry.cmd_code_lo <=
+ subsys_cmd_code &&
+ entry.cmd_code_hi >=
+ subsys_cmd_code) {
+ ret = diag_send_dci_pkt(entry, buf, len,
+ index);
+ }
+ } else if (entry.cmd_code == 255 &&
+ entry.subsys_id == 255) {
+ if (entry.cmd_code_lo <=
+ cmd_code &&
+ entry.
+ cmd_code_hi >= cmd_code) {
+ ret = diag_send_dci_pkt(entry, buf, len,
+ index);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+static int diag_dci_runtime_suspend(struct device *dev)
+{
+ dev_dbg(dev, "pm_runtime: suspending...\n");
+ return 0;
+}
+
+static int diag_dci_runtime_resume(struct device *dev)
+{
+ dev_dbg(dev, "pm_runtime: resuming...\n");
+ return 0;
+}
+
+static const struct dev_pm_ops diag_dci_dev_pm_ops = {
+ .runtime_suspend = diag_dci_runtime_suspend,
+ .runtime_resume = diag_dci_runtime_resume,
+};
+
+struct platform_driver msm_diag_dci_driver = {
+ .probe = diag_dci_probe,
+ .driver = {
+ .name = "DIAG_2",
+ .owner = THIS_MODULE,
+ .pm = &diag_dci_dev_pm_ops,
+ },
+};
+
+int diag_dci_init(void)
+{
+ int success = 0;
+
+ driver->dci_tag = 0;
+ driver->dci_client_id = 0;
+ driver->num_dci_client = 0;
+ driver->in_busy_dci = 0;
+ mutex_init(&driver->dci_mutex);
+ if (driver->buf_in_dci == NULL) {
+ driver->buf_in_dci = kzalloc(IN_BUF_SIZE, GFP_KERNEL);
+ if (driver->buf_in_dci == NULL)
+ goto err;
+ }
+ if (driver->write_ptr_dci == NULL) {
+ driver->write_ptr_dci = kzalloc(
+ sizeof(struct diag_write_device), GFP_KERNEL);
+ if (driver->write_ptr_dci == NULL)
+ goto err;
+ }
+ if (driver->dci_tbl == NULL) {
+ driver->dci_tbl = kzalloc(dci_max_reg *
+ sizeof(struct diag_dci_tbl), GFP_KERNEL);
+ if (driver->dci_tbl == NULL)
+ goto err;
+ }
+ if (driver->apps_dci_buf == NULL) {
+ driver->apps_dci_buf = kzalloc(APPS_BUF_SIZE, GFP_KERNEL);
+ if (driver->apps_dci_buf == NULL)
+ goto err;
+ }
+ success = platform_driver_register(&msm_diag_dci_driver);
+ if (success) {
+ pr_err("diag: Could not register DCI driver\n");
+ goto err;
+ }
+ return DIAG_DCI_NO_ERROR;
+err:
+ pr_err("diag: Could not initialize diag DCI buffers");
+ kfree(driver->dci_tbl);
+ kfree(driver->apps_dci_buf);
+ kfree(driver->buf_in_dci);
+ kfree(driver->write_ptr_dci);
+ return DIAG_DCI_NO_REG;
+}
+
+void diag_dci_exit(void)
+{
+ smd_close(driver->ch_dci);
+ driver->ch_dci = 0;
+ platform_driver_unregister(&msm_diag_dci_driver);
+ kfree(driver->dci_tbl);
+ kfree(driver->apps_dci_buf);
+ kfree(driver->buf_in_dci);
+ kfree(driver->write_ptr_dci);
+}
+
diff --git a/drivers/char/diag/diag_dci.h b/drivers/char/diag/diag_dci.h
new file mode 100644
index 0000000..cc6e0cf
--- /dev/null
+++ b/drivers/char/diag/diag_dci.h
@@ -0,0 +1,46 @@
+/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#ifndef DIAG_DCI_H
+#define DIAG_DCI_H
+#define MAX_DCI_CLIENT 10
+#define DCI_CMD_CODE 0x93
+
+extern unsigned int dci_max_reg;
+extern unsigned int dci_max_clients;
+struct diag_dci_tbl {
+ int pid;
+ int uid;
+ int tag;
+};
+
+#define DIAG_CON_APSS (0x0001) /* Bit mask for APSS */
+#define DIAG_CON_MPSS (0x0002) /* Bit mask for MPSS */
+#define DIAG_CON_LPASS (0x0004) /* Bit mask for LPASS */
+#define DIAG_CON_WCNSS (0x0008) /* Bit mask for WCNSS */
+
+enum {
+ DIAG_DCI_NO_ERROR = 1001, /* No error */
+ DIAG_DCI_NO_REG, /* Could not register */
+ DIAG_DCI_NO_MEM, /* Failed memory allocation */
+ DIAG_DCI_NOT_SUPPORTED, /* This particular client is not supported */
+ DIAG_DCI_HUGE_PACKET, /* Request/Response Packet too huge */
+ DIAG_DCI_SEND_DATA_FAIL,/* writing to kernel or peripheral fails */
+ DIAG_DCI_TABLE_ERR /* Error dealing with registration tables */
+};
+
+int diag_dci_init(void);
+void diag_dci_exit(void);
+void diag_read_smd_dci_work_fn(struct work_struct *);
+int diag_process_dci_client(unsigned char *buf, int len);
+int diag_send_dci_pkt(struct diag_master_table entry, unsigned char *buf,
+ int len, int index);
+#endif
diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h
index 7b63610..d547121 100644
--- a/drivers/char/diag/diagchar.h
+++ b/drivers/char/diag/diagchar.h
@@ -54,6 +54,7 @@
#define DIAG_CTRL_MSG_LOG_MASK 9
#define DIAG_CTRL_MSG_EVENT_MASK 10
#define DIAG_CTRL_MSG_F3_MASK 11
+#define CONTROL_CHAR 0x7E
/* Maximum number of pkt reg supported at initialization*/
extern unsigned int diag_max_reg;
@@ -135,7 +136,14 @@
int polling_reg_flag;
struct diag_write_device *buf_tbl;
int use_device_tree;
-
+ /* DCI related variables */
+ struct diag_dci_tbl *dci_tbl;
+ int dci_tag;
+ int dci_client_id;
+ struct mutex dci_mutex;
+ int num_dci_client;
+ unsigned char *apps_dci_buf;
+ int dci_state;
/* Memory pool parameters */
unsigned int itemsize;
unsigned int poolsize;
@@ -167,6 +175,7 @@
unsigned char *buf_in_wcnss_1;
unsigned char *buf_in_wcnss_2;
unsigned char *buf_in_wcnss_cntl;
+ unsigned char *buf_in_dci;
unsigned char *usb_buf_out;
unsigned char *apps_rsp_buf;
unsigned char *user_space_data;
@@ -176,6 +185,7 @@
unsigned char *buf_event_mask_update;
smd_channel_t *ch;
smd_channel_t *ch_cntl;
+ smd_channel_t *ch_dci;
smd_channel_t *chqdsp;
smd_channel_t *chqdsp_cntl;
smd_channel_t *ch_wcnss;
@@ -186,6 +196,7 @@
int in_busy_qdsp_2;
int in_busy_wcnss_1;
int in_busy_wcnss_2;
+ int in_busy_dci;
int read_len_legacy;
unsigned char *hdlc_buf;
unsigned hdlc_count;
@@ -208,6 +219,7 @@
struct work_struct diag_modem_mask_update_work;
struct work_struct diag_qdsp_mask_update_work;
struct work_struct diag_wcnss_mask_update_work;
+ struct work_struct diag_read_smd_dci_work;
uint8_t *msg_masks;
uint8_t *log_masks;
int log_masks_length;
@@ -223,6 +235,7 @@
struct diag_request *write_ptr_qdsp_2;
struct diag_request *write_ptr_wcnss_1;
struct diag_request *write_ptr_wcnss_2;
+ struct diag_write_device *write_ptr_dci;
int logging_mode;
int mask_check;
int logging_process_id;
diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c
index 7e2333a..0a156de 100644
--- a/drivers/char/diag/diagchar_core.c
+++ b/drivers/char/diag/diagchar_core.c
@@ -28,6 +28,7 @@
#include "diagchar.h"
#include "diagfwd.h"
#include "diagfwd_cntl.h"
+#include "diag_dci.h"
#ifdef CONFIG_DIAG_SDIO_PIPE
#include "diagfwd_sdio.h"
#endif
@@ -222,6 +223,11 @@
return -ENOMEM;
}
+ /* clean up any DCI registrations for this client
+ * This will specially help in case of ungraceful exit of any DCI client
+ * This call will remove any pending registrations of such client
+ */
+ diagchar_ioctl(NULL, DIAG_IOCTL_DCI_DEINIT, 0);
#ifdef CONFIG_DIAG_OVER_USB
/* If the SD logging process exits, change logging to USB mode */
if (driver->logging_process_id == current->tgid) {
@@ -330,6 +336,7 @@
int i, j, count_entries = 0, temp;
int success = -1;
void *temp_buf;
+ uint16_t support_list = 0;
if (iocmd == DIAG_IOCTL_COMMAND_REG) {
struct bindpkt_params_per_process *pkt_params =
@@ -397,6 +404,46 @@
*(delay_params->num_bytes_ptr) = sizeof(delayed_rsp_id);
success = 0;
}
+ } else if (iocmd == DIAG_IOCTL_DCI_REG) {
+ if (driver->dci_state == DIAG_DCI_NO_REG)
+ return DIAG_DCI_NO_REG;
+ /* use the 'list' later on to notify user space */
+ if (driver->num_dci_client >= MAX_DCI_CLIENT)
+ return DIAG_DCI_NO_REG;
+ mutex_lock(&driver->dci_mutex);
+ driver->num_dci_client++;
+ pr_debug("diag: id = %d\n", driver->dci_client_id);
+ driver->dci_client_id++;
+ mutex_unlock(&driver->dci_mutex);
+ return driver->dci_client_id;
+ } else if (iocmd == DIAG_IOCTL_DCI_DEINIT) {
+ success = -1;
+ /* Delete this process from DCI table */
+ mutex_lock(&driver->dci_mutex);
+ for (i = 0; i < dci_max_reg; i++) {
+ if (driver->dci_tbl[i].pid == current->tgid) {
+ pr_debug("diag: delete %d\n", current->tgid);
+ driver->dci_tbl[i].pid = 0;
+ success = i;
+ }
+ }
+ /* if any registrations were deleted successfully OR a valid
+ client_id was sent in DEINIT call , then its DCI client */
+ if (success >= 0 || ioarg)
+ driver->num_dci_client--;
+ driver->num_dci_client--;
+ mutex_unlock(&driver->dci_mutex);
+ for (i = 0; i < dci_max_reg; i++)
+ if (driver->dci_tbl[i].pid != 0)
+ pr_debug("diag: PID = %d, UID = %d, tag = %d\n",
+ driver->dci_tbl[i].pid, driver->dci_tbl[i].uid, driver->dci_tbl[i].tag);
+ pr_debug("diag: complete deleting registrations\n");
+ return success;
+ } else if (iocmd == DIAG_IOCTL_DCI_SUPPORT) {
+ if (driver->ch_dci)
+ support_list = support_list | DIAG_CON_MPSS;
+ *(uint16_t *)ioarg = support_list;
+ return DIAG_DCI_NO_ERROR;
} else if (iocmd == DIAG_IOCTL_LSM_DEINIT) {
for (i = 0; i < driver->num_clients; i++)
if (driver->client_map[i].pid == current->tgid)
@@ -720,6 +767,26 @@
goto exit;
}
+ if (driver->data_ready[index] & DCI_DATA_TYPE) {
+ /*Copy the type of data being passed*/
+ data_type = driver->data_ready[index] & DCI_DATA_TYPE;
+ COPY_USER_SPACE_OR_EXIT(buf, data_type, 4);
+ COPY_USER_SPACE_OR_EXIT(buf+4,
+ driver->write_ptr_dci->length, 4);
+ /* check delayed vs immediate response */
+ if (*(uint8_t *)(driver->buf_in_dci+4) == DCI_CMD_CODE)
+ COPY_USER_SPACE_OR_EXIT(buf+8,
+ *(driver->buf_in_dci + 5), driver->write_ptr_dci->length);
+ else
+ COPY_USER_SPACE_OR_EXIT(buf+8,
+ *(driver->buf_in_dci + 8), driver->write_ptr_dci->length);
+ driver->in_busy_dci = 0;
+ driver->data_ready[index] ^= DCI_DATA_TYPE;
+ if (driver->ch_dci)
+ queue_work(driver->diag_wq,
+ &(driver->diag_read_smd_dci_work));
+ goto exit;
+ }
exit:
mutex_unlock(&driver->diagchar_mutex);
return ret;
@@ -748,6 +815,17 @@
/* First 4 bytes indicate the type of payload - ignore these */
payload_size = count - 4;
+ if (pkt_type == DCI_DATA_TYPE) {
+ err = copy_from_user(driver->user_space_data, buf + 4,
+ payload_size);
+ if (err) {
+ pr_alert("diag: copy failed for DCI data\n");
+ return DIAG_DCI_SEND_DATA_FAIL;
+ }
+ err = diag_process_dci_client(driver->user_space_data,
+ payload_size);
+ return err;
+ }
if (pkt_type == USER_SPACE_LOG_TYPE) {
err = copy_from_user(driver->user_space_data, buf + 4,
payload_size);
@@ -1076,6 +1154,7 @@
driver->used = 0;
timer_in_progress = 0;
driver->debug_flag = 1;
+ driver->dci_state = DIAG_DCI_NO_ERROR;
setup_timer(&drain_timer, drain_timer_func, 1234);
driver->itemsize = itemsize;
driver->poolsize = poolsize;
@@ -1100,8 +1179,11 @@
diag_read_smd_wcnss_work_fn);
INIT_WORK(&(driver->diag_read_smd_wcnss_cntl_work),
diag_read_smd_wcnss_cntl_work_fn);
+ INIT_WORK(&(driver->diag_read_smd_dci_work),
+ diag_read_smd_dci_work_fn);
diagfwd_init();
diagfwd_cntl_init();
+ driver->dci_state = diag_dci_init();
diag_sdio_fn(INIT);
diag_hsic_fn(INIT);
pr_debug("diagchar initializing ..\n");
diff --git a/drivers/char/diag/diagchar_hdlc.c b/drivers/char/diag/diagchar_hdlc.c
index ef57d52..74dcb6b 100644
--- a/drivers/char/diag/diagchar_hdlc.c
+++ b/drivers/char/diag/diagchar_hdlc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2008-2009, 2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -19,6 +19,7 @@
#include <linux/uaccess.h>
#include <linux/crc-ccitt.h>
#include "diagchar_hdlc.h"
+#include "diagchar.h"
MODULE_LICENSE("GPL v2");
diff --git a/drivers/char/diag/diagchar_hdlc.h b/drivers/char/diag/diagchar_hdlc.h
index 2df81de..116c980 100644
--- a/drivers/char/diag/diagchar_hdlc.h
+++ b/drivers/char/diag/diagchar_hdlc.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2008-2009, 2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -54,7 +54,6 @@
int diag_hdlc_decode(struct diag_hdlc_decode_type *hdlc);
#define ESC_CHAR 0x7D
-#define CONTROL_CHAR 0x7E
#define ESC_MASK 0x20
#endif
diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c
index efe0241..7066141 100644
--- a/drivers/char/diag/diagfwd.c
+++ b/drivers/char/diag/diagfwd.c
@@ -37,6 +37,8 @@
#ifdef CONFIG_DIAG_SDIO_PIPE
#include "diagfwd_sdio.h"
#endif
+#include "diag_dci.h"
+
#define MODE_CMD 41
#define RESET_ID 2
#define ALL_EQUIP_ID 100
@@ -689,14 +691,14 @@
mutex_unlock(&driver->diagchar_mutex);
}
-void diag_update_sleeping_process(int process_id)
+void diag_update_sleeping_process(int process_id, int data_type)
{
int i;
mutex_lock(&driver->diagchar_mutex);
for (i = 0; i < driver->num_clients; i++)
if (driver->client_map[i].pid == process_id) {
- driver->data_ready[i] |= PKT_TYPE;
+ driver->data_ready[i] |= data_type;
break;
}
wake_up_interruptible(&driver->wait_q);
@@ -709,7 +711,7 @@
driver->pkt_length = len;
if (entry.process_id != NON_APPS_PROC && type != MODEM_DATA) {
diag_update_pkt_buffer(buf);
- diag_update_sleeping_process(entry.process_id);
+ diag_update_sleeping_process(entry.process_id, PKT_TYPE);
} else {
if (len > 0) {
if (entry.client_id == MODEM_PROC && driver->ch) {
@@ -2016,6 +2018,7 @@
usb_diag_close(driver->legacy_ch);
#endif
platform_driver_unregister(&msm_smd_ch1_driver);
+ platform_driver_unregister(&msm_diag_dci_driver);
platform_driver_unregister(&diag_smd_lite_driver);
kfree(driver->event_mask);
kfree(driver->log_mask);
diff --git a/drivers/char/diag/diagfwd.h b/drivers/char/diag/diagfwd.h
index 5744459..0780a8e 100644
--- a/drivers/char/diag/diagfwd.h
+++ b/drivers/char/diag/diagfwd.h
@@ -32,6 +32,7 @@
void diag_send_msg_mask_update(smd_channel_t *, int ssid_first,
int ssid_last, int proc);
void diag_send_log_mask_update(smd_channel_t *, int);
+void diag_update_sleeping_process(int process_id, int data_type);
/* State for diag forwarding */
#ifdef CONFIG_DIAG_OVER_USB
int diagfwd_connect(void);
@@ -40,4 +41,5 @@
extern int diag_debug_buf_idx;
extern unsigned char diag_debug_buf[1024];
extern int diag_event_num_bytes;
+extern struct platform_driver msm_diag_dci_driver;
#endif
diff --git a/drivers/char/msm_rotator.c b/drivers/char/msm_rotator.c
index 5e186a7..47bc750 100644
--- a/drivers/char/msm_rotator.c
+++ b/drivers/char/msm_rotator.c
@@ -345,6 +345,8 @@
return 1;
case MDP_RGB_888:
+ case MDP_YCBCR_H1V1:
+ case MDP_YCRCB_H1V1:
return 3;
case MDP_YCRYCB_H2V1:
@@ -739,6 +741,8 @@
break;
case MDP_RGB_888:
+ case MDP_YCBCR_H1V1:
+ case MDP_YCRCB_H1V1:
iowrite32(GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
MSM_ROTATOR_SRC_UNPACK_PATTERN1);
iowrite32(GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8),
@@ -1083,6 +1087,8 @@
case MDP_XRGB_8888:
case MDP_BGRA_8888:
case MDP_RGBX_8888:
+ case MDP_YCBCR_H1V1:
+ case MDP_YCRCB_H1V1:
rc = msm_rotator_rgb_types(msm_rotator_dev->img_info[s],
in_paddr, out_paddr,
use_imem,
@@ -1238,6 +1244,8 @@
case MDP_Y_CRCB_H2V2:
case MDP_Y_CBCR_H2V1:
case MDP_Y_CRCB_H2V1:
+ case MDP_YCBCR_H1V1:
+ case MDP_YCRCB_H1V1:
info.dst.format = info.src.format;
break;
case MDP_YCRYCB_H2V1:
diff --git a/drivers/gpu/ion/ion_cp_heap.c b/drivers/gpu/ion/ion_cp_heap.c
index 7d99482..b383e68 100644
--- a/drivers/gpu/ion/ion_cp_heap.c
+++ b/drivers/gpu/ion/ion_cp_heap.c
@@ -224,8 +224,9 @@
if (!offset) {
mutex_lock(&cp_heap->lock);
+ cp_heap->allocated_bytes -= size;
if ((cp_heap->total_size -
- cp_heap->allocated_bytes) > size)
+ cp_heap->allocated_bytes) >= size)
pr_debug("%s: heap %s has enough memory (%lx) but"
" the allocation of size %lx still failed."
" Memory is probably fragmented.\n",
@@ -233,8 +234,6 @@
cp_heap->total_size -
cp_heap->allocated_bytes, size);
- cp_heap->allocated_bytes -= size;
-
if (cp_heap->reusable && !cp_heap->allocated_bytes) {
if (fmem_set_state(FMEM_T_STATE) != 0)
pr_err("%s: unable to transition heap to T-state\n",
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index 9e9bbf2..7e84692 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -718,6 +718,11 @@
mutex_lock(&device->mutex);
kgsl_check_suspended(device);
+ /* clean up any to-be-freed entries that belong to this
+ * process and this device
+ */
+ kgsl_cancel_events(device, dev_priv);
+
while (1) {
context = idr_get_next(&device->context_idr, &next);
if (context == NULL)
@@ -736,10 +741,6 @@
result = device->ftbl->stop(device);
kgsl_pwrctrl_set_state(device, KGSL_STATE_INIT);
}
- /* clean up any to-be-freed entries that belong to this
- * process and this device
- */
- kgsl_cancel_events(device, dev_priv);
mutex_unlock(&device->mutex);
kfree(dev_priv);
diff --git a/drivers/gpu/msm/z180.c b/drivers/gpu/msm/z180.c
index cff7fec..8c29535 100644
--- a/drivers/gpu/msm/z180.c
+++ b/drivers/gpu/msm/z180.c
@@ -304,15 +304,22 @@
return result;
}
-static inline unsigned int rb_offset(unsigned int index)
+static inline unsigned int rb_offset(unsigned int timestamp)
{
- return index*sizeof(unsigned int)*(Z180_PACKET_SIZE);
+ return (timestamp % Z180_PACKET_COUNT)
+ *sizeof(unsigned int)*(Z180_PACKET_SIZE);
}
-static void addmarker(struct z180_ringbuffer *rb, unsigned int index)
+static inline unsigned int rb_gpuaddr(struct z180_device *z180_dev,
+ unsigned int timestamp)
+{
+ return z180_dev->ringbuffer.cmdbufdesc.gpuaddr + rb_offset(timestamp);
+}
+
+static void addmarker(struct z180_ringbuffer *rb, unsigned int timestamp)
{
char *ptr = (char *)(rb->cmdbufdesc.hostptr);
- unsigned int *p = (unsigned int *)(ptr + rb_offset(index));
+ unsigned int *p = (unsigned int *)(ptr + rb_offset(timestamp));
*p++ = Z180_STREAM_PACKET;
*p++ = (Z180_MARKER_CMD | 5);
@@ -326,11 +333,11 @@
*p++ = ADDR_VGV3_LAST << 24;
}
-static void addcmd(struct z180_ringbuffer *rb, unsigned int index,
+static void addcmd(struct z180_ringbuffer *rb, unsigned int timestamp,
unsigned int cmd, unsigned int nextcnt)
{
char * ptr = (char *)(rb->cmdbufdesc.hostptr);
- unsigned int *p = (unsigned int *)(ptr + (rb_offset(index)
+ unsigned int *p = (unsigned int *)(ptr + (rb_offset(timestamp)
+ (Z180_MARKER_SIZE * sizeof(unsigned int))));
*p++ = Z180_STREAM_PACKET_CALL;
@@ -355,7 +362,7 @@
z180_cmdwindow_write(device, ADDR_VGV3_MODE, 4);
z180_cmdwindow_write(device, ADDR_VGV3_NEXTADDR,
- z180_dev->ringbuffer.cmdbufdesc.gpuaddr);
+ rb_gpuaddr(z180_dev, z180_dev->current_timestamp));
z180_cmdwindow_write(device, ADDR_VGV3_NEXTCMD, cmd | 5);
@@ -406,9 +413,7 @@
long result = 0;
unsigned int ofs = PACKETSIZE_STATESTREAM * sizeof(unsigned int);
unsigned int cnt = 5;
- unsigned int nextaddr = 0;
- unsigned int index = 0;
- unsigned int nextindex;
+ unsigned int old_timestamp = 0;
unsigned int nextcnt = Z180_STREAM_END_CMD | 5;
struct kgsl_mem_entry *entry = NULL;
unsigned int cmd;
@@ -477,26 +482,22 @@
}
result = 0;
- index = z180_dev->current_timestamp % Z180_PACKET_COUNT;
+ old_timestamp = z180_dev->current_timestamp;
z180_dev->current_timestamp++;
- nextindex = z180_dev->current_timestamp % Z180_PACKET_COUNT;
*timestamp = z180_dev->current_timestamp;
z180_dev->ringbuffer.prevctx = context->id;
- addcmd(&z180_dev->ringbuffer, index, cmd + ofs, cnt);
+ addcmd(&z180_dev->ringbuffer, old_timestamp, cmd + ofs, cnt);
kgsl_pwrscale_busy(device);
/* Make sure the next ringbuffer entry has a marker */
- addmarker(&z180_dev->ringbuffer, nextindex);
-
- nextaddr = z180_dev->ringbuffer.cmdbufdesc.gpuaddr
- + rb_offset(nextindex);
+ addmarker(&z180_dev->ringbuffer, z180_dev->current_timestamp);
/* monkey patch the IB so that it jumps back to the ringbuffer */
kgsl_sharedmem_writel(&entry->memdesc,
- ((sizedwords + 1) * sizeof(unsigned int)),
- nextaddr);
+ ((sizedwords + 1) * sizeof(unsigned int)),
+ rb_gpuaddr(z180_dev, z180_dev->current_timestamp));
kgsl_sharedmem_writel(&entry->memdesc,
((sizedwords + 2) * sizeof(unsigned int)),
nextcnt);
diff --git a/drivers/media/video/msm/csi/msm_csic.c b/drivers/media/video/msm/csi/msm_csic.c
index 00828c9..b4adbaf 100644
--- a/drivers/media/video/msm/csi/msm_csic.c
+++ b/drivers/media/video/msm/csi/msm_csic.c
@@ -285,6 +285,7 @@
if (rc < 0) {
csic_dev->hw_version = 0;
iounmap(csic_dev->base);
+ csic_dev->base = NULL;
return rc;
}
}
@@ -427,6 +428,7 @@
}
disable_irq(new_csic_dev->irq->start);
iounmap(new_csic_dev->base);
+ new_csic_dev->base = NULL;
new_csic_dev->pdev = pdev;
return 0;
diff --git a/drivers/media/video/msm/csi/msm_csid.c b/drivers/media/video/msm/csi/msm_csid.c
index 21bcac0..0cd2cf0 100644
--- a/drivers/media/video/msm/csi/msm_csid.c
+++ b/drivers/media/video/msm/csi/msm_csid.c
@@ -54,6 +54,8 @@
#define CSID_RST_DONE_IRQ_BITSHIFT 11
#define CSID_RST_STB_ALL 0x7FFF
+#define DBG_CSID 0
+
static int msm_csid_cid_lut(
struct msm_camera_csid_lut_params *csid_lut_params,
void __iomem *csidbase)
@@ -82,6 +84,20 @@
return rc;
}
+#if DBG_CSID
+static void msm_csid_set_debug_reg(void __iomem *csidbase,
+ struct msm_camera_csid_params *csid_params)
+{
+ uint32_t val = 0;
+ val = ((1 << csid_params->lane_cnt) - 1) << 20;
+ msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_MASK_ADDR);
+ msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
+}
+#else
+static void msm_csid_set_debug_reg(void __iomem *csidbase,
+ struct msm_camera_csid_params *csid_params) {}
+#endif
+
static int msm_csid_config(struct csid_cfg_params *cfg_params)
{
int rc = 0;
@@ -106,11 +122,8 @@
if (rc < 0)
return rc;
- val = ((1 << csid_params->lane_cnt) - 1) << 20;
- msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_MASK_ADDR);
- msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
+ msm_csid_set_debug_reg(csidbase, csid_params);
- msleep(20);
return rc;
}
@@ -211,6 +224,7 @@
ARRAY_SIZE(csid_vreg_info), &csid_dev->csi_vdd, 0);
vreg_config_failed:
iounmap(csid_dev->base);
+ csid_dev->base = NULL;
return rc;
}
@@ -231,6 +245,7 @@
ARRAY_SIZE(csid_vreg_info), &csid_dev->csi_vdd, 0);
iounmap(csid_dev->base);
+ csid_dev->base = NULL;
return 0;
}
diff --git a/drivers/media/video/msm/csi/msm_csiphy.c b/drivers/media/video/msm/csi/msm_csiphy.c
index 36385ca..aef017f 100644
--- a/drivers/media/video/msm/csi/msm_csiphy.c
+++ b/drivers/media/video/msm/csi/msm_csiphy.c
@@ -201,6 +201,7 @@
if (rc < 0) {
iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
return rc;
}
@@ -231,6 +232,7 @@
csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 0);
iounmap(csiphy_dev->base);
+ csiphy_dev->base = NULL;
return 0;
}
diff --git a/drivers/media/video/msm/msm_vfe32.c b/drivers/media/video/msm/msm_vfe32.c
index 2f0b6c9..b8344fb 100644
--- a/drivers/media/video/msm/msm_vfe32.c
+++ b/drivers/media/video/msm/msm_vfe32.c
@@ -4022,6 +4022,7 @@
vfe32_ctrl->fs_vfe = NULL;
vfe_fs_failed:
iounmap(vfe32_ctrl->vfebase);
+ vfe32_ctrl->vfebase = NULL;
vfe_remap_failed:
disable_irq(vfe32_ctrl->vfeirq->start);
return rc;
@@ -4041,6 +4042,7 @@
vfe32_ctrl->fs_vfe = NULL;
}
iounmap(vfe32_ctrl->vfebase);
+ vfe32_ctrl->vfebase = NULL;
if (atomic_read(&irq_cnt))
pr_warning("%s, Warning IRQ Count not ZERO\n", __func__);
diff --git a/drivers/media/video/msm/msm_vpe1.c b/drivers/media/video/msm/msm_vpe1.c
index 96988a9..984aea5 100644
--- a/drivers/media/video/msm/msm_vpe1.c
+++ b/drivers/media/video/msm/msm_vpe1.c
@@ -1422,7 +1422,7 @@
return rc; /* this rc should be zero.*/
iounmap(vpe_device->vpebase); /* this path should never occur */
-
+ vpe_device->vpebase = NULL;
/* from this part it is error handling. */
vpe_release_mem_region:
release_mem_region(vpemem->start, (vpemem->end - vpemem->start) + 1);
@@ -1436,6 +1436,7 @@
vpemem = vpe_device->vpemem;
iounmap(vpe_device->vpebase);
+ vpe_device->vpebase = NULL;
release_mem_region(vpemem->start,
(vpemem->end - vpemem->start) + 1);
return 0;
diff --git a/drivers/media/video/msm/sensors/imx074_v4l2.c b/drivers/media/video/msm/sensors/imx074_v4l2.c
index 5330d7b..67b7140 100644
--- a/drivers/media/video/msm/sensors/imx074_v4l2.c
+++ b/drivers/media/video/msm/sensors/imx074_v4l2.c
@@ -184,13 +184,14 @@
static struct msm_camera_csid_vc_cfg imx074_cid_cfg[] = {
{0, CSI_RAW10, CSI_DECODE_10BIT},
{1, CSI_EMBED_DATA, CSI_DECODE_8BIT},
+ {2, CSI_RESERVED_DATA_0, CSI_DECODE_8BIT},
};
static struct msm_camera_csi2_params imx074_csi_params = {
.csid_params = {
.lane_cnt = 4,
.lut_params = {
- .num_cid = 2,
+ .num_cid = ARRAY_SIZE(imx074_cid_cfg),
.vc_cfg = imx074_cid_cfg,
},
},
diff --git a/drivers/media/video/msm/sensors/imx091.c b/drivers/media/video/msm/sensors/imx091.c
index 34f0820..62e97ac 100644
--- a/drivers/media/video/msm/sensors/imx091.c
+++ b/drivers/media/video/msm/sensors/imx091.c
@@ -211,13 +211,14 @@
static struct msm_camera_csid_vc_cfg imx091_cid_cfg[] = {
{0, CSI_RAW10, CSI_DECODE_10BIT},
{1, CSI_EMBED_DATA, CSI_DECODE_8BIT},
+ {2, CSI_RESERVED_DATA_0, CSI_DECODE_8BIT},
};
static struct msm_camera_csi2_params imx091_csi_params = {
.csid_params = {
.lane_cnt = 4,
.lut_params = {
- .num_cid = 2,
+ .num_cid = ARRAY_SIZE(imx091_cid_cfg),
.vc_cfg = imx091_cid_cfg,
},
},
diff --git a/drivers/media/video/msm/sensors/s5k3l1yx.c b/drivers/media/video/msm/sensors/s5k3l1yx.c
index 4a790f8..8d022b6 100644
--- a/drivers/media/video/msm/sensors/s5k3l1yx.c
+++ b/drivers/media/video/msm/sensors/s5k3l1yx.c
@@ -538,6 +538,7 @@
static struct msm_camera_csid_vc_cfg s5k3l1yx_cid_cfg[] = {
{0, CSI_RAW10, CSI_DECODE_10BIT},
+ {1, CSI_EMBED_DATA, CSI_DECODE_8BIT},
};
static struct msm_camera_csi2_params s5k3l1yx_csi_params = {
diff --git a/drivers/mfd/pm8018-core.c b/drivers/mfd/pm8018-core.c
index 041815776..efe4fbf 100644
--- a/drivers/mfd/pm8018-core.c
+++ b/drivers/mfd/pm8018-core.c
@@ -529,8 +529,8 @@
static const char * const pm8018_rev_names[] = {
[PM8XXX_REVISION_8018_TEST] = "test",
[PM8XXX_REVISION_8018_1p0] = "1.0",
- [PM8XXX_REVISION_8018_1p1] = "1.1",
[PM8XXX_REVISION_8018_2p0] = "2.0",
+ [PM8XXX_REVISION_8018_2p1] = "2.1",
};
static int __devinit pm8018_probe(struct platform_device *pdev)
diff --git a/drivers/mfd/pm8921-core.c b/drivers/mfd/pm8921-core.c
index 0f41ba7..71fc3f7 100644
--- a/drivers/mfd/pm8921-core.c
+++ b/drivers/mfd/pm8921-core.c
@@ -831,6 +831,7 @@
[PM8XXX_REVISION_8921_1p1] = "1.1",
[PM8XXX_REVISION_8921_2p0] = "2.0",
[PM8XXX_REVISION_8921_3p0] = "3.0",
+ [PM8XXX_REVISION_8921_3p1] = "3.1",
};
static const char * const pm8922_rev_names[] = {
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c
index 6b3400d..b428bd2 100644
--- a/drivers/usb/otg/msm_otg.c
+++ b/drivers/usb/otg/msm_otg.c
@@ -1993,10 +1993,13 @@
clear_bit(B_SESS_VLD, &motg->inputs);
} else if (pdata->otg_control == OTG_PMIC_CONTROL) {
if (pdata->pmic_id_irq) {
+ unsigned long flags;
+ local_irq_save(flags);
if (irq_read_line(pdata->pmic_id_irq))
set_bit(ID, &motg->inputs);
else
clear_bit(ID, &motg->inputs);
+ local_irq_restore(flags);
}
/*
* VBUS initial state is reported after PMIC
diff --git a/drivers/video/msm/mdp4.h b/drivers/video/msm/mdp4.h
index b768784..d765744 100644
--- a/drivers/video/msm/mdp4.h
+++ b/drivers/video/msm/mdp4.h
@@ -537,7 +537,7 @@
void mdp4_dma_s_done_mddi(void);
void mdp4_dma_p_done_mddi(void);
void mdp4_dma_p_done_dsi(struct mdp_dma_data *dma);
-void mdp4_dma_p_done_dsi_video(void);
+void mdp4_dma_p_done_dsi_video(struct mdp_dma_data *dma);
void mdp4_dma_p_done_lcdc(void);
void mdp4_overlay1_done_dtv(void);
void mdp4_overlay1_done_atv(void);
diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c
index 0ff70f2..b40d88a 100644
--- a/drivers/video/msm/mdp4_overlay.c
+++ b/drivers/video/msm/mdp4_overlay.c
@@ -847,6 +847,8 @@
case MDP_Y_CB_CR_H2V2:
case MDP_Y_CRCB_H1V1:
case MDP_Y_CBCR_H1V1:
+ case MDP_YCRCB_H1V1:
+ case MDP_YCBCR_H1V1:
return OVERLAY_TYPE_VIDEO;
default:
mdp4_stat.err_format++;
@@ -1100,6 +1102,28 @@
pipe->chroma_sample = MDP4_CHROMA_420;
pipe->bpp = 2; /* 2 bpp */
break;
+ case MDP_YCBCR_H1V1:
+ case MDP_YCRCB_H1V1:
+ pipe->frame_format = MDP4_FRAME_FORMAT_LINEAR;
+ pipe->fetch_plane = OVERLAY_PLANE_INTERLEAVED;
+ pipe->a_bit = 0;
+ pipe->r_bit = 3; /* R, 8 bits */
+ pipe->b_bit = 3; /* B, 8 bits */
+ pipe->g_bit = 3; /* G, 8 bits */
+ pipe->alpha_enable = 0;
+ pipe->unpack_tight = 1;
+ pipe->unpack_align_msb = 0;
+ pipe->unpack_count = 2;
+ pipe->element0 = C0_G_Y; /* G */
+ if (pipe->src_format == MDP_YCRCB_H1V1) {
+ pipe->element1 = C2_R_Cr; /* R */
+ pipe->element2 = C1_B_Cb; /* B */
+ } else {
+ pipe->element1 = C1_B_Cb; /* B */
+ pipe->element2 = C2_R_Cr; /* R */
+ }
+ pipe->bpp = 3; /* 3 bpp */
+ break;
default:
/* not likely */
mdp4_stat.err_format++;
@@ -1176,6 +1200,7 @@
case MDP_Y_CB_CR_H2V2:
case MDP_Y_CBCR_H2V2:
case MDP_Y_CBCR_H2V1:
+ case MDP_YCBCR_H1V1:
b_start = 8;
g_start = 16;
r_start = 0;
@@ -1189,6 +1214,7 @@
case MDP_Y_CRCB_H2V1:
case MDP_Y_CRCB_H1V1:
case MDP_Y_CBCR_H1V1:
+ case MDP_YCRCB_H1V1:
b_start = 0;
g_start = 16;
r_start = 8;
@@ -2528,10 +2554,7 @@
#endif
}
- if (mfd->mdp_rev >= MDP_REV_42 && !mfd->use_ov0_blt &&
- (pipe->mixer_num == MDP4_MIXER0 || hdmi_prim_display)) {
- ctrl->stage[pipe->mixer_num][pipe->mixer_stage] = NULL;
- } else if (mfd->mdp_rev == MDP_REV_41 &&
+ if (mfd->mdp_rev >= MDP_REV_41 &&
mdp4_overlay_is_rgb_type(pipe->src_format) &&
!mfd->use_ov0_blt && (pipe->mixer_num == MDP4_MIXER0 ||
hdmi_prim_display)) {
diff --git a/drivers/video/msm/mdp4_overlay_dsi_video.c b/drivers/video/msm/mdp4_overlay_dsi_video.c
index d120071..8ab12590 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_video.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_video.c
@@ -40,6 +40,7 @@
static struct mdp4_overlay_pipe *dsi_pipe;
static struct completion dsi_video_comp;
+static int blt_cfg_changed;
static cmd_fxn_t display_on;
@@ -550,8 +551,26 @@
/*
* mdp4_dma_p_done_dsi_video: called from isr
*/
-void mdp4_dma_p_done_dsi_video(void)
+void mdp4_dma_p_done_dsi_video(struct mdp_dma_data *dma)
{
+ if (blt_cfg_changed) {
+ mdp_is_in_isr = TRUE;
+ mdp4_overlayproc_cfg(dsi_pipe);
+ mdp4_overlay_dmap_xy(dsi_pipe);
+ mdp_is_in_isr = FALSE;
+ if (dsi_pipe->blt_addr) {
+ mdp4_dsi_video_blt_ov_update(dsi_pipe);
+ dsi_pipe->ov_cnt++;
+ outp32(MDP_INTR_CLEAR, INTR_OVERLAY0_DONE);
+ mdp_intr_mask |= INTR_OVERLAY0_DONE;
+ outp32(MDP_INTR_ENABLE, mdp_intr_mask);
+ dma->busy = TRUE;
+ mdp_enable_irq(MDP_OVERLAY0_TERM);
+ /* kickoff overlay engine */
+ outpdw(MDP_BASE + 0x0004, 0);
+ }
+ blt_cfg_changed = 0;
+ }
complete_all(&dsi_video_comp);
}
@@ -573,30 +592,6 @@
complete(&dma->comp);
}
-static void mdp4_overlay_dsi_video_prefill(struct msm_fb_data_type *mfd)
-{
- unsigned long flag;
-
- if (dsi_pipe->blt_addr) {
- mdp4_overlay_dsi_video_dma_busy_wait(mfd);
-
- mdp4_dsi_video_blt_ov_update(dsi_pipe);
- dsi_pipe->ov_cnt++;
-
- spin_lock_irqsave(&mdp_spin_lock, flag);
- outp32(MDP_INTR_CLEAR, INTR_OVERLAY0_DONE);
- mdp_intr_mask |= INTR_OVERLAY0_DONE;
- outp32(MDP_INTR_ENABLE, mdp_intr_mask);
- mdp_enable_irq(MDP_OVERLAY0_TERM);
- mfd->dma->busy = TRUE;
- mb(); /* make sure all registers updated */
- spin_unlock_irqrestore(&mdp_spin_lock, flag);
- outpdw(MDP_BASE + 0x0004, 0); /* kickoff overlay engine */
- mdp4_stat.kickoff_ov0++;
- mb();
- }
-}
-
/*
* make sure the MIPI_DSI_WRITEBACK_SIZE defined at boardfile
* has enough space h * w * 3 * 2
@@ -626,12 +621,18 @@
dsi_pipe->blt_addr = 0;
change++;
}
+
+ if (!change) {
+ spin_unlock_irqrestore(&mdp_spin_lock, flag);
+ return;
+ }
+
pr_debug("%s: enable=%d blt_addr=%x\n", __func__,
- enable, (int)dsi_pipe->blt_addr);
+ enable, (int)dsi_pipe->blt_addr);
+ blt_cfg_changed = 1;
+
spin_unlock_irqrestore(&mdp_spin_lock, flag);
- if (!change)
- return;
/*
* may need mutex here to sync with whom dsiable
@@ -641,24 +642,10 @@
data &= 0x01;
if (data) { /* timing generator enabled */
mdp4_overlay_dsi_video_wait4event(mfd, INTR_DMA_P_DONE);
- MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0);
- msleep(20); /* make sure last frame is finished */
- mipi_dsi_controller_cfg(0);
+ mdp4_overlay_dsi_video_wait4event(mfd, INTR_PRIMARY_VSYNC);
}
- mdp4_overlayproc_cfg(dsi_pipe);
- mdp4_overlay_dmap_xy(dsi_pipe);
- if (data) { /* timing generator enabled */
- if (dsi_pipe->blt_addr) {
- MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 1);
- mdp4_overlay_dsi_video_prefill(mfd);
- mdp4_overlay_dsi_video_prefill(mfd);
- MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0);
- }
- mipi_dsi_sw_reset();
- mipi_dsi_controller_cfg(1);
- MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 1);
- }
+
}
int mdp4_dsi_video_overlay_blt_offset(struct msm_fb_data_type *mfd,
diff --git a/drivers/video/msm/mdp4_util.c b/drivers/video/msm/mdp4_util.c
index 3aa848c..9f8b5c6 100644
--- a/drivers/video/msm/mdp4_util.c
+++ b/drivers/video/msm/mdp4_util.c
@@ -515,7 +515,7 @@
mdp_intr_mask &= ~INTR_DMA_P_DONE;
outp32(MDP_INTR_ENABLE, mdp_intr_mask);
dma->waiting = FALSE;
- mdp4_dma_p_done_dsi_video();
+ mdp4_dma_p_done_dsi_video(dma);
spin_unlock(&mdp_spin_lock);
} else if (panel & MDP4_PANEL_DSI_CMD) {
mdp4_dma_p_done_dsi(dma);
diff --git a/include/linux/diagchar.h b/include/linux/diagchar.h
index 15737d6..e50a054 100644
--- a/include/linux/diagchar.h
+++ b/include/linux/diagchar.h
@@ -19,6 +19,7 @@
#define PKT_TYPE 8
#define DEINIT_TYPE 16
#define USER_SPACE_LOG_TYPE 32
+#define DCI_DATA_TYPE 64
#define USB_MODE 1
#define MEMORY_DEVICE_MODE 2
#define NO_LOGGING_MODE 3
@@ -35,6 +36,10 @@
#define DIAG_IOCTL_SWITCH_LOGGING 7
#define DIAG_IOCTL_GET_DELAYED_RSP_ID 8
#define DIAG_IOCTL_LSM_DEINIT 9
+#define DIAG_IOCTL_DCI_INIT 20
+#define DIAG_IOCTL_DCI_DEINIT 21
+#define DIAG_IOCTL_DCI_SUPPORT 22
+#define DIAG_IOCTL_DCI_REG 23
/* PC Tools IDs */
#define APQ8060_TOOLS_ID 4062
diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h
index 0df513b..bdd6b2a 100644
--- a/include/linux/kallsyms.h
+++ b/include/linux/kallsyms.h
@@ -36,6 +36,7 @@
/* Look up a kernel symbol and return it in a text buffer. */
extern int sprint_symbol(char *buffer, unsigned long address);
+extern int sprint_symbol_no_offset(char *buffer, unsigned long address);
extern int sprint_backtrace(char *buffer, unsigned long address);
/* Look up a kernel symbol and print it to the kernel messages. */
@@ -80,6 +81,12 @@
return 0;
}
+static inline int sprint_symbol_no_offset(char *buffer, unsigned long addr)
+{
+ *buffer = '\0';
+ return 0;
+}
+
static inline int sprint_backtrace(char *buffer, unsigned long addr)
{
*buffer = '\0';
diff --git a/include/linux/mfd/pm8xxx/core.h b/include/linux/mfd/pm8xxx/core.h
index b907219..08e9014 100644
--- a/include/linux/mfd/pm8xxx/core.h
+++ b/include/linux/mfd/pm8xxx/core.h
@@ -50,6 +50,7 @@
#define PM8XXX_REVISION_8921_1p1 2
#define PM8XXX_REVISION_8921_2p0 3
#define PM8XXX_REVISION_8921_3p0 4
+#define PM8XXX_REVISION_8921_3p1 5
#define PM8XXX_REVISION_8821_TEST 0
#define PM8XXX_REVISION_8821_1p0 1
@@ -58,8 +59,8 @@
#define PM8XXX_REVISION_8018_TEST 0
#define PM8XXX_REVISION_8018_1p0 1
-#define PM8XXX_REVISION_8018_1p1 2
-#define PM8XXX_REVISION_8018_2p0 3
+#define PM8XXX_REVISION_8018_2p0 2
+#define PM8XXX_REVISION_8018_2p1 3
#define PM8XXX_REVISION_8922_TEST 0
#define PM8XXX_REVISION_8922_1p0 1
diff --git a/include/linux/msm_mdp.h b/include/linux/msm_mdp.h
index 1c3da53..84c8bfe 100644
--- a/include/linux/msm_mdp.h
+++ b/include/linux/msm_mdp.h
@@ -96,6 +96,8 @@
MDP_Y_CB_CR_H2V2, /* Y, Cb and Cr, planar */
MDP_Y_CRCB_H1V1, /* Y and CrCb, pseduo planer w/ Cr is in MSB */
MDP_Y_CBCR_H1V1, /* Y and CbCr, pseduo planer w/ Cb is in MSB */
+ MDP_YCRCB_H1V1, /* YCrCb interleave */
+ MDP_YCBCR_H1V1, /* YCbCr interleave */
MDP_IMGTYPE_LIMIT,
MDP_BGR_565 = MDP_IMGTYPE2_START, /* BGR 565 planer */
MDP_FB_FORMAT, /* framebuffer format */
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 079f1d3..2169fee 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -343,7 +343,7 @@
/* Look up a kernel symbol and return it in a text buffer. */
static int __sprint_symbol(char *buffer, unsigned long address,
- int symbol_offset)
+ int symbol_offset, int add_offset)
{
char *modname;
const char *name;
@@ -358,13 +358,13 @@
if (name != buffer)
strcpy(buffer, name);
len = strlen(buffer);
- buffer += len;
offset -= symbol_offset;
+ if (add_offset)
+ len += sprintf(buffer + len, "+%#lx/%#lx", offset, size);
+
if (modname)
- len += sprintf(buffer, "+%#lx/%#lx [%s]", offset, size, modname);
- else
- len += sprintf(buffer, "+%#lx/%#lx", offset, size);
+ len += sprintf(buffer + len, " [%s]", modname);
return len;
}
@@ -382,12 +382,28 @@
*/
int sprint_symbol(char *buffer, unsigned long address)
{
- return __sprint_symbol(buffer, address, 0);
+ return __sprint_symbol(buffer, address, 0, 1);
}
-
EXPORT_SYMBOL_GPL(sprint_symbol);
/**
+ * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer
+ * @buffer: buffer to be stored
+ * @address: address to lookup
+ *
+ * This function looks up a kernel symbol with @address and stores its name
+ * and module name to @buffer if possible. If no symbol was found, just saves
+ * its @address as is.
+ *
+ * This function returns the number of bytes stored in @buffer.
+ */
+int sprint_symbol_no_offset(char *buffer, unsigned long address)
+{
+ return __sprint_symbol(buffer, address, 0, 0);
+}
+EXPORT_SYMBOL_GPL(sprint_symbol_no_offset);
+
+/**
* sprint_backtrace - Look up a backtrace symbol and return it in a text buffer
* @buffer: buffer to be stored
* @address: address to lookup
@@ -403,7 +419,7 @@
*/
int sprint_backtrace(char *buffer, unsigned long address)
{
- return __sprint_symbol(buffer, address, -1);
+ return __sprint_symbol(buffer, address, -1, 1);
}
/* Look up a kernel symbol and print it to the kernel messages. */
diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c
index 4755b98..fb4e88d 100644
--- a/lib/spinlock_debug.c
+++ b/lib/spinlock_debug.c
@@ -61,7 +61,7 @@
printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n",
msg, raw_smp_processor_id(),
current->comm, task_pid_nr(current));
- printk(KERN_EMERG " lock: %p, .magic: %08x, .owner: %s/%d, "
+ printk(KERN_EMERG " lock: %ps, .magic: %08x, .owner: %s/%d, "
".owner_cpu: %d\n",
lock, lock->magic,
owner ? owner->comm : "<none>",
@@ -114,7 +114,7 @@
if (print_once) {
print_once = 0;
printk(KERN_EMERG "BUG: spinlock lockup on CPU#%d, "
- "%s/%d, %p\n",
+ "%s/%d, %ps\n",
raw_smp_processor_id(), current->comm,
task_pid_nr(current), lock);
dump_stack();
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 4365df3..44657bc 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -438,7 +438,7 @@
else if (ext != 'f' && ext != 's')
sprint_symbol(sym, value);
else
- kallsyms_lookup(value, NULL, NULL, NULL, sym);
+ sprint_symbol_no_offset(sym, value);
return string(buf, end, sym, spec);
#else
diff --git a/sound/soc/codecs/wcd9310.c b/sound/soc/codecs/wcd9310.c
index a2b8797..d2f58a5 100644
--- a/sound/soc/codecs/wcd9310.c
+++ b/sound/soc/codecs/wcd9310.c
@@ -5427,8 +5427,9 @@
return true;
}
+/* called under codec_resource_lock acquisition */
static int tabla_determine_button(const struct tabla_priv *priv,
- const s32 bias_mv)
+ const s32 micmv)
{
s16 *v_btn_low, *v_btn_high;
struct tabla_mbhc_btn_detect_cfg *btn_det;
@@ -5438,8 +5439,9 @@
v_btn_low = tabla_mbhc_cal_btn_det_mp(btn_det, TABLA_BTN_DET_V_BTN_LOW);
v_btn_high = tabla_mbhc_cal_btn_det_mp(btn_det,
TABLA_BTN_DET_V_BTN_HIGH);
+
for (i = 0; i < btn_det->num_btn; i++) {
- if ((v_btn_low[i] <= bias_mv) && (v_btn_high[i] >= bias_mv)) {
+ if ((v_btn_low[i] <= micmv) && (v_btn_high[i] >= micmv)) {
btn = i;
break;
}
@@ -5447,7 +5449,7 @@
if (btn == -1)
pr_debug("%s: couldn't find button number for mic mv %d\n",
- __func__, bias_mv);
+ __func__, micmv);
return btn;
}
@@ -5487,8 +5489,9 @@
static irqreturn_t tabla_dce_handler(int irq, void *data)
{
int i, mask;
- short dce, sta, bias_value_dce;
- s32 mv, stamv, bias_mv_dce;
+ short dce, sta;
+ s32 mv, mv_s, stamv_s;
+ bool vddio;
int btn = -1, meas = 0;
struct tabla_priv *priv = data;
const struct tabla_mbhc_btn_detect_cfg *d =
@@ -5527,6 +5530,10 @@
goto done;
}
+ vddio = (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
+ priv->mbhc_micbias_switched);
+ mv_s = vddio ? tabla_scale_v_micb_vddio(priv, mv, false) : mv;
+
if (mbhc_status != TABLA_MBHC_STATUS_REL_DETECTION) {
if (priv->mbhc_last_resume &&
!time_after(jiffies, priv->mbhc_last_resume + HZ)) {
@@ -5537,27 +5544,32 @@
pr_debug("%s: Button is already released without "
"resume", __func__);
sta = tabla_codec_read_sta_result(codec);
- stamv = tabla_codec_sta_dce_v(codec, 0, sta);
- btn = tabla_determine_button(priv, mv);
- if (btn != tabla_determine_button(priv, stamv))
+ stamv_s = tabla_codec_sta_dce_v(codec, 0, sta);
+ if (vddio)
+ stamv_s = tabla_scale_v_micb_vddio(priv,
+ stamv_s,
+ false);
+ btn = tabla_determine_button(priv, mv_s);
+ if (btn != tabla_determine_button(priv, stamv_s))
btn = -1;
goto done;
}
}
/* determine pressed button */
- btnmeas[meas++] = tabla_determine_button(priv, mv);
- pr_debug("%s: meas %d - DCE %d,%d, button %d\n", __func__,
- meas - 1, dce, mv, btnmeas[meas - 1]);
+ btnmeas[meas++] = tabla_determine_button(priv, mv_s);
+ pr_debug("%s: meas %d - DCE %d,%d,%d button %d\n", __func__,
+ meas - 1, dce, mv, mv_s, btnmeas[meas - 1]);
if (n_btn_meas == 0)
btn = btnmeas[0];
for (; ((d->n_btn_meas) && (meas < (d->n_btn_meas + 1))); meas++) {
- bias_value_dce = tabla_codec_sta_dce(codec, 1, false);
- bias_mv_dce = tabla_codec_sta_dce_v(codec, 1, bias_value_dce);
- btnmeas[meas] = tabla_determine_button(priv, bias_mv_dce);
- pr_debug("%s: meas %d - DCE %d,%d, button %d\n",
- __func__, meas, bias_value_dce, bias_mv_dce,
- btnmeas[meas]);
+ dce = tabla_codec_sta_dce(codec, 1, false);
+ mv = tabla_codec_sta_dce_v(codec, 1, dce);
+ mv_s = vddio ? tabla_scale_v_micb_vddio(priv, mv, false) : mv;
+
+ btnmeas[meas] = tabla_determine_button(priv, mv_s);
+ pr_debug("%s: meas %d - DCE %d,%d,%d button %d\n",
+ __func__, meas, dce, mv, mv_s, btnmeas[meas]);
/* if large enough measurements are collected,
* start to check if last all n_btn_con measurements were
* in same button low/high range */
diff --git a/sound/soc/msm/msm-pcm-routing.c b/sound/soc/msm/msm-pcm-routing.c
index 4bb9282..6bac324 100644
--- a/sound/soc/msm/msm-pcm-routing.c
+++ b/sound/soc/msm/msm-pcm-routing.c
@@ -47,6 +47,7 @@
static struct mutex routing_lock;
static int fm_switch_enable;
+static int fm_pcmrx_switch_enable;
#define INT_RX_VOL_MAX_STEPS 0x2000
#define INT_RX_VOL_GAIN 0x2000
@@ -594,6 +595,31 @@
return 1;
}
+static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable;
+ pr_debug("%s: FM Switch enable %ld\n", __func__,
+ ucontrol->value.integer.value[0]);
+ return 0;
+}
+
+static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ 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]);
+ if (ucontrol->value.integer.value[0])
+ snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
+ else
+ snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
+ fm_pcmrx_switch_enable = ucontrol->value.integer.value[0];
+ return 1;
+}
+
static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -1178,11 +1204,22 @@
msm_routing_put_port_mixer),
};
+static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = {
+ SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_AFE_PCM_RX,
+ MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
static const struct snd_kcontrol_new fm_switch_mixer_controls =
SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
0, 1, 0, msm_routing_get_switch_mixer,
msm_routing_put_switch_mixer);
+static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls =
+ SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
+ 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer,
+ msm_routing_put_fm_pcmrx_switch_mixer);
+
static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
INT_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
@@ -1452,6 +1489,8 @@
/* Switch Definitions */
SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
&fm_switch_mixer_controls),
+ SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0,
+ &pcm_rx_switch_mixer_controls),
/* Mixer definitions */
SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
@@ -1531,6 +1570,9 @@
SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
bt_sco_rx_port_mixer_controls,
ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer",
+ SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls,
+ ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)),
};
static const struct snd_soc_dapm_route intercon[] = {
@@ -1656,11 +1698,16 @@
{"INTFM_UL_HL", NULL, "INT_FM_TX"},
{"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
{"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
+ {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"},
+ {"PCM_RX", NULL, "PCM_RX_DL_HL"},
{"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
{"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
+ {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"},
+
{"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
{"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
diff --git a/sound/soc/msm/msm8960.c b/sound/soc/msm/msm8960.c
index d2f259c..de98aa3 100644
--- a/sound/soc/msm/msm8960.c
+++ b/sound/soc/msm/msm8960.c
@@ -649,21 +649,21 @@
btn_low = tabla_mbhc_cal_btn_det_mp(btn_cfg, TABLA_BTN_DET_V_BTN_LOW);
btn_high = tabla_mbhc_cal_btn_det_mp(btn_cfg, TABLA_BTN_DET_V_BTN_HIGH);
btn_low[0] = -50;
- btn_high[0] = 10;
- btn_low[1] = 11;
- btn_high[1] = 38;
- btn_low[2] = 39;
- btn_high[2] = 64;
- btn_low[3] = 65;
- btn_high[3] = 91;
- btn_low[4] = 92;
- btn_high[4] = 115;
- btn_low[5] = 116;
- btn_high[5] = 141;
- btn_low[6] = 142;
- btn_high[6] = 163;
- btn_low[7] = 164;
- btn_high[7] = 250;
+ btn_high[0] = 20;
+ btn_low[1] = 21;
+ btn_high[1] = 62;
+ btn_low[2] = 63;
+ btn_high[2] = 104;
+ btn_low[3] = 105;
+ btn_high[3] = 143;
+ btn_low[4] = 144;
+ btn_high[4] = 181;
+ btn_low[5] = 182;
+ btn_high[5] = 218;
+ btn_low[6] = 219;
+ btn_high[6] = 254;
+ btn_low[7] = 255;
+ btn_high[7] = 330;
n_ready = tabla_mbhc_cal_btn_det_mp(btn_cfg, TABLA_BTN_DET_N_READY);
n_ready[0] = 80;
n_ready[1] = 68;