Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5034140 authored by Ken Zhang's avatar Ken Zhang
Browse files

msm: display: 9x35: move platform config out of panel driver



Move platform specific configuration out of panel driver so
that it can be reused for different platform.

Change-Id: If7ef3c4576f554675ba4d36eac21fc3e5152ea67
Signed-off-by: default avatarKen Zhang <kenz@codeaurora.org>
parent 96c3a6c4
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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);
@@ -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;
@@ -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,
@@ -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");
+6 −3
Original line number Diff line number Diff line
@@ -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
@@ -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 {
@@ -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(
+64 −13
Original line number Diff line number Diff line
@@ -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)
{
@@ -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;

@@ -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)
{
@@ -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;
}

@@ -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;
+16 −4
Original line number Diff line number Diff line
@@ -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 */
+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
@@ -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);
@@ -217,8 +211,3 @@ int ili9341_on(void)

	return 0;
}

void ili9341_off(void)
{
	ili9341_panel_power_off();
}