Loading drivers/video/msm/mdss/dsi_v2.c +4 −70 Original line number Diff line number Diff line /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -209,89 +209,23 @@ int dsi_ctrl_gpio_request(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int rc = 0; if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) goto gpio_request_err4; ctrl_pdata->disp_en_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->rst_gpio)) { rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) goto gpio_request_err3; ctrl_pdata->rst_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) { rc = gpio_request(ctrl_pdata->disp_te_gpio, "disp_te"); if (rc) goto gpio_request_err2; ctrl_pdata->disp_te_gpio_requested = 0; else ctrl_pdata->disp_te_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->mode_gpio)) { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) goto gpio_request_err1; ctrl_pdata->mode_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) goto gpio_request_err0; ctrl_pdata->bklt_en_gpio_requested = 1; } return rc; gpio_request_err0: if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); gpio_request_err1: if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) gpio_free(ctrl_pdata->disp_te_gpio); gpio_request_err2: if (gpio_is_valid(ctrl_pdata->rst_gpio)) gpio_free(ctrl_pdata->rst_gpio); gpio_request_err3: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); gpio_request_err4: ctrl_pdata->disp_en_gpio_requested = 0; ctrl_pdata->rst_gpio_requested = 0; ctrl_pdata->disp_te_gpio_requested = 0; ctrl_pdata->mode_gpio_requested = 0; return rc; } void dsi_ctrl_gpio_free(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { if (ctrl_pdata->disp_en_gpio_requested) { gpio_free(ctrl_pdata->disp_en_gpio); ctrl_pdata->disp_en_gpio_requested = 0; } if (ctrl_pdata->rst_gpio_requested) { gpio_free(ctrl_pdata->rst_gpio); ctrl_pdata->rst_gpio_requested = 0; } if (ctrl_pdata->disp_te_gpio_requested) { gpio_free(ctrl_pdata->disp_te_gpio); ctrl_pdata->disp_te_gpio_requested = 0; } if (ctrl_pdata->mode_gpio_requested) { gpio_free(ctrl_pdata->mode_gpio); ctrl_pdata->mode_gpio_requested = 0; } if (ctrl_pdata->bklt_en_gpio_requested) { gpio_free(ctrl_pdata->bklt_en_gpio); ctrl_pdata->bklt_en_gpio_requested = 0; } } static int dsi_parse_vreg(struct device *dev, struct dss_module_power *mp) Loading drivers/video/msm/mdss/mdss_dsi.c +45 −67 Original line number Diff line number Diff line Loading @@ -74,13 +74,26 @@ static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata, int enable) goto error; } if (pdata->panel_info.panel_power_on == 0) mdss_dsi_panel_reset(pdata, 1); if (pdata->panel_info.panel_power_on == 0) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); if (msm_dss_enable_vreg( ctrl_pdata->power_data.vreg_config, ctrl_pdata->power_data.num_vreg, 0)) pr_err("Disable vregs failed\n"); goto error; } } } else { mdss_dsi_panel_reset(pdata, 0); ret = mdss_dsi_panel_reset(pdata, 0); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); goto error; } ret = msm_dss_enable_vreg( ctrl_pdata->power_data.vreg_config, ctrl_pdata->power_data.num_vreg, 0); Loading Loading @@ -374,20 +387,29 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) return ret; } pdata->panel_info.panel_power_on = 1; if (!pdata->panel_info.mipi.lp11_init) mdss_dsi_panel_reset(pdata, 1); if (!pdata->panel_info.mipi.lp11_init) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } } ret = mdss_dsi_enable_bus_clocks(ctrl_pdata); if (ret) { pr_err("%s: failed to enable bus clocks. rc=%d\n", __func__, ret); mdss_dsi_panel_power_on(pdata, 0); ret = mdss_dsi_panel_power_on(pdata, 0); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } pdata->panel_info.panel_power_on = 0; return ret; } pdata->panel_info.panel_power_on = 1; mdss_dsi_phy_sw_reset((ctrl_pdata->ctrl_base)); mdss_dsi_phy_init(pdata); mdss_dsi_disable_bus_clocks(ctrl_pdata); Loading Loading @@ -469,9 +491,14 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) * Issue hardware reset line after enabling the DSI clocks and data * data lanes for LP11 init */ if (pdata->panel_info.mipi.lp11_init) mdss_dsi_panel_reset(pdata, 1); if (pdata->panel_info.mipi.lp11_init) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } } if (pdata->panel_info.mipi.init_delay) usleep(pdata->panel_info.mipi.init_delay); Loading Loading @@ -1214,32 +1241,14 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-enable-gpio", 0); if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) { if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) pr_err("%s:%d, Disp_en gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-bklight-en-gpio", 0); if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) pr_info("%s: bklt_en gpio not specified\n", __func__); } else { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->bklt_en_gpio); gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } if (pinfo->type == MIPI_CMD_PANEL) { ctrl_pdata->disp_te_gpio = of_get_named_gpio Loading @@ -1255,7 +1264,6 @@ int dsi_panel_device_register(struct device_node *pan_node, if (rc) { pr_err("request TE gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } rc = gpio_tlmm_config(GPIO_CFG( Loading Loading @@ -1285,44 +1293,18 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-reset-gpio", 0); if (!gpio_is_valid(ctrl_pdata->rst_gpio)) { if (!gpio_is_valid(ctrl_pdata->rst_gpio)) pr_err("%s:%d, reset gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } if (pinfo->mode_gpio_state != MODE_GPIO_NOT_VALID) { ctrl_pdata->mode_gpio = of_get_named_gpio( ctrl_pdev->dev.of_node, "qcom,platform-mode-gpio", 0); if (!gpio_is_valid(ctrl_pdata->mode_gpio)) { if (!gpio_is_valid(ctrl_pdata->mode_gpio)) pr_info("%s:%d, mode gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) { pr_err("request panel mode gpio failed,rc=%d\n", rc); gpio_free(ctrl_pdata->mode_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); if (gpio_is_valid(ctrl_pdata->rst_gpio)) gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } } } if (mdss_dsi_clk_init(ctrl_pdev, ctrl_pdata)) { Loading Loading @@ -1373,10 +1355,6 @@ int dsi_panel_device_register(struct device_node *pan_node, rc = mdss_register_panel(ctrl_pdev, &(ctrl_pdata->panel_data)); if (rc) { pr_err("%s: unable to register MIPI DSI panel\n", __func__); if (ctrl_pdata->rst_gpio) gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return rc; } Loading drivers/video/msm/mdss/mdss_dsi.h +1 −1 Original line number Diff line number Diff line Loading @@ -323,7 +323,7 @@ int mdss_dsi_clk_init(struct platform_device *pdev, void mdss_dsi_clk_deinit(struct mdss_dsi_ctrl_pdata *ctrl_pdata); int mdss_dsi_enable_bus_clocks(struct mdss_dsi_ctrl_pdata *ctrl_pdata); void mdss_dsi_disable_bus_clocks(struct mdss_dsi_ctrl_pdata *ctrl_pdata); void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); void mdss_dsi_phy_disable(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_phy_init(struct mdss_panel_data *pdata); void mdss_dsi_phy_sw_reset(unsigned char *ctrl_base); Loading drivers/video/msm/mdss/mdss_dsi_panel.c +75 −8 Original line number Diff line number Diff line Loading @@ -153,15 +153,66 @@ static void mdss_dsi_panel_bklt_dcs(struct mdss_dsi_ctrl_pdata *ctrl, int level) mdss_dsi_cmdlist_put(ctrl, &cmdreq); } void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int rc = 0; if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) { pr_err("request disp_en gpio failed, rc=%d\n", rc); goto disp_en_gpio_err; } } rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); goto rst_gpio_err; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto bklt_en_gpio_err; } } if (gpio_is_valid(ctrl_pdata->mode_gpio)) { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) { pr_err("request panel mode gpio failed,rc=%d\n", rc); goto mode_gpio_err; } } return rc; mode_gpio_err: if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); bklt_en_gpio_err: gpio_free(ctrl_pdata->rst_gpio); rst_gpio_err: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); disp_en_gpio_err: return rc; } int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int i; static bool gpio_request_done; int i, rc = 0; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); return; return -EINVAL; } ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, Loading @@ -175,12 +226,21 @@ void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) if (!gpio_is_valid(ctrl_pdata->rst_gpio)) { pr_debug("%s:%d, reset line not configured\n", __func__, __LINE__); return; return rc; } pr_debug("%s: enable = %d\n", __func__, enable); pinfo = &(ctrl_pdata->panel_data.panel_info); if (!gpio_request_done && enable) { rc = mdss_dsi_request_gpios(ctrl_pdata); if (rc) { pr_err("gpio request failed\n"); return rc; } gpio_request_done = true; } if (enable) { if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_set_value((ctrl_pdata->disp_en_gpio), 1); Loading Loading @@ -208,14 +268,21 @@ void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) pr_debug("%s: Reset panel done\n", __func__); } } else { if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { gpio_set_value((ctrl_pdata->bklt_en_gpio), 0); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); } if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); } gpio_set_value((ctrl_pdata->rst_gpio), 0); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); gpio_request_done = false; } return rc; } static char caset[] = {0x2a, 0x00, 0x00, 0x03, 0x00}; /* DTYPE_DCS_LWRITE */ Loading Loading
drivers/video/msm/mdss/dsi_v2.c +4 −70 Original line number Diff line number Diff line /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -209,89 +209,23 @@ int dsi_ctrl_gpio_request(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int rc = 0; if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) goto gpio_request_err4; ctrl_pdata->disp_en_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->rst_gpio)) { rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) goto gpio_request_err3; ctrl_pdata->rst_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) { rc = gpio_request(ctrl_pdata->disp_te_gpio, "disp_te"); if (rc) goto gpio_request_err2; ctrl_pdata->disp_te_gpio_requested = 0; else ctrl_pdata->disp_te_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->mode_gpio)) { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) goto gpio_request_err1; ctrl_pdata->mode_gpio_requested = 1; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) goto gpio_request_err0; ctrl_pdata->bklt_en_gpio_requested = 1; } return rc; gpio_request_err0: if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); gpio_request_err1: if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) gpio_free(ctrl_pdata->disp_te_gpio); gpio_request_err2: if (gpio_is_valid(ctrl_pdata->rst_gpio)) gpio_free(ctrl_pdata->rst_gpio); gpio_request_err3: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); gpio_request_err4: ctrl_pdata->disp_en_gpio_requested = 0; ctrl_pdata->rst_gpio_requested = 0; ctrl_pdata->disp_te_gpio_requested = 0; ctrl_pdata->mode_gpio_requested = 0; return rc; } void dsi_ctrl_gpio_free(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { if (ctrl_pdata->disp_en_gpio_requested) { gpio_free(ctrl_pdata->disp_en_gpio); ctrl_pdata->disp_en_gpio_requested = 0; } if (ctrl_pdata->rst_gpio_requested) { gpio_free(ctrl_pdata->rst_gpio); ctrl_pdata->rst_gpio_requested = 0; } if (ctrl_pdata->disp_te_gpio_requested) { gpio_free(ctrl_pdata->disp_te_gpio); ctrl_pdata->disp_te_gpio_requested = 0; } if (ctrl_pdata->mode_gpio_requested) { gpio_free(ctrl_pdata->mode_gpio); ctrl_pdata->mode_gpio_requested = 0; } if (ctrl_pdata->bklt_en_gpio_requested) { gpio_free(ctrl_pdata->bklt_en_gpio); ctrl_pdata->bklt_en_gpio_requested = 0; } } static int dsi_parse_vreg(struct device *dev, struct dss_module_power *mp) Loading
drivers/video/msm/mdss/mdss_dsi.c +45 −67 Original line number Diff line number Diff line Loading @@ -74,13 +74,26 @@ static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata, int enable) goto error; } if (pdata->panel_info.panel_power_on == 0) mdss_dsi_panel_reset(pdata, 1); if (pdata->panel_info.panel_power_on == 0) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); if (msm_dss_enable_vreg( ctrl_pdata->power_data.vreg_config, ctrl_pdata->power_data.num_vreg, 0)) pr_err("Disable vregs failed\n"); goto error; } } } else { mdss_dsi_panel_reset(pdata, 0); ret = mdss_dsi_panel_reset(pdata, 0); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); goto error; } ret = msm_dss_enable_vreg( ctrl_pdata->power_data.vreg_config, ctrl_pdata->power_data.num_vreg, 0); Loading Loading @@ -374,20 +387,29 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) return ret; } pdata->panel_info.panel_power_on = 1; if (!pdata->panel_info.mipi.lp11_init) mdss_dsi_panel_reset(pdata, 1); if (!pdata->panel_info.mipi.lp11_init) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } } ret = mdss_dsi_enable_bus_clocks(ctrl_pdata); if (ret) { pr_err("%s: failed to enable bus clocks. rc=%d\n", __func__, ret); mdss_dsi_panel_power_on(pdata, 0); ret = mdss_dsi_panel_power_on(pdata, 0); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } pdata->panel_info.panel_power_on = 0; return ret; } pdata->panel_info.panel_power_on = 1; mdss_dsi_phy_sw_reset((ctrl_pdata->ctrl_base)); mdss_dsi_phy_init(pdata); mdss_dsi_disable_bus_clocks(ctrl_pdata); Loading Loading @@ -469,9 +491,14 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) * Issue hardware reset line after enabling the DSI clocks and data * data lanes for LP11 init */ if (pdata->panel_info.mipi.lp11_init) mdss_dsi_panel_reset(pdata, 1); if (pdata->panel_info.mipi.lp11_init) { ret = mdss_dsi_panel_reset(pdata, 1); if (ret) { pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); return ret; } } if (pdata->panel_info.mipi.init_delay) usleep(pdata->panel_info.mipi.init_delay); Loading Loading @@ -1214,32 +1241,14 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-enable-gpio", 0); if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) { if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) pr_err("%s:%d, Disp_en gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-bklight-en-gpio", 0); if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio)) pr_info("%s: bklt_en gpio not specified\n", __func__); } else { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->bklt_en_gpio); gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } if (pinfo->type == MIPI_CMD_PANEL) { ctrl_pdata->disp_te_gpio = of_get_named_gpio Loading @@ -1255,7 +1264,6 @@ int dsi_panel_device_register(struct device_node *pan_node, if (rc) { pr_err("request TE gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } rc = gpio_tlmm_config(GPIO_CFG( Loading Loading @@ -1285,44 +1293,18 @@ int dsi_panel_device_register(struct device_node *pan_node, ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node, "qcom,platform-reset-gpio", 0); if (!gpio_is_valid(ctrl_pdata->rst_gpio)) { if (!gpio_is_valid(ctrl_pdata->rst_gpio)) pr_err("%s:%d, reset gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } if (pinfo->mode_gpio_state != MODE_GPIO_NOT_VALID) { ctrl_pdata->mode_gpio = of_get_named_gpio( ctrl_pdev->dev.of_node, "qcom,platform-mode-gpio", 0); if (!gpio_is_valid(ctrl_pdata->mode_gpio)) { if (!gpio_is_valid(ctrl_pdata->mode_gpio)) pr_info("%s:%d, mode gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) { pr_err("request panel mode gpio failed,rc=%d\n", rc); gpio_free(ctrl_pdata->mode_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); if (gpio_is_valid(ctrl_pdata->rst_gpio)) gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_te_gpio)) gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } } } if (mdss_dsi_clk_init(ctrl_pdev, ctrl_pdata)) { Loading Loading @@ -1373,10 +1355,6 @@ int dsi_panel_device_register(struct device_node *pan_node, rc = mdss_register_panel(ctrl_pdev, &(ctrl_pdata->panel_data)); if (rc) { pr_err("%s: unable to register MIPI DSI panel\n", __func__); if (ctrl_pdata->rst_gpio) gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return rc; } Loading
drivers/video/msm/mdss/mdss_dsi.h +1 −1 Original line number Diff line number Diff line Loading @@ -323,7 +323,7 @@ int mdss_dsi_clk_init(struct platform_device *pdev, void mdss_dsi_clk_deinit(struct mdss_dsi_ctrl_pdata *ctrl_pdata); int mdss_dsi_enable_bus_clocks(struct mdss_dsi_ctrl_pdata *ctrl_pdata); void mdss_dsi_disable_bus_clocks(struct mdss_dsi_ctrl_pdata *ctrl_pdata); void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); void mdss_dsi_phy_disable(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_phy_init(struct mdss_panel_data *pdata); void mdss_dsi_phy_sw_reset(unsigned char *ctrl_base); Loading
drivers/video/msm/mdss/mdss_dsi_panel.c +75 −8 Original line number Diff line number Diff line Loading @@ -153,15 +153,66 @@ static void mdss_dsi_panel_bklt_dcs(struct mdss_dsi_ctrl_pdata *ctrl, int level) mdss_dsi_cmdlist_put(ctrl, &cmdreq); } void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int rc = 0; if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) { pr_err("request disp_en gpio failed, rc=%d\n", rc); goto disp_en_gpio_err; } } rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); goto rst_gpio_err; } if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { rc = gpio_request(ctrl_pdata->bklt_en_gpio, "bklt_enable"); if (rc) { pr_err("request bklt gpio failed, rc=%d\n", rc); goto bklt_en_gpio_err; } } if (gpio_is_valid(ctrl_pdata->mode_gpio)) { rc = gpio_request(ctrl_pdata->mode_gpio, "panel_mode"); if (rc) { pr_err("request panel mode gpio failed,rc=%d\n", rc); goto mode_gpio_err; } } return rc; mode_gpio_err: if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); bklt_en_gpio_err: gpio_free(ctrl_pdata->rst_gpio); rst_gpio_err: if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); disp_en_gpio_err: return rc; } int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int i; static bool gpio_request_done; int i, rc = 0; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); return; return -EINVAL; } ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, Loading @@ -175,12 +226,21 @@ void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) if (!gpio_is_valid(ctrl_pdata->rst_gpio)) { pr_debug("%s:%d, reset line not configured\n", __func__, __LINE__); return; return rc; } pr_debug("%s: enable = %d\n", __func__, enable); pinfo = &(ctrl_pdata->panel_data.panel_info); if (!gpio_request_done && enable) { rc = mdss_dsi_request_gpios(ctrl_pdata); if (rc) { pr_err("gpio request failed\n"); return rc; } gpio_request_done = true; } if (enable) { if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_set_value((ctrl_pdata->disp_en_gpio), 1); Loading Loading @@ -208,14 +268,21 @@ void mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) pr_debug("%s: Reset panel done\n", __func__); } } else { if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) { gpio_set_value((ctrl_pdata->bklt_en_gpio), 0); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->bklt_en_gpio); } if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) { gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); } gpio_set_value((ctrl_pdata->rst_gpio), 0); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); gpio_request_done = false; } return rc; } static char caset[] = {0x2a, 0x00, 0x00, 0x03, 0x00}; /* DTYPE_DCS_LWRITE */ Loading