Loading drivers/video/msm/mdss/mdss_qpic.c +8 −4 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include "mdss_fb.h" #include "mdss_qpic.h" #include "mdss_qpic_panel.h" static int mdss_qpic_probe(struct platform_device *pdev); static int mdss_qpic_remove(struct platform_device *pdev); Loading Loading @@ -68,18 +69,19 @@ static struct platform_driver mdss_qpic_driver = { int qpic_on(struct msm_fb_data_type *mfd) { int ret; ret = mdss_qpic_panel_on(qpic_res->panel_data); ret = mdss_qpic_panel_on(qpic_res->panel_data, &qpic_res->panel_io); return ret; } int qpic_off(struct msm_fb_data_type *mfd) { int ret; ret = mdss_qpic_panel_off(qpic_res->panel_data); ret = mdss_qpic_panel_off(qpic_res->panel_data, &qpic_res->panel_io); return ret; } static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd) static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd, struct mdp_overlay *req, int image_len, int *pipe_ndx) { struct fb_info *fbi; Loading @@ -104,7 +106,7 @@ static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd) } fb_offset = (u32)fbi->fix.smem_start + offset; mdss_qpic_panel_on(qpic_res->panel_data); mdss_qpic_panel_on(qpic_res->panel_data, &qpic_res->panel_io); size = fbi->var.xres * fbi->var.yres * bpp; qpic_send_frame(0, 0, fbi->var.xres, fbi->var.yres, Loading Loading @@ -594,6 +596,8 @@ static int mdss_qpic_probe(struct platform_device *pdev) qpic_res->irq = res->start; qpic_res->res_init = true; mdss_qpic_panel_io_init(pdev, &qpic_res->panel_io); rc = mdss_fb_register_mdp_instance(&qpic_interface); if (rc) pr_err("unable to register QPIC instance\n"); Loading drivers/video/msm/mdss/mdss_qpic.h +6 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/msm-sps.h> #include "mdss_panel.h" #include "mdss_qpic_panel.h" #define QPIC_REG_QPIC_LCDC_CTRL 0x22000 #define QPIC_REG_LCDC_VERSION 0x22004 Loading Loading @@ -50,10 +51,11 @@ int mdss_qpic_init(void); int qpic_flush_buffer(u32 cmd, u32 len, u32 *param, u32 is_cmd); u32 msm_qpic_get_bam_hdl(struct sps_bam_props *bam); int mdss_qpic_panel_on(struct mdss_panel_data *pdata); int mdss_qpic_panel_off(struct mdss_panel_data *pdata); int mdss_qpic_panel_on(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io); int mdss_qpic_panel_off(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io); int qpic_register_panel(struct mdss_panel_data *pdata); int ili9341_on(void); /* Structure that defines an SPS end point for a BAM pipe. */ struct qpic_sps_endpt { Loading @@ -80,6 +82,7 @@ struct qpic_data_type { u32 sps_init; u32 irq_requested; struct mdss_panel_data *panel_data; struct qpic_panel_io_desc panel_io; }; u32 qpic_send_frame( Loading drivers/video/msm/mdss/mdss_qpic_panel.c +64 −13 Original line number Diff line number Diff line Loading @@ -32,10 +32,9 @@ static u32 panel_is_on; static u32 panel_refresh_rate; static int (*qpic_panel_on)(void); static void (*qpic_panel_off)(void); static int (*qpic_panel_init)(struct platform_device *pdev, struct device_node *np); static int (*qpic_panel_on)(struct qpic_panel_io_desc *qpic_panel_io); static void (*qpic_panel_off)(struct qpic_panel_io_desc *qpic_panel_io); u32 qpic_panel_get_framerate(void) { Loading Loading @@ -135,7 +134,8 @@ u32 qpic_send_frame(u32 x_start, return 0; } int mdss_qpic_panel_on(struct mdss_panel_data *pdata) int mdss_qpic_panel_on(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io) { int rc = 0; Loading @@ -144,21 +144,77 @@ int mdss_qpic_panel_on(struct mdss_panel_data *pdata) mdss_qpic_init(); if (qpic_panel_on) rc = qpic_panel_on(); rc = qpic_panel_on(panel_io); if (rc) return rc; panel_is_on = true; return 0; } int mdss_qpic_panel_off(struct mdss_panel_data *pdata) int mdss_qpic_panel_off(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io) { if (qpic_panel_off) qpic_panel_off(); qpic_panel_off(panel_io); panel_is_on = false; return 0; } int mdss_qpic_panel_io_init(struct platform_device *pdev, struct qpic_panel_io_desc *qpic_panel_io) { struct device_node *np = pdev->dev.of_node; int rst_gpio, cs_gpio, te_gpio, ad8_gpio, bl_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; rst_gpio = of_get_named_gpio(np, "qcom,rst-gpio", 0); cs_gpio = of_get_named_gpio(np, "qcom,cs-gpio", 0); ad8_gpio = of_get_named_gpio(np, "qcom,ad8-gpio", 0); te_gpio = of_get_named_gpio(np, "qcom,te-gpio", 0); bl_gpio = of_get_named_gpio(np, "qcom,bl-gpio", 0); if (!gpio_is_valid(rst_gpio)) pr_err("%s: reset gpio not specified\n" , __func__); else qpic_panel_io->rst_gpio = rst_gpio; if (!gpio_is_valid(cs_gpio)) pr_err("%s: cs gpio not specified\n", __func__); else qpic_panel_io->cs_gpio = cs_gpio; if (!gpio_is_valid(ad8_gpio)) pr_err("%s: ad8 gpio not specified\n", __func__); else qpic_panel_io->ad8_gpio = ad8_gpio; if (!gpio_is_valid(te_gpio)) pr_err("%s: te gpio not specified\n", __func__); else qpic_panel_io->te_gpio = te_gpio; if (!gpio_is_valid(bl_gpio)) pr_err("%s: te gpio not specified\n", __func__); else qpic_panel_io->bl_gpio = bl_gpio; vdd_vreg = devm_regulator_get(&pdev->dev, "vdd"); if (IS_ERR(vdd_vreg)) pr_err("%s could not get vdd,", __func__); else qpic_panel_io->vdd_vreg = vdd_vreg; avdd_vreg = devm_regulator_get(&pdev->dev, "avdd"); if (IS_ERR(avdd_vreg)) pr_err("%s could not get avdd,", __func__); else qpic_panel_io->avdd_vreg = avdd_vreg; return 0; } static int mdss_panel_parse_dt(struct platform_device *pdev, struct mdss_panel_data *panel_data) { Loading Loading @@ -186,9 +242,6 @@ static int mdss_panel_parse_dt(struct platform_device *pdev, panel_data->panel_info.type = EBI2_PANEL; panel_data->panel_info.pdest = DISPLAY_1; if (qpic_panel_init) rc = qpic_panel_init(pdev, np); return rc; } Loading @@ -210,14 +263,12 @@ static int mdss_qpic_panel_probe(struct platform_device *pdev) pr_info("%s: Panel Name = %s\n", __func__, panel_name); /* select panel according to label */ qpic_panel_init = ili9341_init; qpic_panel_on = ili9341_on; qpic_panel_off = ili9341_off; rc = mdss_panel_parse_dt(pdev, &vendor_pdata); if (rc) return rc; rc = qpic_register_panel(&vendor_pdata); if (rc) return rc; Loading drivers/video/msm/mdss/mdss_qpic_panel.h +16 −4 Original line number Diff line number Diff line Loading @@ -105,10 +105,22 @@ enum { OP_WRITE_MEMORY_START = OP_SIZE_PAIR(0x2C, INV_SIZE), }; struct qpic_panel_io_desc { int rst_gpio; int cs_gpio; int ad8_gpio; int te_gpio; int bl_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; u32 init; }; int mdss_qpic_panel_io_init(struct platform_device *pdev, struct qpic_panel_io_desc *qpic_panel_io); u32 qpic_panel_set_cmd_only(u32 command); u32 qpic_send_panel_cmd(u32 cmd, u32 *val, u32 length); int ili9341_on(void); void ili9341_off(void); int ili9341_init(struct platform_device *pdev, struct device_node *np); int ili9341_on(struct qpic_panel_io_desc *qpic_panel_io); void ili9341_off(struct qpic_panel_io_desc *qpic_panel_io); #endif /* MDSS_QPIC_PANEL_H */ drivers/video/msm/mdss/qpic_panel_ili_qvga.c +78 −89 Original line number Diff line number Diff line /* Copyright (c) 2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2013 - 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 @@ -56,117 +56,111 @@ enum { OP_ILI9341_READ_DISPLAY_MADCTL = OP_SIZE_PAIR(0x0b, 2), }; static int rst_gpio; static int cs_gpio; static int ad8_gpio; static int te_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; int ili9341_init(struct platform_device *pdev, struct device_node *np) static int ili9341_init(struct qpic_panel_io_desc *panel_io) { int rc = 0; rst_gpio = of_get_named_gpio(np, "qcom,rst-gpio", 0); cs_gpio = of_get_named_gpio(np, "qcom,cs-gpio", 0); ad8_gpio = of_get_named_gpio(np, "qcom,ad8-gpio", 0); te_gpio = of_get_named_gpio(np, "qcom,te-gpio", 0); if (!gpio_is_valid(rst_gpio)) { pr_err("%s: reset gpio not specified\n" , __func__); return -EINVAL; } if (!gpio_is_valid(cs_gpio)) { pr_err("%s: cs gpio not specified\n", __func__); return -EINVAL; } if (!gpio_is_valid(ad8_gpio)) { pr_err("%s: ad8 gpio not specified\n", __func__); return -EINVAL; } if (!gpio_is_valid(te_gpio)) { pr_err("%s: te gpio not specified\n", __func__); return -EINVAL; } vdd_vreg = devm_regulator_get(&pdev->dev, "vdd"); if (IS_ERR(vdd_vreg)) { pr_err("%s could not get vdd,", __func__); return -ENODEV; } avdd_vreg = devm_regulator_get(&pdev->dev, "avdd"); if (IS_ERR(avdd_vreg)) { pr_err("%s could not get avdd,", __func__); return -ENODEV; } rc = regulator_set_voltage(vdd_vreg, 1800000, 1800000); int rc; if (panel_io->vdd_vreg) { rc = regulator_set_voltage(panel_io->vdd_vreg, 1800000, 1800000); if (rc) { pr_err("vdd_vreg->set_voltage failed, rc=%d\n", rc); return -EINVAL; } rc = regulator_set_voltage(avdd_vreg, 2700000, 2700000); } if (panel_io->avdd_vreg) { rc = regulator_set_voltage(panel_io->avdd_vreg, 2700000, 2700000); if (rc) { pr_err("vdd_vreg->set_voltage failed, rc=%d\n", rc); return -EINVAL; } } return 0; } static int ili9341_panel_power_on(void) void ili9341_off(struct qpic_panel_io_desc *qpic_panel_io) { if (qpic_panel_io->ad8_gpio) gpio_free(qpic_panel_io->ad8_gpio); if (qpic_panel_io->cs_gpio) gpio_free(qpic_panel_io->cs_gpio); if (qpic_panel_io->rst_gpio) gpio_free(qpic_panel_io->rst_gpio); if (qpic_panel_io->te_gpio) gpio_free(qpic_panel_io->te_gpio); if (qpic_panel_io->bl_gpio) gpio_free(qpic_panel_io->bl_gpio); if (qpic_panel_io->vdd_vreg) regulator_disable(qpic_panel_io->vdd_vreg); if (qpic_panel_io->avdd_vreg) regulator_disable(qpic_panel_io->avdd_vreg); } static int ili9341_panel_power_on(struct qpic_panel_io_desc *qpic_panel_io) { int rc; rc = regulator_enable(vdd_vreg); if (qpic_panel_io->vdd_vreg) { rc = regulator_enable(qpic_panel_io->vdd_vreg); if (rc) { pr_err("enable vdd failed, rc=%d\n", rc); return -ENODEV; } rc = regulator_enable(avdd_vreg); } if (qpic_panel_io->avdd_vreg) { rc = regulator_enable(qpic_panel_io->avdd_vreg); if (rc) { pr_err("enable avdd failed, rc=%d\n", rc); return -ENODEV; goto power_on_error; } } if (gpio_request(rst_gpio, "disp_rst_n")) { if ((qpic_panel_io->rst_gpio) && (gpio_request(qpic_panel_io->rst_gpio, "disp_rst_n"))) { pr_err("%s request reset gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(cs_gpio, "disp_cs_n")) { gpio_free(rst_gpio); if ((qpic_panel_io->cs_gpio) && (gpio_request(qpic_panel_io->cs_gpio, "disp_cs_n"))) { pr_err("%s request cs gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(ad8_gpio, "disp_ad8_n")) { gpio_free(cs_gpio); gpio_free(rst_gpio); if ((qpic_panel_io->ad8_gpio) && (gpio_request(qpic_panel_io->ad8_gpio, "disp_ad8_n"))) { pr_err("%s request ad8 gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(te_gpio, "disp_te_n")) { gpio_free(ad8_gpio); gpio_free(cs_gpio); gpio_free(rst_gpio); if ((qpic_panel_io->te_gpio) && (gpio_request(qpic_panel_io->te_gpio, "disp_te_n"))) { pr_err("%s request te gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if ((qpic_panel_io->bl_gpio) && (gpio_request(qpic_panel_io->bl_gpio, "disp_bl_n"))) { pr_err("%s request bl gpio failed\n", __func__); goto power_on_error; } /* wait for 20 ms after enable gpio as suggested by hw */ msleep(20); return 0; power_on_error: ili9341_off(qpic_panel_io); return -EINVAL; } static void ili9341_panel_power_off(void) { gpio_free(ad8_gpio); gpio_free(cs_gpio); gpio_free(rst_gpio); gpio_free(te_gpio); regulator_disable(vdd_vreg); regulator_disable(avdd_vreg); } int ili9341_on(void) int ili9341_on(struct qpic_panel_io_desc *qpic_panel_io) { u32 param[20]; int ret; ret = ili9341_panel_power_on(); if (!qpic_panel_io->init) { ili9341_init(qpic_panel_io); qpic_panel_io->init = true; } ret = ili9341_panel_power_on(qpic_panel_io); if (ret) return ret; qpic_panel_set_cmd_only(OP_SOFT_RESET); Loading Loading @@ -217,8 +211,3 @@ int ili9341_on(void) return 0; } void ili9341_off(void) { ili9341_panel_power_off(); } Loading
drivers/video/msm/mdss/mdss_qpic.c +8 −4 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include "mdss_fb.h" #include "mdss_qpic.h" #include "mdss_qpic_panel.h" static int mdss_qpic_probe(struct platform_device *pdev); static int mdss_qpic_remove(struct platform_device *pdev); Loading Loading @@ -68,18 +69,19 @@ static struct platform_driver mdss_qpic_driver = { int qpic_on(struct msm_fb_data_type *mfd) { int ret; ret = mdss_qpic_panel_on(qpic_res->panel_data); ret = mdss_qpic_panel_on(qpic_res->panel_data, &qpic_res->panel_io); return ret; } int qpic_off(struct msm_fb_data_type *mfd) { int ret; ret = mdss_qpic_panel_off(qpic_res->panel_data); ret = mdss_qpic_panel_off(qpic_res->panel_data, &qpic_res->panel_io); return ret; } static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd) static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd, struct mdp_overlay *req, int image_len, int *pipe_ndx) { struct fb_info *fbi; Loading @@ -104,7 +106,7 @@ static void mdss_qpic_pan_display(struct msm_fb_data_type *mfd) } fb_offset = (u32)fbi->fix.smem_start + offset; mdss_qpic_panel_on(qpic_res->panel_data); mdss_qpic_panel_on(qpic_res->panel_data, &qpic_res->panel_io); size = fbi->var.xres * fbi->var.yres * bpp; qpic_send_frame(0, 0, fbi->var.xres, fbi->var.yres, Loading Loading @@ -594,6 +596,8 @@ static int mdss_qpic_probe(struct platform_device *pdev) qpic_res->irq = res->start; qpic_res->res_init = true; mdss_qpic_panel_io_init(pdev, &qpic_res->panel_io); rc = mdss_fb_register_mdp_instance(&qpic_interface); if (rc) pr_err("unable to register QPIC instance\n"); Loading
drivers/video/msm/mdss/mdss_qpic.h +6 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/msm-sps.h> #include "mdss_panel.h" #include "mdss_qpic_panel.h" #define QPIC_REG_QPIC_LCDC_CTRL 0x22000 #define QPIC_REG_LCDC_VERSION 0x22004 Loading Loading @@ -50,10 +51,11 @@ int mdss_qpic_init(void); int qpic_flush_buffer(u32 cmd, u32 len, u32 *param, u32 is_cmd); u32 msm_qpic_get_bam_hdl(struct sps_bam_props *bam); int mdss_qpic_panel_on(struct mdss_panel_data *pdata); int mdss_qpic_panel_off(struct mdss_panel_data *pdata); int mdss_qpic_panel_on(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io); int mdss_qpic_panel_off(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io); int qpic_register_panel(struct mdss_panel_data *pdata); int ili9341_on(void); /* Structure that defines an SPS end point for a BAM pipe. */ struct qpic_sps_endpt { Loading @@ -80,6 +82,7 @@ struct qpic_data_type { u32 sps_init; u32 irq_requested; struct mdss_panel_data *panel_data; struct qpic_panel_io_desc panel_io; }; u32 qpic_send_frame( Loading
drivers/video/msm/mdss/mdss_qpic_panel.c +64 −13 Original line number Diff line number Diff line Loading @@ -32,10 +32,9 @@ static u32 panel_is_on; static u32 panel_refresh_rate; static int (*qpic_panel_on)(void); static void (*qpic_panel_off)(void); static int (*qpic_panel_init)(struct platform_device *pdev, struct device_node *np); static int (*qpic_panel_on)(struct qpic_panel_io_desc *qpic_panel_io); static void (*qpic_panel_off)(struct qpic_panel_io_desc *qpic_panel_io); u32 qpic_panel_get_framerate(void) { Loading Loading @@ -135,7 +134,8 @@ u32 qpic_send_frame(u32 x_start, return 0; } int mdss_qpic_panel_on(struct mdss_panel_data *pdata) int mdss_qpic_panel_on(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io) { int rc = 0; Loading @@ -144,21 +144,77 @@ int mdss_qpic_panel_on(struct mdss_panel_data *pdata) mdss_qpic_init(); if (qpic_panel_on) rc = qpic_panel_on(); rc = qpic_panel_on(panel_io); if (rc) return rc; panel_is_on = true; return 0; } int mdss_qpic_panel_off(struct mdss_panel_data *pdata) int mdss_qpic_panel_off(struct mdss_panel_data *pdata, struct qpic_panel_io_desc *panel_io) { if (qpic_panel_off) qpic_panel_off(); qpic_panel_off(panel_io); panel_is_on = false; return 0; } int mdss_qpic_panel_io_init(struct platform_device *pdev, struct qpic_panel_io_desc *qpic_panel_io) { struct device_node *np = pdev->dev.of_node; int rst_gpio, cs_gpio, te_gpio, ad8_gpio, bl_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; rst_gpio = of_get_named_gpio(np, "qcom,rst-gpio", 0); cs_gpio = of_get_named_gpio(np, "qcom,cs-gpio", 0); ad8_gpio = of_get_named_gpio(np, "qcom,ad8-gpio", 0); te_gpio = of_get_named_gpio(np, "qcom,te-gpio", 0); bl_gpio = of_get_named_gpio(np, "qcom,bl-gpio", 0); if (!gpio_is_valid(rst_gpio)) pr_err("%s: reset gpio not specified\n" , __func__); else qpic_panel_io->rst_gpio = rst_gpio; if (!gpio_is_valid(cs_gpio)) pr_err("%s: cs gpio not specified\n", __func__); else qpic_panel_io->cs_gpio = cs_gpio; if (!gpio_is_valid(ad8_gpio)) pr_err("%s: ad8 gpio not specified\n", __func__); else qpic_panel_io->ad8_gpio = ad8_gpio; if (!gpio_is_valid(te_gpio)) pr_err("%s: te gpio not specified\n", __func__); else qpic_panel_io->te_gpio = te_gpio; if (!gpio_is_valid(bl_gpio)) pr_err("%s: te gpio not specified\n", __func__); else qpic_panel_io->bl_gpio = bl_gpio; vdd_vreg = devm_regulator_get(&pdev->dev, "vdd"); if (IS_ERR(vdd_vreg)) pr_err("%s could not get vdd,", __func__); else qpic_panel_io->vdd_vreg = vdd_vreg; avdd_vreg = devm_regulator_get(&pdev->dev, "avdd"); if (IS_ERR(avdd_vreg)) pr_err("%s could not get avdd,", __func__); else qpic_panel_io->avdd_vreg = avdd_vreg; return 0; } static int mdss_panel_parse_dt(struct platform_device *pdev, struct mdss_panel_data *panel_data) { Loading Loading @@ -186,9 +242,6 @@ static int mdss_panel_parse_dt(struct platform_device *pdev, panel_data->panel_info.type = EBI2_PANEL; panel_data->panel_info.pdest = DISPLAY_1; if (qpic_panel_init) rc = qpic_panel_init(pdev, np); return rc; } Loading @@ -210,14 +263,12 @@ static int mdss_qpic_panel_probe(struct platform_device *pdev) pr_info("%s: Panel Name = %s\n", __func__, panel_name); /* select panel according to label */ qpic_panel_init = ili9341_init; qpic_panel_on = ili9341_on; qpic_panel_off = ili9341_off; rc = mdss_panel_parse_dt(pdev, &vendor_pdata); if (rc) return rc; rc = qpic_register_panel(&vendor_pdata); if (rc) return rc; Loading
drivers/video/msm/mdss/mdss_qpic_panel.h +16 −4 Original line number Diff line number Diff line Loading @@ -105,10 +105,22 @@ enum { OP_WRITE_MEMORY_START = OP_SIZE_PAIR(0x2C, INV_SIZE), }; struct qpic_panel_io_desc { int rst_gpio; int cs_gpio; int ad8_gpio; int te_gpio; int bl_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; u32 init; }; int mdss_qpic_panel_io_init(struct platform_device *pdev, struct qpic_panel_io_desc *qpic_panel_io); u32 qpic_panel_set_cmd_only(u32 command); u32 qpic_send_panel_cmd(u32 cmd, u32 *val, u32 length); int ili9341_on(void); void ili9341_off(void); int ili9341_init(struct platform_device *pdev, struct device_node *np); int ili9341_on(struct qpic_panel_io_desc *qpic_panel_io); void ili9341_off(struct qpic_panel_io_desc *qpic_panel_io); #endif /* MDSS_QPIC_PANEL_H */
drivers/video/msm/mdss/qpic_panel_ili_qvga.c +78 −89 Original line number Diff line number Diff line /* Copyright (c) 2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2013 - 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 @@ -56,117 +56,111 @@ enum { OP_ILI9341_READ_DISPLAY_MADCTL = OP_SIZE_PAIR(0x0b, 2), }; static int rst_gpio; static int cs_gpio; static int ad8_gpio; static int te_gpio; struct regulator *vdd_vreg; struct regulator *avdd_vreg; int ili9341_init(struct platform_device *pdev, struct device_node *np) static int ili9341_init(struct qpic_panel_io_desc *panel_io) { int rc = 0; rst_gpio = of_get_named_gpio(np, "qcom,rst-gpio", 0); cs_gpio = of_get_named_gpio(np, "qcom,cs-gpio", 0); ad8_gpio = of_get_named_gpio(np, "qcom,ad8-gpio", 0); te_gpio = of_get_named_gpio(np, "qcom,te-gpio", 0); if (!gpio_is_valid(rst_gpio)) { pr_err("%s: reset gpio not specified\n" , __func__); return -EINVAL; } if (!gpio_is_valid(cs_gpio)) { pr_err("%s: cs gpio not specified\n", __func__); return -EINVAL; } if (!gpio_is_valid(ad8_gpio)) { pr_err("%s: ad8 gpio not specified\n", __func__); return -EINVAL; } if (!gpio_is_valid(te_gpio)) { pr_err("%s: te gpio not specified\n", __func__); return -EINVAL; } vdd_vreg = devm_regulator_get(&pdev->dev, "vdd"); if (IS_ERR(vdd_vreg)) { pr_err("%s could not get vdd,", __func__); return -ENODEV; } avdd_vreg = devm_regulator_get(&pdev->dev, "avdd"); if (IS_ERR(avdd_vreg)) { pr_err("%s could not get avdd,", __func__); return -ENODEV; } rc = regulator_set_voltage(vdd_vreg, 1800000, 1800000); int rc; if (panel_io->vdd_vreg) { rc = regulator_set_voltage(panel_io->vdd_vreg, 1800000, 1800000); if (rc) { pr_err("vdd_vreg->set_voltage failed, rc=%d\n", rc); return -EINVAL; } rc = regulator_set_voltage(avdd_vreg, 2700000, 2700000); } if (panel_io->avdd_vreg) { rc = regulator_set_voltage(panel_io->avdd_vreg, 2700000, 2700000); if (rc) { pr_err("vdd_vreg->set_voltage failed, rc=%d\n", rc); return -EINVAL; } } return 0; } static int ili9341_panel_power_on(void) void ili9341_off(struct qpic_panel_io_desc *qpic_panel_io) { if (qpic_panel_io->ad8_gpio) gpio_free(qpic_panel_io->ad8_gpio); if (qpic_panel_io->cs_gpio) gpio_free(qpic_panel_io->cs_gpio); if (qpic_panel_io->rst_gpio) gpio_free(qpic_panel_io->rst_gpio); if (qpic_panel_io->te_gpio) gpio_free(qpic_panel_io->te_gpio); if (qpic_panel_io->bl_gpio) gpio_free(qpic_panel_io->bl_gpio); if (qpic_panel_io->vdd_vreg) regulator_disable(qpic_panel_io->vdd_vreg); if (qpic_panel_io->avdd_vreg) regulator_disable(qpic_panel_io->avdd_vreg); } static int ili9341_panel_power_on(struct qpic_panel_io_desc *qpic_panel_io) { int rc; rc = regulator_enable(vdd_vreg); if (qpic_panel_io->vdd_vreg) { rc = regulator_enable(qpic_panel_io->vdd_vreg); if (rc) { pr_err("enable vdd failed, rc=%d\n", rc); return -ENODEV; } rc = regulator_enable(avdd_vreg); } if (qpic_panel_io->avdd_vreg) { rc = regulator_enable(qpic_panel_io->avdd_vreg); if (rc) { pr_err("enable avdd failed, rc=%d\n", rc); return -ENODEV; goto power_on_error; } } if (gpio_request(rst_gpio, "disp_rst_n")) { if ((qpic_panel_io->rst_gpio) && (gpio_request(qpic_panel_io->rst_gpio, "disp_rst_n"))) { pr_err("%s request reset gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(cs_gpio, "disp_cs_n")) { gpio_free(rst_gpio); if ((qpic_panel_io->cs_gpio) && (gpio_request(qpic_panel_io->cs_gpio, "disp_cs_n"))) { pr_err("%s request cs gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(ad8_gpio, "disp_ad8_n")) { gpio_free(cs_gpio); gpio_free(rst_gpio); if ((qpic_panel_io->ad8_gpio) && (gpio_request(qpic_panel_io->ad8_gpio, "disp_ad8_n"))) { pr_err("%s request ad8 gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if (gpio_request(te_gpio, "disp_te_n")) { gpio_free(ad8_gpio); gpio_free(cs_gpio); gpio_free(rst_gpio); if ((qpic_panel_io->te_gpio) && (gpio_request(qpic_panel_io->te_gpio, "disp_te_n"))) { pr_err("%s request te gpio failed\n", __func__); return -EINVAL; goto power_on_error; } if ((qpic_panel_io->bl_gpio) && (gpio_request(qpic_panel_io->bl_gpio, "disp_bl_n"))) { pr_err("%s request bl gpio failed\n", __func__); goto power_on_error; } /* wait for 20 ms after enable gpio as suggested by hw */ msleep(20); return 0; power_on_error: ili9341_off(qpic_panel_io); return -EINVAL; } static void ili9341_panel_power_off(void) { gpio_free(ad8_gpio); gpio_free(cs_gpio); gpio_free(rst_gpio); gpio_free(te_gpio); regulator_disable(vdd_vreg); regulator_disable(avdd_vreg); } int ili9341_on(void) int ili9341_on(struct qpic_panel_io_desc *qpic_panel_io) { u32 param[20]; int ret; ret = ili9341_panel_power_on(); if (!qpic_panel_io->init) { ili9341_init(qpic_panel_io); qpic_panel_io->init = true; } ret = ili9341_panel_power_on(qpic_panel_io); if (ret) return ret; qpic_panel_set_cmd_only(OP_SOFT_RESET); Loading Loading @@ -217,8 +211,3 @@ int ili9341_on(void) return 0; } void ili9341_off(void) { ili9341_panel_power_off(); }