Merge "msm_fb: display: Add BLT support to dsi command mode panel" into msm-3.4
diff --git a/Documentation/devicetree/bindings/gpio/gpio-msm.txt b/Documentation/devicetree/bindings/gpio/gpio-msm.txt
new file mode 100644
index 0000000..359d700
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-msm.txt
@@ -0,0 +1,39 @@
+MSM GPIO controller bindings
+
+Required properties:
+- compatible:
+ - "qcom,msm-gpio" for MSM controllers
+- #gpio-cells : Should be two.
+ - first cell is the pin number
+ - second cell is used to specify optional parameters (unused)
+- gpio-controller : Marks the device node as a GPIO controller.
+- #interrupt-cells : Should be 2.
+- interrupt-controller: Mark the device node as an interrupt controller
+
+Example:
+
+ msmgpio: gpio@fd510000 {
+ compatible = "qcom,msm-gpio";
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ reg = <0xfd510000 0x4000>;
+ };
+
+To specify gpios for a device:
+
+ device1@f991f000 {
+ compatible = "qcom,msm-device-v1";
+ reg = <0xf991f000 0x1000>;
+ gpios = <&msmgpio 45 0>;
+ cs-gpios = <&msmgpio 46 0>;
+ };
+
+45, 46 - gpio numbers.
+The driver for device1 can call of_get_gpio() to extract the
+gpio45. In order to extract gpio46, the driver needs to call
+of_get_named_gpio with "cs-gpios" as the name parameter.
+Please refer to the file: include/linux/of_gpio.h for the
+complete list of APIs the driver can use to extract gpio
+information from the device tree.
diff --git a/Documentation/devicetree/bindings/sound/taiko_codec.txt b/Documentation/devicetree/bindings/sound/taiko_codec.txt
new file mode 100644
index 0000000..9f3719b
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/taiko_codec.txt
@@ -0,0 +1,82 @@
+taiko audio CODEC
+
+Required properties:
+
+ - compatible : "qcom,taiko-slim-pgd"
+ - elemental-addr: codec slimbus slave PGD enumeration address.(48 bits)
+
+ - qcom,cdc-reset-gpio: gpio used for codec SOC reset.
+
+ - <supply-name>-supply: phandle to the regulator device tree node
+ - qcom,<supply-name>-voltage - specifies voltage levels for supply. Should be
+ specified in pairs (min, max), units mV.
+ - qcom,<supply-name>-current - specifies max current in mA that can drawn
+ from the <supply-name>.
+
+ above three properties with "supply-name" set to "qcom,cdc-vdd-buck", "qcom,cdc-vdd-tx-h",
+ "qcom,cdc-vdd-rx-h", "qcom,cdc-vddpx-1", "qcom,cdc-vdd-a-1p2v", "qcom,cdc-vddcx-1",
+ "qcom,cdc-vddcx-2" should be present.
+
+ - qcom,cdc-micbias-ldoh-v - LDOH output in volts ( should be 1.95 V and 3.00 V).
+
+ - qcom,cdc-micbias-cfilt1-mv - cfilt1 output voltage in milli volts.
+ - qcom,cdc-micbias-cfilt2-mv - cfilt2 output voltage in milli volts.
+ - qcom,cdc-micbias-cfilt3-mv - cfilt3 output voltage in milli volts.
+ cfilt volatge can be set to max of qcom,cdc-micbias-ldoh-v - 0.15V.
+
+ - qcom,cdc-micbias1-cfilt-sel = cfilt to use for micbias1 (should be from 1 to 3).
+ - qcom,cdc-micbias2-cfilt-sel = cfilt to use for micbias2 (should be from 1 to 3).
+ - qcom,cdc-micbias3-cfilt-sel = cfilt to use for micbias3 (should be from 1 to 3).
+ - qcom,cdc-micbias4-cfilt-sel = cfilt to use for micbias4 (should be from 1 to 3).
+
+ - qcom,cdc-slim-ifd-dev - namme of the codec slim interface device.
+ - qcom,cdc-slim-ifd-elemental-addr - codec slimbus slave interface device
+ enumeration address.
+Example:
+
+taiko_codec {
+ compatible = "qcom,taiko-slim-pgd";
+ elemental-addr = [00 01 A0 00 17 02];
+
+ qcom,cdc-reset-gpio = <&msmgpio 63 0>;
+
+ cdc-vdd-buck-supply = <&pm8941_s2>;
+ qcom,cdc-vdd-buck-voltage = <2150000 2150000>;
+ qcom,cdc-vdd-buck-current = <500000>;
+
+ cdc-vdd-tx-h-supply = <&pm8941_s3>;
+ qcom,cdc-vdd-tx-h-voltage = <1800000 1800000>;
+ qcom,cdc-vdd-tx-h-current = <200000>;
+
+ cdc-vdd-rx-h-supply = <&pm8941_s3>;
+ qcom,cdc-vdd-rx-h-voltage = <1800000 1800000>;
+ qcom,cdc-vdd-rx-h-current = <200000>;
+
+ cdc-vddpx-1-supply = <&pm8941_s3>;
+ qcom,cdc-vddpx-1-voltage = <1800000 1800000>;
+ qcom,cdc-vddpx-1-current = <5000>;
+
+ cdc-vdd-a-1p2v-supply = <&pm8941_l1>;
+ qcom,cdc-vdd-a-1p2v-voltage = <1225000 1225000>;
+ qcom,cdc-vdd-a-1p2v-current = <5000>;
+
+ cdc-vddcx-1-supply = <&pm8941_l1>;
+ qcom,cdc-vddcx-1-voltage = <1225000 1225000>;
+ qcom,cdc-vddcx-1-current = <5000>;
+
+ cdc-vddcx-2-supply = <&pm8941_l1>;
+ qcom,cdc-vddcx-2-voltage = <1225000 1225000>;
+ qcom,cdc-vddcx-2-current = <5000>;
+
+ qcom,cdc-micbias-ldoh-v = <0x3>;
+ qcom,cdc-micbias-cfilt1-mv = <1800>;
+ qcom,cdc-micbias-cfilt2-mv = <2700>;
+ qcom,cdc-micbias-cfilt3-mv = <1800>;
+ qcom,cdc-micbias1-cfilt-sel = <0x0>;
+ qcom,cdc-micbias2-cfilt-sel = <0x1>;
+ qcom,cdc-micbias3-cfilt-sel = <0x2>;
+ qcom,cdc-micbias4-cfilt-sel = <0x2>;
+
+ qcom,cdc-slim-ifd = "taiko-slim-ifd";
+ qcom,cdc-slim-ifd-elemental-addr = [00 00 A0 00 17 02];
+};
diff --git a/arch/arm/boot/dts/msm-pm8941.dtsi b/arch/arm/boot/dts/msm-pm8941.dtsi
index cb1ac34..67adcd6 100644
--- a/arch/arm/boot/dts/msm-pm8941.dtsi
+++ b/arch/arm/boot/dts/msm-pm8941.dtsi
@@ -425,7 +425,7 @@
#address-cells = <1>;
#size-cells = <1>;
compatible = "qcom,qpnp-regulator";
- reg = <0x1400 0x300>;
+ reg = <0x1a00 0x300>;
status = "disabled";
qcom,ctl@1a00 {
diff --git a/arch/arm/boot/dts/msm8974-regulator.dtsi b/arch/arm/boot/dts/msm8974-regulator.dtsi
index a187223..5c8fd9a 100644
--- a/arch/arm/boot/dts/msm8974-regulator.dtsi
+++ b/arch/arm/boot/dts/msm8974-regulator.dtsi
@@ -38,45 +38,8 @@
status = "okay";
};
};
-
- qcom,pm8841@5 {
-
- pm8841_s5: regulator@2000 {
- regulator-min-microvolt = <850000>;
- regulator-max-microvolt = <1100000>;
- qcom,enable-time = <500>;
- qcom,pull-down-enable = <1>;
- regulator-always-on;
- status = "okay";
- };
-
- pm8841_s6: regulator@2300 {
- regulator-min-microvolt = <850000>;
- regulator-max-microvolt = <1100000>;
- qcom,enable-time = <500>;
- qcom,pull-down-enable = <1>;
- status = "okay";
- };
-
- pm8841_s7: regulator@2600 {
- regulator-min-microvolt = <850000>;
- regulator-max-microvolt = <1100000>;
- qcom,enable-time = <500>;
- qcom,pull-down-enable = <1>;
- status = "okay";
- };
-
- pm8841_s8: regulator@2900 {
- regulator-min-microvolt = <850000>;
- regulator-max-microvolt = <1100000>;
- qcom,enable-time = <500>;
- qcom,pull-down-enable = <1>;
- status = "okay";
- };
- };
};
-
/* RPM controlled regulators: */
&rpm_bus {
diff --git a/arch/arm/boot/dts/msm8974.dtsi b/arch/arm/boot/dts/msm8974.dtsi
index e3dad4f..446f310 100644
--- a/arch/arm/boot/dts/msm8974.dtsi
+++ b/arch/arm/boot/dts/msm8974.dtsi
@@ -33,10 +33,11 @@
msmgpio: gpio@fd510000 {
compatible = "qcom,msm-gpio";
+ gpio-controller;
+ #gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
reg = <0xfd510000 0x4000>;
- #gpio-cells = <2>;
};
timer {
diff --git a/arch/arm/boot/dts/msm9625.dts b/arch/arm/boot/dts/msm9625.dts
index deddc5f..42425ed 100644
--- a/arch/arm/boot/dts/msm9625.dts
+++ b/arch/arm/boot/dts/msm9625.dts
@@ -37,6 +37,8 @@
msmgpio: gpio@fd510000 {
compatible = "qcom,msm-gpio";
+ gpio-controller;
+ #gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
reg = <0xfd510000 0x4000>;
diff --git a/arch/arm/configs/msm8974_defconfig b/arch/arm/configs/msm8974_defconfig
index 1a6c134..da7bfd4 100644
--- a/arch/arm/configs/msm8974_defconfig
+++ b/arch/arm/configs/msm8974_defconfig
@@ -67,7 +67,6 @@
CONFIG_HIGHMEM=y
CONFIG_VMALLOC_RESERVE=0x19000000
CONFIG_USE_OF=y
-CONFIG_ARM_APPENDED_DTB=y
CONFIG_ARM_ATAG_DTB_COMPAT=y
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index ca3e996..7d26726 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -541,7 +541,8 @@
dump_stack();
pr_info("\nsending IPI to all other CPUs:\n");
- smp_cross_call(&backtrace_mask, IPI_CPU_BACKTRACE);
+ if (!cpus_empty(backtrace_mask))
+ smp_cross_call(&backtrace_mask, IPI_CPU_BACKTRACE);
/* Wait for up to 10 seconds for all other CPUs to do the backtrace */
for (i = 0; i < 10 * 1000; i++) {
diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c
index 4b4e006..665b861 100644
--- a/arch/arm/mach-msm/board-8064.c
+++ b/arch/arm/mach-msm/board-8064.c
@@ -2913,6 +2913,7 @@
static void __init apq8064_common_init(void)
{
u32 platform_version;
+ platform_device_register(&msm_gpio_device);
msm_tsens_early_init(&apq_tsens_pdata);
msm_thermal_init(&msm_thermal_pdata);
if (socinfo_init() < 0)
diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c
index 444580f..b80d62d 100644
--- a/arch/arm/mach-msm/board-8930.c
+++ b/arch/arm/mach-msm/board-8930.c
@@ -2572,6 +2572,7 @@
if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
pr_err("meminfo_init() failed!\n");
+ platform_device_register(&msm_gpio_device);
msm_tsens_early_init(&msm_tsens_pdata);
msm_thermal_init(&msm_thermal_pdata);
BUG_ON(msm_rpm_init(&msm8930_rpm_data));
diff --git a/arch/arm/mach-msm/board-8960.c b/arch/arm/mach-msm/board-8960.c
index 7d88ea6..ad788bc 100644
--- a/arch/arm/mach-msm/board-8960.c
+++ b/arch/arm/mach-msm/board-8960.c
@@ -3082,6 +3082,7 @@
if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
pr_err("meminfo_init() failed!\n");
+ platform_device_register(&msm_gpio_device);
msm_tsens_early_init(&msm_tsens_pdata);
msm_thermal_init(&msm_thermal_pdata);
BUG_ON(msm_rpm_init(&msm8960_rpm_data));
diff --git a/arch/arm/mach-msm/board-8974.c b/arch/arm/mach-msm/board-8974.c
index 1049bcb..1b75a0a 100644
--- a/arch/arm/mach-msm/board-8974.c
+++ b/arch/arm/mach-msm/board-8974.c
@@ -487,6 +487,34 @@
OF_DEV_AUXDATA("qcom,pil-mba", 0xFC820000, "pil-mba", NULL),
OF_DEV_AUXDATA("qcom,pil-pronto", 0xFB21B000, \
"pil_pronto", NULL),
+ OF_DEV_AUXDATA("arm,coresight-tmc", 0xFC322000, \
+ "coresight-tmc-etr", NULL),
+ OF_DEV_AUXDATA("arm,coresight-tpiu", 0xFC318000, \
+ "coresight-tpiu", NULL),
+ OF_DEV_AUXDATA("qcom,coresight-replicator", 0xFC31C000, \
+ "coresight-replicator", NULL),
+ OF_DEV_AUXDATA("arm,coresight-tmc", 0xFC307000, \
+ "coresight-tmc-etf", NULL),
+ OF_DEV_AUXDATA("arm,coresight-funnel", 0xFC31B000, \
+ "coresight-funnel-merg", NULL),
+ OF_DEV_AUXDATA("arm,coresight-funnel", 0xFC319000, \
+ "coresight-funnel-in0", NULL),
+ OF_DEV_AUXDATA("arm,coresight-funnel", 0xFC31A000, \
+ "coresight-funnel-in1", NULL),
+ OF_DEV_AUXDATA("arm,coresight-funnel", 0xFC345000, \
+ "coresight-funnel-kpss", NULL),
+ OF_DEV_AUXDATA("arm,coresight-funnel", 0xFC364000, \
+ "coresight-funnel-mmss", NULL),
+ OF_DEV_AUXDATA("arm,coresight-stm", 0xFC321000, \
+ "coresight-stm", NULL),
+ OF_DEV_AUXDATA("arm,coresight-etm", 0xFC33C000, \
+ "coresight-etm0", NULL),
+ OF_DEV_AUXDATA("arm,coresight-etm", 0xFC33D000, \
+ "coresight-etm1", NULL),
+ OF_DEV_AUXDATA("arm,coresight-etm", 0xFC33E000, \
+ "coresight-etm2", NULL),
+ OF_DEV_AUXDATA("arm,coresight-etm", 0xFC33F000, \
+ "coresight-etm3", NULL),
OF_DEV_AUXDATA("qcom,msm-rng", 0xF9BFF000, \
"msm_rng", NULL),
OF_DEV_AUXDATA("qcom,qseecom", 0xFE806000, \
diff --git a/arch/arm/mach-msm/board-9615.c b/arch/arm/mach-msm/board-9615.c
index a312e2b..f885774 100644
--- a/arch/arm/mach-msm/board-9615.c
+++ b/arch/arm/mach-msm/board-9615.c
@@ -976,6 +976,7 @@
msm_android_usb_hsic_device.dev.platform_data;
msm9615_device_init();
+ platform_device_register(&msm_gpio_device);
msm9615_init_gpiomux();
msm9615_i2c_init();
regulator_suppress_info_printing();
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c
index 50b1ac5..38f1170 100644
--- a/arch/arm/mach-msm/board-msm8x60.c
+++ b/arch/arm/mach-msm/board-msm8x60.c
@@ -10213,6 +10213,7 @@
#endif
pmic_reset_irq = PM8058_IRQ_BASE + PM8058_RESOUT_IRQ;
+ platform_device_register(&msm_gpio_device);
/*
* Initialize RPM first as other drivers and devices may need
* it for their initialization.
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index e07301a..680770e 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -4017,6 +4017,11 @@
},
};
+struct platform_device msm_gpio_device = {
+ .name = "msmgpio",
+ .id = -1,
+};
+
struct platform_device mdm_sglte_device = {
.name = "mdm2_modem",
.id = -1,
diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c
index 9f03878..fff8e0d 100644
--- a/arch/arm/mach-msm/devices-9615.c
+++ b/arch/arm/mach-msm/devices-9615.c
@@ -1372,6 +1372,10 @@
},
};
+struct platform_device msm_gpio_device = {
+ .name = "msmgpio",
+ .id = -1,
+};
void __init msm9615_device_init(void)
{
@@ -1382,7 +1386,6 @@
msm_rpmrs_levels[0].latency_us;
msm_android_usb_hsic_pdata.swfi_latency =
msm_rpmrs_levels[0].latency_us;
-
}
#define MSM_SHARED_RAM_PHYS 0x40000000
diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c
index 9ea817f..5402251 100644
--- a/arch/arm/mach-msm/devices-msm8x60.c
+++ b/arch/arm/mach-msm/devices-msm8x60.c
@@ -100,6 +100,11 @@
#define MSM_UART9DM_PHYS (MSM_GSBI9_PHYS + 0x40000)
#define INT_UART9DM_IRQ GSBI9_UARTDM_IRQ
+struct platform_device msm_gpio_device = {
+ .name = "msmgpio",
+ .id = -1,
+};
+
static void charm_ap2mdm_kpdpwr_on(void)
{
gpio_direction_output(AP2MDM_PMIC_RESET_N, 0);
diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h
index 6726e60..8e2ab7d 100644
--- a/arch/arm/mach-msm/devices.h
+++ b/arch/arm/mach-msm/devices.h
@@ -436,3 +436,5 @@
extern struct platform_device msm8930aa_device_acpuclk;
extern struct platform_device msm8960_device_acpuclk;
extern struct platform_device msm9615_device_acpuclk;
+
+extern struct platform_device msm_gpio_device;
diff --git a/arch/arm/mach-msm/pil-q6v5.c b/arch/arm/mach-msm/pil-q6v5.c
index a362a7e3..d6ad2aa3 100644
--- a/arch/arm/mach-msm/pil-q6v5.c
+++ b/arch/arm/mach-msm/pil-q6v5.c
@@ -30,6 +30,7 @@
#define QDSP6SS_RESET 0x014
#define QDSP6SS_GFMUX_CTL 0x020
#define QDSP6SS_PWR_CTL 0x030
+#define QDSP6SS_CGC_OVERRIDE 0x034
/* AXI Halt Register Offsets */
#define AXI_HALTREQ 0x0
@@ -39,15 +40,15 @@
#define HALT_ACK_TIMEOUT_US 100000
/* QDSP6SS_RESET */
+#define Q6SS_STOP_CORE BIT(0)
#define Q6SS_CORE_ARES BIT(1)
-#define Q6SS_ETM_ISDB_ARES BIT(3)
-#define Q6SS_STOP_CORE BIT(4)
+#define Q6SS_BUS_ARES_ENA BIT(2)
/* QDSP6SS_GFMUX_CTL */
#define Q6SS_CLK_ENA BIT(1)
/* QDSP6SS_PWR_CTL */
-#define Q6SS_L2DATA_SLP_NRET_N BIT(0)
+#define Q6SS_L2DATA_SLP_NRET_N (BIT(0)|BIT(1)|BIT(2))
#define Q6SS_L2TAG_SLP_NRET_N BIT(16)
#define Q6SS_ETB_SLP_NRET_N BIT(17)
#define Q6SS_L2DATA_STBY_N BIT(18)
@@ -55,6 +56,10 @@
#define Q6SS_CLAMP_IO BIT(20)
#define QDSS_BHS_ON BIT(21)
+/* QDSP6SS_CGC_OVERRIDE */
+#define Q6SS_CORE_CLK_EN BIT(0)
+#define Q6SS_CORE_RCLK_EN BIT(1)
+
int pil_q6v5_make_proxy_votes(struct pil_desc *pil)
{
int ret;
@@ -174,7 +179,7 @@
/* Assert Q6 resets */
val = readl_relaxed(drv->reg_base + QDSP6SS_RESET);
- val = (Q6SS_CORE_ARES | Q6SS_ETM_ISDB_ARES);
+ val = (Q6SS_CORE_ARES | Q6SS_BUS_ARES_ENA);
writel_relaxed(val, drv->reg_base + QDSP6SS_RESET);
/* Kill power at block headswitch (affects LPASS only) */
@@ -191,7 +196,7 @@
/* Assert resets, stop core */
val = readl_relaxed(drv->reg_base + QDSP6SS_RESET);
- val |= (Q6SS_CORE_ARES | Q6SS_ETM_ISDB_ARES | Q6SS_STOP_CORE);
+ val |= (Q6SS_CORE_ARES | Q6SS_BUS_ARES_ENA | Q6SS_STOP_CORE);
writel_relaxed(val, drv->reg_base + QDSP6SS_RESET);
/* Enable power block headswitch (only affects LPASS) */
@@ -211,9 +216,15 @@
writel_relaxed(val, drv->reg_base + QDSP6SS_PWR_CTL);
/* Bring core out of reset */
- val = Q6SS_STOP_CORE;
+ val = readl_relaxed(drv->reg_base + QDSP6SS_RESET);
+ val &= ~Q6SS_CORE_ARES;
writel_relaxed(val, drv->reg_base + QDSP6SS_RESET);
+ /* Disable clock gating for core and rclk */
+ val = readl_relaxed(drv->reg_base + QDSP6SS_CGC_OVERRIDE);
+ val |= Q6SS_CORE_RCLK_EN | Q6SS_CORE_CLK_EN;
+ writel_relaxed(val, drv->reg_base + QDSP6SS_CGC_OVERRIDE);
+
/* Turn on core clock */
val = readl_relaxed(drv->reg_base + QDSP6SS_GFMUX_CTL);
val |= Q6SS_CLK_ENA;
diff --git a/drivers/char/msm_rotator.c b/drivers/char/msm_rotator.c
index 4d34362..6f3b79b 100644
--- a/drivers/char/msm_rotator.c
+++ b/drivers/char/msm_rotator.c
@@ -421,6 +421,7 @@
break;
case MDP_Y_CRCB_H2V1:
case MDP_Y_CBCR_H2V1:
+ case MDP_Y_CRCB_H1V2:
p->num_planes = 2;
p->plane_size[0] = w * h;
p->plane_size[1] = w * h;
@@ -651,9 +652,12 @@
int bpp;
uint32_t dst_format;
- if (info->src.format == MDP_YCRYCB_H2V1)
- dst_format = MDP_Y_CRCB_H2V1;
- else
+ if (info->src.format == MDP_YCRYCB_H2V1) {
+ if (info->rotations & MDP_ROT_90)
+ dst_format = MDP_Y_CRCB_H1V2;
+ else
+ dst_format = MDP_Y_CRCB_H2V1;
+ } else
return -EINVAL;
if (info->dst.format != dst_format)
@@ -1286,7 +1290,10 @@
info.dst.format = info.src.format;
break;
case MDP_YCRYCB_H2V1:
- info.dst.format = MDP_Y_CRCB_H2V1;
+ if (info.rotations & MDP_ROT_90)
+ info.dst.format = MDP_Y_CRCB_H1V2;
+ else
+ info.dst.format = MDP_Y_CRCB_H2V1;
break;
case MDP_Y_CB_CR_H2V2:
case MDP_Y_CBCR_H2V2_TILE:
diff --git a/drivers/coresight/Makefile b/drivers/coresight/Makefile
index 2ee2093..76aef4c 100644
--- a/drivers/coresight/Makefile
+++ b/drivers/coresight/Makefile
@@ -1,2 +1,2 @@
-obj-$(CONFIG_MSM_QDSS) += coresight.o coresight-etb.o coresight-tpiu.o coresight-funnel.o coresight-stm.o coresight-etm.o
+obj-$(CONFIG_MSM_QDSS) += coresight.o coresight-tpiu.o coresight-etb.o coresight-funnel.o coresight-replicator.o coresight-stm.o coresight-etm.o
diff --git a/drivers/coresight/coresight-etb.c b/drivers/coresight/coresight-etb.c
index 30f4d0c..a9283ee2 100644
--- a/drivers/coresight/coresight-etb.c
+++ b/drivers/coresight/coresight-etb.c
@@ -343,58 +343,41 @@
static int __devinit etb_probe(struct platform_device *pdev)
{
int ret;
+ struct device *dev = &pdev->dev;
struct etb_drvdata *drvdata;
struct resource *res;
struct coresight_desc *desc;
- drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata) {
- ret = -ENOMEM;
- goto err_kzalloc_drvdata;
- }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- ret = -EINVAL;
- goto err_res;
- }
- drvdata->base = ioremap_nocache(res->start, resource_size(res));
- if (!drvdata->base) {
- ret = -EINVAL;
- goto err_ioremap;
- }
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
drvdata->dev = &pdev->dev;
platform_set_drvdata(pdev, drvdata);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+
spin_lock_init(&drvdata->spinlock);
- drvdata->clk = clk_get(drvdata->dev, "core_clk");
- if (IS_ERR(drvdata->clk)) {
- ret = PTR_ERR(drvdata->clk);
- goto err_clk_get;
- }
-
+ drvdata->clk = devm_clk_get(dev, "core_clk");
+ if (IS_ERR(drvdata->clk))
+ return PTR_ERR(drvdata->clk);
ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
if (ret)
- goto err_clk_rate;
+ return ret;
- drvdata->buf = kzalloc(ETB_SIZE_WORDS * BYTES_PER_WORD, GFP_KERNEL);
- if (!drvdata->buf) {
- ret = -ENOMEM;
- goto err_kzalloc_buf;
- }
- drvdata->miscdev.name = ((struct coresight_platform_data *)
- (pdev->dev.platform_data))->name;
- drvdata->miscdev.minor = MISC_DYNAMIC_MINOR;
- drvdata->miscdev.fops = &etb_fops;
- ret = misc_register(&drvdata->miscdev);
- if (ret)
- goto err_misc_register;
+ drvdata->buf = devm_kzalloc(dev, ETB_SIZE_WORDS * BYTES_PER_WORD,
+ GFP_KERNEL);
+ if (!drvdata->buf)
+ return -ENOMEM;
- desc = kzalloc(sizeof(*desc), GFP_KERNEL);
- if (!desc) {
- ret = -ENOMEM;
- goto err_kzalloc_desc;
- }
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
desc->type = CORESIGHT_DEV_TYPE_SINK;
desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
desc->ops = &etb_cs_ops;
@@ -403,30 +386,21 @@
desc->groups = etb_attr_grps;
desc->owner = THIS_MODULE;
drvdata->csdev = coresight_register(desc);
- if (IS_ERR(drvdata->csdev)) {
- ret = PTR_ERR(drvdata->csdev);
- goto err_coresight_register;
- }
- kfree(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
- dev_info(drvdata->dev, "ETB initialized\n");
+ drvdata->miscdev.name = ((struct coresight_platform_data *)
+ (pdev->dev.platform_data))->name;
+ drvdata->miscdev.minor = MISC_DYNAMIC_MINOR;
+ drvdata->miscdev.fops = &etb_fops;
+ ret = misc_register(&drvdata->miscdev);
+ if (ret)
+ goto err;
+
+ dev_info(dev, "ETB initialized\n");
return 0;
-err_coresight_register:
- kfree(desc);
-err_kzalloc_desc:
- misc_deregister(&drvdata->miscdev);
-err_misc_register:
- kfree(drvdata->buf);
-err_kzalloc_buf:
-err_clk_rate:
- clk_put(drvdata->clk);
-err_clk_get:
- iounmap(drvdata->base);
-err_ioremap:
-err_res:
- kfree(drvdata);
-err_kzalloc_drvdata:
- dev_err(drvdata->dev, "ETB init failed\n");
+err:
+ coresight_unregister(drvdata->csdev);
return ret;
}
@@ -434,12 +408,8 @@
{
struct etb_drvdata *drvdata = platform_get_drvdata(pdev);
- coresight_unregister(drvdata->csdev);
misc_deregister(&drvdata->miscdev);
- kfree(drvdata->buf);
- clk_put(drvdata->clk);
- iounmap(drvdata->base);
- kfree(drvdata);
+ coresight_unregister(drvdata->csdev);
return 0;
}
diff --git a/drivers/coresight/coresight-etm.c b/drivers/coresight/coresight-etm.c
index 020e542..d7f657d 100644
--- a/drivers/coresight/coresight-etm.c
+++ b/drivers/coresight/coresight-etm.c
@@ -1505,59 +1505,54 @@
static int __devinit etm_probe(struct platform_device *pdev)
{
int ret;
+ struct device *dev = &pdev->dev;
struct etm_drvdata *drvdata;
struct resource *res;
static int etm_count;
struct coresight_desc *desc;
- drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata) {
- ret = -ENOMEM;
- goto err_kzalloc_drvdata;
- }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- ret = -EINVAL;
- goto err_res;
- }
- drvdata->base = ioremap_nocache(res->start, resource_size(res));
- if (!drvdata->base) {
- ret = -EINVAL;
- goto err_ioremap;
- }
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
drvdata->dev = &pdev->dev;
platform_set_drvdata(pdev, drvdata);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+
mutex_init(&drvdata->mutex);
wake_lock_init(&drvdata->wake_lock, WAKE_LOCK_SUSPEND, "coresight-etm");
pm_qos_add_request(&drvdata->qos_req, PM_QOS_CPU_DMA_LATENCY,
PM_QOS_DEFAULT_VALUE);
- drvdata->cpu = etm_count++;
- drvdata->clk = clk_get(drvdata->dev, "core_clk");
+ drvdata->clk = devm_clk_get(dev, "core_clk");
if (IS_ERR(drvdata->clk)) {
ret = PTR_ERR(drvdata->clk);
- goto err_clk_get;
+ goto err0;
}
-
ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
if (ret)
- goto err_clk_rate;
+ goto err0;
+
+ drvdata->cpu = etm_count++;
+
ret = clk_prepare_enable(drvdata->clk);
if (ret)
- goto err_clk_enable;
-
+ goto err0;
ret = etm_init_arch_data(drvdata);
if (ret)
- goto err_arch;
+ goto err1;
etm_init_default_data(drvdata);
-
clk_disable_unprepare(drvdata->clk);
- desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
if (!desc) {
ret = -ENOMEM;
- goto err_kzalloc_desc;
+ goto err0;
}
desc->type = CORESIGHT_DEV_TYPE_SOURCE;
desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
@@ -1569,34 +1564,21 @@
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev);
- goto err_coresight_register;
+ goto err0;
}
- kfree(desc);
- dev_info(drvdata->dev, "ETM initialized\n");
+ dev_info(dev, "ETM initialized\n");
if (boot_enable)
coresight_enable(drvdata->csdev);
return 0;
-err_coresight_register:
- kfree(desc);
-err_kzalloc_desc:
-err_arch:
+err1:
clk_disable_unprepare(drvdata->clk);
-err_clk_enable:
-err_clk_rate:
- clk_put(drvdata->clk);
-err_clk_get:
+err0:
pm_qos_remove_request(&drvdata->qos_req);
wake_lock_destroy(&drvdata->wake_lock);
mutex_destroy(&drvdata->mutex);
- iounmap(drvdata->base);
-err_ioremap:
-err_res:
- kfree(drvdata);
-err_kzalloc_drvdata:
- dev_err(drvdata->dev, "ETM init failed\n");
return ret;
}
@@ -1605,12 +1587,9 @@
struct etm_drvdata *drvdata = platform_get_drvdata(pdev);
coresight_unregister(drvdata->csdev);
- clk_put(drvdata->clk);
pm_qos_remove_request(&drvdata->qos_req);
wake_lock_destroy(&drvdata->wake_lock);
mutex_destroy(&drvdata->mutex);
- iounmap(drvdata->base);
- kfree(drvdata);
return 0;
}
diff --git a/drivers/coresight/coresight-funnel.c b/drivers/coresight/coresight-funnel.c
index 333a07c..5072f7a 100644
--- a/drivers/coresight/coresight-funnel.c
+++ b/drivers/coresight/coresight-funnel.c
@@ -172,43 +172,34 @@
static int __devinit funnel_probe(struct platform_device *pdev)
{
int ret;
+ struct device *dev = &pdev->dev;
struct funnel_drvdata *drvdata;
struct resource *res;
struct coresight_desc *desc;
- drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata) {
- ret = -ENOMEM;
- goto err_kzalloc_drvdata;
- }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- ret = -EINVAL;
- goto err_res;
- }
- drvdata->base = ioremap_nocache(res->start, resource_size(res));
- if (!drvdata->base) {
- ret = -EINVAL;
- goto err_ioremap;
- }
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
drvdata->dev = &pdev->dev;
platform_set_drvdata(pdev, drvdata);
- drvdata->clk = clk_get(drvdata->dev, "core_clk");
- if (IS_ERR(drvdata->clk)) {
- ret = PTR_ERR(drvdata->clk);
- goto err_clk_get;
- }
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+ drvdata->clk = devm_clk_get(dev, "core_clk");
+ if (IS_ERR(drvdata->clk))
+ return PTR_ERR(drvdata->clk);
ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
if (ret)
- goto err_clk_rate;
+ return ret;
- desc = kzalloc(sizeof(*desc), GFP_KERNEL);
- if (!desc) {
- ret = -ENOMEM;
- goto err_kzalloc_desc;
- }
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
desc->type = CORESIGHT_DEV_TYPE_LINK;
desc->subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
desc->ops = &funnel_cs_ops;
@@ -217,27 +208,11 @@
desc->groups = funnel_attr_grps;
desc->owner = THIS_MODULE;
drvdata->csdev = coresight_register(desc);
- if (IS_ERR(drvdata->csdev)) {
- ret = PTR_ERR(drvdata->csdev);
- goto err_coresight_register;
- }
- kfree(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
- dev_info(drvdata->dev, "FUNNEL initialized\n");
+ dev_info(dev, "FUNNEL initialized\n");
return 0;
-err_coresight_register:
- kfree(desc);
-err_kzalloc_desc:
-err_clk_rate:
- clk_put(drvdata->clk);
-err_clk_get:
- iounmap(drvdata->base);
-err_ioremap:
-err_res:
- kfree(drvdata);
-err_kzalloc_drvdata:
- dev_err(drvdata->dev, "FUNNEL init failed\n");
- return ret;
}
static int __devexit funnel_remove(struct platform_device *pdev)
@@ -245,9 +220,6 @@
struct funnel_drvdata *drvdata = platform_get_drvdata(pdev);
coresight_unregister(drvdata->csdev);
- clk_put(drvdata->clk);
- iounmap(drvdata->base);
- kfree(drvdata);
return 0;
}
diff --git a/drivers/coresight/coresight-replicator.c b/drivers/coresight/coresight-replicator.c
new file mode 100644
index 0000000..7fe355d
--- /dev/null
+++ b/drivers/coresight/coresight-replicator.c
@@ -0,0 +1,204 @@
+/* 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
+ * 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/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/clk.h>
+#include <linux/coresight.h>
+
+#include "coresight-priv.h"
+
+
+#define replicator_writel(drvdata, val, off) \
+ __raw_writel((val), drvdata->base + off)
+#define replicator_readl(drvdata, off) \
+ __raw_readl(drvdata->base + off)
+
+#define REPLICATOR_LOCK(drvdata) \
+do { \
+ mb(); \
+ replicator_writel(drvdata, 0x0, CORESIGHT_LAR); \
+} while (0)
+#define REPLICATOR_UNLOCK(drvdata) \
+do { \
+ replicator_writel(drvdata, CORESIGHT_UNLOCK, CORESIGHT_LAR); \
+ mb(); \
+} while (0)
+
+
+#define REPLICATOR_IDFILTER0 (0x000)
+#define REPLICATOR_IDFILTER1 (0x004)
+#define REPLICATOR_ITATBCTR0 (0xEFC)
+#define REPLICATOR_ITATBCTR1 (0xEF8)
+
+
+struct replicator_drvdata {
+ void __iomem *base;
+ struct device *dev;
+ struct coresight_device *csdev;
+ struct clk *clk;
+};
+
+
+static void __replicator_enable(struct replicator_drvdata *drvdata, int outport)
+{
+ REPLICATOR_UNLOCK(drvdata);
+
+ if (outport == 0) {
+ replicator_writel(drvdata, 0x0, REPLICATOR_IDFILTER0);
+ replicator_writel(drvdata, 0xFF, REPLICATOR_IDFILTER1);
+ } else {
+ replicator_writel(drvdata, 0x0, REPLICATOR_IDFILTER1);
+ replicator_writel(drvdata, 0xFF, REPLICATOR_IDFILTER0);
+ }
+
+ REPLICATOR_LOCK(drvdata);
+}
+
+static int replicator_enable(struct coresight_device *csdev, int inport,
+ int outport)
+{
+ struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+ int ret;
+
+ ret = clk_prepare_enable(drvdata->clk);
+ if (ret)
+ return ret;
+
+ __replicator_enable(drvdata, outport);
+
+ dev_info(drvdata->dev, "REPLICATOR enabled\n");
+ return 0;
+}
+
+static void __replicator_disable(struct replicator_drvdata *drvdata,
+ int outport)
+{
+ REPLICATOR_UNLOCK(drvdata);
+
+ if (outport == 0)
+ replicator_writel(drvdata, 0xFF, REPLICATOR_IDFILTER0);
+ else
+ replicator_writel(drvdata, 0xFF, REPLICATOR_IDFILTER1);
+
+ REPLICATOR_LOCK(drvdata);
+}
+
+static void replicator_disable(struct coresight_device *csdev, int inport,
+ int outport)
+{
+ struct replicator_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+
+ __replicator_disable(drvdata, outport);
+
+ clk_disable_unprepare(drvdata->clk);
+
+ dev_info(drvdata->dev, "REPLICATOR disabled\n");
+}
+
+static const struct coresight_ops_link replicator_link_ops = {
+ .enable = replicator_enable,
+ .disable = replicator_disable,
+};
+
+static const struct coresight_ops replicator_cs_ops = {
+ .link_ops = &replicator_link_ops,
+};
+
+static int __devinit replicator_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct device *dev = &pdev->dev;
+ struct replicator_drvdata *drvdata;
+ struct resource *res;
+ struct coresight_desc *desc;
+
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+ drvdata->dev = &pdev->dev;
+ platform_set_drvdata(pdev, drvdata);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+
+ drvdata->clk = devm_clk_get(dev, "core_clk");
+ if (IS_ERR(drvdata->clk))
+ return PTR_ERR(drvdata->clk);
+ ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
+ if (ret)
+ return ret;
+
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+ desc->type = CORESIGHT_DEV_TYPE_LINK;
+ desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
+ desc->ops = &replicator_cs_ops;
+ desc->pdata = pdev->dev.platform_data;
+ desc->dev = &pdev->dev;
+ desc->owner = THIS_MODULE;
+ drvdata->csdev = coresight_register(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ dev_info(dev, "REPLICATOR initialized\n");
+ return 0;
+}
+
+static int __devexit replicator_remove(struct platform_device *pdev)
+{
+ struct replicator_drvdata *drvdata = platform_get_drvdata(pdev);
+
+ coresight_unregister(drvdata->csdev);
+ return 0;
+}
+
+static struct of_device_id replicator_match[] = {
+ {.compatible = "coresight-replicator"},
+ {}
+};
+
+static struct platform_driver replicator_driver = {
+ .probe = replicator_probe,
+ .remove = __devexit_p(replicator_remove),
+ .driver = {
+ .name = "coresight-replicator",
+ .owner = THIS_MODULE,
+ .of_match_table = replicator_match,
+ },
+};
+
+static int __init replicator_init(void)
+{
+ return platform_driver_register(&replicator_driver);
+}
+module_init(replicator_init);
+
+static void __exit replicator_exit(void)
+{
+ platform_driver_unregister(&replicator_driver);
+}
+module_exit(replicator_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("CoreSight Replicator driver");
diff --git a/drivers/coresight/coresight-stm.c b/drivers/coresight/coresight-stm.c
index 22928aa..242418c 100644
--- a/drivers/coresight/coresight-stm.c
+++ b/drivers/coresight/coresight-stm.c
@@ -426,34 +426,30 @@
static int __devinit stm_probe(struct platform_device *pdev)
{
int ret;
+ struct device *dev = &pdev->dev;
struct stm_drvdata *drvdata;
struct resource *res;
size_t res_size, bitmap_size;
struct coresight_desc *desc;
- drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata) {
- ret = -ENOMEM;
- goto err_kzalloc_drvdata;
- }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- ret = -EINVAL;
- goto err_res0;
- }
- drvdata->base = ioremap_nocache(res->start, resource_size(res));
- if (!drvdata->base) {
- ret = -EINVAL;
- goto err_ioremap0;
- }
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+ /* Store the driver data pointer for use in exported functions */
+ stmdrvdata = drvdata;
drvdata->dev = &pdev->dev;
platform_set_drvdata(pdev, drvdata);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
- if (!res) {
- ret = -EINVAL;
- goto err_res1;
- }
+ if (!res)
+ return -ENODEV;
if (boot_nr_channel) {
res_size = min((resource_size_t)(boot_nr_channel *
BYTES_PER_CHANNEL), resource_size(res));
@@ -463,44 +459,25 @@
BYTES_PER_CHANNEL), resource_size(res));
bitmap_size = NR_STM_CHANNEL * sizeof(long);
}
- drvdata->chs.bitmap = kzalloc(bitmap_size, GFP_KERNEL);
- if (!drvdata->chs.bitmap) {
- ret = -ENOMEM;
- goto err_kzalloc_bitmap;
- }
- drvdata->chs.base = ioremap_nocache(res->start, res_size);
- if (!drvdata->chs.base) {
- ret = -EINVAL;
- goto err_ioremap1;
- }
- /* Store the driver data pointer for use in exported functions */
- stmdrvdata = drvdata;
+ drvdata->chs.base = devm_ioremap(dev, res->start, res_size);
+ if (!drvdata->chs.base)
+ return -ENOMEM;
+ drvdata->chs.bitmap = devm_kzalloc(dev, bitmap_size, GFP_KERNEL);
+ if (!drvdata->chs.bitmap)
+ return -ENOMEM;
- drvdata->clk = clk_get(drvdata->dev, "core_clk");
- if (IS_ERR(drvdata->clk)) {
- ret = PTR_ERR(drvdata->clk);
- goto err_clk_get;
- }
-
+ drvdata->clk = devm_clk_get(dev, "core_clk");
+ if (IS_ERR(drvdata->clk))
+ return PTR_ERR(drvdata->clk);
ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
if (ret)
- goto err_clk_rate;
-
- drvdata->miscdev.name = ((struct coresight_platform_data *)
- (pdev->dev.platform_data))->name;
- drvdata->miscdev.minor = MISC_DYNAMIC_MINOR;
- drvdata->miscdev.fops = &stm_fops;
- ret = misc_register(&drvdata->miscdev);
- if (ret)
- goto err_misc_register;
+ return ret;
drvdata->entity = OST_ENTITY_ALL;
- desc = kzalloc(sizeof(*desc), GFP_KERNEL);
- if (!desc) {
- ret = -ENOMEM;
- goto err_kzalloc_desc;
- }
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
desc->type = CORESIGHT_DEV_TYPE_SOURCE;
desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE;
desc->ops = &stm_cs_ops;
@@ -509,11 +486,16 @@
desc->groups = stm_attr_grps;
desc->owner = THIS_MODULE;
drvdata->csdev = coresight_register(desc);
- if (IS_ERR(drvdata->csdev)) {
- ret = PTR_ERR(drvdata->csdev);
- goto err_coresight_register;
- }
- kfree(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
+
+ drvdata->miscdev.name = ((struct coresight_platform_data *)
+ (pdev->dev.platform_data))->name;
+ drvdata->miscdev.minor = MISC_DYNAMIC_MINOR;
+ drvdata->miscdev.fops = &stm_fops;
+ ret = misc_register(&drvdata->miscdev);
+ if (ret)
+ goto err;
dev_info(drvdata->dev, "STM initialized\n");
@@ -521,25 +503,8 @@
coresight_enable(drvdata->csdev);
return 0;
-err_coresight_register:
- kfree(desc);
-err_kzalloc_desc:
- misc_deregister(&drvdata->miscdev);
-err_misc_register:
-err_clk_rate:
- clk_put(drvdata->clk);
-err_clk_get:
- iounmap(drvdata->chs.base);
-err_ioremap1:
- kfree(drvdata->chs.bitmap);
-err_kzalloc_bitmap:
-err_res1:
- iounmap(drvdata->base);
-err_ioremap0:
-err_res0:
- kfree(drvdata);
-err_kzalloc_drvdata:
- dev_err(drvdata->dev, "STM init failed\n");
+err:
+ coresight_unregister(drvdata->csdev);
return ret;
}
@@ -547,13 +512,8 @@
{
struct stm_drvdata *drvdata = platform_get_drvdata(pdev);
- coresight_unregister(drvdata->csdev);
misc_deregister(&drvdata->miscdev);
- clk_put(drvdata->clk);
- iounmap(drvdata->chs.base);
- kfree(drvdata->chs.bitmap);
- iounmap(drvdata->base);
- kfree(drvdata);
+ coresight_unregister(drvdata->csdev);
return 0;
}
diff --git a/drivers/coresight/coresight-tpiu.c b/drivers/coresight/coresight-tpiu.c
index 570eeb2..fc00ff2 100644
--- a/drivers/coresight/coresight-tpiu.c
+++ b/drivers/coresight/coresight-tpiu.c
@@ -125,50 +125,41 @@
static int __devinit tpiu_probe(struct platform_device *pdev)
{
int ret;
+ struct device *dev = &pdev->dev;
struct tpiu_drvdata *drvdata;
struct resource *res;
struct coresight_desc *desc;
- drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata) {
- ret = -ENOMEM;
- goto err_kzalloc_drvdata;
- }
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- ret = -EINVAL;
- goto err_res;
- }
- drvdata->base = ioremap_nocache(res->start, resource_size(res));
- if (!drvdata->base) {
- ret = -EINVAL;
- goto err_ioremap;
- }
+ drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
drvdata->dev = &pdev->dev;
platform_set_drvdata(pdev, drvdata);
- drvdata->clk = clk_get(drvdata->dev, "core_clk");
- if (IS_ERR(drvdata->clk)) {
- ret = PTR_ERR(drvdata->clk);
- goto err_clk_get;
- }
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+ drvdata->base = devm_ioremap(dev, res->start, resource_size(res));
+ if (!drvdata->base)
+ return -ENOMEM;
+ drvdata->clk = devm_clk_get(dev, "core_clk");
+ if (IS_ERR(drvdata->clk))
+ return PTR_ERR(drvdata->clk);
ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE);
if (ret)
- goto err_clk_rate;
+ return ret;
/* Disable tpiu to support older targets that need this */
ret = clk_prepare_enable(drvdata->clk);
if (ret)
- goto err_clk_enable;
+ return ret;
__tpiu_disable(drvdata);
clk_disable_unprepare(drvdata->clk);
- desc = kzalloc(sizeof(*desc), GFP_KERNEL);
- if (!desc) {
- ret = -ENOMEM;
- goto err_kzalloc_desc;
- }
+ desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
desc->type = CORESIGHT_DEV_TYPE_SINK;
desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_PORT;
desc->ops = &tpiu_cs_ops;
@@ -176,28 +167,11 @@
desc->dev = &pdev->dev;
desc->owner = THIS_MODULE;
drvdata->csdev = coresight_register(desc);
- if (IS_ERR(drvdata->csdev)) {
- ret = PTR_ERR(drvdata->csdev);
- goto err_coresight_register;
- }
- kfree(desc);
+ if (IS_ERR(drvdata->csdev))
+ return PTR_ERR(drvdata->csdev);
- dev_info(drvdata->dev, "TPIU initialized\n");
+ dev_info(dev, "TPIU initialized\n");
return 0;
-err_coresight_register:
- kfree(desc);
-err_kzalloc_desc:
-err_clk_enable:
-err_clk_rate:
- clk_put(drvdata->clk);
-err_clk_get:
- iounmap(drvdata->base);
-err_ioremap:
-err_res:
- kfree(drvdata);
-err_kzalloc_drvdata:
- dev_err(drvdata->dev, "TPIU init failed\n");
- return ret;
}
static int __devexit tpiu_remove(struct platform_device *pdev)
@@ -205,9 +179,6 @@
struct tpiu_drvdata *drvdata = platform_get_drvdata(pdev);
coresight_unregister(drvdata->csdev);
- clk_put(drvdata->clk);
- iounmap(drvdata->base);
- kfree(drvdata);
return 0;
}
diff --git a/drivers/gpio/gpio-msm-common.c b/drivers/gpio/gpio-msm-common.c
index bdb8171..46f6460 100644
--- a/drivers/gpio/gpio-msm-common.c
+++ b/drivers/gpio/gpio-msm-common.c
@@ -23,6 +23,7 @@
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/err.h>
+#include <linux/platform_device.h>
#include <asm/mach/irq.h>
@@ -402,59 +403,6 @@
.irq_disable = msm_gpio_irq_disable,
};
-/*
- * This lock class tells lockdep that GPIO irqs are in a different
- * category than their parent, so it won't report false recursion.
- */
-static struct lock_class_key msm_gpio_lock_class;
-
-/* TODO: This should be a real platform_driver */
-static int __devinit msm_gpio_probe(void)
-{
- int ret;
-#ifndef CONFIG_OF
- int irq, i;
-#endif
-
- spin_lock_init(&tlmm_lock);
- bitmap_zero(msm_gpio.enabled_irqs, NR_MSM_GPIOS);
- bitmap_zero(msm_gpio.wake_irqs, NR_MSM_GPIOS);
- bitmap_zero(msm_gpio.dual_edge_irqs, NR_MSM_GPIOS);
- ret = gpiochip_add(&msm_gpio.gpio_chip);
- if (ret < 0)
- return ret;
-
-#ifndef CONFIG_OF
- 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);
- }
-#endif
- ret = request_irq(TLMM_MSM_SUMMARY_IRQ, msm_summary_irq_handler,
- IRQF_TRIGGER_HIGH, "msmgpio", NULL);
- if (ret) {
- pr_err("Request_irq failed for TLMM_MSM_SUMMARY_IRQ - %d\n",
- ret);
- return ret;
- }
- return 0;
-}
-
-static int __devexit msm_gpio_remove(void)
-{
- int ret = gpiochip_remove(&msm_gpio.gpio_chip);
-
- if (ret < 0)
- return ret;
-
- irq_set_handler(TLMM_MSM_SUMMARY_IRQ, NULL);
-
- return 0;
-}
-
#ifdef CONFIG_PM
static int msm_gpio_suspend(void)
{
@@ -518,22 +466,6 @@
.resume = msm_gpio_resume,
};
-static int __init msm_gpio_init(void)
-{
- msm_gpio_probe();
- register_syscore_ops(&msm_gpio_syscore_ops);
- return 0;
-}
-
-static void __exit msm_gpio_exit(void)
-{
- unregister_syscore_ops(&msm_gpio_syscore_ops);
- msm_gpio_remove();
-}
-
-postcore_initcall(msm_gpio_init);
-module_exit(msm_gpio_exit);
-
static void msm_tlmm_set_field(const struct tlmm_field_cfg *configs,
unsigned id, unsigned width, unsigned val)
{
@@ -594,6 +526,89 @@
}
EXPORT_SYMBOL(msm_gpio_install_direct_irq);
+/*
+ * This lock class tells lockdep that GPIO irqs are in a different
+ * category than their parent, so it won't report false recursion.
+ */
+static struct lock_class_key msm_gpio_lock_class;
+
+static int __devinit msm_gpio_probe(struct platform_device *pdev)
+{
+ int ret;
+#ifndef CONFIG_OF
+ int irq, i;
+#endif
+ msm_gpio.gpio_chip.dev = &pdev->dev;
+ spin_lock_init(&tlmm_lock);
+ bitmap_zero(msm_gpio.enabled_irqs, NR_MSM_GPIOS);
+ bitmap_zero(msm_gpio.wake_irqs, NR_MSM_GPIOS);
+ bitmap_zero(msm_gpio.dual_edge_irqs, NR_MSM_GPIOS);
+ ret = gpiochip_add(&msm_gpio.gpio_chip);
+ if (ret < 0)
+ return ret;
+
+#ifndef CONFIG_OF
+ 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);
+ }
+#endif
+ ret = request_irq(TLMM_MSM_SUMMARY_IRQ, msm_summary_irq_handler,
+ IRQF_TRIGGER_HIGH, "msmgpio", NULL);
+ if (ret) {
+ pr_err("Request_irq failed for TLMM_MSM_SUMMARY_IRQ - %d\n",
+ ret);
+ return ret;
+ }
+ register_syscore_ops(&msm_gpio_syscore_ops);
+ return 0;
+}
+
+#ifdef CONFIG_OF
+static struct of_device_id msm_gpio_of_match[] __devinitdata = {
+ {.compatible = "qcom,msm-gpio", },
+ { },
+};
+#endif
+
+static int __devexit msm_gpio_remove(struct platform_device *pdev)
+{
+ int ret;
+
+ unregister_syscore_ops(&msm_gpio_syscore_ops);
+ ret = gpiochip_remove(&msm_gpio.gpio_chip);
+ if (ret < 0)
+ return ret;
+ irq_set_handler(TLMM_MSM_SUMMARY_IRQ, NULL);
+
+ return 0;
+}
+
+static struct platform_driver msm_gpio_driver = {
+ .probe = msm_gpio_probe,
+ .remove = __devexit_p(msm_gpio_remove),
+ .driver = {
+ .name = "msmgpio",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(msm_gpio_of_match),
+ },
+};
+
+static void __exit msm_gpio_exit(void)
+{
+ platform_driver_unregister(&msm_gpio_driver);
+}
+module_exit(msm_gpio_exit);
+
+static int __init msm_gpio_init(void)
+{
+ return platform_driver_register(&msm_gpio_driver);
+}
+postcore_initcall(msm_gpio_init);
+
#ifdef CONFIG_OF
static int msm_gpio_irq_domain_xlate(struct irq_domain *d,
struct device_node *controller,
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index 57a0e2b..53eff77 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -2176,7 +2176,7 @@
static long kgsl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
{
struct kgsl_device_private *dev_priv = filep->private_data;
- unsigned int nr = _IOC_NR(cmd);
+ unsigned int nr;
kgsl_ioctl_func_t func;
int lock, ret;
char ustack[64];
@@ -2192,6 +2192,8 @@
else if (cmd == IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_OLD)
cmd = IOCTL_KGSL_CMDSTREAM_READTIMESTAMP;
+ nr = _IOC_NR(cmd);
+
if (cmd & (IOC_IN | IOC_OUT)) {
if (_IOC_SIZE(cmd) < sizeof(ustack))
uptr = ustack;
@@ -2216,7 +2218,20 @@
}
if (nr < ARRAY_SIZE(kgsl_ioctl_funcs) &&
- kgsl_ioctl_funcs[nr].func != NULL) {
+ kgsl_ioctl_funcs[nr].func != NULL) {
+
+ /*
+ * Make sure that nobody tried to send us a malformed ioctl code
+ * with a valid NR but bogus flags
+ */
+
+ if (kgsl_ioctl_funcs[nr].cmd != cmd) {
+ KGSL_DRV_ERR(dev_priv->device,
+ "Malformed ioctl code %08x\n", cmd);
+ ret = -ENOIOCTLCMD;
+ goto done;
+ }
+
func = kgsl_ioctl_funcs[nr].func;
lock = kgsl_ioctl_funcs[nr].lock;
} else {
diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c
index e24eeaf..c122270 100644
--- a/drivers/hwmon/qpnp-adc-common.c
+++ b/drivers/hwmon/qpnp-adc-common.c
@@ -111,7 +111,7 @@
struct qpnp_vadc_amux *adc_channel_list;
struct qpnp_adc_properties *adc_prop;
struct qpnp_adc_amux_properties *amux_prop;
- int count_adc_channel_list = 0, decimation, rc = 0;
+ int count_adc_channel_list = 0, decimation, rc = 0, i = 0;
if (!node)
return -EINVAL;
@@ -133,7 +133,7 @@
return -ENOMEM;
}
adc_channel_list = devm_kzalloc(&spmi->dev,
- (sizeof(struct qpnp_vadc_amux) * count_adc_channel_list),
+ sizeof(struct qpnp_vadc_amux) * count_adc_channel_list,
GFP_KERNEL);
if (!adc_channel_list) {
dev_err(&spmi->dev, "Unable to allocate memory\n");
@@ -148,9 +148,12 @@
return -ENOMEM;
}
+ adc_qpnp->adc_channels = adc_channel_list;
+ adc_qpnp->amux_prop = amux_prop;
+
for_each_child_of_node(node, child) {
int channel_num, scaling, post_scaling, hw_settle_time;
- int fast_avg_setup, calib_type, i = 0, rc;
+ int fast_avg_setup, calib_type, rc;
const char *calibration_param, *channel_name;
channel_name = of_get_property(child,
@@ -216,8 +219,6 @@
adc_channel_list[i].fast_avg_setup = fast_avg_setup;
i++;
}
- adc_qpnp->adc_channels = adc_channel_list;
- adc_qpnp->amux_prop = amux_prop;
/* Get the ADC VDD reference voltage and ADC bit resolution */
rc = of_property_read_u32(node, "qcom,adc-vdd-reference",
diff --git a/drivers/hwmon/qpnp-adc-current.c b/drivers/hwmon/qpnp-adc-current.c
index 95da3b9..b689255 100644
--- a/drivers/hwmon/qpnp-adc-current.c
+++ b/drivers/hwmon/qpnp-adc-current.c
@@ -142,7 +142,7 @@
int rc;
rc = spmi_ext_register_readl(iadc->adc->spmi->ctrl, iadc->adc->slave,
- reg, data, 1);
+ (iadc->adc->offset + reg), data, 1);
if (rc < 0) {
pr_err("qpnp iadc read reg %d failed with %d\n", reg, rc);
return rc;
@@ -159,7 +159,7 @@
buf = &data;
rc = spmi_ext_register_writel(iadc->adc->spmi->ctrl, iadc->adc->slave,
- reg, buf, 1);
+ (iadc->adc->offset + reg), buf, 1);
if (rc < 0) {
pr_err("qpnp iadc write reg %d failed with %d\n", reg, rc);
return rc;
diff --git a/drivers/hwmon/qpnp-adc-voltage.c b/drivers/hwmon/qpnp-adc-voltage.c
index 8d6d411..9e8a2e2 100644
--- a/drivers/hwmon/qpnp-adc-voltage.c
+++ b/drivers/hwmon/qpnp-adc-voltage.c
@@ -37,6 +37,7 @@
#define QPNP_VADC_STATUS1_MEAS_INTERVAL_EN_STS BIT(2)
#define QPNP_VADC_STATUS1_REQ_STS BIT(1)
#define QPNP_VADC_STATUS1_EOC BIT(0)
+#define QPNP_VADC_STATUS1_REQ_STS_EOC_MASK 0x3
#define QPNP_VADC_STATUS2 0x9
#define QPNP_VADC_STATUS2_CONV_SEQ_STATE 6
#define QPNP_VADC_STATUS2_FIFO_NOT_EMPTY_FLAG BIT(1)
@@ -112,7 +113,7 @@
int rc;
rc = spmi_ext_register_readl(vadc->adc->spmi->ctrl, vadc->adc->slave,
- reg, data, 1);
+ (vadc->adc->offset + reg), data, 1);
if (rc < 0) {
pr_err("qpnp adc read reg %d failed with %d\n", reg, rc);
return rc;
@@ -130,7 +131,7 @@
buf = &data;
rc = spmi_ext_register_writel(vadc->adc->spmi->ctrl, vadc->adc->slave,
- reg, buf, 1);
+ (vadc->adc->offset + reg), buf, 1);
if (rc < 0) {
pr_err("qpnp adc write reg %d failed with %d\n", reg, rc);
return rc;
@@ -200,61 +201,87 @@
int32_t qpnp_vadc_configure(
struct qpnp_adc_amux_properties *chan_prop)
{
+ struct qpnp_vadc_drv *vadc = qpnp_vadc;
u8 decimation = 0, conv_sequence = 0, conv_sequence_trig = 0;
+ u8 mode_ctrl = 0;
int rc = 0;
- rc = qpnp_vadc_write_reg(QPNP_VADC_INT_EN_SET,
+ if (vadc->vadc_init_calib) {
+ /* Configure interrupt if calibration is complete */
+ rc = qpnp_vadc_write_reg(QPNP_VADC_INT_EN_SET,
QPNP_VADC_INT_EOC_BIT);
+ if (rc < 0) {
+ pr_err("Configure error for interrupt setup\n");
+ return rc;
+ }
+ }
+
+ /* Mode selection */
+ rc = qpnp_vadc_read_reg(QPNP_VADC_MODE_CTL, &mode_ctrl);
if (rc < 0) {
- pr_err("qpnp adc configure error for interrupt setup\n");
+ pr_err("Mode configure read error\n");
+ return rc;
+ }
+ mode_ctrl |= chan_prop->mode_sel << QPNP_VADC_OP_MODE_SHIFT;
+ rc = qpnp_vadc_write_reg(QPNP_VADC_MODE_CTL, mode_ctrl);
+ if (rc < 0) {
+ pr_err("Mode configure write error\n");
return rc;
}
- rc = qpnp_vadc_write_reg(QPNP_VADC_MODE_CTL, chan_prop->mode_sel);
- if (rc < 0) {
- pr_err("qpnp adc configure error for mode selection\n");
+ rc = qpnp_vadc_enable(true);
+ if (rc)
return rc;
- }
+ /* Channel selection */
rc = qpnp_vadc_write_reg(QPNP_VADC_ADC_CH_SEL_CTL,
chan_prop->amux_channel);
if (rc < 0) {
- pr_err("qpnp adc configure error for channel selection\n");
+ pr_err("Channel configure error\n");
return rc;
}
+ /* Digital parameter setup */
+ rc = qpnp_vadc_read_reg(QPNP_VADC_ADC_DIG_PARAM, &decimation);
+ if (rc < 0) {
+ pr_err("Digital parameter configure read error\n");
+ return rc;
+ }
decimation |= chan_prop->decimation <<
QPNP_VADC_ADC_DIG_DEC_RATIO_SEL_SHIFT;
rc = qpnp_vadc_write_reg(QPNP_VADC_ADC_DIG_PARAM, decimation);
if (rc < 0) {
- pr_err("qpnp adc configure error for digital parameter setup\n");
+ pr_err("Digital parameter configure write error\n");
return rc;
}
+ /* HW settling time delay */
rc = qpnp_vadc_write_reg(QPNP_VADC_HW_SETTLE_DELAY,
chan_prop->hw_settle_time);
if (rc < 0) {
- pr_err("qpnp adc configure error for hw settling time setup\n");
+ pr_err("HW settling time setup error\n");
return rc;
}
if (chan_prop->mode_sel == (ADC_OP_NORMAL_MODE <<
QPNP_VADC_OP_MODE_SHIFT)) {
+ /* Normal measurement mode */
rc = qpnp_vadc_write_reg(QPNP_VADC_FAST_AVG_CTL,
chan_prop->fast_avg_setup);
if (rc < 0) {
- pr_err("qpnp adc fast averaging configure error\n");
+ pr_err("Fast averaging configure error\n");
return rc;
}
} else if (chan_prop->mode_sel == (ADC_OP_CONVERSION_SEQUENCER <<
QPNP_VADC_OP_MODE_SHIFT)) {
+ /* Conversion sequence mode */
conv_sequence = ((ADC_SEQ_HOLD_100US <<
QPNP_VADC_CONV_SEQ_HOLDOFF_SHIFT) |
ADC_CONV_SEQ_TIMEOUT_5MS);
rc = qpnp_vadc_write_reg(QPNP_VADC_CONV_SEQ_CTL,
conv_sequence);
if (rc < 0) {
- pr_err("qpnp adc conversion sequence error\n");
+ pr_err("Conversion sequence error\n");
return rc;
}
@@ -264,14 +291,15 @@
rc = qpnp_vadc_write_reg(QPNP_VADC_CONV_SEQ_TRIG_CTL,
conv_sequence_trig);
if (rc < 0) {
- pr_err("qpnp adc conversion trigger error\n");
+ pr_err("Conversion trigger error\n");
return rc;
}
}
+ /* Request conversion */
rc = qpnp_vadc_write_reg(QPNP_VADC_CONV_REQ, QPNP_VADC_CONV_REQ_SET);
if (rc < 0) {
- pr_err("qpnp adc request conversion failed\n");
+ pr_err("Request conversion failed\n");
return rc;
}
@@ -282,29 +310,34 @@
static int32_t qpnp_vadc_read_conversion_result(int32_t *data)
{
uint8_t rslt_lsb, rslt_msb;
- int rc = 0;
+ int rc = 0, status = 0;
- rc = qpnp_vadc_read_reg(QPNP_VADC_DATA0, &rslt_lsb);
- if (rc < 0) {
- pr_err("qpnp adc result read failed for data0 with %d\n", rc);
- return rc;
+ status = qpnp_vadc_read_reg(QPNP_VADC_DATA0, &rslt_lsb);
+ if (status < 0) {
+ pr_err("qpnp adc result read failed for data0\n");
+ goto fail;
}
- rc = qpnp_vadc_read_reg(QPNP_VADC_DATA1, &rslt_msb);
- if (rc < 0) {
- pr_err("qpnp adc result read failed for data1 with %d\n", rc);
- return rc;
+ status = qpnp_vadc_read_reg(QPNP_VADC_DATA1, &rslt_msb);
+ if (status < 0) {
+ pr_err("qpnp adc result read failed for data1\n");
+ goto fail;
}
*data = (rslt_msb << 8) | rslt_lsb;
- rc = qpnp_vadc_check_result(data);
- if (rc < 0) {
+ status = qpnp_vadc_check_result(data);
+ if (status < 0) {
pr_err("VADC data check failed\n");
- return rc;
+ goto fail;
}
- return 0;
+fail:
+ rc = qpnp_vadc_enable(false);
+ if (rc)
+ return rc;
+
+ return status;
}
static int32_t qpnp_vadc_read_status(int mode_sel)
@@ -393,6 +426,7 @@
rc = qpnp_vadc_read_reg(QPNP_VADC_STATUS1, &status1);
if (rc < 0)
return rc;
+ status1 &= QPNP_VADC_STATUS1_REQ_STS_EOC_MASK;
usleep_range(QPNP_VADC_CONV_TIME_MIN,
QPNP_VADC_CONV_TIME_MAX);
}
@@ -414,11 +448,13 @@
goto calib_fail;
}
+ status1 = 0;
while (status1 != (~QPNP_VADC_STATUS1_REQ_STS |
QPNP_VADC_STATUS1_EOC)) {
rc = qpnp_vadc_read_reg(QPNP_VADC_STATUS1, &status1);
if (rc < 0)
return rc;
+ status1 &= QPNP_VADC_STATUS1_REQ_STS_EOC_MASK;
usleep_range(QPNP_VADC_CONV_TIME_MIN,
QPNP_VADC_CONV_TIME_MAX);
}
@@ -449,11 +485,13 @@
goto calib_fail;
}
+ status1 = 0;
while (status1 != (~QPNP_VADC_STATUS1_REQ_STS |
QPNP_VADC_STATUS1_EOC)) {
rc = qpnp_vadc_read_reg(QPNP_VADC_STATUS1, &status1);
if (rc < 0)
return rc;
+ status1 &= QPNP_VADC_STATUS1_REQ_STS_EOC_MASK;
usleep_range(QPNP_VADC_CONV_TIME_MIN,
QPNP_VADC_CONV_TIME_MAX);
}
@@ -475,11 +513,13 @@
goto calib_fail;
}
+ status1 = 0;
while (status1 != (~QPNP_VADC_STATUS1_REQ_STS |
QPNP_VADC_STATUS1_EOC)) {
rc = qpnp_vadc_read_reg(QPNP_VADC_STATUS1, &status1);
if (rc < 0)
return rc;
+ status1 &= QPNP_VADC_STATUS1_REQ_STS_EOC_MASK;
usleep_range(QPNP_VADC_CONV_TIME_MIN,
QPNP_VADC_CONV_TIME_MAX);
}
@@ -508,7 +548,7 @@
struct qpnp_vadc_result *result)
{
struct qpnp_vadc_drv *vadc = qpnp_vadc;
- int rc, scale_type, amux_prescaling;
+ int rc = 0, scale_type, amux_prescaling;
if (!vadc->vadc_init_calib) {
rc = qpnp_vadc_calib_device();
@@ -521,10 +561,6 @@
mutex_lock(&vadc->adc->adc_lock);
- rc = qpnp_vadc_enable(true);
- if (rc)
- goto fail_unlock;
-
vadc->adc->amux_prop->amux_channel = channel;
vadc->adc->amux_prop->decimation =
vadc->adc->adc_channels[channel].adc_decimation;
@@ -541,15 +577,15 @@
<< QPNP_VADC_OP_MODE_SHIFT);
else {
pr_err("Invalid trigger channel:%d\n", trigger_channel);
- goto fail;
+ goto fail_unlock;
}
vadc->adc->amux_prop->trigger_channel = trigger_channel;
rc = qpnp_vadc_configure(vadc->adc->amux_prop);
if (rc) {
- pr_info("qpnp vadc configure failed with %d\n", rc);
- goto fail;
+ pr_err("qpnp vadc configure failed with %d\n", rc);
+ goto fail_unlock;
}
wait_for_completion(&vadc->adc->adc_rslt_completion);
@@ -557,13 +593,13 @@
if (trigger_channel < ADC_SEQ_NONE) {
rc = qpnp_vadc_read_status(vadc->adc->amux_prop->mode_sel);
if (rc)
- pr_info("Conversion sequence timed out - %d\n", rc);
+ pr_debug("Conversion sequence timed out - %d\n", rc);
}
rc = qpnp_vadc_read_conversion_result(&result->adc_code);
if (rc) {
- pr_info("qpnp vadc read adc code failed with %d\n", rc);
- goto fail;
+ pr_err("qpnp vadc read adc code failed with %d\n", rc);
+ goto fail_unlock;
}
amux_prescaling = vadc->adc->adc_channels[channel].chan_path_prescaling;
@@ -576,17 +612,12 @@
scale_type = vadc->adc->adc_channels[channel].adc_scale_fn;
if (scale_type >= SCALE_NONE) {
rc = -EBADF;
- goto fail;
+ goto fail_unlock;
}
vadc_scale_fn[scale_type].chan(result->adc_code,
vadc->adc->adc_prop, vadc->adc->amux_prop->chan_prop, result);
-fail:
- rc = qpnp_vadc_enable(false);
- if (rc)
- pr_err("Disable ADC failed during configuration\n");
-
fail_unlock:
mutex_unlock(&vadc->adc->adc_lock);
@@ -649,7 +680,7 @@
return 0;
hwmon_err_sens:
- pr_info("Init HWMON failed for qpnp_adc with %d\n", rc);
+ pr_err("Init HWMON failed for qpnp_adc with %d\n", rc);
return rc;
}
diff --git a/drivers/media/video/msm_vidc/msm_smem.c b/drivers/media/video/msm_vidc/msm_smem.c
index 76e3592..ff12a5c 100644
--- a/drivers/media/video/msm_vidc/msm_smem.c
+++ b/drivers/media/video/msm_vidc/msm_smem.c
@@ -108,8 +108,6 @@
unsigned long iova = 0;
unsigned long buffer_size = 0;
int rc = 0;
- if (size == 0)
- goto skip_mem_alloc;
flags = flags | ION_HEAP(ION_CP_MM_HEAP_ID);
if (align < 4096)
align = 4096;
@@ -147,7 +145,6 @@
fail_map:
ion_free(client->clnt, hndl);
fail_shared_mem_alloc:
-skip_mem_alloc:
return rc;
}
@@ -236,12 +233,15 @@
struct smem_client *client;
int rc = 0;
struct msm_smem *mem;
-
client = clt;
if (!client) {
pr_err("Invalid client passed\n");
return NULL;
}
+ if (!size) {
+ pr_err("No need to allocate memory of size: %d\n", size);
+ return NULL;
+ }
mem = kzalloc(sizeof(*mem), GFP_KERNEL);
if (!mem) {
pr_err("Failed to allocate shared mem\n");
diff --git a/drivers/media/video/msm_vidc/msm_vidc_common.c b/drivers/media/video/msm_vidc/msm_vidc_common.c
index 58dee31..b07c63b 100644
--- a/drivers/media/video/msm_vidc/msm_vidc_common.c
+++ b/drivers/media/video/msm_vidc/msm_vidc_common.c
@@ -1490,10 +1490,13 @@
struct list_head *ptr, *next;
struct vidc_buffer_addr_info buffer_info;
unsigned long flags;
+ struct hal_buffer_requirements *scratch_buf =
+ &inst->buff_req.buffer[HAL_BUFFER_INTERNAL_SCRATCH];
int i;
+
pr_debug("scratch: num = %d, size = %d\n",
- inst->buff_req.buffer[6].buffer_count_actual,
- inst->buff_req.buffer[6].buffer_size);
+ scratch_buf->buffer_count_actual,
+ scratch_buf->buffer_size);
spin_lock_irqsave(&inst->lock, flags);
if (!list_empty(&inst->internalbufs)) {
list_for_each_safe(ptr, next, &inst->internalbufs) {
@@ -1505,40 +1508,44 @@
}
}
spin_unlock_irqrestore(&inst->lock, flags);
-
-
- for (i = 0; i < inst->buff_req.buffer[6].buffer_count_actual;
+ if (scratch_buf->buffer_size) {
+ for (i = 0; i < scratch_buf->buffer_count_actual;
i++) {
- handle = msm_smem_alloc(inst->mem_client,
- inst->buff_req.buffer[6].buffer_size, 1, 0,
+ handle = msm_smem_alloc(inst->mem_client,
+ scratch_buf->buffer_size, 1, 0,
inst->core->resources.io_map[NS_MAP].domain, 0);
- if (!handle) {
- pr_err("Failed to allocate scratch memory\n");
- rc = -ENOMEM;
- goto err_no_mem;
- }
- binfo = kzalloc(sizeof(*binfo), GFP_KERNEL);
- if (!binfo) {
- pr_err("Out of memory\n");
- rc = -ENOMEM;
- goto err_no_mem;
- }
- binfo->handle = handle;
- spin_lock_irqsave(&inst->lock, flags);
- list_add_tail(&binfo->list, &inst->internalbufs);
- spin_unlock_irqrestore(&inst->lock, flags);
- buffer_info.buffer_size =
- inst->buff_req.buffer[6].buffer_size;
- buffer_info.buffer_type = HAL_BUFFER_INTERNAL_SCRATCH;
- buffer_info.num_buffers = 1;
- buffer_info.align_device_addr = handle->device_addr;
- rc = vidc_hal_session_set_buffers((void *) inst->session,
- &buffer_info);
- if (rc) {
- pr_err("vidc_hal_session_set_buffers failed");
- break;
+ if (!handle) {
+ pr_err("Failed to allocate scratch memory\n");
+ rc = -ENOMEM;
+ goto err_no_mem;
+ }
+ binfo = kzalloc(sizeof(*binfo), GFP_KERNEL);
+ if (!binfo) {
+ pr_err("Out of memory\n");
+ rc = -ENOMEM;
+ goto fail_kzalloc;
+ }
+ binfo->handle = handle;
+ buffer_info.buffer_size = scratch_buf->buffer_size;
+ buffer_info.buffer_type = HAL_BUFFER_INTERNAL_SCRATCH;
+ buffer_info.num_buffers = 1;
+ buffer_info.align_device_addr = handle->device_addr;
+ rc = vidc_hal_session_set_buffers(
+ (void *) inst->session, &buffer_info);
+ if (rc) {
+ pr_err("vidc_hal_session_set_buffers failed");
+ goto fail_set_buffers;
+ }
+ spin_lock_irqsave(&inst->lock, flags);
+ list_add_tail(&binfo->list, &inst->internalbufs);
+ spin_unlock_irqrestore(&inst->lock, flags);
}
}
+ return rc;
+fail_set_buffers:
+ kfree(binfo);
+fail_kzalloc:
+ msm_smem_free(inst->mem_client, handle);
err_no_mem:
return rc;
}
diff --git a/drivers/media/video/vcap_vp.c b/drivers/media/video/vcap_vp.c
index f1f1c69..9f2ead4 100644
--- a/drivers/media/video/vcap_vp.c
+++ b/drivers/media/video/vcap_vp.c
@@ -273,10 +273,10 @@
#ifdef TOP_FIELD_FIX
writel_iowmb(0x00000000 | vp_act->top_field << 0, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | vp_act->top_field << 0, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | vp_act->top_field << 0, VCAP_VP_CTRL);
#else
writel_iowmb(0x00000000 | top_field, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | top_field, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | top_field, VCAP_VP_CTRL);
#endif
enable_irq(dev->vpirq->start);
writel_iowmb(irq, VCAP_VP_INT_CLEAR);
@@ -420,58 +420,84 @@
int init_motion_buf(struct vcap_client_data *c_data)
{
+ int rc;
struct vcap_dev *dev = c_data->dev;
- void *buf;
- unsigned long motion_base_addr;
- uint32_t size = ((c_data->vp_out_fmt.width + 63) >> 6) *
+ struct ion_handle *handle = NULL;
+ unsigned long paddr, ionflag = 0;
+ void *vaddr;
+ size_t len;
+ size_t size = ((c_data->vp_out_fmt.width + 63) >> 6) *
((c_data->vp_out_fmt.height + 7) >> 3) * 16;
- if (c_data->vid_vp_action.bufMotion) {
+ if (c_data->vid_vp_action.motionHandle) {
pr_err("Motion buffer has already been created");
return -ENOEXEC;
}
- buf = kzalloc(size, GFP_KERNEL);
- if (!buf)
+ handle = ion_alloc(dev->ion_client, size, SZ_4K,
+ ION_HEAP(ION_CP_MM_HEAP_ID));
+ if (IS_ERR_OR_NULL(handle)) {
+ pr_err("%s: ion_alloc failed\n", __func__);
return -ENOMEM;
+ }
+ rc = ion_phys(dev->ion_client, handle, &paddr, &len);
+ if (rc < 0) {
+ pr_err("%s: ion_phys failed\n", __func__);
+ ion_free(dev->ion_client, handle);
+ return rc;
+ }
- c_data->vid_vp_action.bufMotion = buf;
- motion_base_addr = virt_to_phys(buf);
- writel_iowmb(motion_base_addr, VCAP_VP_MOTION_EST_ADDR);
+ rc = ion_handle_get_flags(dev->ion_client, handle, &ionflag);
+ if (rc) {
+ pr_err("%s: get flags ion handle failed\n", __func__);
+ ion_free(dev->ion_client, handle);
+ return rc;
+ }
+
+ vaddr = ion_map_kernel(dev->ion_client, handle, ionflag);
+ if (IS_ERR(vaddr)) {
+ pr_err("%s: Map motion buffer failed\n", __func__);
+ ion_free(dev->ion_client, handle);
+ rc = -ENOMEM;
+ return rc;
+ }
+
+ memset(vaddr, 0, size);
+ c_data->vid_vp_action.motionHandle = handle;
+
+ vaddr = NULL;
+ ion_unmap_kernel(dev->ion_client, handle);
+
+ writel_iowmb(paddr, VCAP_VP_MOTION_EST_ADDR);
return 0;
}
void deinit_motion_buf(struct vcap_client_data *c_data)
{
struct vcap_dev *dev = c_data->dev;
- void *buf;
-
- if (!c_data->vid_vp_action.bufMotion) {
+ if (!c_data->vid_vp_action.motionHandle) {
pr_err("Motion buffer has not been created");
return;
}
- buf = c_data->vid_vp_action.bufMotion;
-
writel_iowmb(0x00000000, VCAP_VP_MOTION_EST_ADDR);
- c_data->vid_vp_action.bufMotion = NULL;
- kfree(buf);
+ ion_free(dev->ion_client, c_data->vid_vp_action.motionHandle);
+ c_data->vid_vp_action.motionHandle = NULL;
return;
}
int init_nr_buf(struct vcap_client_data *c_data)
{
struct vcap_dev *dev = c_data->dev;
- struct nr_buffer *buf;
- uint32_t frame_size, tot_size, rc;
+ struct ion_handle *handle = NULL;
+ size_t frame_size, tot_size, len;
+ unsigned long paddr;
+ int rc;
- if (c_data->vid_vp_action.bufNR.vaddr) {
+ if (c_data->vid_vp_action.bufNR.nr_handle) {
pr_err("NR buffer has already been created");
return -ENOEXEC;
}
- buf = &c_data->vid_vp_action.bufNR;
- if (!buf)
- return -ENOMEM;
frame_size = c_data->vp_in_fmt.width * c_data->vp_in_fmt.height;
if (c_data->vp_in_fmt.pixfmt == V4L2_PIX_FMT_NV16)
@@ -479,19 +505,30 @@
else
tot_size = frame_size / 2 * 3;
- buf->vaddr = kzalloc(tot_size, GFP_KERNEL);
- if (!buf->vaddr)
+ handle = ion_alloc(dev->ion_client, tot_size, SZ_4K,
+ ION_HEAP(ION_CP_MM_HEAP_ID));
+ if (IS_ERR_OR_NULL(handle)) {
+ pr_err("%s: ion_alloc failed\n", __func__);
return -ENOMEM;
+ }
+ rc = ion_phys(dev->ion_client, handle, &paddr, &len);
+ if (rc < 0) {
+ pr_err("%s: ion_phys failed\n", __func__);
+ ion_free(dev->ion_client, handle);
+ return rc;
+ }
+
+ c_data->vid_vp_action.bufNR.nr_handle = handle;
update_nr_value(c_data);
- buf->paddr = virt_to_phys(buf->vaddr);
+ c_data->vid_vp_action.bufNR.paddr = paddr;
rc = readl_relaxed(VCAP_VP_NR_CONFIG2);
- rc |= 0x02D00001;
+ rc |= (((c_data->vp_out_fmt.width / 16) << 20) | 0x1);
writel_relaxed(rc, VCAP_VP_NR_CONFIG2);
- writel_relaxed(buf->paddr, VCAP_VP_NR_T2_Y_BASE_ADDR);
- writel_relaxed(buf->paddr + frame_size, VCAP_VP_NR_T2_C_BASE_ADDR);
- buf->nr_pos = NRT2_BUF;
+ writel_relaxed(paddr, VCAP_VP_NR_T2_Y_BASE_ADDR);
+ writel_relaxed(paddr + frame_size, VCAP_VP_NR_T2_C_BASE_ADDR);
+ c_data->vid_vp_action.bufNR.nr_pos = NRT2_BUF;
return 0;
}
@@ -501,20 +538,19 @@
struct nr_buffer *buf;
uint32_t rc;
- if (!c_data->vid_vp_action.bufNR.vaddr) {
+ if (!c_data->vid_vp_action.bufNR.nr_handle) {
pr_err("NR buffer has not been created");
return;
}
-
buf = &c_data->vid_vp_action.bufNR;
rc = readl_relaxed(VCAP_VP_NR_CONFIG2);
- rc &= !(0x02D00001);
+ rc &= !(0x0FF00001);
writel_relaxed(rc, VCAP_VP_NR_CONFIG2);
- kfree(buf->vaddr);
+ ion_free(dev->ion_client, buf->nr_handle);
+ buf->nr_handle = NULL;
buf->paddr = 0;
- buf->vaddr = NULL;
return;
}
@@ -592,18 +628,26 @@
{
struct vcap_dev *dev = c_data->dev;
unsigned int width, height;
+ struct ion_handle *handle = NULL;
unsigned long paddr;
- void *temp;
+ size_t len;
uint32_t reg;
int rc = 0;
dprintk(2, "%s: Start VP dummy event\n", __func__);
- temp = kzalloc(0x1200, GFP_KERNEL);
- if (!temp) {
- pr_err("%s: Failed to alloc mem", __func__);
+ handle = ion_alloc(dev->ion_client, 0x1200, SZ_4K,
+ ION_HEAP(ION_CP_MM_HEAP_ID));
+ if (IS_ERR_OR_NULL(handle)) {
+ pr_err("%s: ion_alloc failed\n", __func__);
return -ENOMEM;
}
- paddr = virt_to_phys(temp);
+
+ rc = ion_phys(dev->ion_client, handle, &paddr, &len);
+ if (rc < 0) {
+ pr_err("%s: ion_phys failed\n", __func__);
+ ion_free(dev->ion_client, handle);
+ return rc;
+ }
width = c_data->vp_out_fmt.width;
height = c_data->vp_out_fmt.height;
@@ -626,7 +670,7 @@
writel_relaxed(0x01100101, VCAP_VP_INTERRUPT_ENABLE);
writel_iowmb(0x00000000, VCAP_VP_CTRL);
- writel_iowmb(0x00030000, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000, VCAP_VP_CTRL);
enable_irq(dev->vpirq->start);
rc = wait_event_interruptible_timeout(dev->vp_dummy_waitq,
@@ -650,7 +694,7 @@
c_data->vp_out_fmt.width = width;
c_data->vp_out_fmt.height = height;
- kfree(temp);
+ ion_free(dev->ion_client, handle);
dprintk(2, "%s: Exit VP dummy event\n", __func__);
return rc;
@@ -748,10 +792,10 @@
writel_relaxed(0x01100101, VCAP_VP_INTERRUPT_ENABLE);
#ifdef TOP_FIELD_FIX
writel_iowmb(0x00000000 | vp_act->top_field << 0, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | vp_act->top_field << 0, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | vp_act->top_field << 0, VCAP_VP_CTRL);
#else
writel_iowmb(0x00000000 | top_field, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | top_field, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | top_field, VCAP_VP_CTRL);
#endif
atomic_set(&c_data->dev->vp_enabled, 1);
enable_irq(dev->vpirq->start);
@@ -795,10 +839,10 @@
writel_relaxed(0x01100101, VCAP_VP_INTERRUPT_ENABLE);
#ifdef TOP_FIELD_FIX
writel_iowmb(0x00000000 | vp_act->top_field << 0, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | vp_act->top_field << 0, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | vp_act->top_field << 0, VCAP_VP_CTRL);
#else
writel_iowmb(0x00000000 | top_field, VCAP_VP_CTRL);
- writel_iowmb(0x00030000 | top_field, VCAP_VP_CTRL);
+ writel_iowmb(0x00010000 | top_field, VCAP_VP_CTRL);
#endif
atomic_set(&c_data->dev->vp_enabled, 1);
diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c
index 6d82e11..05707fd 100644
--- a/drivers/mfd/wcd9xxx-core.c
+++ b/drivers/mfd/wcd9xxx-core.c
@@ -12,6 +12,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of_gpio.h>
#include <linux/slab.h>
#include <linux/mfd/core.h>
#include <linux/mfd/wcd9xxx/wcd9xxx-slimslave.h>
@@ -320,10 +321,12 @@
wcd9xxx_bring_up(wcd9xxx);
- ret = wcd9xxx_irq_init(wcd9xxx);
- if (ret) {
- pr_err("IRQ initialization failed\n");
- goto err;
+ if (wcd9xxx->irq != -1) {
+ ret = wcd9xxx_irq_init(wcd9xxx);
+ if (ret) {
+ pr_err("IRQ initialization failed\n");
+ goto err;
+ }
}
wcd9xxx->idbyte_0 = wcd9xxx_reg_read(wcd9xxx, WCD9XXX_A_CHIP_ID_BYTE_0);
@@ -497,10 +500,15 @@
goto err;
}
- for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++)
- wcd9xxx->supplies[i].supply = pdata->regulator[i].name;
+ wcd9xxx->num_of_supplies = 0;
+ for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
+ if (pdata->regulator[i].name) {
+ wcd9xxx->supplies[i].supply = pdata->regulator[i].name;
+ wcd9xxx->num_of_supplies++;
+ }
+ }
- ret = regulator_bulk_get(wcd9xxx->dev, ARRAY_SIZE(pdata->regulator),
+ ret = regulator_bulk_get(wcd9xxx->dev, wcd9xxx->num_of_supplies,
wcd9xxx->supplies);
if (ret != 0) {
dev_err(wcd9xxx->dev, "Failed to get supplies: err = %d\n",
@@ -508,7 +516,7 @@
goto err_supplies;
}
- for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
+ for (i = 0; i < wcd9xxx->num_of_supplies; i++) {
ret = regulator_set_voltage(wcd9xxx->supplies[i].consumer,
pdata->regulator[i].min_uV, pdata->regulator[i].max_uV);
if (ret) {
@@ -528,7 +536,7 @@
}
}
- ret = regulator_bulk_enable(ARRAY_SIZE(pdata->regulator),
+ ret = regulator_bulk_enable(wcd9xxx->num_of_supplies,
wcd9xxx->supplies);
if (ret != 0) {
dev_err(wcd9xxx->dev, "Failed to enable supplies: err = %d\n",
@@ -538,13 +546,13 @@
return ret;
err_configure:
- for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
+ for (i = 0; i < wcd9xxx->num_of_supplies; i++) {
regulator_set_voltage(wcd9xxx->supplies[i].consumer, 0,
pdata->regulator[i].max_uV);
regulator_set_optimum_mode(wcd9xxx->supplies[i].consumer, 0);
}
err_get:
- regulator_bulk_free(ARRAY_SIZE(pdata->regulator), wcd9xxx->supplies);
+ regulator_bulk_free(wcd9xxx->num_of_supplies, wcd9xxx->supplies);
err_supplies:
kfree(wcd9xxx->supplies);
err:
@@ -556,14 +564,14 @@
{
int i;
- regulator_bulk_disable(ARRAY_SIZE(pdata->regulator),
+ regulator_bulk_disable(wcd9xxx->num_of_supplies,
wcd9xxx->supplies);
- for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
+ for (i = 0; i < wcd9xxx->num_of_supplies; i++) {
regulator_set_voltage(wcd9xxx->supplies[i].consumer, 0,
pdata->regulator[i].max_uV);
regulator_set_optimum_mode(wcd9xxx->supplies[i].consumer, 0);
}
- regulator_bulk_free(ARRAY_SIZE(pdata->regulator), wcd9xxx->supplies);
+ regulator_bulk_free(wcd9xxx->num_of_supplies, wcd9xxx->supplies);
kfree(wcd9xxx->supplies);
}
@@ -792,6 +800,252 @@
return 0;
}
+#define CODEC_DT_MAX_PROP_SIZE 40
+static int wcd9xxx_dt_parse_vreg_info(struct device *dev,
+ struct wcd9xxx_regulator *vreg, const char *vreg_name)
+{
+ int len, ret = 0;
+ const __be32 *prop;
+ char prop_name[CODEC_DT_MAX_PROP_SIZE];
+ struct device_node *regnode = NULL;
+ u32 prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "%s-supply",
+ vreg_name);
+ regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+
+ if (!regnode) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ vreg->name = vreg_name;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,%s-voltage", vreg_name);
+ prop = of_get_property(dev->of_node, prop_name, &len);
+
+ if (!prop || (len != (2 * sizeof(__be32)))) {
+ dev_err(dev, "%s %s property\n",
+ prop ? "invalid format" : "no", prop_name);
+ return -ENODEV;
+ } else {
+ vreg->min_uV = be32_to_cpup(&prop[0]);
+ vreg->max_uV = be32_to_cpup(&prop[1]);
+ }
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,%s-current", vreg_name);
+
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ vreg->optimum_uA = prop_val;
+
+ dev_info(dev, "%s: vol=[%d %d]uV, curr=[%d]uA\n", vreg->name,
+ vreg->min_uV, vreg->max_uV, vreg->optimum_uA);
+ return 0;
+}
+
+static int wcd9xxx_dt_parse_micbias_info(struct device *dev,
+ struct wcd9xxx_micbias_setting *micbias)
+{
+ int ret = 0;
+ char prop_name[CODEC_DT_MAX_PROP_SIZE];
+ u32 prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias-ldoh-v");
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ micbias->ldoh_v = (u8)prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias-cfilt1-mv");
+ ret = of_property_read_u32(dev->of_node, prop_name,
+ &micbias->cfilt1_mv);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias-cfilt2-mv");
+ ret = of_property_read_u32(dev->of_node, prop_name,
+ &micbias->cfilt2_mv);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias-cfilt3-mv");
+ ret = of_property_read_u32(dev->of_node, prop_name,
+ &micbias->cfilt3_mv);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias1-cfilt-sel");
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ micbias->bias1_cfilt_sel = (u8)prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias2-cfilt-sel");
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ micbias->bias2_cfilt_sel = (u8)prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias3-cfilt-sel");
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ micbias->bias3_cfilt_sel = (u8)prop_val;
+
+ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
+ "qcom,cdc-micbias4-cfilt-sel");
+ ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ prop_name, dev->of_node->full_name);
+ return -ENODEV;
+ }
+ micbias->bias4_cfilt_sel = (u8)prop_val;
+
+ dev_dbg(dev, "ldoh_v %u cfilt1_mv %u cfilt2_mv %u cfilt3_mv %u",
+ (u32)micbias->ldoh_v, (u32)micbias->cfilt1_mv,
+ (u32)micbias->cfilt2_mv, (u32)micbias->cfilt3_mv);
+
+ dev_dbg(dev, "bias1_cfilt_sel %u bias2_cfilt_sel %u\n",
+ (u32)micbias->bias1_cfilt_sel, (u32)micbias->bias2_cfilt_sel);
+
+ dev_dbg(dev, "bias3_cfilt_sel %u bias4_cfilt_sel %u\n",
+ (u32)micbias->bias3_cfilt_sel, (u32)micbias->bias4_cfilt_sel);
+
+ return 0;
+}
+
+static int wcd9xxx_dt_parse_slim_interface_dev_info(struct device *dev,
+ struct slim_device *slim_ifd)
+{
+ int ret = 0;
+ struct property *prop;
+
+ ret = of_property_read_string(dev->of_node, "qcom,cdc-slim-ifd",
+ &slim_ifd->name);
+ if (ret) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ "qcom,cdc-slim-ifd-dev", dev->of_node->full_name);
+ return -ENODEV;
+ }
+ prop = of_find_property(dev->of_node,
+ "qcom,cdc-slim-ifd-elemental-addr", NULL);
+ if (!prop) {
+ dev_err(dev, "Looking up %s property in node %s failed",
+ "qcom,cdc-slim-ifd-elemental-addr",
+ dev->of_node->full_name);
+ return -ENODEV;
+ } else if (prop->length != 6) {
+ dev_err(dev, "invalid codec slim ifd addr. addr length = %d\n",
+ prop->length);
+ return -ENODEV;
+ }
+ memcpy(slim_ifd->e_addr, prop->value, 6);
+
+ return 0;
+}
+
+static char *taiko_supplies[] = {
+ "cdc-vdd-buck", "cdc-vdd-tx-h", "cdc-vdd-rx-h", "cdc-vddpx-1",
+ "cdc-vdd-a-1p2v", "cdc-vddcx-1", "cdc-vddcx-2",
+};
+
+static struct wcd9xxx_pdata *wcd9xxx_populate_dt_pdata(struct device *dev)
+{
+ struct wcd9xxx_pdata *pdata;
+ int ret, i;
+ char **codec_supplies;
+ u32 num_of_supplies = 0;
+
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata) {
+ dev_err(dev,
+ "could not allocate memory for platform data\n");
+ return NULL;
+ }
+
+ if (!strcmp(dev_name(dev), "taiko-slim-pgd")) {
+ codec_supplies = taiko_supplies;
+ num_of_supplies = ARRAY_SIZE(taiko_supplies);
+ } else {
+ dev_err(dev, "%s unsupported device %s\n",
+ __func__, dev_name(dev));
+ goto err;
+ }
+
+ if (num_of_supplies > ARRAY_SIZE(pdata->regulator)) {
+ dev_err(dev, "%s: Num of supplies %u > max supported %u\n",
+ __func__, num_of_supplies, ARRAY_SIZE(pdata->regulator));
+
+ goto err;
+ }
+
+ for (i = 0; i < num_of_supplies; i++) {
+ ret = wcd9xxx_dt_parse_vreg_info(dev, &pdata->regulator[i],
+ codec_supplies[i]);
+ if (ret)
+ goto err;
+ }
+
+ ret = wcd9xxx_dt_parse_micbias_info(dev, &pdata->micbias);
+ if (ret)
+ goto err;
+
+ pdata->reset_gpio = of_get_named_gpio(dev->of_node,
+ "qcom,cdc-reset-gpio", 0);
+ if (pdata->reset_gpio < 0) {
+ dev_err(dev, "Looking up %s property in node %s failed %d\n",
+ "qcom, cdc-reset-gpio", dev->of_node->full_name,
+ pdata->reset_gpio);
+ goto err;
+ }
+ pdata->irq = -1;
+
+ ret = wcd9xxx_dt_parse_slim_interface_dev_info(dev,
+ &pdata->slimbus_slave_device);
+ if (ret)
+ goto err;
+ return pdata;
+err:
+ devm_kfree(dev, pdata);
+ return NULL;
+}
+
static int wcd9xxx_slim_probe(struct slim_device *slim)
{
struct wcd9xxx *wcd9xxx;
@@ -799,8 +1053,15 @@
int ret = 0;
int sgla_retry_cnt;
- dev_info(&slim->dev, "Initialized slim device %s\n", slim->name);
- pdata = slim->dev.platform_data;
+ if (slim->dev.of_node) {
+ dev_info(&slim->dev, "Platform data from device tree\n");
+ pdata = wcd9xxx_populate_dt_pdata(&slim->dev);
+ slim->dev.platform_data = pdata;
+
+ } else {
+ dev_info(&slim->dev, "Platform data from board file\n");
+ pdata = slim->dev.platform_data;
+ }
if (!pdata) {
dev_err(&slim->dev, "Error, no platform data\n");
@@ -1103,7 +1364,7 @@
};
static const struct slim_device_id taiko_slimtest_id[] = {
- {"taiko-slim", 0},
+ {"taiko-slim-pgd", 0},
{}
};
diff --git a/drivers/regulator/qpnp-regulator.c b/drivers/regulator/qpnp-regulator.c
index 8d592fb..f8176b9 100644
--- a/drivers/regulator/qpnp-regulator.c
+++ b/drivers/regulator/qpnp-regulator.c
@@ -268,8 +268,8 @@
};
static struct qpnp_voltage_range ftsmps_ranges[] = {
- VOLTAGE_RANGE(0, 80000, 350000, 1355000, 5000),
- VOLTAGE_RANGE(1, 160000, 1360000, 2710000, 10000),
+ VOLTAGE_RANGE(0, 0, 350000, 1275000, 5000),
+ VOLTAGE_RANGE(1, 0, 1280000, 2040000, 10000),
};
static struct qpnp_voltage_range boost_ranges[] = {
diff --git a/drivers/tty/n_smux.c b/drivers/tty/n_smux.c
index 32e52d0..1385e08 100644
--- a/drivers/tty/n_smux.c
+++ b/drivers/tty/n_smux.c
@@ -274,6 +274,7 @@
struct mutex mutex_lha0;
int is_initialized;
+ int platform_devs_registered;
int in_reset;
int ld_open_count;
struct tty_struct *tty;
@@ -3377,14 +3378,18 @@
/* re-register platform devices */
SMUX_DBG("%s: ssr - after power-up\n", __func__);
mutex_lock(&smux.mutex_lha0);
- for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
- SMUX_DBG("%s: register pdev '%s'\n",
+ if (smux.ld_open_count > 0
+ && !smux.platform_devs_registered) {
+ for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
+ SMUX_DBG("%s: register pdev '%s'\n",
__func__, smux_devs[i].name);
- smux_devs[i].dev.release = smux_pdev_release;
- tmp = platform_device_register(&smux_devs[i]);
- if (tmp)
- pr_err("%s: error %d registering device %s\n",
+ smux_devs[i].dev.release = smux_pdev_release;
+ tmp = platform_device_register(&smux_devs[i]);
+ if (tmp)
+ pr_err("%s: error %d registering device %s\n",
__func__, tmp, smux_devs[i].name);
+ }
+ smux.platform_devs_registered = 1;
}
mutex_unlock(&smux.mutex_lha0);
return NOTIFY_DONE;
@@ -3396,30 +3401,34 @@
/* Cleanup channels */
smux_flush_workqueues();
mutex_lock(&smux.mutex_lha0);
- smux_lch_purge();
- if (smux.tty)
- tty_driver_flush_buffer(smux.tty);
+ if (smux.ld_open_count > 0) {
+ smux_lch_purge();
+ if (smux.tty)
+ tty_driver_flush_buffer(smux.tty);
- /* Unregister platform devices */
- for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
- SMUX_DBG("%s: unregister pdev '%s'\n",
- __func__, smux_devs[i].name);
- platform_device_unregister(&smux_devs[i]);
+ /* Unregister platform devices */
+ if (smux.platform_devs_registered) {
+ for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
+ SMUX_DBG("%s: unregister pdev '%s'\n",
+ __func__, smux_devs[i].name);
+ platform_device_unregister(&smux_devs[i]);
+ }
+ smux.platform_devs_registered = 0;
+ }
+
+ /* Power-down UART */
+ spin_lock_irqsave(&smux.tx_lock_lha2, flags);
+ if (smux.power_state != SMUX_PWR_OFF) {
+ SMUX_PWR("%s: SSR - turning off UART\n", __func__);
+ smux.power_state = SMUX_PWR_OFF;
+ power_off_uart = 1;
+ }
+ smux.powerdown_enabled = 0;
+ spin_unlock_irqrestore(&smux.tx_lock_lha2, flags);
+
+ if (power_off_uart)
+ smux_uart_power_off_atomic();
}
-
- /* Power-down UART */
- spin_lock_irqsave(&smux.tx_lock_lha2, flags);
- if (smux.power_state != SMUX_PWR_OFF) {
- SMUX_PWR("%s: SSR - turning off UART\n", __func__);
- smux.power_state = SMUX_PWR_OFF;
- power_off_uart = 1;
- }
- smux.powerdown_enabled = 0;
- spin_unlock_irqrestore(&smux.tx_lock_lha2, flags);
-
- if (power_off_uart)
- smux_uart_power_off_atomic();
-
smux.tx_activity_flag = 0;
smux.rx_activity_flag = 0;
smux.rx_state = SMUX_RX_IDLE;
@@ -3493,6 +3502,7 @@
pr_err("%s: error %d registering device %s\n",
__func__, tmp, smux_devs[i].name);
}
+ smux.platform_devs_registered = 1;
mutex_unlock(&smux.mutex_lha0);
return 0;
}
@@ -3519,10 +3529,13 @@
smux_lch_purge();
/* Unregister platform devices */
- for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
- SMUX_DBG("%s: unregister pdev '%s'\n",
- __func__, smux_devs[i].name);
- platform_device_unregister(&smux_devs[i]);
+ if (smux.platform_devs_registered) {
+ for (i = 0; i < ARRAY_SIZE(smux_devs); ++i) {
+ SMUX_DBG("%s: unregister pdev '%s'\n",
+ __func__, smux_devs[i].name);
+ platform_device_unregister(&smux_devs[i]);
+ }
+ smux.platform_devs_registered = 0;
}
/* Schedule UART power-up if it's down */
@@ -3668,6 +3681,7 @@
smux.ld_open_count = 0;
smux.in_reset = 0;
smux.is_initialized = 1;
+ smux.platform_devs_registered = 0;
smux_byte_loopback = 0;
spin_lock_init(&smux.tx_lock_lha2);
diff --git a/drivers/video/msm/external_common.c b/drivers/video/msm/external_common.c
index 46ef7b4..0976fc6 100644
--- a/drivers/video/msm/external_common.c
+++ b/drivers/video/msm/external_common.c
@@ -1452,21 +1452,21 @@
len += ret;
if (len && (format & TOP_AND_BOTTOM))
- ret = snprintf(buf + len, PAGE_SIZE, ":%s",
+ ret = snprintf(buf + len, PAGE_SIZE - len, ":%s",
single_video_3d_format_2string(
format & TOP_AND_BOTTOM));
else
- ret = snprintf(buf + len, PAGE_SIZE, "%s",
+ ret = snprintf(buf + len, PAGE_SIZE - len, "%s",
single_video_3d_format_2string(
format & TOP_AND_BOTTOM));
len += ret;
if (len && (format & SIDE_BY_SIDE_HALF))
- ret = snprintf(buf + len, PAGE_SIZE, ":%s",
+ ret = snprintf(buf + len, PAGE_SIZE - len, ":%s",
single_video_3d_format_2string(
format & SIDE_BY_SIDE_HALF));
else
- ret = snprintf(buf + len, PAGE_SIZE, "%s",
+ ret = snprintf(buf + len, PAGE_SIZE - len, "%s",
single_video_3d_format_2string(
format & SIDE_BY_SIDE_HALF));
len += ret;
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
index 267e924..fade821 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
@@ -217,6 +217,7 @@
DDL_METADATA_ALIGNSIZE(suffix);
decoder->suffix = suffix;
output_buf_req->sz += suffix;
+ decoder->meta_data_offset = 0;
DDL_MSG_LOW("metadata output buf size : %d", suffix);
}
diff --git a/include/linux/mfd/wcd9xxx/core.h b/include/linux/mfd/wcd9xxx/core.h
index 17be2cb..105c2cb 100644
--- a/include/linux/mfd/wcd9xxx/core.h
+++ b/include/linux/mfd/wcd9xxx/core.h
@@ -144,6 +144,7 @@
int (*write_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg,
int bytes, void *src, bool interface_reg);
+ u32 num_of_supplies;
struct regulator_bulk_data *supplies;
enum wcd9xxx_pm_state pm_state;
diff --git a/include/linux/mfd/wcd9xxx/pdata.h b/include/linux/mfd/wcd9xxx/pdata.h
index 1b7706b..e831f0b 100644
--- a/include/linux/mfd/wcd9xxx/pdata.h
+++ b/include/linux/mfd/wcd9xxx/pdata.h
@@ -125,7 +125,7 @@
unsigned int hph_ocp_limit:3; /* Headphone OCP current limit */
};
-#define MAX_REGULATOR 6
+#define MAX_REGULATOR 7
/*
* format : TABLA_<POWER_SUPPLY_PIN_NAME>_CUR_MAX
*
diff --git a/include/media/vcap_v4l2.h b/include/media/vcap_v4l2.h
index 390a843..cf99435 100644
--- a/include/media/vcap_v4l2.h
+++ b/include/media/vcap_v4l2.h
@@ -28,6 +28,7 @@
#include <media/v4l2-common.h>
#include <media/vcap_fmt.h>
#include <mach/board.h>
+#include <mach/iommu_domains.h>
#define to_client_data(val) container_of(val, struct vcap_client_data, vfh)
@@ -94,7 +95,7 @@
};
struct nr_buffer {
- void *vaddr;
+ struct ion_handle *nr_handle;
unsigned long paddr;
enum nr_buf_pos nr_pos;
};
@@ -118,6 +119,7 @@
struct vcap_buffer *bufOut;
+ struct ion_handle *motionHandle;
void *bufMotion;
struct nr_buffer bufNR;
struct nr_param nr_param;
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index f83c108..6e8500b 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2929,8 +2929,16 @@
static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_sniff_subrate *ev = (void *) skb->data;
+ struct hci_conn *conn =
+ hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
BT_DBG("%s status %d", hdev->name, ev->status);
+ if (conn && (ev->max_rx_latency > hdev->sniff_max_interval)) {
+ BT_ERR("value of rx_latency:%d", ev->max_rx_latency);
+ hci_dev_lock(hdev);
+ hci_conn_enter_active_mode(conn, 1);
+ hci_dev_unlock(hdev);
+ }
}
static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index f090a77..026ce5d 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -394,6 +394,15 @@
case BT_CONNECTED:
case BT_CONFIG:
+ if (sco_pi(sk)->conn) {
+ sk->sk_state = BT_DISCONN;
+ sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
+ hci_conn_put(sco_pi(sk)->conn->hcon);
+ sco_pi(sk)->conn->hcon = NULL;
+ } else
+ sco_chan_del(sk, ECONNRESET);
+ break;
+
case BT_CONNECT:
case BT_DISCONN:
sco_chan_del(sk, ECONNRESET);
@@ -857,7 +866,9 @@
conn->sk = NULL;
sco_pi(sk)->conn = NULL;
sco_conn_unlock(conn);
- hci_conn_put(conn->hcon);
+
+ if (conn->hcon)
+ hci_conn_put(conn->hcon);
}
sk->sk_state = BT_CLOSED;
diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c
index 6da9166..01820eb 100644
--- a/sound/soc/codecs/wcd9320.c
+++ b/sound/soc/codecs/wcd9320.c
@@ -6817,18 +6817,21 @@
struct snd_soc_codec *codec = taiko->codec;
struct wcd9xxx_pdata *pdata = taiko->pdata;
int k1, k2, k3, rc = 0;
- u8 leg_mode = pdata->amic_settings.legacy_mode;
- u8 txfe_bypass = pdata->amic_settings.txfe_enable;
- u8 txfe_buff = pdata->amic_settings.txfe_buff;
- u8 flag = pdata->amic_settings.use_pdata;
+ u8 leg_mode, txfe_bypass, txfe_buff, flag;
u8 i = 0, j = 0;
u8 val_txfe = 0, value = 0;
if (!pdata) {
+ pr_err("%s: NULL pdata\n", __func__);
rc = -ENODEV;
goto done;
}
+ leg_mode = pdata->amic_settings.legacy_mode;
+ txfe_bypass = pdata->amic_settings.txfe_enable;
+ txfe_buff = pdata->amic_settings.txfe_buff;
+ flag = pdata->amic_settings.use_pdata;
+
/* Make sure settings are correct */
if ((pdata->micbias.ldoh_v > TAIKO_LDOH_2P85_V) ||
(pdata->micbias.bias1_cfilt_sel > TAIKO_CFILT3_SEL) ||