Loading Documentation/devicetree/bindings/i2c/sii8620-i2c.txt +8 −0 Original line number Diff line number Diff line Loading @@ -3,17 +3,25 @@ Required properties: - compatible: must be "sil,sii-8620" - reg: i2c slave address - sil,pwr-gpio: MHL power gpio required to power sii8620 - sil,fw-wake: MHL fw wake gpio going into sii8620 - sil,reset-gpio: MHL reset gpio going into sii8620 for toggling reset pin - sil,irq-gpio: MHL interrupt gpio coming out of sii8620 - sil,i2c_port#: Port number of i2c device - pinctrl-0: Pin control group to be used for this controller. - pinctrl-names: Should contain only one value - "mhl_active". Example: i2c@f9923000 { sil,sii-8620@72 { compatible = "sil,sii-8620"; reg = <0x72>; sil,pwr-gpio = <&pm8994_gpios 2 0>; sil,fw-wake = <&msm_gpio 38 0>; sil,reset-gpio = <&msm_gpio 58 0>; sil,irq-gpio = <&msm_gpio 57 0>; sil,i2c_port# = <1>; pinctrl-names = "mhl_active"; pinctrl-0 = <&mhl_intr_active &mhl_reset_active>; }; }; arch/arm/boot/dts/qcom/msm8994-fluid.dtsi +108 −0 Original line number Diff line number Diff line Loading @@ -306,7 +306,85 @@ qcom,cont-splash-enabled; }; &pmx_hdmi_cec { qcom,num-grp-pins = <1>; qcom,pins = <&gp 31>; }; &pmx_hdmi_ddc { qcom,num-grp-pins = <2>; qcom,pins = <&gp 32>, <&gp 33>; }; &pmx_hdmi_hpd { qcom,num-grp-pins = <1>; qcom,pins = <&gp 34>; }; &mdss_hdmi_tx { pinctrl-names = "hdmi_hpd_active", "hdmi_ddc_active", "hdmi_cec_active", "hdmi_active", "hdmi_sleep"; pinctrl-0 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_suspend &mdss_hdmi_cec_suspend>; pinctrl-1 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active &mdss_hdmi_cec_suspend>; pinctrl-2 = <&mdss_hdmi_hpd_active &mdss_hdmi_cec_active &mdss_hdmi_ddc_suspend>; pinctrl-3 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active &mdss_hdmi_cec_active>; pinctrl-4 = <&mdss_hdmi_hpd_suspend &mdss_hdmi_ddc_suspend &mdss_hdmi_cec_suspend>; }; &spi_epm { status = "disabled"; }; &soc { i2c_1: i2c@f9923000 { /* BLSP2 QUP1 */ compatible = "qcom,i2c-msm-v2"; #address-cells = <1>; #size-cells = <0>; reg-names = "qup_phys_addr", "bam_phys_addr"; reg = <0xf9923000 0x1000>, <0xf9904000 0x19000>; interrupt-names = "qup_irq", "bam_irq"; interrupts = <0 95 0>, <0 238 0>; qcom,clk-freq-out = <100000>; qcom,clk-freq-in = <19200000>; clock-names = "iface_clk", "core_clk"; clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, <&clock_gcc clk_gcc_blsp1_qup1_i2c_apps_clk>; pinctrl-names = "i2c_active", "i2c_sleep"; pinctrl-0 = <&i2c_1_active>; pinctrl-1 = <&i2c_1_sleep>; qcom,noise-rjct-scl = <0>; qcom,noise-rjct-sda = <0>; qcom,bam-pipe-idx-cons = <12>; qcom,bam-pipe-idx-prod = <13>; qcom,master-id = <86>; status = "ok"; sil,sii-8620@72 { status = "disabled"; compatible = "sil,sii-8620"; reg = <0x72>; ldo25-supply = <&pm8994_l25>; sil,pwr-gpio = <&pm8994_gpios 2 0>; sil,pmi9 = <&pmi8994_gpios 9 0>; sil,pmi10 = <&pmi8994_gpios 10 0>; sil,fw-wake = <&msm_gpio 38 0>; sil,reset-gpio = <&msm_gpio 58 0>; sil,irq-gpio = <&msm_gpio 57 0>; sil,i2c_port# = <1>; pinctrl-names = "mhl_active"; pinctrl-0 = <&mhl_intr_active &mhl_reset_active>; }; }; i2c@f9924000 { synaptics@20 { compatible = "synaptics,dsx"; Loading Loading @@ -399,7 +477,36 @@ }; }; &pmi8994_gpios { gpio@c800 { /* GPIO 9 */ qcom,mode = <1>; /* Digital output */ qcom,output-type = <0>; /* CMOS logic */ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ status = "okay"; }; gpio@c900 { /* GPIO 10 */ qcom,mode = <1>; qcom,output-type = <0>; qcom,vin-sel = <2>; qcom,src-sel = <0>; qcom,master-en = <1>; status = "okay"; }; }; &pm8994_gpios { gpio@c100 { /* GPIO 2 */ qcom,mode = <1>; /* Digital output */ qcom,output-type = <0>; /* CMOS logic */ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ status = "okay"; }; gpio@c200 { /* GPIO 3 */ qcom,mode = <0>; qcom,pull = <0>; Loading Loading @@ -520,6 +627,7 @@ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ qcom,invert = <0>; status = "okay"; }; }; Loading arch/arm/boot/dts/qcom/msm8994-pinctrl.dtsi +25 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,31 @@ }; }; mhl_intr: mhl_intr { qcom,pins = <&gp 57>; qcom,num-grp-pins = <1>; qcom,pin-func = <0>; label = "mhl_intr"; mhl_intr_active: mhl_intr_active { bias-pull-up; input-enable; }; }; mhl_reset: mhl_reset { qcom,pins = <&gp 58>; qcom,num-grp-pins = <1>; qcom,pin-func = <0>; label = "mhl_reset"; mhl_reset_active: mhl_reset_active { drive-strength = <2>; bias-pull-down; output-low; }; }; spi_0_active { /* MOSI, MISO, CLK */ qcom,pins = <&gp 0>, <&gp 1>, <&gp 3>; Loading drivers/video/msm/mdss/mhl3/platform.c +162 −22 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/semaphore.h> #include <linux/cdev.h> #include <linux/spi/spi.h> #include <linux/regulator/consumer.h> #include "si_fw_macros.h" #include "si_infoframe.h" Loading Loading @@ -183,6 +184,12 @@ struct i2c_xfer_mem { uint8_t *block_tx_buffers; } i2c_mem; #ifdef MHL_GPIO_EXPANDER static bool expander_enabled = true; #else static bool expander_enabled; #endif static int gpio_expander_transfer(u8 offset, u16 count, u8 *values, bool write); #if defined(SIMG_USE_DTS) Loading Loading @@ -218,7 +225,7 @@ bool input_dev_ucp = 1; bool input_dev_rbp = 1; #endif int hdcp_content_type; bool use_spi; /* Default to i2c (0). */ bool use_spi = 0; /* Default to i2c (0). */ int crystal_khz = 19200; /* SiI8620 SK has 19.2MHz crystal */ int use_heartbeat; Loading Loading @@ -490,9 +497,9 @@ static void toggle_reset_n(void) static void toggle_BB_RST(int reset_period) { MHL_TX_DBG_INFO("Toggle BB_RST# pin. Resets GPIO expander AND 8620\n"); gpio_set_value(GPIO_BB_RESET, 0); gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 0); msleep(reset_period); gpio_set_value(GPIO_BB_RESET, 1); gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 1); } Loading Loading @@ -545,13 +552,15 @@ void set_pin_impl(int pin_idx, int value, case GET_FROM_MODULE_PARAM: break; case GPIO_ON_EXPANDER: bank_value = *(platform_signals[pin_idx].gpio_bank_value); if (expander_enabled) { bank_value = *(platform_signals[pin_idx] .gpio_bank_value); if (value) bank_value |= platform_signals[pin_idx]. gpio_mask_PCA950x; else bank_value &= ~platform_signals[pin_idx]. bank_value &= ~platform_signals[pin_idx]. gpio_mask_PCA950x; *(platform_signals[pin_idx].gpio_bank_value) = Loading @@ -562,6 +571,9 @@ void set_pin_impl(int pin_idx, int value, platform_signals[pin_idx]. gpio_reg_PCA950x.offset, bank_value); } else { bank_value = 0; } break; default: gpio_set_value(platform_signals[pin_idx].gpio_number, Loading @@ -574,7 +586,10 @@ void set_pin_impl(int pin_idx, int value, void platform_mhl_tx_hw_reset(uint32_t reset_period, uint32_t reset_delay) { /* then reset the chip */ if (expander_enabled) toggle_reset_n(); else toggle_BB_RST(100); if (reset_delay) msleep(reset_delay); Loading Loading @@ -1398,7 +1413,10 @@ static int __devinit starter_kit_init(void) pr_err("%s(): gpio_request_array failed, error code %d\n", __func__, ret); } else { if (expander_enabled) ret = gpio_expander_init(); else toggle_BB_RST(100); if (ret != 0) { gpio_free_array(starter_kit_control_gpios, ARRAY_SIZE(starter_kit_control_gpios)); Loading @@ -1412,10 +1430,131 @@ static int si_8620_parse_dt(struct device *dev) { struct device_node *np = dev->of_node; int value; int pmi_gpio9; int pmi_gpio10; int pm_gpio2; int fw_wake; int rc = 0; struct pinctrl *pinctrl; struct pinctrl_state *active_state; struct regulator *ldo; pinctrl = devm_pinctrl_get(dev); if (IS_ERR_OR_NULL(pinctrl)) { MHL_TX_DBG_ERR("%s: failed to get pinctrl\n", __func__); rc = -ENODEV; goto dt_exit; } active_state = pinctrl_lookup_state(pinctrl, "mhl_active"); if (IS_ERR_OR_NULL(active_state)) { MHL_TX_DBG_ERR("%s: failed to find mhl_active state\n", __func__); rc = -ENODEV; goto dt_exit; } if (pinctrl_select_state(pinctrl, active_state)) { MHL_TX_DBG_ERR("%s: failed to select mhl active state\n", __func__); } ldo = devm_regulator_get(dev, "ldo25"); if (IS_ERR_OR_NULL(ldo)) { MHL_TX_DBG_ERR("%s: Unable to get regulator\n", __func__); rc = -ENODEV; goto dt_exit; } rc = regulator_set_voltage(ldo, 1000000, 1000000); if (rc) { MHL_TX_DBG_ERR("%s: Unable to set regulator voltage\n", __func__); goto dt_exit; } rc = regulator_enable(ldo); if (rc) { MHL_TX_DBG_ERR("%s: Regulator enable failed\n", __func__); goto dt_exit; } pm_gpio2 = of_get_named_gpio(np, "sil,pwr-gpio", 0); pmi_gpio9 = of_get_named_gpio(np, "sil,pmi9", 0); pmi_gpio10 = of_get_named_gpio(np, "sil,pmi10", 0); fw_wake = of_get_named_gpio(np, "sil,fw-wake", 0); if (gpio_is_valid(pmi_gpio9)) { rc = gpio_request(pmi_gpio9, "mhl_pmi9"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pmi_gpio9); goto dt_exit; } gpio_direction_output(pmi_gpio9, 0); gpio_set_value(pmi_gpio9, 1); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pmi_gpio9); rc = pmi_gpio9; goto dt_exit; } if (gpio_is_valid(pmi_gpio10)) { rc = gpio_request(pmi_gpio10, "mhl_pmi10"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pmi_gpio10); goto dt_exit; } gpio_direction_output(pmi_gpio10, 0); gpio_set_value(pmi_gpio10, 1); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pmi_gpio10); rc = pmi_gpio10; goto dt_exit; } if (gpio_is_valid(pm_gpio2)) { rc = gpio_request(pm_gpio2, "mhl_pm2"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pm_gpio2); goto dt_exit; } gpio_direction_output(pm_gpio2, 0); gpio_set_value(pm_gpio2, 0); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pm_gpio2); rc = pm_gpio2; goto dt_exit; } if (gpio_is_valid(fw_wake)) { rc = gpio_request(fw_wake, "mhl_fw"); if (rc) { MHL_TX_DBG_ERR("%s:wake_gpio=[%d] req failed:\n", __func__, fw_wake); return rc; } gpio_direction_output(fw_wake, 0); gpio_set_value(fw_wake, 1); platform_signals[TX_FW_WAKE].gpio_number = fw_wake; } else { MHL_TX_DBG_ERR("%s:wake_gpio=[%d] invalid\n", __func__, fw_wake); rc = fw_wake; goto dt_exit; } value = of_get_named_gpio_flags(np, "sil,reset-gpio", 0, NULL); if (value >= 0) if (value >= 0) { starter_kit_control_gpios[MHL_RESET_INDEX].gpio = value; gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 1); } value = of_get_named_gpio_flags(np, "sil,irq-gpio", 0, NULL); if (value >= 0) Loading @@ -1429,15 +1568,16 @@ static int si_8620_parse_dt(struct device *dev) i2c_adapter_num = value; MHL_TX_DBG_INFO("Resources assigned to driver...\n"); MHL_TX_DBG_ERR(" Reset GPIO = %d\n", MHL_TX_DBG_INFO(" Reset GPIO = %d\n", starter_kit_control_gpios[MHL_RESET_INDEX].gpio); MHL_TX_DBG_ERR(" Interrupt GPIO = %d\n", MHL_TX_DBG_INFO(" Interrupt GPIO = %d\n", starter_kit_control_gpios[MHL_INT_INDEX].gpio); MHL_TX_DBG_ERR(" I2C adapter = %d\n", i2c_adapter_num); MHL_TX_DBG_INFO(" I2C adapter = %d\n", i2c_adapter_num); if (use_spi) MHL_TX_DBG_ERR(" SPI adapter = %d\n", spi_bus_num); return 0; dt_exit: return rc; } #endif Loading drivers/video/msm/mdss/mhl3/si_8620_drv.c +1 −1 Original line number Diff line number Diff line Loading @@ -6654,7 +6654,7 @@ int si_mhl_tx_chip_initialize(struct drv_hw_context *hw_context) int status = -1; hw_context->pp_16bpp_override = pp_16bpp_automatic; set_pin(TX_FW_WAKE, 0); /* inverter on board */ set_pin(TX_FW_WAKE, 1); /* inverter on board */ platform_mhl_tx_hw_reset(TX_HW_RESET_PERIOD, TX_HW_RESET_DELAY); /* Power up the device. Keep HSIC and Rx cores powered down. */ Loading Loading
Documentation/devicetree/bindings/i2c/sii8620-i2c.txt +8 −0 Original line number Diff line number Diff line Loading @@ -3,17 +3,25 @@ Required properties: - compatible: must be "sil,sii-8620" - reg: i2c slave address - sil,pwr-gpio: MHL power gpio required to power sii8620 - sil,fw-wake: MHL fw wake gpio going into sii8620 - sil,reset-gpio: MHL reset gpio going into sii8620 for toggling reset pin - sil,irq-gpio: MHL interrupt gpio coming out of sii8620 - sil,i2c_port#: Port number of i2c device - pinctrl-0: Pin control group to be used for this controller. - pinctrl-names: Should contain only one value - "mhl_active". Example: i2c@f9923000 { sil,sii-8620@72 { compatible = "sil,sii-8620"; reg = <0x72>; sil,pwr-gpio = <&pm8994_gpios 2 0>; sil,fw-wake = <&msm_gpio 38 0>; sil,reset-gpio = <&msm_gpio 58 0>; sil,irq-gpio = <&msm_gpio 57 0>; sil,i2c_port# = <1>; pinctrl-names = "mhl_active"; pinctrl-0 = <&mhl_intr_active &mhl_reset_active>; }; };
arch/arm/boot/dts/qcom/msm8994-fluid.dtsi +108 −0 Original line number Diff line number Diff line Loading @@ -306,7 +306,85 @@ qcom,cont-splash-enabled; }; &pmx_hdmi_cec { qcom,num-grp-pins = <1>; qcom,pins = <&gp 31>; }; &pmx_hdmi_ddc { qcom,num-grp-pins = <2>; qcom,pins = <&gp 32>, <&gp 33>; }; &pmx_hdmi_hpd { qcom,num-grp-pins = <1>; qcom,pins = <&gp 34>; }; &mdss_hdmi_tx { pinctrl-names = "hdmi_hpd_active", "hdmi_ddc_active", "hdmi_cec_active", "hdmi_active", "hdmi_sleep"; pinctrl-0 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_suspend &mdss_hdmi_cec_suspend>; pinctrl-1 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active &mdss_hdmi_cec_suspend>; pinctrl-2 = <&mdss_hdmi_hpd_active &mdss_hdmi_cec_active &mdss_hdmi_ddc_suspend>; pinctrl-3 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active &mdss_hdmi_cec_active>; pinctrl-4 = <&mdss_hdmi_hpd_suspend &mdss_hdmi_ddc_suspend &mdss_hdmi_cec_suspend>; }; &spi_epm { status = "disabled"; }; &soc { i2c_1: i2c@f9923000 { /* BLSP2 QUP1 */ compatible = "qcom,i2c-msm-v2"; #address-cells = <1>; #size-cells = <0>; reg-names = "qup_phys_addr", "bam_phys_addr"; reg = <0xf9923000 0x1000>, <0xf9904000 0x19000>; interrupt-names = "qup_irq", "bam_irq"; interrupts = <0 95 0>, <0 238 0>; qcom,clk-freq-out = <100000>; qcom,clk-freq-in = <19200000>; clock-names = "iface_clk", "core_clk"; clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, <&clock_gcc clk_gcc_blsp1_qup1_i2c_apps_clk>; pinctrl-names = "i2c_active", "i2c_sleep"; pinctrl-0 = <&i2c_1_active>; pinctrl-1 = <&i2c_1_sleep>; qcom,noise-rjct-scl = <0>; qcom,noise-rjct-sda = <0>; qcom,bam-pipe-idx-cons = <12>; qcom,bam-pipe-idx-prod = <13>; qcom,master-id = <86>; status = "ok"; sil,sii-8620@72 { status = "disabled"; compatible = "sil,sii-8620"; reg = <0x72>; ldo25-supply = <&pm8994_l25>; sil,pwr-gpio = <&pm8994_gpios 2 0>; sil,pmi9 = <&pmi8994_gpios 9 0>; sil,pmi10 = <&pmi8994_gpios 10 0>; sil,fw-wake = <&msm_gpio 38 0>; sil,reset-gpio = <&msm_gpio 58 0>; sil,irq-gpio = <&msm_gpio 57 0>; sil,i2c_port# = <1>; pinctrl-names = "mhl_active"; pinctrl-0 = <&mhl_intr_active &mhl_reset_active>; }; }; i2c@f9924000 { synaptics@20 { compatible = "synaptics,dsx"; Loading Loading @@ -399,7 +477,36 @@ }; }; &pmi8994_gpios { gpio@c800 { /* GPIO 9 */ qcom,mode = <1>; /* Digital output */ qcom,output-type = <0>; /* CMOS logic */ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ status = "okay"; }; gpio@c900 { /* GPIO 10 */ qcom,mode = <1>; qcom,output-type = <0>; qcom,vin-sel = <2>; qcom,src-sel = <0>; qcom,master-en = <1>; status = "okay"; }; }; &pm8994_gpios { gpio@c100 { /* GPIO 2 */ qcom,mode = <1>; /* Digital output */ qcom,output-type = <0>; /* CMOS logic */ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ status = "okay"; }; gpio@c200 { /* GPIO 3 */ qcom,mode = <0>; qcom,pull = <0>; Loading Loading @@ -520,6 +627,7 @@ qcom,vin-sel = <2>; /* S4 1.8V */ qcom,src-sel = <0>; /* Constant */ qcom,master-en = <1>; /* Enable GPIO */ qcom,invert = <0>; status = "okay"; }; }; Loading
arch/arm/boot/dts/qcom/msm8994-pinctrl.dtsi +25 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,31 @@ }; }; mhl_intr: mhl_intr { qcom,pins = <&gp 57>; qcom,num-grp-pins = <1>; qcom,pin-func = <0>; label = "mhl_intr"; mhl_intr_active: mhl_intr_active { bias-pull-up; input-enable; }; }; mhl_reset: mhl_reset { qcom,pins = <&gp 58>; qcom,num-grp-pins = <1>; qcom,pin-func = <0>; label = "mhl_reset"; mhl_reset_active: mhl_reset_active { drive-strength = <2>; bias-pull-down; output-low; }; }; spi_0_active { /* MOSI, MISO, CLK */ qcom,pins = <&gp 0>, <&gp 1>, <&gp 3>; Loading
drivers/video/msm/mdss/mhl3/platform.c +162 −22 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/semaphore.h> #include <linux/cdev.h> #include <linux/spi/spi.h> #include <linux/regulator/consumer.h> #include "si_fw_macros.h" #include "si_infoframe.h" Loading Loading @@ -183,6 +184,12 @@ struct i2c_xfer_mem { uint8_t *block_tx_buffers; } i2c_mem; #ifdef MHL_GPIO_EXPANDER static bool expander_enabled = true; #else static bool expander_enabled; #endif static int gpio_expander_transfer(u8 offset, u16 count, u8 *values, bool write); #if defined(SIMG_USE_DTS) Loading Loading @@ -218,7 +225,7 @@ bool input_dev_ucp = 1; bool input_dev_rbp = 1; #endif int hdcp_content_type; bool use_spi; /* Default to i2c (0). */ bool use_spi = 0; /* Default to i2c (0). */ int crystal_khz = 19200; /* SiI8620 SK has 19.2MHz crystal */ int use_heartbeat; Loading Loading @@ -490,9 +497,9 @@ static void toggle_reset_n(void) static void toggle_BB_RST(int reset_period) { MHL_TX_DBG_INFO("Toggle BB_RST# pin. Resets GPIO expander AND 8620\n"); gpio_set_value(GPIO_BB_RESET, 0); gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 0); msleep(reset_period); gpio_set_value(GPIO_BB_RESET, 1); gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 1); } Loading Loading @@ -545,13 +552,15 @@ void set_pin_impl(int pin_idx, int value, case GET_FROM_MODULE_PARAM: break; case GPIO_ON_EXPANDER: bank_value = *(platform_signals[pin_idx].gpio_bank_value); if (expander_enabled) { bank_value = *(platform_signals[pin_idx] .gpio_bank_value); if (value) bank_value |= platform_signals[pin_idx]. gpio_mask_PCA950x; else bank_value &= ~platform_signals[pin_idx]. bank_value &= ~platform_signals[pin_idx]. gpio_mask_PCA950x; *(platform_signals[pin_idx].gpio_bank_value) = Loading @@ -562,6 +571,9 @@ void set_pin_impl(int pin_idx, int value, platform_signals[pin_idx]. gpio_reg_PCA950x.offset, bank_value); } else { bank_value = 0; } break; default: gpio_set_value(platform_signals[pin_idx].gpio_number, Loading @@ -574,7 +586,10 @@ void set_pin_impl(int pin_idx, int value, void platform_mhl_tx_hw_reset(uint32_t reset_period, uint32_t reset_delay) { /* then reset the chip */ if (expander_enabled) toggle_reset_n(); else toggle_BB_RST(100); if (reset_delay) msleep(reset_delay); Loading Loading @@ -1398,7 +1413,10 @@ static int __devinit starter_kit_init(void) pr_err("%s(): gpio_request_array failed, error code %d\n", __func__, ret); } else { if (expander_enabled) ret = gpio_expander_init(); else toggle_BB_RST(100); if (ret != 0) { gpio_free_array(starter_kit_control_gpios, ARRAY_SIZE(starter_kit_control_gpios)); Loading @@ -1412,10 +1430,131 @@ static int si_8620_parse_dt(struct device *dev) { struct device_node *np = dev->of_node; int value; int pmi_gpio9; int pmi_gpio10; int pm_gpio2; int fw_wake; int rc = 0; struct pinctrl *pinctrl; struct pinctrl_state *active_state; struct regulator *ldo; pinctrl = devm_pinctrl_get(dev); if (IS_ERR_OR_NULL(pinctrl)) { MHL_TX_DBG_ERR("%s: failed to get pinctrl\n", __func__); rc = -ENODEV; goto dt_exit; } active_state = pinctrl_lookup_state(pinctrl, "mhl_active"); if (IS_ERR_OR_NULL(active_state)) { MHL_TX_DBG_ERR("%s: failed to find mhl_active state\n", __func__); rc = -ENODEV; goto dt_exit; } if (pinctrl_select_state(pinctrl, active_state)) { MHL_TX_DBG_ERR("%s: failed to select mhl active state\n", __func__); } ldo = devm_regulator_get(dev, "ldo25"); if (IS_ERR_OR_NULL(ldo)) { MHL_TX_DBG_ERR("%s: Unable to get regulator\n", __func__); rc = -ENODEV; goto dt_exit; } rc = regulator_set_voltage(ldo, 1000000, 1000000); if (rc) { MHL_TX_DBG_ERR("%s: Unable to set regulator voltage\n", __func__); goto dt_exit; } rc = regulator_enable(ldo); if (rc) { MHL_TX_DBG_ERR("%s: Regulator enable failed\n", __func__); goto dt_exit; } pm_gpio2 = of_get_named_gpio(np, "sil,pwr-gpio", 0); pmi_gpio9 = of_get_named_gpio(np, "sil,pmi9", 0); pmi_gpio10 = of_get_named_gpio(np, "sil,pmi10", 0); fw_wake = of_get_named_gpio(np, "sil,fw-wake", 0); if (gpio_is_valid(pmi_gpio9)) { rc = gpio_request(pmi_gpio9, "mhl_pmi9"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pmi_gpio9); goto dt_exit; } gpio_direction_output(pmi_gpio9, 0); gpio_set_value(pmi_gpio9, 1); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pmi_gpio9); rc = pmi_gpio9; goto dt_exit; } if (gpio_is_valid(pmi_gpio10)) { rc = gpio_request(pmi_gpio10, "mhl_pmi10"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pmi_gpio10); goto dt_exit; } gpio_direction_output(pmi_gpio10, 0); gpio_set_value(pmi_gpio10, 1); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pmi_gpio10); rc = pmi_gpio10; goto dt_exit; } if (gpio_is_valid(pm_gpio2)) { rc = gpio_request(pm_gpio2, "mhl_pm2"); if (rc) { MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n", __func__, pm_gpio2); goto dt_exit; } gpio_direction_output(pm_gpio2, 0); gpio_set_value(pm_gpio2, 0); } else { MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n", __func__, pm_gpio2); rc = pm_gpio2; goto dt_exit; } if (gpio_is_valid(fw_wake)) { rc = gpio_request(fw_wake, "mhl_fw"); if (rc) { MHL_TX_DBG_ERR("%s:wake_gpio=[%d] req failed:\n", __func__, fw_wake); return rc; } gpio_direction_output(fw_wake, 0); gpio_set_value(fw_wake, 1); platform_signals[TX_FW_WAKE].gpio_number = fw_wake; } else { MHL_TX_DBG_ERR("%s:wake_gpio=[%d] invalid\n", __func__, fw_wake); rc = fw_wake; goto dt_exit; } value = of_get_named_gpio_flags(np, "sil,reset-gpio", 0, NULL); if (value >= 0) if (value >= 0) { starter_kit_control_gpios[MHL_RESET_INDEX].gpio = value; gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 1); } value = of_get_named_gpio_flags(np, "sil,irq-gpio", 0, NULL); if (value >= 0) Loading @@ -1429,15 +1568,16 @@ static int si_8620_parse_dt(struct device *dev) i2c_adapter_num = value; MHL_TX_DBG_INFO("Resources assigned to driver...\n"); MHL_TX_DBG_ERR(" Reset GPIO = %d\n", MHL_TX_DBG_INFO(" Reset GPIO = %d\n", starter_kit_control_gpios[MHL_RESET_INDEX].gpio); MHL_TX_DBG_ERR(" Interrupt GPIO = %d\n", MHL_TX_DBG_INFO(" Interrupt GPIO = %d\n", starter_kit_control_gpios[MHL_INT_INDEX].gpio); MHL_TX_DBG_ERR(" I2C adapter = %d\n", i2c_adapter_num); MHL_TX_DBG_INFO(" I2C adapter = %d\n", i2c_adapter_num); if (use_spi) MHL_TX_DBG_ERR(" SPI adapter = %d\n", spi_bus_num); return 0; dt_exit: return rc; } #endif Loading
drivers/video/msm/mdss/mhl3/si_8620_drv.c +1 −1 Original line number Diff line number Diff line Loading @@ -6654,7 +6654,7 @@ int si_mhl_tx_chip_initialize(struct drv_hw_context *hw_context) int status = -1; hw_context->pp_16bpp_override = pp_16bpp_automatic; set_pin(TX_FW_WAKE, 0); /* inverter on board */ set_pin(TX_FW_WAKE, 1); /* inverter on board */ platform_mhl_tx_hw_reset(TX_HW_RESET_PERIOD, TX_HW_RESET_DELAY); /* Power up the device. Keep HSIC and Rx cores powered down. */ Loading