Merge "msm: kgsl: Move graphics device registration for 8960" into msm-3.4
diff --git a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
index 6db1150..82e76fc 100644
--- a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
+++ b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
@@ -14,6 +14,16 @@
- qcom,mdss-pan-bpp: Specifies the panel bits per pixel. Default value is 24(rgb888).
18 = for rgb666
16 = for rgb565
+- qcom,panel-phy-regulatorSettings: An array of length 8 that specifies the PHY
+ regulator settings for the panel.
+- qcom,panel-phy-timingSettings: An array of length 12 that specifies the PHY
+ timing settings for the panel.
+- qcom,panel-phy-strengthCtrl: An array of length 2 that specifies the PHY
+ strengthCtrl settings for the panel.
+- qcom,panel-phy-bistCtrl: An array of length 6 that specifies the PHY
+ BIST ctrl settings for the panel.
+- qcom,panel-phy-laneConfig: An array of length 45 that specifies the PHY
+ lane configuration settings for the panel.
- qcom,mdss-panel-on-cmds: An array of variable length that lists the init commands
of the panel. Each command will have the format specified
as below:
@@ -42,9 +52,16 @@
Optional properties:
- label: A string used as a descriptive name of the panel
+- qcom,enable-gpio: Specifies the panel lcd/display enable gpio.
+- qcom,rst-gpio: Specifies the panel reset gpio.
- qcom,mdss-pan-porch-values: An array of size 6 that specifies the panel blanking values.
- qcom,mdss-pan-underflow-clr: Specifies the controller settings for the panel underflow clear
settings. Default value is 0xff.
+- qcom,mdss-pan-bl-ctrl: A string that specifies the implementation of backlight
+ control for this panel.
+ "bl_ctrl_pwm" = Backlight controlled by PWM gpio.
+ "bl_ctrl_wled" = Backlight controlled by WLED.
+ "bl_ctrl_dcs_cmds" = Backlight controlled by DCS commands.
- qcom,mdss-pan-bl-levels: Specifies the backlight levels supported by the panel.
Default range is 1 to 255.
diff --git a/Documentation/devicetree/bindings/sound/qcom-audio-dev.txt b/Documentation/devicetree/bindings/sound/qcom-audio-dev.txt
index 84f0c24..f082a0f 100644
--- a/Documentation/devicetree/bindings/sound/qcom-audio-dev.txt
+++ b/Documentation/devicetree/bindings/sound/qcom-audio-dev.txt
@@ -30,6 +30,12 @@
- compatible : "qcom,msm-voip-dsp"
+* msm-pcm-voice
+
+Required properties:
+
+ - compatible : "qcom,msm-pcm-voice"
+
* msm-stub-codec
Required properties:
diff --git a/arch/arm/boot/dts/msm8974-cdp.dts b/arch/arm/boot/dts/msm8974-cdp.dts
index bfe24d2..8ae9583 100644
--- a/arch/arm/boot/dts/msm8974-cdp.dts
+++ b/arch/arm/boot/dts/msm8974-cdp.dts
@@ -23,3 +23,15 @@
status = "ok";
};
};
+
+&sdcc2 {
+ #address-cells = <0>;
+ interrupt-parent = <&sdcc2>;
+ interrupts = <0 1>;
+ #interrupt-cells = <1>;
+ interrupt-map-mask = <0xffffffff>;
+ interrupt-map = <0 &intc 0 125 0
+ 1 &msmgpio 62 0x3>;
+ interrupt-names = "core_irq", "status_irq";
+ cd-gpios = <&msmgpio 62 0x1>;
+};
diff --git a/arch/arm/boot/dts/msm8974.dtsi b/arch/arm/boot/dts/msm8974.dtsi
index 415122b..1be0af9 100644
--- a/arch/arm/boot/dts/msm8974.dtsi
+++ b/arch/arm/boot/dts/msm8974.dtsi
@@ -98,7 +98,7 @@
qcom,hsusb-otg-disable-reset;
};
- qcom,sdcc@f9824000 {
+ sdcc1: qcom,sdcc@f9824000 {
cell-index = <1>; /* SDC1 eMMC slot */
compatible = "qcom,msm-sdcc";
reg = <0xf9824000 0x1000>;
@@ -127,7 +127,7 @@
qcom,sdcc-bus-speed-mode = "HS200_1p8v", "DDR_1p8v";
};
- qcom,sdcc@f98a4000 {
+ sdcc2: qcom,sdcc@f98a4000 {
cell-index = <2>; /* SDC2 SD card slot */
compatible = "qcom,msm-sdcc";
reg = <0xf98a4000 0x1000>;
@@ -158,7 +158,7 @@
qcom,sdcc-current-limit = <800>;
};
- qcom,sdcc@f9864000 {
+ sdcc3: qcom,sdcc@f9864000 {
cell-index = <3>; /* SDC3 SDIO slot */
compatible = "qcom,msm-sdcc";
reg = <0xf9864000 0x1000>;
@@ -181,7 +181,7 @@
status = "disable";
};
- qcom,sdcc@f98e4000 {
+ sdcc4: qcom,sdcc@f98e4000 {
cell-index = <4>; /* SDC4 SDIO slot */
compatible = "qcom,msm-sdcc";
reg = <0xf98e4000 0x1000>;
@@ -598,6 +598,10 @@
compatible = "qcom,msm-voip-dsp";
};
+ qcom,msm-pcm-voice {
+ compatible = "qcom,msm-pcm-voice";
+ };
+
qcom,msm-stub-codec {
compatible = "qcom,msm-stub-codec";
};
diff --git a/arch/arm/configs/msm7627a-perf_defconfig b/arch/arm/configs/msm7627a-perf_defconfig
index a8abb30..8363b7f 100644
--- a/arch/arm/configs/msm7627a-perf_defconfig
+++ b/arch/arm/configs/msm7627a-perf_defconfig
@@ -154,10 +154,14 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_FILTER=y
CONFIG_BT=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
diff --git a/arch/arm/configs/msm7627a_defconfig b/arch/arm/configs/msm7627a_defconfig
index 00325c9..d7735f5 100644
--- a/arch/arm/configs/msm7627a_defconfig
+++ b/arch/arm/configs/msm7627a_defconfig
@@ -154,10 +154,14 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_FILTER=y
CONFIG_BT=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
diff --git a/arch/arm/configs/msm8660-perf_defconfig b/arch/arm/configs/msm8660-perf_defconfig
index a51b76d..c8f9212 100644
--- a/arch/arm/configs/msm8660-perf_defconfig
+++ b/arch/arm/configs/msm8660-perf_defconfig
@@ -181,12 +181,14 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_PRIO=y
diff --git a/arch/arm/configs/msm8660_defconfig b/arch/arm/configs/msm8660_defconfig
index 0efe658..2eba8ab 100644
--- a/arch/arm/configs/msm8660_defconfig
+++ b/arch/arm/configs/msm8660_defconfig
@@ -181,12 +181,14 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_PRIO=y
diff --git a/arch/arm/configs/msm8960-perf_defconfig b/arch/arm/configs/msm8960-perf_defconfig
index 3fad6b7..408175d 100644
--- a/arch/arm/configs/msm8960-perf_defconfig
+++ b/arch/arm/configs/msm8960-perf_defconfig
@@ -203,6 +203,7 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
@@ -211,6 +212,7 @@
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_PRIO=y
diff --git a/arch/arm/configs/msm8960_defconfig b/arch/arm/configs/msm8960_defconfig
index cd79e98..7a4bf08 100644
--- a/arch/arm/configs/msm8960_defconfig
+++ b/arch/arm/configs/msm8960_defconfig
@@ -207,6 +207,7 @@
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
@@ -215,6 +216,7 @@
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_PRIO=y
diff --git a/arch/arm/configs/msm8974_defconfig b/arch/arm/configs/msm8974_defconfig
index 82e5c63..d23baec 100644
--- a/arch/arm/configs/msm8974_defconfig
+++ b/arch/arm/configs/msm8974_defconfig
@@ -56,6 +56,8 @@
CONFIG_MSM_OCMEM_POWER_DISABLE=y
CONFIG_MSM_MEMORY_DUMP=y
CONFIG_MSM_WATCHDOG_V2=y
+CONFIG_MSM_DLOAD_MODE=y
+CONFIG_PANIC_TIMEOUT=5
CONFIG_MSM_CACHE_ERP=y
CONFIG_MSM_L1_ERR_PANIC=y
CONFIG_MSM_L2_ERP_PRINT_ACCESS_ERRORS=y
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig
index 9af22a9..e41ab0a 100644
--- a/arch/arm/mach-msm/Kconfig
+++ b/arch/arm/mach-msm/Kconfig
@@ -2115,7 +2115,7 @@
config MSM_DLOAD_MODE
bool "Enable download mode on crashes"
- depends on ARCH_MSM8X60 || ARCH_MSM8960 || ARCH_MSM9615
+ depends on ARCH_MSM8X60 || ARCH_MSM8960 || ARCH_MSM9615 || ARCH_MSM8974
default n
help
This makes the SoC enter download mode when it resets
diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c
index ab9004f..0e05407 100644
--- a/arch/arm/mach-msm/board-8064.c
+++ b/arch/arm/mach-msm/board-8064.c
@@ -2950,6 +2950,7 @@
ARRAY_SIZE(common_not_mpq_devices));
enable_ddr3_regulator();
if (machine_is_apq8064_mtp()) {
+ msm_hsic_pdata.log2_irq_thresh = 5,
apq8064_device_hsic_host.dev.platform_data = &msm_hsic_pdata;
device_initialize(&apq8064_device_hsic_host.dev);
}
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index df5f748..cde6437 100644
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -5818,6 +5818,7 @@
static struct clk_lookup msm_clocks_8960ab_only[] __initdata = {
CLK_LOOKUP("bus_clk", gfx3d_axi_clk.c, "footswitch-8x60.2"),
+ CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu.10"),
CLK_LOOKUP("div_clk", tv_src_div_clk.c, ""),
};
@@ -6456,6 +6457,8 @@
msm_clocks_8960ab_only, sizeof(msm_clocks_8960ab_only));
msm8960_clock_init_data.size -=
ARRAY_SIZE(msm_clocks_8960_only);
+
+ gmem_axi_clk.c.depends = &gfx3d_axi_clk.c;
} else if (cpu_is_msm8960()) {
memcpy(msm_clocks_8960 + ARRAY_SIZE(msm_clocks_8960_common),
msm_clocks_8960_only, sizeof(msm_clocks_8960_only));
diff --git a/arch/arm/mach-msm/clock-8974.c b/arch/arm/mach-msm/clock-8974.c
index dc05dcf..fac3b1c 100644
--- a/arch/arm/mach-msm/clock-8974.c
+++ b/arch/arm/mach-msm/clock-8974.c
@@ -2655,6 +2655,7 @@
};
static struct clk_freq_tbl ftbl_camss_mclk0_3_clk[] = {
+ F_MM(19200000, cxo, 1, 0, 0),
F_MM(66670000, gpll0, 9, 0, 0),
F_END
};
@@ -5069,37 +5070,93 @@
CLK_LOOKUP("lut_clk", mdss_mdp_lut_clk.c, "mdp.0"),
CLK_LOOKUP("core_clk_src", mdp_clk_src.c, "mdp.0"),
CLK_LOOKUP("vsync_clk", mdss_vsync_clk.c, "mdp.0"),
- CLK_LOOKUP("iface_clk", camss_cci_cci_ahb_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_cci_cci_clk.c, ""),
- CLK_LOOKUP("iface_clk", camss_csi0_ahb_clk.c, ""),
- CLK_LOOKUP("camss_csi0_clk", camss_csi0_clk.c, ""),
- CLK_LOOKUP("camss_csi0phy_clk", camss_csi0phy_clk.c, ""),
- CLK_LOOKUP("camss_csi0pix_clk", camss_csi0pix_clk.c, ""),
- CLK_LOOKUP("camss_csi0rdi_clk", camss_csi0rdi_clk.c, ""),
- CLK_LOOKUP("iface_clk", camss_csi1_ahb_clk.c, ""),
- CLK_LOOKUP("camss_csi1_clk", camss_csi1_clk.c, ""),
- CLK_LOOKUP("camss_csi1phy_clk", camss_csi1phy_clk.c, ""),
- CLK_LOOKUP("camss_csi1pix_clk", camss_csi1pix_clk.c, ""),
- CLK_LOOKUP("camss_csi1rdi_clk", camss_csi1rdi_clk.c, ""),
- CLK_LOOKUP("iface_clk", camss_csi2_ahb_clk.c, ""),
- CLK_LOOKUP("camss_csi2_clk", camss_csi2_clk.c, ""),
- CLK_LOOKUP("camss_csi2phy_clk", camss_csi2phy_clk.c, ""),
- CLK_LOOKUP("camss_csi2pix_clk", camss_csi2pix_clk.c, ""),
- CLK_LOOKUP("camss_csi2rdi_clk", camss_csi2rdi_clk.c, ""),
- CLK_LOOKUP("iface_clk", camss_csi3_ahb_clk.c, ""),
- CLK_LOOKUP("camss_csi3_clk", camss_csi3_clk.c, ""),
- CLK_LOOKUP("camss_csi3phy_clk", camss_csi3phy_clk.c, ""),
- CLK_LOOKUP("camss_csi3pix_clk", camss_csi3pix_clk.c, ""),
- CLK_LOOKUP("camss_csi3rdi_clk", camss_csi3rdi_clk.c, ""),
- CLK_LOOKUP("camss_csi0_clk_src", csi0_clk_src.c, ""),
- CLK_LOOKUP("camss_csi1_clk_src", csi1_clk_src.c, ""),
- CLK_LOOKUP("camss_csi2_clk_src", csi2_clk_src.c, ""),
- CLK_LOOKUP("camss_csi3_clk_src", csi3_clk_src.c, ""),
- CLK_LOOKUP("camss_csi_vfe0_clk", camss_csi_vfe0_clk.c, ""),
- CLK_LOOKUP("camss_csi_vfe1_clk", camss_csi_vfe1_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_gp0_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_gp1_clk.c, ""),
- CLK_LOOKUP("iface_clk", camss_ispif_ahb_clk.c, ""),
+
+ /* MM sensor clocks */
+ CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6e.qcom,s5k3l1yx"),
+ CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6c.qcom,ov2720"),
+ CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6e.qcom,s5k3l1yx"),
+ CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6c.qcom,ov2720"),
+ CLK_LOOKUP("cam_clk", camss_mclk1_clk.c, ""),
+ CLK_LOOKUP("cam_clk", camss_mclk2_clk.c, ""),
+ CLK_LOOKUP("cam_clk", camss_mclk3_clk.c, ""),
+ CLK_LOOKUP("cam_gp0_src_clk", mmss_gp0_clk_src.c, ""),
+ CLK_LOOKUP("cam_gp1_src_clk", mmss_gp1_clk_src.c, ""),
+ CLK_LOOKUP("cam_gp0_clk", camss_gp0_clk.c, ""),
+ CLK_LOOKUP("cam_gp1_clk", camss_gp1_clk.c, ""),
+ /* CCI clocks */
+ CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
+ "fda0c000.qcom,cci"),
+ CLK_LOOKUP("cci_ahb_clk", camss_cci_cci_ahb_clk.c, "fda0c000.qcom,cci"),
+ CLK_LOOKUP("cci_src_clk", cci_clk_src.c, "fda0c000.qcom,cci"),
+ CLK_LOOKUP("cci_clk", camss_cci_cci_clk.c, "fda0c000.qcom,cci"),
+ /* CSIPHY clocks */
+ CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
+ "fda0ac00.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_src_clk", csi0phytimer_clk_src.c,
+ "fda0ac00.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_clk", camss_phy0_csi0phytimer_clk.c,
+ "fda0ac00.qcom,csiphy"),
+ CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
+ "fda0b000.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_src_clk", csi1phytimer_clk_src.c,
+ "fda0b000.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_clk", camss_phy1_csi1phytimer_clk.c,
+ "fda0b000.qcom,csiphy"),
+ CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
+ "fda0b400.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_src_clk", csi2phytimer_clk_src.c,
+ "fda0b400.qcom,csiphy"),
+ CLK_LOOKUP("csiphy_timer_clk", camss_phy2_csi2phytimer_clk.c,
+ "fda0b400.qcom,csiphy"),
+ /* CSID clocks */
+ CLK_LOOKUP("csi_ahb_clk", camss_csi0_ahb_clk.c, "fda08000.qcom,csid"),
+ CLK_LOOKUP("csi_src_clk", csi0_clk_src.c, "fda08000.qcom,csid"),
+ CLK_LOOKUP("csi_phy_clk", camss_csi0phy_clk.c, "fda08000.qcom,csid"),
+ CLK_LOOKUP("csi_clk", camss_csi0_clk.c, "fda08000.qcom,csid"),
+ CLK_LOOKUP("csi_ahb_clk", camss_csi1_ahb_clk.c, "fda08400.qcom,csid"),
+ CLK_LOOKUP("csi_src_clk", csi1_clk_src.c, "fda08400.qcom,csid"),
+ CLK_LOOKUP("csi_phy_clk", camss_csi1phy_clk.c, "fda08400.qcom,csid"),
+ CLK_LOOKUP("csi_clk", camss_csi1_clk.c, "fda08400.qcom,csid"),
+ CLK_LOOKUP("csi_ahb_clk", camss_csi2_ahb_clk.c, "fda08800.qcom,csid"),
+ CLK_LOOKUP("csi_src_clk", csi2_clk_src.c, "fda08800.qcom,csid"),
+ CLK_LOOKUP("csi_phy_clk", camss_csi2phy_clk.c, "fda08800.qcom,csid"),
+ CLK_LOOKUP("csi_clk", camss_csi2_clk.c, "fda08800.qcom,csid"),
+ CLK_LOOKUP("csi_ahb_clk", camss_csi3_ahb_clk.c, "fda08c00.qcom,csid"),
+ CLK_LOOKUP("csi_src_clk", csi3_clk_src.c, "fda08c00.qcom,csid"),
+ CLK_LOOKUP("csi_phy_clk", camss_csi3phy_clk.c, "fda08c00.qcom,csid"),
+ CLK_LOOKUP("csi_clk", camss_csi3_clk.c, "fda08c00.qcom,csid"),
+ /* ISPIF clocks */
+ CLK_LOOKUP("csi0_pix_clk", camss_csi0pix_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi0_rdi_clk", camss_csi0rdi_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_pix_clk", camss_csi1pix_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi1_rdi_clk", camss_csi1rdi_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi2_pix_clk", camss_csi2pix_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi2_rdi_clk", camss_csi2rdi_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi3_pix_clk", camss_csi3pix_clk.c, "fda0a000.qcom,ispif"),
+ CLK_LOOKUP("csi3_rdi_clk", camss_csi3rdi_clk.c, "fda0a000.qcom,ispif"),
+ /*VFE clocks*/
+ CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
+ "fda10000.qcom,vfe"),
+ CLK_LOOKUP("vfe_clk_src", vfe0_clk_src.c, "fda10000.qcom,vfe"),
+ CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe0_clk.c,
+ "fda10000.qcom,vfe"),
+ CLK_LOOKUP("camss_csi_vfe_clk", camss_csi_vfe0_clk.c,
+ "fda10000.qcom,vfe"),
+ CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c, "fda10000.qcom,vfe"),
+ CLK_LOOKUP("bus_clk", camss_vfe_vfe_axi_clk.c, "fda10000.qcom,vfe"),
+ CLK_LOOKUP("alt_bus_clk", camss_vfe_vfe_ocmemnoc_clk.c,
+ "fda10000.qcom,vfe"),
+ CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
+ "fda14000.qcom,vfe"),
+ CLK_LOOKUP("vfe_clk_src", vfe1_clk_src.c, "fda14000.qcom,vfe"),
+ CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe1_clk.c,
+ "fda14000.qcom,vfe"),
+ CLK_LOOKUP("camss_csi_vfe_clk", camss_csi_vfe1_clk.c,
+ "fda14000.qcom,vfe"),
+ CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c, "fda14000.qcom,vfe"),
+ CLK_LOOKUP("bus_clk", camss_vfe_vfe_axi_clk.c, "fda14000.qcom,vfe"),
+ CLK_LOOKUP("alt_bus_clk", camss_vfe_vfe_ocmemnoc_clk.c,
+ "fda14000.qcom,vfe"),
CLK_LOOKUP("core_clk", camss_jpeg_jpeg0_clk.c, ""),
CLK_LOOKUP("core_clk", camss_jpeg_jpeg1_clk.c, ""),
CLK_LOOKUP("core_clk", camss_jpeg_jpeg2_clk.c, ""),
@@ -5109,24 +5166,10 @@
"fda64000.qcom,iommu"),
CLK_LOOKUP("bus_clk", camss_jpeg_jpeg_axi_clk.c, ""),
CLK_LOOKUP("bus_clk", camss_jpeg_jpeg_ocmemnoc_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_mclk0_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_mclk1_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_mclk2_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_mclk3_clk.c, ""),
CLK_LOOKUP("iface_clk", camss_micro_ahb_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_phy0_csi0phytimer_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_phy1_csi1phytimer_clk.c, ""),
- CLK_LOOKUP("core_clk", camss_phy2_csi2phytimer_clk.c, ""),
CLK_LOOKUP("iface_clk", camss_top_ahb_clk.c, ""),
CLK_LOOKUP("iface_clk", camss_vfe_cpp_ahb_clk.c, "fda44000.qcom,iommu"),
CLK_LOOKUP("core_clk", camss_vfe_cpp_clk.c, "fda44000.qcom,iommu"),
- CLK_LOOKUP("camss_vfe_vfe0_clk", camss_vfe_vfe0_clk.c, ""),
- CLK_LOOKUP("camss_vfe_vfe1_clk", camss_vfe_vfe1_clk.c, ""),
- CLK_LOOKUP("vfe0_clk_src", vfe0_clk_src.c, ""),
- CLK_LOOKUP("vfe1_clk_src", vfe1_clk_src.c, ""),
- CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c, ""),
- CLK_LOOKUP("bus_clk", camss_vfe_vfe_axi_clk.c, ""),
- CLK_LOOKUP("bus_clk", camss_vfe_vfe_ocmemnoc_clk.c, ""),
CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "mdp.0"),
CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "mdss_dsi_clk_ctrl"),
CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "fd928000.qcom,iommu"),
diff --git a/arch/arm/mach-msm/devices-iommu.c b/arch/arm/mach-msm/devices-iommu.c
index ae8a8fe..b65bd1f 100644
--- a/arch/arm/mach-msm/devices-iommu.c
+++ b/arch/arm/mach-msm/devices-iommu.c
@@ -939,8 +939,11 @@
&msm_device_iommu_gfx2d1,
};
-static struct platform_device *msm_iommu_8064_devs[] = {
+static struct platform_device *msm_iommu_adreno3xx_gfx_devs[] = {
&msm_device_iommu_gfx3d1,
+};
+
+static struct platform_device *msm_iommu_vcap_devs[] = {
&msm_device_iommu_vcap,
};
@@ -973,9 +976,12 @@
&msm_device_gfx2d1_2d1_ctx,
};
-static struct platform_device *msm_iommu_8064_ctx_devs[] = {
+static struct platform_device *msm_iommu_adreno3xx_ctx_devs[] = {
&msm_device_gfx3d1_user_ctx,
&msm_device_gfx3d1_priv_ctx,
+};
+
+static struct platform_device *msm_iommu_vcap_ctx_devs[] = {
&msm_device_vcap_vc_ctx,
&msm_device_vcap_vp_ctx,
};
@@ -1014,9 +1020,12 @@
if (cpu_is_apq8064() || cpu_is_msm8960ab()) {
platform_add_devices(msm_iommu_jpegd_devs,
ARRAY_SIZE(msm_iommu_jpegd_devs));
- platform_add_devices(msm_iommu_8064_devs,
- ARRAY_SIZE(msm_iommu_8064_devs));
+ platform_add_devices(msm_iommu_adreno3xx_gfx_devs,
+ ARRAY_SIZE(msm_iommu_adreno3xx_gfx_devs));
}
+ if (cpu_is_apq8064())
+ platform_add_devices(msm_iommu_vcap_devs,
+ ARRAY_SIZE(msm_iommu_vcap_devs));
/* Initialize common ctx_devs */
ret = platform_add_devices(msm_iommu_common_ctx_devs,
@@ -1033,9 +1042,13 @@
if (cpu_is_apq8064() || cpu_is_msm8960ab()) {
platform_add_devices(msm_iommu_jpegd_ctx_devs,
ARRAY_SIZE(msm_iommu_jpegd_ctx_devs));
- platform_add_devices(msm_iommu_8064_ctx_devs,
- ARRAY_SIZE(msm_iommu_8064_ctx_devs));
+
+ platform_add_devices(msm_iommu_adreno3xx_ctx_devs,
+ ARRAY_SIZE(msm_iommu_adreno3xx_ctx_devs));
}
+ if (cpu_is_apq8064())
+ platform_add_devices(msm_iommu_vcap_ctx_devs,
+ ARRAY_SIZE(msm_iommu_vcap_ctx_devs));
return 0;
@@ -1068,16 +1081,33 @@
for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_devs); i++)
platform_device_unregister(msm_iommu_jpegd_devs[i]);
}
+ if (cpu_is_apq8064()) {
+ for (i = 0; i < ARRAY_SIZE(msm_iommu_vcap_ctx_devs); i++)
+ platform_device_unregister(msm_iommu_vcap_ctx_devs[i]);
+ }
if (cpu_is_apq8064() || cpu_is_msm8960ab()) {
- for (i = 0; i < ARRAY_SIZE(msm_iommu_8064_ctx_devs); i++)
- platform_device_unregister(msm_iommu_8064_ctx_devs[i]);
+ for (i = 0; i < ARRAY_SIZE(msm_iommu_adreno3xx_ctx_devs);
+ i++)
+ platform_device_unregister(
+ msm_iommu_adreno3xx_ctx_devs[i]);
- for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_ctx_devs); i++)
- platform_device_unregister(msm_iommu_jpegd_ctx_devs[i]);
+ for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_ctx_devs);
+ i++)
+ platform_device_unregister(
+ msm_iommu_jpegd_ctx_devs[i]);
- for (i = 0; i < ARRAY_SIZE(msm_iommu_8064_devs); i++)
- platform_device_unregister(msm_iommu_8064_devs[i]);
+ if (cpu_is_apq8064()) {
+ for (i = 0; i < ARRAY_SIZE(msm_iommu_vcap_devs);
+ i++)
+ platform_device_unregister(
+ msm_iommu_vcap_devs[i]);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(msm_iommu_adreno3xx_gfx_devs);
+ i++)
+ platform_device_unregister(
+ msm_iommu_adreno3xx_gfx_devs[i]);
for (i = 0; i < ARRAY_SIZE(msm_iommu_jpegd_devs); i++)
platform_device_unregister(msm_iommu_jpegd_devs[i]);
diff --git a/arch/arm/mach-msm/devices-msm7x27a.c b/arch/arm/mach-msm/devices-msm7x27a.c
index 5295cbc..e7d652b 100644
--- a/arch/arm/mach-msm/devices-msm7x27a.c
+++ b/arch/arm/mach-msm/devices-msm7x27a.c
@@ -1263,8 +1263,8 @@
},
{
.name = "dma_chnl",
- .start = DMOV_SDC3_CHAN,
- .end = DMOV_SDC3_CHAN,
+ .start = DMOV_NAND_CHAN,
+ .end = DMOV_NAND_CHAN,
.flags = IORESOURCE_DMA,
},
{
diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c
index a6473c6..45486f4 100644
--- a/arch/arm/mach-msm/devices-msm7x30.c
+++ b/arch/arm/mach-msm/devices-msm7x30.c
@@ -1329,7 +1329,7 @@
static struct kgsl_device_platform_data kgsl_2d0_pdata = {
.pwrlevel = {
{
- .gpu_freq = 192000000,
+ .gpu_freq = 0,
.bus_freq = 192000000,
},
},
diff --git a/arch/arm/mach-msm/include/mach/socinfo.h b/arch/arm/mach-msm/include/mach/socinfo.h
index f7ba507..d80cc02 100644
--- a/arch/arm/mach-msm/include/mach/socinfo.h
+++ b/arch/arm/mach-msm/include/mach/socinfo.h
@@ -97,6 +97,7 @@
const int cpu_is_krait(void);
const int cpu_is_krait_v1(void);
const int cpu_is_krait_v2(void);
+const int cpu_is_krait_v3(void);
static inline int cpu_is_msm7x01(void)
{
diff --git a/arch/arm/mach-msm/include/mach/sps.h b/arch/arm/mach-msm/include/mach/sps.h
index edc4b39..000ffe4 100644
--- a/arch/arm/mach-msm/include/mach/sps.h
+++ b/arch/arm/mach-msm/include/mach/sps.h
@@ -75,6 +75,8 @@
#define SPS_BAM_OPT_BAMDMA (1UL << 2)
/* BAM IRQ is registered for apps wakeup */
#define SPS_BAM_OPT_IRQ_WAKEUP (1UL << 3)
+/* Ignore external block pipe reset */
+#define SPS_BAM_NO_EXT_P_RST (1UL << 4)
/* BAM device management flags */
diff --git a/arch/arm/mach-msm/lpm_resources.c b/arch/arm/mach-msm/lpm_resources.c
index 6a9654f..7d432f4 100644
--- a/arch/arm/mach-msm/lpm_resources.c
+++ b/arch/arm/mach-msm/lpm_resources.c
@@ -851,6 +851,7 @@
msm_lpm_l2.rs_data.default_value = MSM_LPM_L2_CACHE_HSFS_OPEN;
msm_lpm_l2.rs_data.value = MSM_LPM_L2_CACHE_HSFS_OPEN;
}
+ msm_pm_set_l2_flush_flag(0);
return 0;
fail:
return ret;
diff --git a/arch/arm/mach-msm/restart.c b/arch/arm/mach-msm/restart.c
index 519dbb3..aac83e5 100644
--- a/arch/arm/mach-msm/restart.c
+++ b/arch/arm/mach-msm/restart.c
@@ -223,8 +223,9 @@
{
printk(KERN_NOTICE "Going down for restart now\n");
+ msm_restart_prepare(cmd);
+
if (!use_restart_v2()) {
- msm_restart_prepare(cmd);
__raw_writel(0, msm_tmr0_base + WDT0_EN);
if (!(machine_is_msm8x60_fusion() ||
machine_is_msm8x60_fusn_ffa())) {
diff --git a/arch/arm/mach-msm/socinfo.c b/arch/arm/mach-msm/socinfo.c
index 39fbba8..8e0113c 100644
--- a/arch/arm/mach-msm/socinfo.c
+++ b/arch/arm/mach-msm/socinfo.c
@@ -830,3 +830,17 @@
return 0;
};
}
+
+const int cpu_is_krait_v3(void)
+{
+ switch (read_cpuid_id()) {
+ case 0x512F04D0:
+ case 0x511F06F0:
+ case 0x511F06F1:
+ case 0x510F05D0:
+ return 1;
+
+ default:
+ return 0;
+ };
+}
diff --git a/drivers/coresight/coresight-etm.c b/drivers/coresight/coresight-etm.c
index e805c7f..46d3e5d 100644
--- a/drivers/coresight/coresight-etm.c
+++ b/drivers/coresight/coresight-etm.c
@@ -1516,6 +1516,12 @@
static int etm_count;
struct coresight_desc *desc;
+ /* Fail probe for Krait pass3 until supported */
+ if (cpu_is_krait_v3()) {
+ dev_info(dev, "ETM: failing probe for Krait pass3\n");
+ return -EINVAL;
+ }
+
if (pdev->dev.of_node) {
pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node);
if (IS_ERR(pdata))
diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c
index 880fe92..8c45475 100644
--- a/drivers/gpu/msm/kgsl_pwrctrl.c
+++ b/drivers/gpu/msm/kgsl_pwrctrl.c
@@ -465,16 +465,17 @@
&pwr->power_flags)) {
trace_kgsl_clk(device, state);
/* High latency clock maintenance. */
- if ((pwr->pwrlevels[0].gpu_freq > 0) &&
- (device->state != KGSL_STATE_NAP)) {
+ if (device->state != KGSL_STATE_NAP) {
for (i = KGSL_MAX_CLKS - 1; i > 0; i--)
if (pwr->grp_clks[i])
clk_prepare(pwr->grp_clks[i]);
- clk_set_rate(pwr->grp_clks[0],
- pwr->pwrlevels[pwr->active_pwrlevel].
+
+ if (pwr->pwrlevels[0].gpu_freq > 0)
+ clk_set_rate(pwr->grp_clks[0],
+ pwr->pwrlevels
+ [pwr->active_pwrlevel].
gpu_freq);
}
-
/* as last step, enable grp_clk
this is to let GPU interrupt to come */
for (i = KGSL_MAX_CLKS - 1; i > 0; i--)
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c
index cb33ec8..c2ce5c7 100644
--- a/drivers/gpu/msm/kgsl_sharedmem.c
+++ b/drivers/gpu/msm/kgsl_sharedmem.c
@@ -510,6 +510,25 @@
struct page **pages = NULL;
pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL);
void *ptr;
+ struct sysinfo si;
+
+ /*
+ * Get the current memory information to be used in deciding if we
+ * should go ahead with this allocation
+ */
+
+ si_meminfo(&si);
+
+ /*
+ * Limit the size of the allocation to the amount of free memory minus
+ * 32MB. Why 32MB? Because thats the buffer that page_alloc uses and
+ * it just seems like a reasonable limit that won't make the OOM killer
+ * go all serial on us. Of course, if we are down this low all bets
+ * are off but above all do no harm.
+ */
+
+ if (size >= ((si.freeram << PAGE_SHIFT) - SZ_32M))
+ return -ENOMEM;
/*
* Add guard page to the end of the allocation when the
@@ -681,7 +700,8 @@
{
unsigned int protflags;
- BUG_ON(size == 0);
+ if (size == 0)
+ return -EINVAL;
protflags = GSL_PT_PAGE_RV;
if (!(flags & KGSL_MEMFLAGS_GPUREADONLY))
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index e696973..f10f433 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -2773,7 +2773,7 @@
{ }
};
MODULE_DEVICE_TABLE(i2c, mxt_id);
-#ifdef OF_CONFIG
+#ifdef CONFIG_OF
static struct of_device_id mxt_match_table[] = {
{ .compatible = "atmel,mxt-ts",},
{ },
diff --git a/drivers/media/video/msm/vfe/msm_vfe31_v4l2.c b/drivers/media/video/msm/vfe/msm_vfe31_v4l2.c
index 2179282..de32f1b 100644
--- a/drivers/media/video/msm/vfe/msm_vfe31_v4l2.c
+++ b/drivers/media/video/msm/vfe/msm_vfe31_v4l2.c
@@ -367,7 +367,7 @@
rc = vfe31_ctrl->stats_ops.dqbuf(vfe31_ctrl->stats_ops.stats_ctrl,
stats_type, &buf);
if (rc < 0) {
- pr_err("%s: dq stats buf (type = %d) err = %d",
+ CDBG("%s: dq stats buf (type = %d) err = %d",
__func__, stats_type, rc);
return 0L;
}
diff --git a/drivers/media/video/msm/vfe/msm_vfe32.c b/drivers/media/video/msm/vfe/msm_vfe32.c
index 908f3fb..2740808 100644
--- a/drivers/media/video/msm/vfe/msm_vfe32.c
+++ b/drivers/media/video/msm/vfe/msm_vfe32.c
@@ -960,7 +960,7 @@
rc = vfe32_ctrl->stats_ops.dqbuf(
vfe32_ctrl->stats_ops.stats_ctrl, stats_type, &buf);
if (rc < 0) {
- pr_err("%s: dq stats buf (type = %d) err = %d",
+ CDBG("%s: dq stats buf (type = %d) err = %d",
__func__, stats_type, rc);
return 0L;
}
diff --git a/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c b/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
index 75d9293..15c38af 100644
--- a/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
+++ b/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
@@ -360,7 +360,7 @@
rc = vfe2x_ctrl->stats_ops.dqbuf(vfe2x_ctrl->stats_ops.stats_ctrl,
stats_type, &buf);
if (rc < 0) {
- pr_err("%s: dq stats buf (type = %d) err = %d",
+ CDBG("%s: dq stats buf (type = %d) err = %d",
__func__, stats_type, rc);
return 0;
}
diff --git a/drivers/media/video/msm/vfe/msm_vfe_stats_buf.c b/drivers/media/video/msm/vfe/msm_vfe_stats_buf.c
index 5820d76..a813e09 100644
--- a/drivers/media/video/msm/vfe/msm_vfe_stats_buf.c
+++ b/drivers/media/video/msm/vfe/msm_vfe_stats_buf.c
@@ -363,7 +363,7 @@
}
}
if (!(*pp_stats_buf)) {
- pr_err("%s: no free stats buf, type = %d",
+ D("%s: no free stats buf, type = %d",
__func__, stats_type);
rc = -1;
return rc;
diff --git a/drivers/media/video/msm_vidc/msm_vdec.c b/drivers/media/video/msm_vidc/msm_vdec.c
index ffa873f..7f83625 100644
--- a/drivers/media/video/msm_vidc/msm_vdec.c
+++ b/drivers/media/video/msm_vidc/msm_vdec.c
@@ -469,8 +469,8 @@
return -EINVAL;
}
if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
- inst->prop.width = f->fmt.pix_mp.width;
- inst->prop.height = f->fmt.pix_mp.height;
+ struct hal_frame_size frame_sz;
+
fmt = msm_comm_get_pixel_fmt_fourcc(vdec_formats,
ARRAY_SIZE(vdec_formats), f->fmt.pix_mp.pixelformat,
CAPTURE_PORT);
@@ -480,6 +480,21 @@
rc = -EINVAL;
goto err_invalid_fmt;
}
+
+ inst->prop.width = f->fmt.pix_mp.width;
+ inst->prop.height = f->fmt.pix_mp.height;
+
+ frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
+ frame_sz.width = inst->prop.width;
+ frame_sz.height = inst->prop.height;
+ pr_debug("width = %d, height = %d\n",
+ frame_sz.width, frame_sz.height);
+ rc = vidc_hal_session_set_property((void *)inst->session,
+ HAL_PARAM_FRAME_SIZE, &frame_sz);
+ if (rc) {
+ pr_err("Failed to set hal property for framesize\n");
+ goto err_invalid_fmt;
+ }
} else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
fmt = msm_comm_get_pixel_fmt_fourcc(vdec_formats,
ARRAY_SIZE(vdec_formats), f->fmt.pix_mp.pixelformat,
@@ -570,7 +585,6 @@
{
int i, rc = 0;
struct msm_vidc_inst *inst;
- struct hal_frame_size frame_sz;
unsigned long flags;
if (!q || !q->drv_priv) {
pr_err("Invalid input, q = %p\n", q);
@@ -595,27 +609,42 @@
pr_err("Failed to open instance\n");
break;
}
- frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
- frame_sz.width = inst->prop.width;
- frame_sz.height = inst->prop.height;
- pr_debug("width = %d, height = %d\n",
- frame_sz.width, frame_sz.height);
- rc = vidc_hal_session_set_property((void *)inst->session,
- HAL_PARAM_FRAME_SIZE, &frame_sz);
- if (rc) {
- pr_err("Failed to set hal property for framesize\n");
- break;
- }
+
rc = msm_comm_try_get_bufreqs(inst);
if (rc) {
pr_err("Failed to get buffer requirements: %d\n", rc);
break;
}
*num_planes = 1;
+
spin_lock_irqsave(&inst->lock, flags);
- *num_buffers = inst->buff_req.buffer[1].buffer_count_actual;
+ if (*num_buffers && *num_buffers >
+ inst->buff_req.buffer[HAL_BUFFER_OUTPUT].
+ buffer_count_actual) {
+ struct hal_buffer_count_actual new_buf_count;
+ enum hal_property property_id =
+ HAL_PARAM_BUFFER_COUNT_ACTUAL;
+
+ new_buf_count.buffer_type = HAL_BUFFER_OUTPUT;
+ new_buf_count.buffer_count_actual = *num_buffers;
+ rc = vidc_hal_session_set_property(inst->session,
+ property_id, &new_buf_count);
+
+ spin_unlock_irqrestore(&inst->lock, flags);
+ if (!rc && msm_comm_try_get_bufreqs(inst)) {
+ /* We are allowed to reject clients' request for
+ * more buffers and suggest our own bufreq */
+ pr_warn("Unable to increase the number of output buffers to %d\n",
+ *num_buffers);
+ }
+ spin_lock_irqsave(&inst->lock, flags);
+ }
+ *num_buffers = inst->buff_req.buffer[HAL_BUFFER_OUTPUT].
+ buffer_count_actual;
spin_unlock_irqrestore(&inst->lock, flags);
- pr_debug("size = %d, alignment = %d\n",
+
+ pr_debug("count = %d, size = %d, alignment = %d\n",
+ inst->buff_req.buffer[1].buffer_count_actual,
inst->buff_req.buffer[1].buffer_size,
inst->buff_req.buffer[1].buffer_alignment);
for (i = 0; i < *num_planes; i++) {
diff --git a/drivers/media/video/msm_vidc/vidc_hal.c b/drivers/media/video/msm_vidc/vidc_hal.c
index 0b00d3d..2021ec6 100644
--- a/drivers/media/video/msm_vidc/vidc_hal.c
+++ b/drivers/media/video/msm_vidc/vidc_hal.c
@@ -486,7 +486,7 @@
{
q_hdr->qhdr_status = 0x1;
q_hdr->qhdr_type = VIDC_IFACEQ_DFLT_QHDR;
- q_hdr->qhdr_q_size = VIDC_IFACEQ_QUEUE_SIZE;
+ q_hdr->qhdr_q_size = VIDC_IFACEQ_QUEUE_SIZE / 4;
q_hdr->qhdr_pkt_size = 0;
q_hdr->qhdr_rx_wm = 0x1;
q_hdr->qhdr_tx_wm = 0x1;
diff --git a/drivers/media/video/vcap_vp.c b/drivers/media/video/vcap_vp.c
index 9f2ead4..ba053f2 100644
--- a/drivers/media/video/vcap_vp.c
+++ b/drivers/media/video/vcap_vp.c
@@ -320,7 +320,7 @@
}
dprintk(1, "%s: irq=0x%08x\n", __func__, irq);
- if (!(irq & (VP_PIC_DONE || VP_MODE_CHANGE))) {
+ if (!(irq & (VP_PIC_DONE | VP_MODE_CHANGE))) {
writel_relaxed(irq, VCAP_VP_INT_CLEAR);
pr_err("VP IRQ shows some error\n");
return IRQ_HANDLED;
@@ -789,7 +789,7 @@
top_field = 1;
#endif
vp_act->vp_state = VP_FRAME2;
- writel_relaxed(0x01100101, VCAP_VP_INTERRUPT_ENABLE);
+ writel_relaxed(0x01100001, VCAP_VP_INTERRUPT_ENABLE);
#ifdef TOP_FIELD_FIX
writel_iowmb(0x00000000 | vp_act->top_field << 0, VCAP_VP_CTRL);
writel_iowmb(0x00010000 | vp_act->top_field << 0, VCAP_VP_CTRL);
@@ -836,7 +836,7 @@
#endif
/* Config VP & Enable Interrupt */
- writel_relaxed(0x01100101, VCAP_VP_INTERRUPT_ENABLE);
+ writel_relaxed(0x01100001, VCAP_VP_INTERRUPT_ENABLE);
#ifdef TOP_FIELD_FIX
writel_iowmb(0x00000000 | vp_act->top_field << 0, VCAP_VP_CTRL);
writel_iowmb(0x00010000 | vp_act->top_field << 0, VCAP_VP_CTRL);
diff --git a/drivers/mfd/wcd9xxx-slimslave.c b/drivers/mfd/wcd9xxx-slimslave.c
index 71c68ac..b4cf435 100644
--- a/drivers/mfd/wcd9xxx-slimslave.c
+++ b/drivers/mfd/wcd9xxx-slimslave.c
@@ -535,7 +535,6 @@
unsigned int ch_cnt)
{
u16 grph = 0;
- u32 sph[SLIM_MAX_RX_PORTS] = {0};
int i = 0 , idx = 0;
int ret = 0;
struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx;
@@ -549,10 +548,9 @@
ret = -EINVAL;
goto err;
}
- sph[i] = rx[idx].sph;
grph = rx[idx].grph;
- pr_debug("%s: ch_num[%d] %d, idx %d, sph[%d] %x, grph %x\n",
- __func__, i, ch_num[i], idx, i, sph[i], grph);
+ pr_debug("%s: ch_num[%d] %d, idx %d, grph %x\n",
+ __func__, i, ch_num[i], idx, grph);
}
/* slim_control_ch (REMOVE) */
@@ -561,12 +559,6 @@
pr_err("%s: slim_control_ch failed ret[%d]\n", __func__, ret);
goto err;
}
- /* slim_disconnect_port */
- ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt);
- if (ret < 0) {
- pr_err("%s: slim_disconnect_ports failed ret[%d]\n",
- __func__, ret);
- }
for (i = 0; i < ch_cnt; i++) {
idx = (ch_num[i] - BASE_CH_NUM - sh_ch.rx_port_start_offset);
rx[idx].grph = 0;
@@ -580,7 +572,6 @@
unsigned int ch_cnt)
{
u16 grph = 0;
- u32 sph[SLIM_MAX_TX_PORTS] = {0};
int ret = 0;
int i = 0 , idx = 0;
struct wcd9xxx_slim_sch_tx *tx = sh_ch.tx;
@@ -594,15 +585,8 @@
ret = -EINVAL;
goto err;
}
- sph[i] = tx[idx].sph;
grph = tx[idx].grph;
}
- /* slim_disconnect_port */
- ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt);
- if (ret < 0) {
- pr_err("%s: slim_disconnect_ports failed ret[%d]\n",
- __func__, ret);
- }
/* slim_control_ch (REMOVE) */
ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true);
if (ret < 0) {
@@ -633,3 +617,48 @@
return ret;
}
EXPORT_SYMBOL_GPL(wcd9xxx_get_slave_port);
+
+int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
+ unsigned int ch_cnt, unsigned int rx_tx)
+{
+ u32 sph[SLIM_MAX_TX_PORTS] = {0};
+ int i = 0 , idx = 0;
+ int ret = 0;
+ struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx;
+ struct wcd9xxx_slim_sch_tx *tx = sh_ch.tx;
+
+ pr_debug("%s: ch_cnt[%d], rx_tx flag = %d\n", __func__, ch_cnt, rx_tx);
+ for (i = 0; i < ch_cnt; i++) {
+ /* rx_tx will be 1 for rx, 0 for tx */
+ if (rx_tx) {
+ idx = (ch_num[i] - BASE_CH_NUM -
+ sh_ch.rx_port_start_offset);
+ if (idx < 0) {
+ pr_err("%s: Invalid index found for RX = %d\n",
+ __func__, idx);
+ ret = -EINVAL;
+ goto err;
+ }
+ sph[i] = rx[idx].sph;
+ } else {
+ idx = (ch_num[i] - BASE_CH_NUM);
+ if (idx < 0) {
+ pr_err("%s:Invalid index found for TX = %d\n",
+ __func__, idx);
+ ret = -EINVAL;
+ goto err;
+ }
+ sph[i] = tx[idx].sph;
+ }
+ }
+
+ /* slim_disconnect_port */
+ ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt);
+ if (ret < 0) {
+ pr_err("%s: slim_disconnect_ports failed ret[%d]\n",
+ __func__, ret);
+ }
+err:
+ return ret;
+}
+EXPORT_SYMBOL_GPL(wcd9xxx_disconnect_port);
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c
index cd97701..2b278be 100644
--- a/drivers/mmc/host/msm_sdcc.c
+++ b/drivers/mmc/host/msm_sdcc.c
@@ -5181,7 +5181,9 @@
pdata->status_gpio = of_get_named_gpio_flags(np,
"cd-gpios", 0, &flags);
if (gpio_is_valid(pdata->status_gpio)) {
- pdata->status_irq = gpio_to_irq(pdata->status_gpio);
+ struct platform_device *pdev = container_of(dev,
+ struct platform_device, dev);
+ pdata->status_irq = platform_get_irq_byname(pdev, "status_irq");
pdata->is_status_gpio_active_low = flags & OF_GPIO_ACTIVE_LOW;
}
diff --git a/drivers/platform/msm/sps/bam.c b/drivers/platform/msm/sps/bam.c
index 2873a5f..7924578 100644
--- a/drivers/platform/msm/sps/bam.c
+++ b/drivers/platform/msm/sps/bam.c
@@ -643,10 +643,10 @@
*/
int bam_init(void *base, u32 ee,
u16 summing_threshold,
- u32 irq_mask, u32 *version, u32 *num_pipes)
+ u32 irq_mask, u32 *version,
+ u32 *num_pipes, u32 p_rst)
{
- /* disable bit#11 because of HW bug */
- u32 cfg_bits = 0xffffffff & ~(1 << 11);
+ u32 cfg_bits;
u32 ver = 0;
SPS_DBG2("sps:%s:bam=0x%x(va).ee=%d.", __func__, (u32) base, ee);
@@ -667,6 +667,11 @@
"use default 4.\n", (u32) base);
}
+ if (p_rst)
+ cfg_bits = 0xffffffff & ~(3 << 11);
+ else
+ cfg_bits = 0xffffffff & ~(1 << 11);
+
bam_write_reg_field(base, CTRL, BAM_SW_RST, 1);
/* No delay needed */
bam_write_reg_field(base, CTRL, BAM_SW_RST, 0);
diff --git a/drivers/platform/msm/sps/bam.h b/drivers/platform/msm/sps/bam.h
index 3521ffa..c183fcd 100644
--- a/drivers/platform/msm/sps/bam.h
+++ b/drivers/platform/msm/sps/bam.h
@@ -102,13 +102,16 @@
*
* @num_pipes - return number of pipes
*
+ * @p_rst - ignore external block pipe reset
+ *
* @return 0 on success, negative value on error
*
*/
int bam_init(void *base,
u32 ee,
u16 summing_threshold,
- u32 irq_mask, u32 *version, u32 *num_pipes);
+ u32 irq_mask, u32 *version,
+ u32 *num_pipes, u32 p_rst);
/**
* Initialize BAM device security execution environment
diff --git a/drivers/platform/msm/sps/sps_bam.c b/drivers/platform/msm/sps/sps_bam.c
index de7fb75..e3be11d 100644
--- a/drivers/platform/msm/sps/sps_bam.c
+++ b/drivers/platform/msm/sps/sps_bam.c
@@ -254,7 +254,8 @@
dev->props.ee,
(u16) dev->props.summing_threshold,
irq_mask,
- &dev->version, &num_pipes);
+ &dev->version, &num_pipes,
+ dev->props.options & SPS_BAM_NO_EXT_P_RST);
else
/* No, so just verify that it is enabled */
rc = bam_check(dev->base, &dev->version, &num_pipes);
diff --git a/drivers/usb/gadget/f_adb.c b/drivers/usb/gadget/f_adb.c
index b997a3f..9778673 100644
--- a/drivers/usb/gadget/f_adb.c
+++ b/drivers/usb/gadget/f_adb.c
@@ -48,7 +48,6 @@
atomic_t read_excl;
atomic_t write_excl;
atomic_t open_excl;
- struct delayed_work adb_release_w;
struct list_head tx_idle;
@@ -410,11 +409,6 @@
return r;
}
-static void adb_release_work(struct work_struct *w)
-{
- adb_closed_callback();
-}
-
static int adb_open(struct inode *ip, struct file *fp)
{
pr_info("adb_open\n");
@@ -429,8 +423,7 @@
/* clear the error latch */
atomic_set(&_adb_dev->error, 0);
- if (!cancel_delayed_work_sync(&_adb_dev->adb_release_w))
- adb_ready_callback();
+ adb_ready_callback();
return 0;
}
@@ -439,16 +432,7 @@
{
pr_info("adb_release\n");
- /*
- * When USB cable is plugged out, adb reader is unblocked and
- * -EIO is returned to user space. adb daemon reopen the port
- * which would disable and enable USB configuration unnecessarily.
- *
- * Delay notifying the adb close event to android by 1 sec. If
- * ADB daemon opens the port with in 1 sec, USB configuration
- * re-enable does not happen.
- */
- schedule_delayed_work(&_adb_dev->adb_release_w, msecs_to_jiffies(1000));
+ adb_closed_callback();
adb_unlock(&_adb_dev->open_excl);
return 0;
@@ -624,7 +608,6 @@
atomic_set(&dev->read_excl, 0);
atomic_set(&dev->write_excl, 0);
- INIT_DELAYED_WORK(&dev->adb_release_w, adb_release_work);
INIT_LIST_HEAD(&dev->tx_idle);
_adb_dev = dev;
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 7309438..8d967cd 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -691,8 +691,7 @@
hw->hw_alt_next = QTD_NEXT(ehci, ehci->async->dummy->qtd_dma);
/* clear interrupt enables, set irq latency */
- if (ehci->max_log2_irq_thresh)
- log2_irq_thresh = ehci->max_log2_irq_thresh;
+ log2_irq_thresh = ehci->log2_irq_thresh;
if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
log2_irq_thresh = 0;
diff --git a/drivers/usb/host/ehci-msm-hsic.c b/drivers/usb/host/ehci-msm-hsic.c
index 7af0afd..b396593 100644
--- a/drivers/usb/host/ehci-msm-hsic.c
+++ b/drivers/usb/host/ehci-msm-hsic.c
@@ -1287,13 +1287,15 @@
mehci = hcd_to_hsic(hcd);
mehci->dev = &pdev->dev;
+ pdata = mehci->dev->platform_data;
mehci->ehci.susp_sof_bug = 1;
mehci->ehci.reset_sof_bug = 1;
mehci->ehci.resume_sof_bug = 1;
- mehci->ehci.max_log2_irq_thresh = 6;
+ if (pdata)
+ mehci->ehci.log2_irq_thresh = pdata->log2_irq_thresh;
res = platform_get_resource_byname(pdev,
IORESOURCE_IRQ,
@@ -1376,7 +1378,6 @@
dev_dbg(&pdev->dev, "mode debugfs file is"
"not available\n");
- pdata = mehci->dev->platform_data;
if (pdata && pdata->bus_scale_table) {
mehci->bus_perf_client =
msm_bus_scale_register_client(pdata->bus_scale_table);
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index a0f995c..f8b884a 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -135,7 +135,7 @@
ktime_t last_periodic_enable;
u32 command;
- unsigned max_log2_irq_thresh;
+ unsigned log2_irq_thresh;
/* SILICON QUIRKS */
unsigned no_selective_suspend:1;
diff --git a/drivers/video/msm/hdmi_msm.c b/drivers/video/msm/hdmi_msm.c
index a5e72fe..ade9691 100644
--- a/drivers/video/msm/hdmi_msm.c
+++ b/drivers/video/msm/hdmi_msm.c
@@ -917,22 +917,34 @@
*/
if (external_common_state->present_hdcp) {
hdcp_deauthenticate();
+ mutex_lock(&hdcp_auth_state_mutex);
+ hdmi_msm_state->reauth = TRUE;
+ mutex_unlock(&hdcp_auth_state_mutex);
mod_timer(&hdmi_msm_state->hdcp_timer, jiffies + HZ/2);
}
}
static void hdmi_msm_hdcp_work(struct work_struct *work)
{
-
/* Only re-enable if cable still connected */
mutex_lock(&external_common_state_hpd_mutex);
if (external_common_state->hpd_state &&
!(hdmi_msm_state->full_auth_done)) {
mutex_unlock(&external_common_state_hpd_mutex);
- hdmi_msm_state->reauth = TRUE;
- hdmi_msm_turn_on();
- } else
+ if (hdmi_msm_state->reauth == TRUE) {
+ DEV_DBG("%s: Starting HDCP re-authentication\n",
+ __func__);
+ hdmi_msm_turn_on();
+ } else {
+ DEV_DBG("%s: Starting HDCP authentication\n", __func__);
+ hdmi_msm_hdcp_enable();
+ }
+ } else {
mutex_unlock(&external_common_state_hpd_mutex);
+ DEV_DBG("%s: HDMI not connected or HDCP already active\n",
+ __func__);
+ hdmi_msm_state->reauth = FALSE;
+ }
}
#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT */
@@ -4342,15 +4354,6 @@
DEV_INFO("power: ON (%dx%d %d)\n", mfd->var_xres, mfd->var_yres,
mfd->var_pixclock);
-#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT
- mutex_lock(&hdmi_msm_state_mutex);
- if (hdmi_msm_state->hdcp_activating) {
- hdmi_msm_state->panel_power_on = TRUE;
- DEV_INFO("HDCP: activating, returning\n");
- }
- mutex_unlock(&hdmi_msm_state_mutex);
-#endif /* CONFIG_FB_MSM_HDMI_MSM_PANEL_HDCP_SUPPORT */
-
changed = hdmi_common_get_video_format_from_drv_data(mfd);
hdmi_msm_audio_info_setup(TRUE, 0, 0, 0, FALSE);
@@ -4360,7 +4363,13 @@
DEV_DBG("%s: Turning HDMI on\n", __func__);
mutex_unlock(&external_common_state_hpd_mutex);
hdmi_msm_turn_on();
- hdmi_msm_hdcp_enable();
+
+ /* Kick off HDCP Authentication */
+ mutex_lock(&hdcp_auth_state_mutex);
+ hdmi_msm_state->reauth = FALSE;
+ hdmi_msm_state->full_auth_done = FALSE;
+ mutex_unlock(&hdcp_auth_state_mutex);
+ mod_timer(&hdmi_msm_state->hdcp_timer, jiffies + HZ/2);
} else
mutex_unlock(&external_common_state_hpd_mutex);
diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c
index 9c3d1d5..31e62b2 100644
--- a/drivers/video/msm/mdp4_overlay.c
+++ b/drivers/video/msm/mdp4_overlay.c
@@ -2737,7 +2737,6 @@
}
if (mfd->panel_info.pdest == DISPLAY_1 &&
perf_req->use_ov0_blt && !perf_cur->use_ov0_blt) {
- mdp4_allocate_writeback_buf(mfd, MDP4_MIXER0);
if (mfd->panel_info.type == LCDC_PANEL ||
mfd->panel_info.type == LVDS_PANEL)
mdp4_lcdc_overlay_blt_start(mfd);
@@ -2754,7 +2753,6 @@
}
if (mfd->panel_info.pdest == DISPLAY_2 &&
perf_req->use_ov1_blt && !perf_cur->use_ov1_blt) {
- mdp4_allocate_writeback_buf(mfd, MDP4_MIXER1);
mdp4_dtv_overlay_blt_start(mfd);
pr_info("%s mixer1 start blt [%d] from %d to %d.\n",
__func__,
@@ -2794,7 +2792,6 @@
mdp4_dsi_video_blt_stop(mfd);
else if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD)
mdp4_dsi_cmd_blt_stop(mfd);
- mdp4_free_writeback_buf(mfd, MDP4_MIXER0);
pr_info("%s mixer0 stop blt [%d] from %d to %d.\n",
__func__,
flag,
@@ -2805,7 +2802,6 @@
if (mfd->panel_info.pdest == DISPLAY_2 &&
!perf_req->use_ov1_blt && perf_cur->use_ov1_blt) {
mdp4_dtv_overlay_blt_stop(mfd);
- mdp4_free_writeback_buf(mfd, MDP4_MIXER1);
pr_info("%s mixer1 stop blt [%d] from %d to %d.\n",
__func__,
flag,
diff --git a/drivers/video/msm/mdp4_overlay_dsi_video.c b/drivers/video/msm/mdp4_overlay_dsi_video.c
index cac6962..a461c3b 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_video.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_video.c
@@ -932,6 +932,8 @@
vctrl = &vsync_ctrl_db[cndx];
pipe = vctrl->base_pipe;
+ mdp4_allocate_writeback_buf(mfd, MDP4_MIXER0);
+
if (mfd->ov0_wb_buf->write_addr == 0) {
pr_info("%s: no blt_base assigned\n", __func__);
return;
@@ -1014,6 +1016,7 @@
}
mdp4_overlay_mdp_perf_upd(mfd, 1);
+
mutex_lock(&mfd->dma->ov_mutex);
mdp4_dsi_video_pipe_commit();
mutex_unlock(&mfd->dma->ov_mutex);
diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c
index f012e2e..8c61be9 100644
--- a/drivers/video/msm/mdss/mdss_dsi.c
+++ b/drivers/video/msm/mdss/mdss_dsi.c
@@ -119,7 +119,12 @@
return ret;
}
+ mdss_dsi_panel_reset(1);
+
} else {
+
+ mdss_dsi_panel_reset(0);
+
ret = regulator_disable(dsi_drv.vdd_vreg);
if (ret) {
pr_err("%s: Failed to disable regulator.\n", __func__);
@@ -180,7 +185,7 @@
}
spin_lock_bh(&dsi_clk_lock);
- mdss_dsi_clk_disable();
+ mdss_dsi_clk_disable(pdata);
/* disable dsi engine */
MIPI_OUTP(mdss_dsi_base + 0x0004, 0);
@@ -212,15 +217,18 @@
pinfo = &pdata->panel_info;
- cont_splash_clk_ctrl(0);
+ MIPI_OUTP(mdss_dsi_base + 0x118, 1);
+ MIPI_OUTP(mdss_dsi_base + 0x118, 0);
+
+ mdss_dsi_phy_sw_reset(pdata);
+ mdss_dsi_phy_enable(pdata, 1);
+ mdss_dsi_phy_init(pdata);
+
mdss_dsi_prepare_clocks();
spin_lock_bh(&dsi_clk_lock);
- MIPI_OUTP(mdss_dsi_base + 0x118, 1);
- MIPI_OUTP(mdss_dsi_base + 0x118, 0);
-
- mdss_dsi_clk_enable();
+ mdss_dsi_clk_enable(pdata);
spin_unlock_bh(&dsi_clk_lock);
clk_rate = pdata->panel_info.clk_rate;
@@ -496,6 +504,7 @@
pdata->dsi_base = mdss_dsi_base;
pdata->mmss_cc_base = mmss_cc_base;
+ pdata->set_backlight = panel_data->bl_ctrl;
/*
* register in mdp driver
diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h
index 0af4371..6acb8d5 100644
--- a/drivers/video/msm/mdss/mdss_dsi.h
+++ b/drivers/video/msm/mdss/mdss_dsi.h
@@ -76,6 +76,12 @@
DSI_CMD_MODE_MDP,
};
+enum dsi_panel_bl_ctrl {
+ BL_PWM,
+ BL_WLED,
+ BL_DCS_CMD,
+};
+
#define DSI_NON_BURST_SYNCH_PULSE 0
#define DSI_NON_BURST_SYNCH_EVENT 1
#define DSI_BURST_MODE 2
@@ -241,6 +247,7 @@
struct mdss_panel_info panel_info;
int (*on) (struct mdss_panel_data *pdata);
int (*off) (struct mdss_panel_data *pdata);
+ void (*bl_ctrl) (u32 bl_level);
};
struct mdss_dsi_drv_pdata {
@@ -279,8 +286,8 @@
void mdss_dsi_cmd_mdp_start(void);
void mdss_dsi_cmd_bta_sw_trigger(struct mdss_panel_data *pdata);
void mdss_dsi_ack_err_status(unsigned char *dsi_base);
-void mdss_dsi_clk_enable(void);
-void mdss_dsi_clk_disable(void);
+void mdss_dsi_clk_enable(struct mdss_panel_data *pdata);
+void mdss_dsi_clk_disable(struct mdss_panel_data *pdata);
void mdss_dsi_controller_cfg(int enable,
struct mdss_panel_data *pdata);
void mdss_dsi_sw_reset(struct mdss_panel_data *pdata);
@@ -294,6 +301,10 @@
void mdss_dsi_clk_deinit(struct device *dev);
void mdss_dsi_prepare_clocks(void);
void mdss_dsi_unprepare_clocks(void);
-void cont_splash_clk_ctrl(int enable);
unsigned char *mdss_dsi_get_base_adr(void);
+void mdss_dsi_panel_reset(int enable);
+void mdss_dsi_phy_enable(struct mdss_panel_data *pdata, int on);
+void mdss_dsi_phy_init(struct mdss_panel_data *pdata);
+void mdss_dsi_phy_sw_reset(struct mdss_panel_data *pdata);
+
#endif /* MDSS_DSI_H */
diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c
index bfb7fae..e4b1867 100644
--- a/drivers/video/msm/mdss/mdss_dsi_panel.c
+++ b/drivers/video/msm/mdss/mdss_dsi_panel.c
@@ -13,7 +13,12 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
+#include <linux/qpnp/pin.h>
+#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/leds.h>
#include "mdss_dsi.h"
@@ -28,6 +33,68 @@
static int num_of_off_cmds;
static char *on_cmds, *off_cmds;
+static char bl_ctrl;
+DEFINE_LED_TRIGGER(bl_led_trigger);
+
+static struct mdss_dsi_phy_ctrl phy_params;
+
+static int rst_gpio;
+static int disp_en;
+
+struct qpnp_pin_cfg param = {
+ .mode = QPNP_PIN_MODE_DIG_OUT,
+ .output_type = QPNP_PIN_OUT_BUF_OPEN_DRAIN_NMOS,
+ .invert = QPNP_PIN_INVERT_ENABLE,
+ .pull = QPNP_PIN_MPP_PULL_UP_30KOHM,
+ .vin_sel = QPNP_PIN_VIN3,
+ .out_strength = QPNP_PIN_OUT_STRENGTH_HIGH,
+ .select = QPNP_PIN_SEL_DTEST3,
+ .master_en = QPNP_PIN_MASTER_ENABLE,
+ .aout_ref = QPNP_PIN_AOUT_0V625,
+ .ain_route = QPNP_PIN_AIN_AMUX_CH7,
+ .cs_out = QPNP_PIN_CS_OUT_20MA,
+};
+
+void mdss_dsi_panel_reset(int enable)
+{
+ if (!disp_en)
+ pr_debug("%s:%d, reset line not configured\n",
+ __func__, __LINE__);
+
+ if (!rst_gpio)
+ pr_debug("%s:%d, reset line not configured\n",
+ __func__, __LINE__);
+
+ if (enable) {
+ gpio_set_value(disp_en, 1);
+ gpio_set_value(rst_gpio, 1);
+ usleep(10);
+ gpio_set_value(rst_gpio, 0);
+ usleep(200);
+ gpio_set_value(rst_gpio, 1);
+ } else {
+ gpio_set_value(rst_gpio, 0);
+ gpio_set_value(disp_en, 0);
+ }
+}
+
+static void mdss_dsi_panel_bl_ctrl(u32 bl_level)
+{
+ if (bl_ctrl) {
+ switch (bl_ctrl) {
+ case BL_WLED:
+ led_trigger_event(bl_led_trigger, bl_level);
+ break;
+
+ default:
+ pr_err("%s: Unknown bl_ctrl configuration\n",
+ __func__);
+ break;
+ }
+ } else
+ pr_err("%s:%d, bl_ctrl not configured", __func__, __LINE__);
+}
+
static int mdss_dsi_panel_on(struct mdss_panel_data *pdata)
{
struct mipi_panel_info *mipi;
@@ -37,6 +104,8 @@
pr_debug("%s:%d, debug info (mode) : %d\n", __func__, __LINE__,
mipi->mode);
+ mdss_dsi_panel_reset(1);
+
if (mipi->mode == DSI_VIDEO_MODE) {
mdss_dsi_cmds_tx(pdata, &dsi_panel_tx_buf, dsi_panel_on_cmds,
num_of_on_cmds);
@@ -64,6 +133,8 @@
return -EINVAL;
}
+ mdss_dsi_panel_reset(0);
+
return 0;
}
@@ -75,6 +146,7 @@
int rc, i, len;
int cmd_plen, data_offset;
const char *data;
+ static const char *bl_ctrl_type;
rc = of_property_read_u32_array(np, "qcom,mdss-pan-res", res, 2);
if (rc) {
@@ -85,6 +157,59 @@
panel_data->panel_info.xres = (!rc ? res[0] : 640);
panel_data->panel_info.yres = (!rc ? res[1] : 480);
+ rc = of_property_read_u32_array(np, "qcom,mdss-pan-active-res", res, 2);
+ if (rc == 0) {
+ panel_data->panel_info.lcdc.xres_pad =
+ panel_data->panel_info.xres - res[0];
+ panel_data->panel_info.lcdc.yres_pad =
+ panel_data->panel_info.yres - res[1];
+ }
+
+ disp_en = of_get_named_gpio(np, "qcom,enable-gpio", 0);
+ if (!gpio_is_valid(disp_en)) {
+ pr_err("%s:%d, Disp_en gpio not specified\n",
+ __func__, __LINE__);
+ return -ENODEV;
+ }
+
+ rc = gpio_request(disp_en, "disp_enable");
+ if (rc) {
+ pr_err("request reset gpio failed, rc=%d\n",
+ rc);
+ gpio_free(disp_en);
+ return -ENODEV;
+ }
+ rc = gpio_direction_output(disp_en, 1);
+ if (rc) {
+ pr_err("set_direction for disp_en gpio failed, rc=%d\n",
+ rc);
+ gpio_free(disp_en);
+ return -ENODEV;
+ }
+
+ rst_gpio = of_get_named_gpio(np, "qcom,rst-gpio", 0);
+ if (!gpio_is_valid(rst_gpio)) {
+ pr_err("%s:%d, reset gpio not specified\n",
+ __func__, __LINE__);
+ } else {
+ rc = qpnp_pin_config(rst_gpio, ¶m);
+ if (rc) {
+ pr_err("request reset gpio failed, rc=%d\n",
+ rc);
+ gpio_free(disp_en);
+ return rc;
+ }
+
+ rc = gpio_request(rst_gpio, "disp_rst_n");
+ if (rc) {
+ pr_err("request reset gpio failed, rc=%d\n",
+ rc);
+ gpio_free(rst_gpio);
+ gpio_free(disp_en);
+ return -ENODEV;
+ }
+ }
+
rc = of_property_read_u32(np, "qcom,mdss-pan-bpp", &tmp);
if (rc) {
pr_err("%s:%d, panel bpp not specified\n",
@@ -106,6 +231,14 @@
"qcom,mdss-pan-underflow-clr", &tmp);
panel_data->panel_info.lcdc.underflow_clr = (!rc ? tmp : 0xff);
+ bl_ctrl_type = of_get_property(pdev->dev.of_node,
+ "qcom,mdss-pan-bl-ctrl", NULL);
+ if (!strncmp(bl_ctrl_type, "bl_ctrl_wled", 12)) {
+ led_trigger_register_simple("bkl-trigger", &bl_led_trigger);
+ pr_debug("%s: SUCCESS-> WLED TRIGGER register\n", __func__);
+ bl_ctrl = BL_WLED;
+ }
+
rc = of_property_read_u32_array(np,
"qcom,mdss-pan-bl-levels", res, 2);
panel_data->panel_info.bl_min = (!rc ? res[0] : 0);
@@ -184,6 +317,53 @@
rc = of_property_read_u32(np, "qcom,mdss-pan-dsi-frame-rate", &tmp);
panel_data->panel_info.mipi.frame_rate = (!rc ? tmp : 60);
+ data = of_get_property(np, "qcom,panel-phy-regulatorSettings", &len);
+ if ((!data) || (len != 8)) {
+ pr_err("%s:%d, Unable to read Phy regulator settings",
+ __func__, __LINE__);
+ goto error;
+ }
+ for (i = 0; i < len; i++)
+ phy_params.regulator[i] = data[i];
+
+ data = of_get_property(np, "qcom,panel-phy-timingSettings", &len);
+ if ((!data) || (len != 12)) {
+ pr_err("%s:%d, Unable to read Phy timing settings",
+ __func__, __LINE__);
+ goto error;
+ }
+ for (i = 0; i < len; i++)
+ phy_params.timing[i] = data[i];
+
+ data = of_get_property(np, "qcom,panel-phy-strengthCtrl", &len);
+ if ((!data) || (len != 2)) {
+ pr_err("%s:%d, Unable to read Phy Strength ctrl settings",
+ __func__, __LINE__);
+ goto error;
+ }
+ phy_params.strength[0] = data[0];
+ phy_params.strength[1] = data[1];
+
+ data = of_get_property(np, "qcom,panel-phy-bistCtrl", &len);
+ if ((!data) || (len != 6)) {
+ pr_err("%s:%d, Unable to read Phy Bist Ctrl settings",
+ __func__, __LINE__);
+ goto error;
+ }
+ for (i = 0; i < len; i++)
+ phy_params.bistCtrl[i] = data[i];
+
+ data = of_get_property(np, "qcom,panel-phy-laneConfig", &len);
+ if ((!data) || (len != 45)) {
+ pr_err("%s:%d, Unable to read Phy lane configure settings",
+ __func__, __LINE__);
+ goto error;
+ }
+ for (i = 0; i < len; i++)
+ phy_params.laneCfg[i] = data[i];
+
+ panel_data->panel_info.mipi.dsi_phy_db = &phy_params;
+
data = of_get_property(np, "qcom,panel-on-cmds", &len);
if (!data) {
pr_err("%s:%d, Unable to read ON cmds", __func__, __LINE__);
@@ -288,6 +468,10 @@
kfree(dsi_panel_off_cmds);
kfree(on_cmds);
kfree(off_cmds);
+ if (rst_gpio)
+ gpio_free(rst_gpio);
+ if (disp_en)
+ gpio_free(disp_en);
return -EINVAL;
}
@@ -295,7 +479,7 @@
static int __devinit mdss_dsi_panel_probe(struct platform_device *pdev)
{
int rc = 0;
- struct mdss_panel_common_pdata *vendor_pdata = NULL;
+ static struct mdss_panel_common_pdata vendor_pdata;
static const char *panel_name;
if (pdev->dev.parent == NULL) {
@@ -314,21 +498,15 @@
else
pr_info("%s: Panel Name = %s\n", __func__, panel_name);
- vendor_pdata = devm_kzalloc(&pdev->dev,
- sizeof(*vendor_pdata), GFP_KERNEL);
- if (!vendor_pdata)
- return -ENOMEM;
-
- rc = mdss_panel_parse_dt(pdev, vendor_pdata);
- if (rc) {
- devm_kfree(&pdev->dev, vendor_pdata);
- vendor_pdata = NULL;
+ rc = mdss_panel_parse_dt(pdev, &vendor_pdata);
+ if (rc)
return rc;
- }
- vendor_pdata->on = mdss_dsi_panel_on;
- vendor_pdata->off = mdss_dsi_panel_off;
- rc = dsi_panel_device_register(pdev, vendor_pdata);
+ vendor_pdata.on = mdss_dsi_panel_on;
+ vendor_pdata.off = mdss_dsi_panel_off;
+ vendor_pdata.bl_ctrl = mdss_dsi_panel_bl_ctrl;
+
+ rc = dsi_panel_device_register(pdev, &vendor_pdata);
if (rc)
return rc;
diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c
index 63df8ed..d4d889b 100644
--- a/drivers/video/msm/mdss/mdss_mdp_overlay.c
+++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c
@@ -49,7 +49,6 @@
struct mdss_mdp_format_params *fmt)
{
u32 xres, yres;
- u32 dst_w, dst_h;
xres = mfd->fbi->var.xres;
yres = mfd->fbi->var.yres;
@@ -62,32 +61,45 @@
if (req->src.width > MAX_IMG_WIDTH ||
req->src.height > MAX_IMG_HEIGHT ||
req->src_rect.w == 0 || req->src_rect.h == 0 ||
- req->dst_rect.w < MIN_DST_W || req->dst_rect.h < MIN_DST_H ||
- req->dst_rect.w > MAX_DST_W || req->dst_rect.h > MAX_DST_H ||
CHECK_BOUNDS(req->src_rect.x, req->src_rect.w, req->src.width) ||
- CHECK_BOUNDS(req->src_rect.y, req->src_rect.h, req->src.height) ||
- CHECK_BOUNDS(req->dst_rect.x, req->dst_rect.w, xres) ||
- CHECK_BOUNDS(req->dst_rect.y, req->dst_rect.h, yres)) {
- pr_err("invalid image img_w=%d img_h=%d\n",
- req->src.width, req->src.height);
-
- pr_err("\tsrc_rect=%d,%d,%d,%d dst_rect=%d,%d,%d,%d\n",
+ CHECK_BOUNDS(req->src_rect.y, req->src_rect.h, req->src.height)) {
+ pr_err("invalid source image img wh=%dx%d rect=%d,%d,%d,%d\n",
+ req->src.width, req->src.height,
req->src_rect.x, req->src_rect.y,
- req->src_rect.w, req->src_rect.h,
- req->dst_rect.x, req->dst_rect.y,
+ req->src_rect.w, req->src_rect.h);
+ return -EOVERFLOW;
+ }
+
+ if (req->dst_rect.w < MIN_DST_W || req->dst_rect.h < MIN_DST_H ||
+ req->dst_rect.w > MAX_DST_W || req->dst_rect.h > MAX_DST_H) {
+ pr_err("invalid destination resolution (%dx%d)",
req->dst_rect.w, req->dst_rect.h);
- return -EINVAL;
+ return -EOVERFLOW;
}
- if (req->flags & MDP_ROT_90) {
- dst_h = req->dst_rect.w;
- dst_w = req->dst_rect.h;
+ if (req->flags & MDSS_MDP_ROT_ONLY) {
+ /* dst res should match src res in rotation only mode*/
+ req->dst_rect.w = req->src_rect.w;
+ req->dst_rect.h = req->src_rect.h;
} else {
- dst_w = req->dst_rect.w;
- dst_h = req->dst_rect.h;
- }
+ u32 dst_w, dst_h;
- if (!(req->flags & MDSS_MDP_ROT_ONLY)) {
+ if ((CHECK_BOUNDS(req->dst_rect.x, req->dst_rect.w, xres) ||
+ CHECK_BOUNDS(req->dst_rect.y, req->dst_rect.h, yres))) {
+ pr_err("invalid destination rect=%d,%d,%d,%d\n",
+ req->dst_rect.x, req->dst_rect.y,
+ req->dst_rect.w, req->dst_rect.h);
+ return -EOVERFLOW;
+ }
+
+ if (req->flags & MDP_ROT_90) {
+ dst_h = req->dst_rect.w;
+ dst_w = req->dst_rect.h;
+ } else {
+ dst_w = req->dst_rect.w;
+ dst_h = req->dst_rect.h;
+ }
+
if ((req->src_rect.w * MAX_UPSCALE_RATIO) < dst_w) {
pr_err("too much upscaling Width %d->%d\n",
req->src_rect.w, req->dst_rect.w);
@@ -111,6 +123,22 @@
req->src_rect.h, req->dst_rect.h);
return -EINVAL;
}
+
+ if ((fmt->chroma_sample == MDSS_MDP_CHROMA_420 ||
+ fmt->chroma_sample == MDSS_MDP_CHROMA_H2V1) &&
+ ((req->src_rect.w * (MAX_UPSCALE_RATIO / 2)) < dst_w)) {
+ pr_err("too much YUV upscaling Width %d->%d\n",
+ req->src_rect.w, req->dst_rect.w);
+ return -EINVAL;
+ }
+
+ if ((fmt->chroma_sample == MDSS_MDP_CHROMA_420 ||
+ fmt->chroma_sample == MDSS_MDP_CHROMA_H1V2) &&
+ (req->src_rect.h * (MAX_UPSCALE_RATIO / 2)) < dst_h) {
+ pr_err("too much YUV upscaling Height %d->%d\n",
+ req->src_rect.h, req->dst_rect.h);
+ return -EINVAL;
+ }
}
if (fmt->is_yuv) {
@@ -123,22 +151,6 @@
pr_err("invalid odd dst resolution\n");
return -EINVAL;
}
-
- if (((req->src_rect.w * (MAX_UPSCALE_RATIO / 2)) < dst_w) &&
- (fmt->chroma_sample == MDSS_MDP_CHROMA_420 ||
- fmt->chroma_sample == MDSS_MDP_CHROMA_H2V1)) {
- pr_err("too much YUV upscaling Width %d->%d\n",
- req->src_rect.w, req->dst_rect.w);
- return -EINVAL;
- }
-
- if (((req->src_rect.h * (MAX_UPSCALE_RATIO / 2)) < dst_h) &&
- (fmt->chroma_sample == MDSS_MDP_CHROMA_420 ||
- fmt->chroma_sample == MDSS_MDP_CHROMA_H1V2)) {
- pr_err("too much YUV upscaling Height %d->%d\n",
- req->src_rect.h, req->dst_rect.h);
- return -EINVAL;
- }
}
return 0;
diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h
index 91010f4..5d23548 100644
--- a/drivers/video/msm/mdss/mdss_panel.h
+++ b/drivers/video/msm/mdss/mdss_panel.h
@@ -83,6 +83,18 @@
u32 yres_pad;
};
+
+/* DSI PHY configuration */
+struct mdss_dsi_phy_ctrl {
+ uint32_t regulator[8];
+ uint32_t timing[12];
+ uint32_t ctrl[4];
+ uint32_t strength[2];
+ char bistCtrl[6];
+ uint32_t pll[21];
+ char laneCfg[45];
+};
+
struct mipi_panel_info {
char mode; /* video/cmd */
char interleave_mode;
@@ -103,7 +115,7 @@
char t_clk_post; /* 0xc0, DSI_CLKOUT_TIMING_CTRL */
char t_clk_pre; /* 0xc0, DSI_CLKOUT_TIMING_CTRL */
char vc; /* virtual channel */
- struct mipi_dsi_phy_ctrl *dsi_phy_db;
+ struct mdss_dsi_phy_ctrl *dsi_phy_db;
/* video mode */
char pulse_mode_hsa_he;
char hfp_power_stop;
diff --git a/drivers/video/msm/mdss/msm_mdss_io_8974.c b/drivers/video/msm/mdss/msm_mdss_io_8974.c
index c766ec7..9d9a366 100644
--- a/drivers/video/msm/mdss/msm_mdss_io_8974.c
+++ b/drivers/video/msm/mdss/msm_mdss_io_8974.c
@@ -12,6 +12,7 @@
*/
#include <linux/clk.h>
#include <linux/interrupt.h>
+#include <linux/delay.h>
#include <linux/err.h>
#include <linux/io.h>
@@ -26,8 +27,9 @@
static struct dsi_clk_desc dsi_pclk;
-static struct clk *dsi_byte_div_clk;
+static struct clk *dsi_byte_clk;
static struct clk *dsi_esc_clk;
+static struct clk *dsi_pixel_clk;
int mdss_dsi_clk_on;
@@ -35,16 +37,23 @@
{
struct device *dev = &pdev->dev;
- dsi_byte_div_clk = clk_get(dev, "byte_clk");
- if (IS_ERR(dsi_byte_div_clk)) {
- pr_err("can't find dsi_byte_div_clk\n");
- dsi_byte_div_clk = NULL;
+ dsi_byte_clk = clk_get(dev, "byte_clk");
+ if (IS_ERR(dsi_byte_clk)) {
+ pr_err("can't find dsi_byte_clk\n");
+ dsi_byte_clk = NULL;
+ goto mdss_dsi_clk_err;
+ }
+
+ dsi_pixel_clk = clk_get(dev, "pixel_clk");
+ if (IS_ERR(dsi_pixel_clk)) {
+ pr_err("can't find dsi_pixel_clk\n");
+ dsi_pixel_clk = NULL;
goto mdss_dsi_clk_err;
}
dsi_esc_clk = clk_get(dev, "core_clk");
if (IS_ERR(dsi_esc_clk)) {
- printk(KERN_ERR "can't find dsi_esc_clk\n");
+ pr_err("can't find dsi_esc_clk\n");
dsi_esc_clk = NULL;
goto mdss_dsi_clk_err;
}
@@ -58,10 +67,12 @@
void mdss_dsi_clk_deinit(struct device *dev)
{
- if (dsi_byte_div_clk)
- clk_put(dsi_byte_div_clk);
+ if (dsi_byte_clk)
+ clk_put(dsi_byte_clk);
if (dsi_esc_clk)
clk_put(dsi_esc_clk);
+ if (dsi_pixel_clk)
+ clk_put(dsi_pixel_clk);
}
#define PREF_DIV_RATIO 27
@@ -143,57 +154,145 @@
return 0;
}
-void cont_splash_clk_ctrl(int enable)
-{
- static int cont_splash_clks_enabled;
- if (enable && !cont_splash_clks_enabled) {
- clk_prepare_enable(dsi_byte_div_clk);
- clk_prepare_enable(dsi_esc_clk);
- cont_splash_clks_enabled = 1;
- } else if (!enable && cont_splash_clks_enabled) {
- clk_disable_unprepare(dsi_byte_div_clk);
- clk_disable_unprepare(dsi_esc_clk);
- cont_splash_clks_enabled = 0;
- }
-}
-
void mdss_dsi_prepare_clocks(void)
{
- clk_prepare(dsi_byte_div_clk);
+ clk_prepare(dsi_byte_clk);
clk_prepare(dsi_esc_clk);
+ clk_prepare(dsi_pixel_clk);
}
void mdss_dsi_unprepare_clocks(void)
{
clk_unprepare(dsi_esc_clk);
- clk_unprepare(dsi_byte_div_clk);
+ clk_unprepare(dsi_pixel_clk);
+ clk_unprepare(dsi_byte_clk);
}
-void mdss_dsi_clk_enable(void)
+void mdss_dsi_clk_enable(struct mdss_panel_data *pdata)
{
if (mdss_dsi_clk_on) {
pr_info("%s: mdss_dsi_clks already ON\n", __func__);
return;
}
- if (clk_set_rate(dsi_byte_div_clk, 1) < 0) /* divided by 1 */
- pr_err("%s: dsi_byte_div_clk - clk_set_rate failed\n",
- __func__);
- if (clk_set_rate(dsi_esc_clk, 2) < 0) /* divided by 2 */
+ if (clk_set_rate(dsi_esc_clk, 19200000) < 0)
pr_err("%s: dsi_esc_clk - clk_set_rate failed\n",
__func__);
- clk_enable(dsi_byte_div_clk);
+
+ if (clk_set_rate(dsi_byte_clk, 53000000) < 0)
+ pr_err("%s: dsi_byte_clk - clk_set_rate failed\n",
+ __func__);
+
+ if (clk_set_rate(dsi_pixel_clk, 70000000) < 0)
+ pr_err("%s: dsi_pixel_clk - clk_set_rate failed\n",
+ __func__);
+
clk_enable(dsi_esc_clk);
+ clk_enable(dsi_byte_clk);
+ clk_enable(dsi_pixel_clk);
+
mdss_dsi_clk_on = 1;
}
-void mdss_dsi_clk_disable(void)
+void mdss_dsi_clk_disable(struct mdss_panel_data *pdata)
{
if (mdss_dsi_clk_on == 0) {
pr_info("%s: mdss_dsi_clks already OFF\n", __func__);
return;
}
+
+ clk_disable(dsi_pixel_clk);
+ clk_disable(dsi_byte_clk);
clk_disable(dsi_esc_clk);
- clk_disable(dsi_byte_div_clk);
+
mdss_dsi_clk_on = 0;
}
+
+void mdss_dsi_phy_sw_reset(struct mdss_panel_data *pdata)
+{
+ /* start phy sw reset */
+ MIPI_OUTP((pdata->dsi_base) + 0x12c, 0x0001);
+ wmb();
+ usleep(1);
+ /* end phy sw reset */
+ MIPI_OUTP((pdata->dsi_base) + 0x12c, 0x0000);
+ wmb();
+ usleep(1);
+}
+
+void mdss_dsi_phy_enable(struct mdss_panel_data *pdata, int on)
+{
+ if (on) {
+ MIPI_OUTP((pdata->dsi_base) + 0x0220, 0x006);
+ usleep(10);
+ MIPI_OUTP((pdata->dsi_base) + 0x0268, 0x001);
+ usleep(10);
+ MIPI_OUTP((pdata->dsi_base) + 0x0268, 0x000);
+ usleep(10);
+ MIPI_OUTP((pdata->dsi_base) + 0x0220, 0x007);
+ wmb();
+
+ /* MMSS_DSI_0_PHY_DSIPHY_CTRL_0 */
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x07e);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x06e);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x06c);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x064);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x065);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x075);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x077);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x07f);
+ wmb();
+
+ } else {
+ MIPI_OUTP((pdata->dsi_base) + 0x0220, 0x006);
+ usleep(10);
+ MIPI_OUTP((pdata->dsi_base) + 0x0470, 0x000);
+ wmb();
+ }
+}
+
+void mdss_dsi_phy_init(struct mdss_panel_data *pdata)
+{
+ struct mdss_dsi_phy_ctrl *pd;
+ int i, off, ln, offset;
+
+ pd = (pdata->panel_info.mipi).dsi_phy_db;
+
+ off = 0x0580; /* phy regulator ctrl settings */
+ for (i = 0; i < 8; i++) {
+ MIPI_OUTP((pdata->dsi_base) + off, pd->regulator[i]);
+ wmb();
+ off += 4;
+ }
+
+ off = 0x0440; /* phy timing ctrl 0 - 11 */
+ for (i = 0; i < 12; i++) {
+ MIPI_OUTP((pdata->dsi_base) + off, pd->timing[i]);
+ wmb();
+ off += 4;
+ }
+
+ /* Strength ctrl 0 - 1 */
+ MIPI_OUTP((pdata->dsi_base) + 0x0484, pd->strength[0]);
+ MIPI_OUTP((pdata->dsi_base) + 0x0488, pd->strength[1]);
+ wmb();
+
+ off = 0x04b4; /* phy BIST ctrl 0 - 5 */
+ for (i = 0; i < 6; i++) {
+ MIPI_OUTP((pdata->dsi_base) + off, pd->bistCtrl[i]);
+ wmb();
+ off += 4;
+ }
+
+ /* 4 lanes + clk lane configuration */
+ /* lane config n * (0 - 4) & DataPath setup */
+ for (ln = 0; ln < 5; ln++) {
+ off = 0x0300 + (ln * 0x40);
+ for (i = 0; i < 9; i++) {
+ offset = i + (ln * 9);
+ MIPI_OUTP((pdata->dsi_base) + off, pd->laneCfg[offset]);
+ wmb();
+ off += 4;
+ }
+ }
+}
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
index 260cd72..90114f7 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
@@ -112,10 +112,10 @@
&iova,
&buffer_size,
UNCACHED, 0);
- if (ret) {
+ if (ret || !iova) {
DDL_MSG_ERROR(
- "%s():DDL ION ion map iommu failed\n",
- __func__);
+ "%s():DDL ION ion map iommu failed, ret = %d iova = 0x%lx\n",
+ __func__, ret, iova);
goto unmap_ion_alloc;
}
addr->alloced_phys_addr = (phys_addr_t) iova;
diff --git a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c
index 291de5f..972160a 100644
--- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c
+++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c
@@ -85,9 +85,10 @@
&iova,
&buffer_size,
UNCACHED, 0);
- if (ret) {
- DDL_MSG_ERROR("%s():DDL ION client iommu map failed\n",
- __func__);
+ if (ret || !iova) {
+ DDL_MSG_ERROR(
+ "%s():DDL ION client iommu map failed, ret = %d iova = 0x%lx\n",
+ __func__, ret, iova);
goto ion_unmap_bail_out;
}
addr->mapped_buffer = NULL;
diff --git a/drivers/video/msm/vidc/common/dec/vdec.c b/drivers/video/msm/vidc/common/dec/vdec.c
index 927f19b..f68265a 100644
--- a/drivers/video/msm/vidc/common/dec/vdec.c
+++ b/drivers/video/msm/vidc/common/dec/vdec.c
@@ -936,9 +936,10 @@
SZ_4K, 0, (unsigned long *)&iova,
(unsigned long *)&buffer_size,
UNCACHED, 0);
- if (rc) {
- ERR("%s():get_ION_kernel physical addr fail\n",
- __func__);
+ if (rc || !iova) {
+ ERR(
+ "%s():get_ION_kernel physical addr fail, rc = %d iova = 0x%lx\n",
+ __func__, rc, iova);
goto ion_map_error;
}
vcd_h264_mv_buffer->physical_addr = (u8 *) iova;
diff --git a/drivers/video/msm/vidc/common/enc/venc_internal.c b/drivers/video/msm/vidc/common/enc/venc_internal.c
index 50cccbb..5ee0a3d 100644
--- a/drivers/video/msm/vidc/common/enc/venc_internal.c
+++ b/drivers/video/msm/vidc/common/enc/venc_internal.c
@@ -1868,9 +1868,10 @@
(unsigned long *)&iova,
(unsigned long *)&buffer_size,
UNCACHED, 0);
- if (rc) {
- ERR("%s():ION map iommu addr fail\n",
- __func__);
+ if (rc || !iova) {
+ ERR(
+ "%s():ION map iommu addr fail, rc = %d, iova = 0x%lx\n",
+ __func__, rc, iova);
goto map_ion_error;
}
control->physical_addr = (u8 *) iova;
diff --git a/drivers/video/msm/vidc/common/init/vidc_init.c b/drivers/video/msm/vidc/common/init/vidc_init.c
index c884cf5..221c154 100644
--- a/drivers/video/msm/vidc/common/init/vidc_init.c
+++ b/drivers/video/msm/vidc/common/init/vidc_init.c
@@ -680,9 +680,10 @@
(unsigned long *) &buffer_size,
UNCACHED,
ION_IOMMU_UNMAP_DELAYED);
- if (ret) {
- ERR("%s():ION iommu map fail\n",
- __func__);
+ if (ret || !iova) {
+ ERR(
+ "%s():ION iommu map fail, ret = %d, iova = 0x%lx\n",
+ __func__, ret, iova);
goto ion_map_error;
}
phys_addr = iova;
diff --git a/drivers/video/msm/vidc/common/vcd/vcd_sub.c b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
index 28ea453..b97a58e 100644
--- a/drivers/video/msm/vidc/common/vcd/vcd_sub.c
+++ b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
@@ -121,8 +121,10 @@
(unsigned long *)&iova,
(unsigned long *)&buffer_size,
UNCACHED, 0);
- if (ret) {
- pr_err("%s() ION iommu map failed", __func__);
+ if (ret || !iova) {
+ pr_err(
+ "%s() ION iommu map failed, ret = %d, iova = 0x%lx",
+ __func__, ret, iova);
goto ion_map_bailout;
}
map_buffer->phy_addr = iova;
diff --git a/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h b/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
index 9619527..0d5d058 100644
--- a/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
+++ b/include/linux/mfd/wcd9xxx/wcd9xxx-slimslave.h
@@ -116,4 +116,6 @@
unsigned int *rx_ch,
unsigned int *tx_ch);
int wcd9xxx_get_slave_port(unsigned int ch_num);
+int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, unsigned int *ch_num,
+ unsigned int tot_ch, unsigned int rx_tx);
#endif /* __WCD9310_SLIMSLAVE_H_ */
diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h
index aaabca9..468a410 100644
--- a/include/linux/usb/msm_hsusb.h
+++ b/include/linux/usb/msm_hsusb.h
@@ -378,6 +378,7 @@
unsigned strobe;
unsigned data;
struct msm_bus_scale_pdata *bus_scale_table;
+ unsigned log2_irq_thresh;
};
struct msm_usb_host_platform_data {
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 3526e29..80f36e0 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -967,6 +967,26 @@
#define HCI_OP_LE_CREATE_CONN_CANCEL 0x200e
+#define HCI_OP_LE_READ_WHITE_LIST_SIZE 0x200F
+struct hci_rp_le_read_white_list_size {
+ __u8 status;
+ __u8 size;
+} __packed;
+
+#define HCI_OP_LE_CLEAR_WHITE_LIST 0x2010
+
+#define HCI_OP_LE_ADD_DEV_WHITE_LIST 0x2011
+struct hci_cp_le_add_dev_white_list {
+ __u8 addr_type;
+ bdaddr_t addr;
+} __packed;
+
+#define HCI_OP_LE_REMOVE_DEV_WHITE_LIST 0x2012
+struct hci_cp_le_remove_dev_white_list {
+ __u8 addr_type;
+ bdaddr_t addr;
+} __packed;
+
#define HCI_OP_LE_CONN_UPDATE 0x2013
struct hci_cp_le_conn_update {
__le16 handle;
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 22428c1..71dcb28 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -191,6 +191,7 @@
unsigned int acl_pkts;
unsigned int sco_pkts;
unsigned int le_pkts;
+ unsigned int le_white_list_size;
unsigned int data_block_len;
@@ -602,6 +603,9 @@
bdaddr_t *dst, __u8 sec_level,
__u8 auth_type,
struct bt_le_params *le_params);
+void hci_le_add_dev_white_list(struct hci_dev *hdev, bdaddr_t *dst);
+void hci_le_remove_dev_white_list(struct hci_dev *hdev, bdaddr_t *dst);
+void hci_le_cancel_create_connect(struct hci_dev *hdev, bdaddr_t *dst);
int hci_conn_check_link_mode(struct hci_conn *conn);
int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
int hci_conn_change_link_key(struct hci_conn *conn);
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index 3048339..4a69331 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -60,6 +60,7 @@
__u8 hci_ver;
__u16 hci_rev;
__u8 name[MGMT_MAX_NAME_LENGTH];
+ __u8 le_white_list_size;
} __packed;
struct mgmt_mode {
@@ -246,6 +247,26 @@
bdaddr_t bdaddr;
} __packed;
+#define MGMT_OP_LE_READ_WHITE_LIST_SIZE 0xE000
+
+#define MGMT_OP_LE_CLEAR_WHITE_LIST 0xE001
+
+#define MGMT_OP_LE_ADD_DEV_WHITE_LIST 0xE002
+struct mgmt_cp_le_add_dev_white_list {
+ __u8 addr_type;
+ bdaddr_t bdaddr;
+} __packed;
+
+#define MGMT_OP_LE_REMOVE_DEV_WHITE_LIST 0xE003
+struct mgmt_cp_le_remove_dev_white_list {
+ __u8 addr_type;
+ bdaddr_t bdaddr;
+} __packed;
+
+#define MGMT_OP_LE_CREATE_CONN_WHITE_LIST 0xE004
+
+#define MGMT_OP_LE_CANCEL_CREATE_CONN_WHITE_LIST 0xE005
+
#define MGMT_EV_CMD_COMPLETE 0x0001
struct mgmt_ev_cmd_complete {
__le16 opcode;
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 08bf42d..f57fab7 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -50,7 +50,7 @@
bdaddr_t *dst, __u8 sec_level, __u8 auth_type,
struct bt_le_params *le_params)
{
- struct hci_conn *le;
+ struct hci_conn *le, *le_wlist_conn;
struct hci_cp_le_create_conn cp;
struct adv_entry *entry;
struct link_key *key;
@@ -59,8 +59,21 @@
le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
if (le) {
- hci_conn_hold(le);
- return le;
+ le_wlist_conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
+ BDADDR_ANY);
+ if (!le_wlist_conn) {
+ hci_conn_hold(le);
+ return le;
+ } else {
+ BT_DBG("remove wlist conn");
+ le->out = 1;
+ le->link_mode |= HCI_LM_MASTER;
+ le->sec_level = BT_SECURITY_LOW;
+ le->type = LE_LINK;
+ hci_proto_connect_cfm(le, 0);
+ hci_conn_del(le_wlist_conn);
+ return le;
+ }
}
key = hci_find_link_key_type(hdev, dst, KEY_TYPE_LTK);
@@ -107,8 +120,13 @@
cp.conn_latency = cpu_to_le16(BT_LE_LATENCY_DEF);
le->conn_timeout = 5;
}
- bacpy(&cp.peer_addr, &le->dst);
- cp.peer_addr_type = le->dst_type;
+ if (!bacmp(&le->dst, BDADDR_ANY)) {
+ cp.filter_policy = 0x01;
+ le->conn_timeout = 0;
+ } else {
+ bacpy(&cp.peer_addr, &le->dst);
+ cp.peer_addr_type = le->dst_type;
+ }
hci_send_cmd(hdev, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
@@ -121,6 +139,73 @@
hci_send_cmd(conn->hdev, HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
}
+void hci_le_cancel_create_connect(struct hci_dev *hdev, bdaddr_t *dst)
+{
+ struct hci_conn *le;
+
+ BT_DBG("%p", hdev);
+
+ le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
+ if (le) {
+ BT_DBG("send hci connect cancel");
+ hci_le_connect_cancel(le);
+ hci_conn_del(le);
+ }
+}
+EXPORT_SYMBOL(hci_le_cancel_create_connect);
+
+void hci_le_add_dev_white_list(struct hci_dev *hdev, bdaddr_t *dst)
+{
+ struct hci_cp_le_add_dev_white_list cp;
+ struct adv_entry *entry;
+ struct link_key *key;
+
+ BT_DBG("%p", hdev);
+
+ memset(&cp, 0, sizeof(cp));
+ bacpy(&cp.addr, dst);
+
+ key = hci_find_link_key_type(hdev, dst, KEY_TYPE_LTK);
+ if (!key) {
+ entry = hci_find_adv_entry(hdev, dst);
+ if (entry)
+ cp.addr_type = entry->bdaddr_type;
+ else
+ cp.addr_type = 0x00;
+ } else {
+ cp.addr_type = key->addr_type;
+ }
+
+ hci_send_cmd(hdev, HCI_OP_LE_ADD_DEV_WHITE_LIST, sizeof(cp), &cp);
+}
+EXPORT_SYMBOL(hci_le_add_dev_white_list);
+
+void hci_le_remove_dev_white_list(struct hci_dev *hdev, bdaddr_t *dst)
+{
+ struct hci_cp_le_remove_dev_white_list cp;
+ struct adv_entry *entry;
+ struct link_key *key;
+
+ BT_DBG("%p", hdev);
+
+ memset(&cp, 0, sizeof(cp));
+ bacpy(&cp.addr, dst);
+
+ key = hci_find_link_key_type(hdev, dst, KEY_TYPE_LTK);
+ if (!key) {
+ entry = hci_find_adv_entry(hdev, dst);
+ if (entry)
+ cp.addr_type = entry->bdaddr_type;
+ else
+ cp.addr_type = 0x00;
+ } else {
+ cp.addr_type = key->addr_type;
+ }
+
+ hci_send_cmd(hdev, HCI_OP_LE_REMOVE_DEV_WHITE_LIST, sizeof(cp), &cp);
+}
+EXPORT_SYMBOL(hci_le_remove_dev_white_list);
+
void hci_acl_connect(struct hci_conn *conn)
{
struct hci_dev *hdev = conn->hdev;
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index bf854c3..0cd3c3f 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -305,6 +305,12 @@
/* Read LE buffer size */
hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
+
+ /* Read LE clear white list */
+ hci_send_cmd(hdev, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
+
+ /* Read LE white list size */
+ hci_send_cmd(hdev, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
}
static void hci_scan_req(struct hci_dev *hdev, unsigned long opt)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 6e8500b..d3402b7 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -426,6 +426,16 @@
hci_req_complete(hdev, HCI_OP_HOST_BUFFER_SIZE, status);
}
+static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
+ struct sk_buff *skb)
+{
+ __u8 status = *((__u8 *) skb->data);
+
+ BT_DBG("%s status 0x%x", hdev->name, status);
+
+ hci_req_complete(hdev, HCI_OP_LE_CLEAR_WHITE_LIST, status);
+}
+
static void hci_cc_read_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_rp_read_ssp_mode *rp = (void *) skb->data;
@@ -913,6 +923,23 @@
hci_req_complete(hdev, HCI_OP_LE_READ_BUFFER_SIZE, rp->status);
}
+static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
+ struct sk_buff *skb)
+{
+ struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
+
+ BT_DBG("%s status 0x%x", hdev->name, rp->status);
+
+ if (rp->status)
+ return;
+
+ hdev->le_white_list_size = rp->size;
+
+ BT_DBG("%s le white list %d", hdev->name, hdev->le_white_list_size);
+
+ hci_req_complete(hdev, HCI_OP_LE_READ_WHITE_LIST_SIZE, rp->status);
+}
+
static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
@@ -2253,6 +2280,14 @@
hci_cc_le_read_buffer_size(hdev, skb);
break;
+ case HCI_OP_LE_READ_WHITE_LIST_SIZE:
+ hci_cc_le_read_white_list_size(hdev, skb);
+ break;
+
+ case HCI_OP_LE_CLEAR_WHITE_LIST:
+ hci_cc_le_clear_white_list(hdev, skb);
+ break;
+
case HCI_OP_READ_RSSI:
hci_cc_read_rssi(hdev, skb);
break;
@@ -3172,11 +3207,23 @@
{
struct hci_ev_le_conn_complete *ev = (void *) skb->data;
struct hci_conn *conn;
+ u8 white_list;
BT_DBG("%s status %d", hdev->name, ev->status);
hci_dev_lock(hdev);
+ /* Ignore event for LE cancel create conn whitelist */
+ if (ev->status && !bacmp(&ev->bdaddr, BDADDR_ANY))
+ goto unlock;
+
+ if (hci_conn_hash_lookup_ba(hdev, LE_LINK, BDADDR_ANY))
+ white_list = 1;
+ else
+ white_list = 0;
+
+ BT_DBG("w_list %d", white_list);
+
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &ev->bdaddr);
if (!conn) {
conn = hci_le_conn_add(hdev, &ev->bdaddr, ev->bdaddr_type);
@@ -3208,7 +3255,8 @@
hci_conn_hold_device(conn);
hci_conn_add_sysfs(conn);
- hci_proto_connect_cfm(conn, ev->status);
+ if (!white_list)
+ hci_proto_connect_cfm(conn, ev->status);
unlock:
hci_dev_unlock(hdev);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 72234c1..1702ce3 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -229,6 +229,8 @@
memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
+ rp.le_white_list_size = hdev->le_white_list_size;
+
hci_dev_unlock_bh(hdev);
hci_dev_put(hdev);
@@ -1450,6 +1452,185 @@
return err;
}
+static int le_add_dev_white_list(struct sock *sk, u16 index,
+ unsigned char *data, u16 len)
+{
+ struct hci_dev *hdev;
+ struct mgmt_cp_le_add_dev_white_list *cp;
+ int err = 0;
+
+ BT_DBG("");
+
+ cp = (void *) data;
+
+ if (len != sizeof(*cp))
+ return cmd_status(sk, index, MGMT_OP_LE_ADD_DEV_WHITE_LIST,
+ EINVAL);
+
+ hdev = hci_dev_get(index);
+ if (!hdev)
+ return cmd_status(sk, index, MGMT_OP_LE_ADD_DEV_WHITE_LIST,
+ ENODEV);
+
+ hci_dev_lock_bh(hdev);
+
+ if (!test_bit(HCI_UP, &hdev->flags)) {
+ err = cmd_status(sk, index, MGMT_OP_LE_ADD_DEV_WHITE_LIST,
+ ENETDOWN);
+ goto failed;
+ }
+
+ hci_le_add_dev_white_list(hdev, &cp->bdaddr);
+
+failed:
+ hci_dev_unlock_bh(hdev);
+ hci_dev_put(hdev);
+
+ return err;
+}
+
+static int le_remove_dev_white_list(struct sock *sk, u16 index,
+ unsigned char *data, u16 len)
+{
+ struct hci_dev *hdev;
+ struct mgmt_cp_le_remove_dev_white_list *cp;
+ int err = 0;
+
+ BT_DBG("");
+
+ cp = (void *) data;
+
+ if (len != sizeof(*cp))
+ return cmd_status(sk, index, MGMT_OP_LE_REMOVE_DEV_WHITE_LIST,
+ EINVAL);
+
+ hdev = hci_dev_get(index);
+ if (!hdev)
+ return cmd_status(sk, index, MGMT_OP_LE_REMOVE_DEV_WHITE_LIST,
+ ENODEV);
+
+ hci_dev_lock_bh(hdev);
+
+ if (!test_bit(HCI_UP, &hdev->flags)) {
+ err = cmd_status(sk, index, MGMT_OP_LE_REMOVE_DEV_WHITE_LIST,
+ ENETDOWN);
+ goto failed;
+ }
+
+ hci_le_remove_dev_white_list(hdev, &cp->bdaddr);
+
+failed:
+ hci_dev_unlock_bh(hdev);
+ hci_dev_put(hdev);
+
+ return err;
+}
+
+static int le_create_conn_white_list(struct sock *sk, u16 index)
+{
+ struct hci_dev *hdev;
+ struct hci_conn *conn;
+ u8 sec_level, auth_type;
+ struct pending_cmd *cmd;
+ bdaddr_t bdaddr;
+ int err = 0;
+
+ BT_DBG("");
+
+ hdev = hci_dev_get(index);
+ if (!hdev)
+ return cmd_status(sk, index, MGMT_OP_LE_CREATE_CONN_WHITE_LIST,
+ ENODEV);
+
+ hci_dev_lock_bh(hdev);
+
+ if (!test_bit(HCI_UP, &hdev->flags)) {
+ err = cmd_status(sk, index, MGMT_OP_LE_CREATE_CONN_WHITE_LIST,
+ ENETDOWN);
+ goto failed;
+ }
+
+ cmd = mgmt_pending_add(sk, MGMT_OP_LE_CREATE_CONN_WHITE_LIST, index,
+ NULL, 0);
+ if (!cmd) {
+ err = -ENOMEM;
+ goto failed;
+ }
+
+ sec_level = BT_SECURITY_MEDIUM;
+ auth_type = HCI_AT_GENERAL_BONDING;
+ memset(&bdaddr, 0, sizeof(bdaddr));
+ conn = hci_le_connect(hdev, 0, BDADDR_ANY, sec_level, auth_type, NULL);
+ if (IS_ERR(conn)) {
+ err = PTR_ERR(conn);
+ mgmt_pending_remove(cmd);
+ }
+
+failed:
+ hci_dev_unlock_bh(hdev);
+ hci_dev_put(hdev);
+
+ return err;
+}
+
+static int le_cancel_create_conn_white_list(struct sock *sk, u16 index)
+{
+ struct hci_dev *hdev;
+ int err = 0;
+
+ BT_DBG("");
+
+ hdev = hci_dev_get(index);
+ if (!hdev)
+ return cmd_status(sk, index,
+ MGMT_OP_LE_CANCEL_CREATE_CONN_WHITE_LIST, ENODEV);
+
+ hci_dev_lock_bh(hdev);
+
+ if (!test_bit(HCI_UP, &hdev->flags)) {
+ err = cmd_status(sk, index,
+ MGMT_OP_LE_CANCEL_CREATE_CONN_WHITE_LIST, ENETDOWN);
+ goto failed;
+ }
+
+ hci_le_cancel_create_connect(hdev, BDADDR_ANY);
+
+failed:
+ hci_dev_unlock_bh(hdev);
+ hci_dev_put(hdev);
+
+ return err;
+}
+
+static int le_clear_white_list(struct sock *sk, u16 index)
+{
+ struct hci_dev *hdev;
+ int err;
+
+ BT_DBG("");
+
+ hdev = hci_dev_get(index);
+ if (!hdev)
+ return cmd_status(sk, index,
+ MGMT_OP_LE_CLEAR_WHITE_LIST, ENODEV);
+
+ hci_dev_lock_bh(hdev);
+
+ if (!test_bit(HCI_UP, &hdev->flags)) {
+ err = cmd_status(sk, index,
+ MGMT_OP_LE_CLEAR_WHITE_LIST, ENETDOWN);
+ goto failed;
+ }
+
+ err = hci_send_cmd(hdev, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
+
+failed:
+ hci_dev_unlock_bh(hdev);
+ hci_dev_put(hdev);
+
+ return err;
+}
+
static int set_io_capability(struct sock *sk, u16 index, unsigned char *data,
u16 len)
{
@@ -2466,7 +2647,23 @@
case MGMT_OP_ENCRYPT_LINK:
err = encrypt_link(sk, index, buf + sizeof(*hdr), len);
break;
-
+ case MGMT_OP_LE_ADD_DEV_WHITE_LIST:
+ err = le_add_dev_white_list(sk, index, buf + sizeof(*hdr),
+ len);
+ break;
+ case MGMT_OP_LE_REMOVE_DEV_WHITE_LIST:
+ err = le_remove_dev_white_list(sk, index, buf + sizeof(*hdr),
+ len);
+ break;
+ case MGMT_OP_LE_CLEAR_WHITE_LIST:
+ err = le_clear_white_list(sk, index);
+ break;
+ case MGMT_OP_LE_CREATE_CONN_WHITE_LIST:
+ err = le_create_conn_white_list(sk, index);
+ break;
+ case MGMT_OP_LE_CANCEL_CREATE_CONN_WHITE_LIST:
+ err = le_cancel_create_conn_white_list(sk, index);
+ break;
default:
BT_DBG("Unknown op %u", opcode);
err = cmd_status(sk, index, opcode, 0x01);
@@ -2626,10 +2823,25 @@
int mgmt_connected(u16 index, bdaddr_t *bdaddr, u8 le)
{
struct mgmt_ev_connected ev;
+ struct pending_cmd *cmd;
+ struct hci_dev *hdev;
+
+ BT_DBG("hci%u", index);
+
+ hdev = hci_dev_get(index);
+
+ if (!hdev)
+ return -ENODEV;
bacpy(&ev.bdaddr, bdaddr);
ev.le = le;
+ cmd = mgmt_pending_find(MGMT_OP_LE_CREATE_CONN_WHITE_LIST, index);
+ if (cmd) {
+ BT_ERR("mgmt_connected remove mgmt pending white_list");
+ mgmt_pending_remove(cmd);
+ }
+
return mgmt_event(MGMT_EV_CONNECTED, index, &ev, sizeof(ev), NULL);
}
diff --git a/sound/soc/codecs/wcd9310.c b/sound/soc/codecs/wcd9310.c
index 4758829..9881640 100644
--- a/sound/soc/codecs/wcd9310.c
+++ b/sound/soc/codecs/wcd9310.c
@@ -4472,8 +4472,8 @@
pr_err("%s: Slim close tx/rx wait timeout\n",
__func__);
ret = -EINVAL;
- }
- ret = 0;
+ } else
+ ret = 0;
break;
}
return ret;
@@ -4486,7 +4486,7 @@
struct snd_soc_codec *codec = w->codec;
struct tabla_priv *tabla_p = snd_soc_codec_get_drvdata(codec);
u32 j = 0;
- u32 ret = 0;
+ int ret = 0;
codec->control_data = dev_get_drvdata(codec->dev->parent);
tabla = codec->control_data;
@@ -4543,13 +4543,22 @@
ret = wcd9xxx_close_slim_sch_rx(tabla,
tabla_p->dai[j].ch_num,
tabla_p->dai[j].ch_tot);
- tabla_p->dai[j].rate = 0;
- memset(tabla_p->dai[j].ch_num, 0, (sizeof(u32)*
- tabla_p->dai[j].ch_tot));
- tabla_p->dai[j].ch_tot = 0;
ret = tabla_codec_enable_chmask(tabla_p,
SND_SOC_DAPM_POST_PMD,
j);
+ if (ret < 0) {
+ ret = wcd9xxx_disconnect_port(tabla,
+ tabla_p->dai[j].ch_num,
+ tabla_p->dai[j].ch_tot,
+ 1);
+ pr_info("%s: Disconnect RX port ret = %d\n",
+ __func__, ret);
+ }
+ tabla_p->dai[j].rate = 0;
+ memset(tabla_p->dai[j].ch_num, 0, (sizeof(u32)*
+ tabla_p->dai[j].ch_tot));
+ tabla_p->dai[j].ch_tot = 0;
+
if ((tabla != NULL) &&
(tabla->dev != NULL) &&
(tabla->dev->parent != NULL)) {
@@ -4569,7 +4578,7 @@
struct tabla_priv *tabla_p = snd_soc_codec_get_drvdata(codec);
/* index to the DAI ID, for now hardcoding */
u32 j = 0;
- u32 ret = 0;
+ int ret = 0;
codec->control_data = dev_get_drvdata(codec->dev->parent);
tabla = codec->control_data;
@@ -4626,13 +4635,21 @@
ret = wcd9xxx_close_slim_sch_tx(tabla,
tabla_p->dai[j].ch_num,
tabla_p->dai[j].ch_tot);
+ ret = tabla_codec_enable_chmask(tabla_p,
+ SND_SOC_DAPM_POST_PMD,
+ j);
+ if (ret < 0) {
+ ret = wcd9xxx_disconnect_port(tabla,
+ tabla_p->dai[j].ch_num,
+ tabla_p->dai[j].ch_tot, 0);
+ pr_info("%s: Disconnect TX port, ret = %d\n",
+ __func__, ret);
+ }
+
tabla_p->dai[j].rate = 0;
memset(tabla_p->dai[j].ch_num, 0, (sizeof(u32)*
tabla_p->dai[j].ch_tot));
tabla_p->dai[j].ch_tot = 0;
- ret = tabla_codec_enable_chmask(tabla_p,
- SND_SOC_DAPM_POST_PMD,
- j);
if ((tabla != NULL) &&
(tabla->dev != NULL) &&
(tabla->dev->parent != NULL)) {
diff --git a/sound/soc/msm/apq8064.c b/sound/soc/msm/apq8064.c
index 2959fe0..8c2495b 100644
--- a/sound/soc/msm/apq8064.c
+++ b/sound/soc/msm/apq8064.c
@@ -1280,6 +1280,28 @@
return 0;
}
+static int msm_slim_4_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_interval *rate = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_RATE);
+
+ struct snd_interval *channels = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_CHANNELS);
+
+ pr_debug("%s()\n", __func__);
+
+ rate->min = rate->max = 48000;
+ if (rec_mode == INCALL_REC_STEREO)
+ channels->min = channels->max = 2;
+ else
+ channels->min = channels->max = 1;
+
+ pr_debug("%s channels->min %u channels->max %u ()\n", __func__,
+ channels->min, channels->max);
+ return 0;
+}
+
static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params)
{
@@ -1944,7 +1966,7 @@
.codec_dai_name = "msm-stub-tx",
.no_pcm = 1,
.be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
- .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .be_hw_params_fixup = msm_slim_4_tx_be_hw_params_fixup,
.ops = &msm_slimbus_4_be_ops,
},
{
diff --git a/sound/soc/msm/msm8974.c b/sound/soc/msm/msm8974.c
index f50b915..545a5b9 100644
--- a/sound/soc/msm/msm8974.c
+++ b/sound/soc/msm/msm8974.c
@@ -823,6 +823,22 @@
.be_id = MSM_FRONTEND_DAI_VOIP,
},
{
+ .name = "Circuit-Switch Voice",
+ .stream_name = "CS-Voice",
+ .cpu_dai_name = "CS-VOICE",
+ .platform_name = "msm-pcm-voice",
+ .dynamic = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ /* this dainlink has playback support */
+ .ignore_pmdown_time = 1,
+ .be_id = MSM_FRONTEND_DAI_CS_VOICE,
+ },
+ {
.name = "MSM8974 LPA",
.stream_name = "LPA",
.cpu_dai_name = "MultiMedia3",
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-voice-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-voice-v2.c
index 206e881..f1e0f3a 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-voice-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-voice-v2.c
@@ -466,6 +466,9 @@
static __devinit int msm_pcm_probe(struct platform_device *pdev)
{
+ if (pdev->dev.of_node)
+ dev_set_name(&pdev->dev, "%s", "msm-pcm-voice");
+
pr_debug("%s: dev name %s\n", __func__, dev_name(&pdev->dev));
return snd_soc_register_platform(&pdev->dev,
&msm_soc_platform);
@@ -477,10 +480,17 @@
return 0;
}
+static const struct of_device_id msm_voice_dt_match[] = {
+ {.compatible = "qcom,msm-pcm-voice"},
+ {}
+};
+MODULE_DEVICE_TABLE(of, msm_voice_dt_match);
+
static struct platform_driver msm_pcm_driver = {
.driver = {
.name = "msm-pcm-voice",
.owner = THIS_MODULE,
+ .of_match_table = msm_voice_dt_match,
},
.probe = msm_pcm_probe,
.remove = __devexit_p(msm_pcm_remove),
diff --git a/sound/soc/msm/qdsp6v2/q6voice.c b/sound/soc/msm/qdsp6v2/q6voice.c
index 4e11dfe..f84b456 100644
--- a/sound/soc/msm/qdsp6v2/q6voice.c
+++ b/sound/soc/msm/qdsp6v2/q6voice.c
@@ -50,19 +50,6 @@
static int voice_send_set_device_cmd(struct voice_data *v);
static int voice_send_disable_vocproc_cmd(struct voice_data *v);
static int voice_send_vol_index_cmd(struct voice_data *v);
-static int voice_send_cvp_map_memory_cmd(struct voice_data *v);
-static int voice_send_cvp_unmap_memory_cmd(struct voice_data *v);
-static int voice_send_cvs_map_memory_cmd(struct voice_data *v);
-static int voice_send_cvs_unmap_memory_cmd(struct voice_data *v);
-static int voice_send_cvs_register_cal_cmd(struct voice_data *v);
-static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v);
-static int voice_send_cvp_register_cal_cmd(struct voice_data *v);
-static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v);
-static int voice_send_cvp_register_vol_cal_table_cmd(struct voice_data *v);
-static int voice_send_cvp_deregister_vol_cal_table_cmd(struct voice_data *v);
-static int voice_send_set_widevoice_enable_cmd(struct voice_data *v);
-static int voice_send_set_pp_enable_cmd(struct voice_data *v,
- uint32_t module_id, int enable);
static int voice_cvs_stop_playback(struct voice_data *v);
static int voice_cvs_start_playback(struct voice_data *v);
static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode);
@@ -223,7 +210,6 @@
goto err;
}
- rtac_set_voice_handle(RTAC_CVS, common.apr_q6_cvs);
}
if (common.apr_q6_cvp == NULL) {
@@ -238,7 +224,6 @@
goto err;
}
- rtac_set_voice_handle(RTAC_CVP, common.apr_q6_cvp);
}
mutex_unlock(&common.common_lock);
@@ -249,7 +234,6 @@
if (common.apr_q6_cvs != NULL) {
apr_deregister(common.apr_q6_cvs);
common.apr_q6_cvs = NULL;
- rtac_set_voice_handle(RTAC_CVS, NULL);
}
if (common.apr_q6_mvm != NULL) {
apr_deregister(common.apr_q6_mvm);
@@ -278,7 +262,8 @@
return -EINVAL;
}
pr_debug("%s: VoLTE command to MVM\n", __func__);
- if (is_volte_session(v->session_id)) {
+ if (is_volte_session(v->session_id) ||
+ is_voice_session(v->session_id)) {
mvm_handle = voice_get_mvm_handle(v);
mvm_voice_ctl_cmd.hdr.hdr_field = APR_HDR_FIELD(
APR_MSG_TYPE_SEQ_CMD,
@@ -1211,765 +1196,6 @@
return -EINVAL;
}
-static int voice_send_cvs_register_cal_cmd(struct voice_data *v)
-{
- struct cvs_register_cal_data_cmd cvs_reg_cal_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvs;
- u16 cvs_handle;
- uint32_t cal_paddr;
-
- /* get the cvs cal data */
- get_all_vocstrm_cal(&cal_block);
- if (cal_block.cal_size == 0)
- goto fail;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvs = common.apr_q6_cvs;
-
- if (!apr_cvs) {
- pr_err("%s: apr_cvs is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id)) {
- if (common.cvs_cal.buf) {
- cal_paddr = common.cvs_cal.phy;
-
- memcpy(common.cvs_cal.buf,
- (void *) cal_block.cal_kvaddr,
- cal_block.cal_size);
- } else {
- return -EINVAL;
- }
- } else {
- cal_paddr = cal_block.cal_paddr;
- }
-
- cvs_handle = voice_get_cvs_handle(v);
-
- /* fill in the header */
- cvs_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvs_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvs_reg_cal_cmd) - APR_HDR_SIZE);
- cvs_reg_cal_cmd.hdr.src_port = v->session_id;
- cvs_reg_cal_cmd.hdr.dest_port = cvs_handle;
- cvs_reg_cal_cmd.hdr.token = 0;
- cvs_reg_cal_cmd.hdr.opcode = VSS_ISTREAM_CMD_REGISTER_CALIBRATION_DATA;
-
- cvs_reg_cal_cmd.cvs_cal_data.phys_addr = cal_paddr;
- cvs_reg_cal_cmd.cvs_cal_data.mem_size = cal_block.cal_size;
-
- v->cvs_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_reg_cal_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvs cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvs_wait,
- (v->cvs_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvs_deregister_cal_cmd(struct voice_data *v)
-{
- struct cvs_deregister_cal_data_cmd cvs_dereg_cal_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvs;
- u16 cvs_handle;
-
- get_all_vocstrm_cal(&cal_block);
- if (cal_block.cal_size == 0)
- return 0;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvs = common.apr_q6_cvs;
-
- if (!apr_cvs) {
- pr_err("%s: apr_cvs is NULL.\n", __func__);
- return -EINVAL;
- }
- cvs_handle = voice_get_cvs_handle(v);
-
- /* fill in the header */
- cvs_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvs_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvs_dereg_cal_cmd) - APR_HDR_SIZE);
- cvs_dereg_cal_cmd.hdr.src_port = v->session_id;
- cvs_dereg_cal_cmd.hdr.dest_port = cvs_handle;
- cvs_dereg_cal_cmd.hdr.token = 0;
- cvs_dereg_cal_cmd.hdr.opcode =
- VSS_ISTREAM_CMD_DEREGISTER_CALIBRATION_DATA;
-
- v->cvs_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_dereg_cal_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvs cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvs_wait,
- (v->cvs_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_map_memory_cmd(struct voice_data *v)
-{
- struct vss_map_memory_cmd cvp_map_mem_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
- uint32_t cal_paddr;
-
- /* get all cvp cal data */
- get_all_cvp_cal(&cal_block);
- if (cal_block.cal_size == 0)
- goto fail;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id)) {
- if (common.cvp_cal.buf)
- cal_paddr = common.cvp_cal.phy;
- else
- return -EINVAL;
- } else {
- cal_paddr = cal_block.cal_paddr;
- }
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_map_mem_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvp_map_mem_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_map_mem_cmd) - APR_HDR_SIZE);
- cvp_map_mem_cmd.hdr.src_port = v->session_id;
- cvp_map_mem_cmd.hdr.dest_port = cvp_handle;
- cvp_map_mem_cmd.hdr.token = 0;
- cvp_map_mem_cmd.hdr.opcode = VSS_ICOMMON_CMD_MAP_MEMORY;
-
- pr_debug("%s, phy_addr:0x%x, mem_size:%d\n", __func__,
- cal_paddr, cal_block.cal_size);
- cvp_map_mem_cmd.vss_map_mem.phys_addr = cal_paddr;
- cvp_map_mem_cmd.vss_map_mem.mem_size = cal_block.cal_size;
- cvp_map_mem_cmd.vss_map_mem.mem_pool_id =
- VSS_ICOMMON_MAP_MEMORY_SHMEM8_4K_POOL;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_map_mem_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_unmap_memory_cmd(struct voice_data *v)
-{
- struct vss_unmap_memory_cmd cvp_unmap_mem_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
- uint32_t cal_paddr;
-
- get_all_cvp_cal(&cal_block);
- if (cal_block.cal_size == 0)
- return 0;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id))
- cal_paddr = common.cvp_cal.phy;
- else
- cal_paddr = cal_block.cal_paddr;
-
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_unmap_mem_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvp_unmap_mem_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_unmap_mem_cmd) - APR_HDR_SIZE);
- cvp_unmap_mem_cmd.hdr.src_port = v->session_id;
- cvp_unmap_mem_cmd.hdr.dest_port = cvp_handle;
- cvp_unmap_mem_cmd.hdr.token = 0;
- cvp_unmap_mem_cmd.hdr.opcode = VSS_ICOMMON_CMD_UNMAP_MEMORY;
-
- cvp_unmap_mem_cmd.vss_unmap_mem.phys_addr = cal_paddr;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_unmap_mem_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvs_map_memory_cmd(struct voice_data *v)
-{
- struct vss_map_memory_cmd cvs_map_mem_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvs;
- u16 cvs_handle;
- uint32_t cal_paddr;
-
- /* get all cvs cal data */
- get_all_vocstrm_cal(&cal_block);
- if (cal_block.cal_size == 0)
- goto fail;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvs = common.apr_q6_cvs;
-
- if (!apr_cvs) {
- pr_err("%s: apr_cvs is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id)) {
- if (common.cvs_cal.buf)
- cal_paddr = common.cvs_cal.phy;
- else
- return -EINVAL;
- } else {
- cal_paddr = cal_block.cal_paddr;
- }
-
- cvs_handle = voice_get_cvs_handle(v);
-
- /* fill in the header */
- cvs_map_mem_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvs_map_mem_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvs_map_mem_cmd) - APR_HDR_SIZE);
- cvs_map_mem_cmd.hdr.src_port = v->session_id;
- cvs_map_mem_cmd.hdr.dest_port = cvs_handle;
- cvs_map_mem_cmd.hdr.token = 0;
- cvs_map_mem_cmd.hdr.opcode = VSS_ICOMMON_CMD_MAP_MEMORY;
-
- pr_debug("%s, phys_addr: 0x%x, mem_size: %d\n", __func__,
- cal_paddr, cal_block.cal_size);
- cvs_map_mem_cmd.vss_map_mem.phys_addr = cal_paddr;
- cvs_map_mem_cmd.vss_map_mem.mem_size = cal_block.cal_size;
- cvs_map_mem_cmd.vss_map_mem.mem_pool_id =
- VSS_ICOMMON_MAP_MEMORY_SHMEM8_4K_POOL;
-
- v->cvs_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_map_mem_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvs cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvs_wait,
- (v->cvs_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvs_unmap_memory_cmd(struct voice_data *v)
-{
- struct vss_unmap_memory_cmd cvs_unmap_mem_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvs;
- u16 cvs_handle;
- uint32_t cal_paddr;
-
- get_all_vocstrm_cal(&cal_block);
- if (cal_block.cal_size == 0)
- return 0;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvs = common.apr_q6_cvs;
-
- if (!apr_cvs) {
- pr_err("%s: apr_cvs is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id))
- cal_paddr = common.cvs_cal.phy;
- else
- cal_paddr = cal_block.cal_paddr;
-
- cvs_handle = voice_get_cvs_handle(v);
-
- /* fill in the header */
- cvs_unmap_mem_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvs_unmap_mem_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvs_unmap_mem_cmd) - APR_HDR_SIZE);
- cvs_unmap_mem_cmd.hdr.src_port = v->session_id;
- cvs_unmap_mem_cmd.hdr.dest_port = cvs_handle;
- cvs_unmap_mem_cmd.hdr.token = 0;
- cvs_unmap_mem_cmd.hdr.opcode = VSS_ICOMMON_CMD_UNMAP_MEMORY;
-
- cvs_unmap_mem_cmd.vss_unmap_mem.phys_addr = cal_paddr;
-
- v->cvs_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_unmap_mem_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvs cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvs_wait,
- (v->cvs_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_register_cal_cmd(struct voice_data *v)
-{
- struct cvp_register_cal_data_cmd cvp_reg_cal_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
- uint32_t cal_paddr;
-
- /* get the cvp cal data */
- get_all_vocproc_cal(&cal_block);
- if (cal_block.cal_size == 0)
- goto fail;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id)) {
- if (common.cvp_cal.buf) {
- cal_paddr = common.cvp_cal.phy;
-
- memcpy(common.cvp_cal.buf,
- (void *)cal_block.cal_kvaddr,
- cal_block.cal_size);
- } else {
- return -EINVAL;
- }
- } else {
- cal_paddr = cal_block.cal_paddr;
- }
-
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_reg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvp_reg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_reg_cal_cmd) - APR_HDR_SIZE);
- cvp_reg_cal_cmd.hdr.src_port = v->session_id;
- cvp_reg_cal_cmd.hdr.dest_port = cvp_handle;
- cvp_reg_cal_cmd.hdr.token = 0;
- cvp_reg_cal_cmd.hdr.opcode = VSS_IVOCPROC_CMD_REGISTER_CALIBRATION_DATA;
-
- cvp_reg_cal_cmd.cvp_cal_data.phys_addr = cal_paddr;
- cvp_reg_cal_cmd.cvp_cal_data.mem_size = cal_block.cal_size;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_reg_cal_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v)
-{
- struct cvp_deregister_cal_data_cmd cvp_dereg_cal_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
-
- get_all_vocproc_cal(&cal_block);
- if (cal_block.cal_size == 0)
- return 0;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_dereg_cal_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvp_dereg_cal_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_dereg_cal_cmd) - APR_HDR_SIZE);
- cvp_dereg_cal_cmd.hdr.src_port = v->session_id;
- cvp_dereg_cal_cmd.hdr.dest_port = cvp_handle;
- cvp_dereg_cal_cmd.hdr.token = 0;
- cvp_dereg_cal_cmd.hdr.opcode =
- VSS_IVOCPROC_CMD_DEREGISTER_CALIBRATION_DATA;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_dereg_cal_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_register_vol_cal_table_cmd(struct voice_data *v)
-{
- struct cvp_register_vol_cal_table_cmd cvp_reg_cal_tbl_cmd;
- struct acdb_cal_block vol_block;
- struct acdb_cal_block voc_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
- uint32_t cal_paddr;
-
- /* get the cvp vol cal data */
- get_all_vocvol_cal(&vol_block);
- get_all_vocproc_cal(&voc_block);
-
- if (vol_block.cal_size == 0)
- goto fail;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
-
- if (is_voip_session(v->session_id)) {
- if (common.cvp_cal.buf) {
- cal_paddr = common.cvp_cal.phy + voc_block.cal_size;
-
- memcpy(common.cvp_cal.buf + voc_block.cal_size,
- (void *) vol_block.cal_kvaddr,
- vol_block.cal_size);
- } else {
- return -EINVAL;
- }
- } else {
- cal_paddr = vol_block.cal_paddr;
- }
-
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_reg_cal_tbl_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvp_reg_cal_tbl_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_reg_cal_tbl_cmd) - APR_HDR_SIZE);
- cvp_reg_cal_tbl_cmd.hdr.src_port = v->session_id;
- cvp_reg_cal_tbl_cmd.hdr.dest_port = cvp_handle;
- cvp_reg_cal_tbl_cmd.hdr.token = 0;
- cvp_reg_cal_tbl_cmd.hdr.opcode =
- VSS_IVOCPROC_CMD_REGISTER_VOLUME_CAL_TABLE;
-
- cvp_reg_cal_tbl_cmd.cvp_vol_cal_tbl.phys_addr = cal_paddr;
- cvp_reg_cal_tbl_cmd.cvp_vol_cal_tbl.mem_size = vol_block.cal_size;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_reg_cal_tbl_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal table,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_cvp_deregister_vol_cal_table_cmd(struct voice_data *v)
-{
- struct cvp_deregister_vol_cal_table_cmd cvp_dereg_cal_tbl_cmd;
- struct acdb_cal_block cal_block;
- int ret = 0;
- void *apr_cvp;
- u16 cvp_handle;
-
- get_all_vocvol_cal(&cal_block);
- if (cal_block.cal_size == 0)
- return 0;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvp = common.apr_q6_cvp;
-
- if (!apr_cvp) {
- pr_err("%s: apr_cvp is NULL.\n", __func__);
- return -EINVAL;
- }
- cvp_handle = voice_get_cvp_handle(v);
-
- /* fill in the header */
- cvp_dereg_cal_tbl_cmd.hdr.hdr_field = APR_HDR_FIELD(
- APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE),
- APR_PKT_VER);
- cvp_dereg_cal_tbl_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvp_dereg_cal_tbl_cmd) - APR_HDR_SIZE);
- cvp_dereg_cal_tbl_cmd.hdr.src_port = v->session_id;
- cvp_dereg_cal_tbl_cmd.hdr.dest_port = cvp_handle;
- cvp_dereg_cal_tbl_cmd.hdr.token = 0;
- cvp_dereg_cal_tbl_cmd.hdr.opcode =
- VSS_IVOCPROC_CMD_DEREGISTER_VOLUME_CAL_TABLE;
-
- v->cvp_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_dereg_cal_tbl_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvp cal table,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvp_wait,
- (v->cvp_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-
-}
-
-static int voice_send_set_widevoice_enable_cmd(struct voice_data *v)
-{
- struct mvm_set_widevoice_enable_cmd mvm_set_wv_cmd;
- int ret = 0;
- void *apr_mvm;
- u16 mvm_handle;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_mvm = common.apr_q6_mvm;
-
- if (!apr_mvm) {
- pr_err("%s: apr_mvm is NULL.\n", __func__);
- return -EINVAL;
- }
- mvm_handle = voice_get_mvm_handle(v);
-
- /* fill in the header */
- mvm_set_wv_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- mvm_set_wv_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(mvm_set_wv_cmd) - APR_HDR_SIZE);
- mvm_set_wv_cmd.hdr.src_port = v->session_id;
- mvm_set_wv_cmd.hdr.dest_port = mvm_handle;
- mvm_set_wv_cmd.hdr.token = 0;
- mvm_set_wv_cmd.hdr.opcode = VSS_IWIDEVOICE_CMD_SET_WIDEVOICE;
-
- mvm_set_wv_cmd.vss_set_wv.enable = v->wv_enable;
-
- v->mvm_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_wv_cmd);
- if (ret < 0) {
- pr_err("Fail: sending mvm set widevoice enable,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->mvm_wait,
- (v->mvm_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-}
-
-static int voice_send_set_pp_enable_cmd(struct voice_data *v,
- uint32_t module_id, int enable)
-{
- struct cvs_set_pp_enable_cmd cvs_set_pp_cmd;
- int ret = 0;
- void *apr_cvs;
- u16 cvs_handle;
-
- if (v == NULL) {
- pr_err("%s: v is NULL\n", __func__);
- return -EINVAL;
- }
- apr_cvs = common.apr_q6_cvs;
-
- if (!apr_cvs) {
- pr_err("%s: apr_cvs is NULL.\n", __func__);
- return -EINVAL;
- }
- cvs_handle = voice_get_cvs_handle(v);
-
- /* fill in the header */
- cvs_set_pp_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
- APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
- cvs_set_pp_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
- sizeof(cvs_set_pp_cmd) - APR_HDR_SIZE);
- cvs_set_pp_cmd.hdr.src_port = v->session_id;
- cvs_set_pp_cmd.hdr.dest_port = cvs_handle;
- cvs_set_pp_cmd.hdr.token = 0;
- cvs_set_pp_cmd.hdr.opcode = VSS_ICOMMON_CMD_SET_UI_PROPERTY;
-
- cvs_set_pp_cmd.vss_set_pp.module_id = module_id;
- cvs_set_pp_cmd.vss_set_pp.param_id = VOICE_PARAM_MOD_ENABLE;
- cvs_set_pp_cmd.vss_set_pp.param_size = MOD_ENABLE_PARAM_LEN;
- cvs_set_pp_cmd.vss_set_pp.reserved = 0;
- cvs_set_pp_cmd.vss_set_pp.enable = enable;
- cvs_set_pp_cmd.vss_set_pp.reserved_field = 0;
- pr_debug("voice_send_set_pp_enable_cmd, module_id=%d, enable=%d\n",
- module_id, enable);
-
- v->cvs_state = CMD_STATUS_FAIL;
- ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_pp_cmd);
- if (ret < 0) {
- pr_err("Fail: sending cvs set slowtalk enable,\n");
- goto fail;
- }
- ret = wait_event_timeout(v->cvs_wait,
- (v->cvs_state == CMD_STATUS_SUCCESS),
- msecs_to_jiffies(TIMEOUT_MS));
- if (!ret) {
- pr_err("%s: wait_event timeout\n", __func__);
- goto fail;
- }
- return 0;
-fail:
- return -EINVAL;
-}
static int voice_setup_vocproc(struct voice_data *v)
{
@@ -2040,17 +1266,6 @@
goto fail;
}
- /* send cvs cal */
- ret = voice_send_cvs_map_memory_cmd(v);
- if (!ret)
- voice_send_cvs_register_cal_cmd(v);
-
- /* send cvp and vol cal */
- ret = voice_send_cvp_map_memory_cmd(v);
- if (!ret) {
- voice_send_cvp_register_cal_cmd(v);
- voice_send_cvp_register_vol_cal_table_cmd(v);
- }
/* enable vocproc */
ret = voice_send_enable_vocproc_cmd(v);
@@ -2065,16 +1280,6 @@
/* send tty mode if tty device is used */
voice_send_tty_mode_cmd(v);
- /* enable widevoice if wv_enable is set */
- if (v->wv_enable)
- voice_send_set_widevoice_enable_cmd(v);
-
- /* enable slowtalk if st_enable is set */
- if (v->st_enable)
- voice_send_set_pp_enable_cmd(v, MODULE_ID_VOICE_MODULE_ST,
- v->st_enable);
- voice_send_set_pp_enable_cmd(v, MODULE_ID_VOICE_MODULE_FENS,
- v->fens_enable);
if (is_voip_session(v->session_id))
voice_send_netid_timing_cmd(v);
@@ -2087,10 +1292,6 @@
if (v->rec_info.rec_enable)
voice_cvs_start_record(v, v->rec_info.rec_mode);
- rtac_add_voice(voice_get_cvs_handle(v),
- voice_get_cvp_handle(v),
- v->dev_rx.port_id, v->dev_tx.port_id,
- v->session_id);
return 0;
@@ -2359,14 +1560,6 @@
goto fail;
}
- /* deregister cvp and vol cal */
- voice_send_cvp_deregister_vol_cal_table_cmd(v);
- voice_send_cvp_deregister_cal_cmd(v);
- voice_send_cvp_unmap_memory_cmd(v);
-
- /* deregister cvs cal */
- voice_send_cvs_deregister_cal_cmd(v);
- voice_send_cvs_unmap_memory_cmd(v);
/* destrop cvp session */
cvp_destroy_session_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
@@ -2395,7 +1588,6 @@
goto fail;
}
- rtac_remove_voice(voice_get_cvs_handle(v));
cvp_handle = 0;
voice_set_cvp_handle(v, cvp_handle);
@@ -2975,12 +2167,6 @@
mutex_lock(&v->lock);
if (v->voc_state == VOC_RUN) {
- if (v->dev_tx.port_id != RT_PROXY_PORT_001_TX &&
- v->dev_rx.port_id != RT_PROXY_PORT_001_RX)
- afe_sidetone(v->dev_tx.port_id, v->dev_rx.port_id,
- 0, 0);
-
- rtac_remove_voice(voice_get_cvs_handle(v));
/* send cmd to dsp to disable vocproc */
ret = voice_send_disable_vocproc_cmd(v);
if (ret < 0) {
@@ -2988,10 +2174,6 @@
goto fail;
}
- /* deregister cvp and vol cal */
- voice_send_cvp_deregister_vol_cal_table_cmd(v);
- voice_send_cvp_deregister_cal_cmd(v);
- voice_send_cvp_unmap_memory_cmd(v);
v->voc_state = VOC_CHANGE;
}
@@ -3004,7 +2186,6 @@
int voc_enable_cvp(uint16_t session_id)
{
struct voice_data *v = voice_get_session(session_id);
- struct sidetone_cal sidetone_cal_data;
int ret = 0;
if (v == NULL) {
@@ -3021,53 +2202,9 @@
pr_err("%s: set device failed\n", __func__);
goto fail;
}
- /* send cvp and vol cal */
- ret = voice_send_cvp_map_memory_cmd(v);
- if (!ret) {
- voice_send_cvp_register_cal_cmd(v);
- voice_send_cvp_register_vol_cal_table_cmd(v);
- }
- ret = voice_send_enable_vocproc_cmd(v);
- if (ret < 0) {
- pr_err("%s: enable vocproc failed\n", __func__);
- goto fail;
-
- }
/* send tty mode if tty device is used */
voice_send_tty_mode_cmd(v);
- /* enable widevoice if wv_enable is set */
- if (v->wv_enable)
- voice_send_set_widevoice_enable_cmd(v);
-
- /* enable slowtalk */
- if (v->st_enable)
- voice_send_set_pp_enable_cmd(v,
- MODULE_ID_VOICE_MODULE_ST,
- v->st_enable);
- /* enable FENS */
- if (v->fens_enable)
- voice_send_set_pp_enable_cmd(v,
- MODULE_ID_VOICE_MODULE_FENS,
- v->fens_enable);
-
- get_sidetone_cal(&sidetone_cal_data);
- if (v->dev_tx.port_id != RT_PROXY_PORT_001_TX &&
- v->dev_rx.port_id != RT_PROXY_PORT_001_RX) {
- ret = afe_sidetone(v->dev_tx.port_id,
- v->dev_rx.port_id,
- sidetone_cal_data.enable,
- sidetone_cal_data.gain);
-
- if (ret < 0)
- pr_err("%s: AFE command sidetone failed\n",
- __func__);
- }
-
- rtac_add_voice(voice_get_cvs_handle(v),
- voice_get_cvp_handle(v),
- v->dev_rx.port_id, v->dev_tx.port_id,
- v->session_id);
v->voc_state = VOC_RUN;
}
@@ -3201,8 +2338,6 @@
mvm_handle = voice_get_mvm_handle(v);
- if (mvm_handle != 0)
- voice_send_set_widevoice_enable_cmd(v);
mutex_unlock(&v->lock);
@@ -3246,16 +2381,6 @@
else if (module_id == MODULE_ID_VOICE_MODULE_FENS)
v->fens_enable = enable;
- if (v->voc_state == VOC_RUN) {
- if (module_id == MODULE_ID_VOICE_MODULE_ST)
- ret = voice_send_set_pp_enable_cmd(v,
- MODULE_ID_VOICE_MODULE_ST,
- enable);
- else if (module_id == MODULE_ID_VOICE_MODULE_FENS)
- ret = voice_send_set_pp_enable_cmd(v,
- MODULE_ID_VOICE_MODULE_FENS,
- enable);
- }
mutex_unlock(&v->lock);
return ret;
@@ -3391,10 +2516,6 @@
mutex_lock(&v->lock);
if (v->voc_state == VOC_RUN) {
- if (v->dev_tx.port_id != RT_PROXY_PORT_001_TX &&
- v->dev_rx.port_id != RT_PROXY_PORT_001_RX)
- afe_sidetone(v->dev_tx.port_id, v->dev_rx.port_id,
- 0, 0);
ret = voice_destroy_vocproc(v);
if (ret < 0)
pr_err("%s: destroy voice failed\n", __func__);
@@ -3409,7 +2530,6 @@
int voc_start_voice_call(uint16_t session_id)
{
struct voice_data *v = voice_get_session(session_id);
- struct sidetone_cal sidetone_cal_data;
int ret = 0;
if (v == NULL) {
@@ -3447,16 +2567,6 @@
pr_err("start voice failed\n");
goto fail;
}
- get_sidetone_cal(&sidetone_cal_data);
- if (v->dev_tx.port_id != RT_PROXY_PORT_001_TX &&
- v->dev_rx.port_id != RT_PROXY_PORT_001_RX) {
- ret = afe_sidetone(v->dev_tx.port_id,
- v->dev_rx.port_id,
- sidetone_cal_data.enable,
- sidetone_cal_data.gain);
- if (ret < 0)
- pr_err("AFE command sidetone failed\n");
- }
v->voc_state = VOC_RUN;
}
@@ -3649,8 +2759,6 @@
wake_up(&v->cvs_wait);
break;
case VOICE_CMD_SET_PARAM:
- rtac_make_voice_callback(RTAC_CVS, ptr,
- data->payload_size);
break;
default:
pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
@@ -3712,9 +2820,6 @@
pr_debug("%s: dl_cb is NULL\n", __func__);
} else if (data->opcode == VSS_ISTREAM_EVT_SEND_DEC_BUFFER) {
pr_debug("Send dec buf resp\n");
- } else if (data->opcode == VOICE_EVT_GET_PARAM_ACK) {
- rtac_make_voice_callback(RTAC_CVS, data->payload,
- data->payload_size);
} else
pr_debug("Unknown opcode 0x%x\n", data->opcode);
@@ -3792,8 +2897,6 @@
wake_up(&v->cvp_wait);
break;
case VOICE_CMD_SET_PARAM:
- rtac_make_voice_callback(RTAC_CVP, ptr,
- data->payload_size);
break;
default:
pr_debug("%s: not match cmd = 0x%x\n",
@@ -3801,9 +2904,6 @@
break;
}
}
- } else if (data->opcode == VOICE_EVT_GET_PARAM_ACK) {
- rtac_make_voice_callback(RTAC_CVP, data->payload,
- data->payload_size);
}
return 0;
}
@@ -3812,73 +2912,9 @@
static int __init voice_init(void)
{
int rc = 0, i = 0;
- int len;
memset(&common, 0, sizeof(struct common_data));
- /* Allocate memory for VoIP calibration */
- common.client = msm_ion_client_create(UINT_MAX, "voip_client");
- if (IS_ERR_OR_NULL((void *)common.client)) {
- pr_err("%s: ION create client for Voip failed\n", __func__);
- goto cont;
- }
- common.cvp_cal.handle = ion_alloc(common.client, CVP_CAL_SIZE, SZ_4K,
- ION_HEAP(ION_AUDIO_HEAP_ID));
- if (IS_ERR_OR_NULL((void *) common.cvp_cal.handle)) {
- pr_err("%s: ION memory allocation for CVP failed\n",
- __func__);
- ion_client_destroy(common.client);
- goto cont;
- }
-
- rc = ion_phys(common.client, common.cvp_cal.handle,
- (ion_phys_addr_t *)&common.cvp_cal.phy, (size_t *)&len);
- if (rc) {
- pr_err("%s: ION Get Physical for cvp failed, rc = %d\n",
- __func__, rc);
- ion_free(common.client, common.cvp_cal.handle);
- ion_client_destroy(common.client);
- goto cont;
- }
-
- common.cvp_cal.buf = ion_map_kernel(common.client,
- common.cvp_cal.handle, 0);
- if (IS_ERR_OR_NULL((void *) common.cvp_cal.buf)) {
- pr_err("%s: ION memory mapping for cvp failed\n", __func__);
- common.cvp_cal.buf = NULL;
- ion_free(common.client, common.cvp_cal.handle);
- ion_client_destroy(common.client);
- goto cont;
- }
- memset((void *)common.cvp_cal.buf, 0, CVP_CAL_SIZE);
-
- common.cvs_cal.handle = ion_alloc(common.client, CVS_CAL_SIZE, SZ_4K,
- ION_HEAP(ION_AUDIO_HEAP_ID));
- if (IS_ERR_OR_NULL((void *) common.cvs_cal.handle)) {
- pr_err("%s: ION memory allocation for CVS failed\n",
- __func__);
- goto cont;
- }
-
- rc = ion_phys(common.client, common.cvs_cal.handle,
- (ion_phys_addr_t *)&common.cvs_cal.phy, (size_t *)&len);
- if (rc) {
- pr_err("%s: ION Get Physical for cvs failed, rc = %d\n",
- __func__, rc);
- ion_free(common.client, common.cvs_cal.handle);
- goto cont;
- }
-
- common.cvs_cal.buf = ion_map_kernel(common.client,
- common.cvs_cal.handle, 0);
- if (IS_ERR_OR_NULL((void *) common.cvs_cal.buf)) {
- pr_err("%s: ION memory mapping for cvs failed\n", __func__);
- common.cvs_cal.buf = NULL;
- ion_free(common.client, common.cvs_cal.handle);
- goto cont;
- }
- memset((void *)common.cvs_cal.buf, 0, CVS_CAL_SIZE);
-cont:
/* set default value */
common.default_mute_val = 1; /* default is mute */
common.default_vol_val = 0;
diff --git a/sound/soc/msm/qdsp6v2/q6voice.h b/sound/soc/msm/qdsp6v2/q6voice.h
index 1bedb15..d313349 100644
--- a/sound/soc/msm/qdsp6v2/q6voice.h
+++ b/sound/soc/msm/qdsp6v2/q6voice.h
@@ -119,6 +119,8 @@
#define VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION 0x000110FE
/* Create a new full control MVM session. */
+#define VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION_V2 0x000112BF
+
#define APRV2_IBASIC_CMD_DESTROY_SESSION 0x0001003C
/**< No payload. Wait for APRV2_IBASIC_RSP_RESULT response. */
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 4522d15..79016b5 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3231,6 +3231,7 @@
card->instantiated = 0;
mutex_init(&card->mutex);
mutex_init(&card->dpcm_mutex);
+ mutex_init(&card->dapm_power_mutex);
mutex_lock(&client_mutex);
list_add(&card->list, &card_list);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 729142f..5ac643416 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -1290,7 +1290,7 @@
/* Do we need to apply any queued changes? */
if (sort[w->id] != cur_sort || w->reg != cur_reg ||
w->dapm != cur_dapm || w->subseq != cur_subseq) {
- if (!list_empty(&pending))
+ if (cur_dapm && !list_empty(&pending))
dapm_seq_run_coalesced(cur_dapm, &pending);
if (cur_dapm && cur_dapm->seq_notifier) {
@@ -1350,7 +1350,7 @@
"Failed to apply widget power: %d\n", ret);
}
- if (!list_empty(&pending))
+ if (cur_dapm && !list_empty(&pending))
dapm_seq_run_coalesced(cur_dapm, &pending);
if (cur_dapm && cur_dapm->seq_notifier) {
@@ -1567,6 +1567,8 @@
trace_snd_soc_dapm_start(card);
+ mutex_lock(&card->dapm_power_mutex);
+
list_for_each_entry(d, &card->dapm_list, list) {
if (d->n_widgets || d->codec == NULL) {
if (d->idle_bias_off)
@@ -1682,6 +1684,8 @@
"DAPM sequencing finished, waiting %dms\n", card->pop_time);
pop_wait(card->pop_time);
+ mutex_unlock(&card->dapm_power_mutex);
+
trace_snd_soc_dapm_done(card);
return 0;
@@ -3092,9 +3096,9 @@
if (stream == NULL)
return 0;
- //mutex_lock(&codec->mutex);
+ mutex_lock(&codec->mutex);
soc_dapm_stream_event(&codec->dapm, stream, event);
- //mutex_unlock(&codec->mutex);
+ mutex_unlock(&codec->mutex);
return 0;
}