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

Commit 312649d1 authored by Dhaval Patel's avatar Dhaval Patel
Browse files

msm: mdss: Support GCDB on 8x10 target.



Update dsi v2 driver to use GCDB platform
tags and B family panel utility API. This changes
supports complete GCDB kernel dtsi tags
for 8x10. It also removes the panel v2 driver because
switching to B family panel utility removes
panel v2 driver usage.

Change-Id: I840223279ef3aa6aa8ee364f6c4e03f49e0e2d4b
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent 32edf01f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ ifeq ($(CONFIG_FB_MSM_MDSS),y)
obj-$(CONFIG_DEBUG_FS) += mdss_debug.o
endif

dsi-v2-objs = dsi_v2.o dsi_host_v2.o dsi_io_v2.o dsi_panel_v2.o
dsi-v2-objs = dsi_v2.o dsi_host_v2.o dsi_io_v2.o
obj-$(CONFIG_FB_MSM_MDSS) += dsi-v2.o

mdss-dsi-objs := mdss_dsi.o mdss_dsi_host.o
+255 −58
Original line number Diff line number Diff line
@@ -546,8 +546,8 @@ int msm_dsi_cmds_tx(struct mdss_panel_data *pdata,
		dsi_buf_init(tp);
		dsi_cmd_dma_add(tp, cm);
		msm_dsi_cmd_dma_tx(tp);
		if (cm->wait)
			msleep(cm->wait);
		if (cm->dchdr.wait)
			msleep(cm->dchdr.wait);
		cm++;
	}

@@ -562,8 +562,8 @@ int msm_dsi_cmds_tx(struct mdss_panel_data *pdata,
static char max_pktsize[2] = {0x00, 0x00}; /* LSB tx first, 10 bytes */

static struct dsi_cmd_desc pkt_size_cmd[] = {
	{DTYPE_MAX_PKTSIZE, 1, 0, 0, 0,
		sizeof(max_pktsize), max_pktsize}
	{{DTYPE_MAX_PKTSIZE, 1, 0, 0, 0,
		sizeof(max_pktsize)}, max_pktsize}
};

/*
@@ -594,8 +594,8 @@ int msm_dsi_cmds_rx(struct mdss_panel_data *pdata,
	if (len <= 2) {
		cnt = 4;	/* short read */
	} else {
		if (len > DSI_LEN)
			len = DSI_LEN;	/* 8 bytes at most */
		if (len > MDSS_DSI_LEN)
			len = MDSS_DSI_LEN;	/* 8 bytes at most */

		len = ALIGN(len, 4); /* len 4 bytes align */
		diff = len - rlen;
@@ -743,12 +743,18 @@ static int msm_dsi_on(struct mdss_panel_data *pdata)
	u32 dummy_xres, dummy_yres;
	u32 bitclk_rate = 0, byteclk_rate = 0, pclk_rate = 0, dsiclk_rate = 0;
	unsigned char *ctrl_base = dsi_host_private->dsi_base;
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;

	pr_debug("msm_dsi_on\n");

	pinfo = &pdata->panel_info;

	ret = msm_dsi_regulator_enable();
	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
				panel_data);

	ret = msm_dss_enable_vreg(
		ctrl_pdata->power_data.vreg_config,
		ctrl_pdata->power_data.num_vreg, 1);
	if (ret) {
		pr_err("%s: DSI power on failed\n", __func__);
		return ret;
@@ -843,6 +849,16 @@ static int msm_dsi_on(struct mdss_panel_data *pdata)
static int msm_dsi_off(struct mdss_panel_data *pdata)
{
	int ret = 0;
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;

	if (pdata == NULL) {
		pr_err("%s: Invalid input data\n", __func__);
		ret = -EINVAL;
		return ret;
	}

	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
				panel_data);

	pr_debug("msm_dsi_off\n");
	msm_dsi_controller_cfg(0);
@@ -852,7 +868,9 @@ static int msm_dsi_off(struct mdss_panel_data *pdata)
	msm_dsi_phy_off(dsi_host_private->dsi_base);
	msm_dsi_ahb_ctrl(0);

	ret = msm_dsi_regulator_disable();
	ret = msm_dss_enable_vreg(
		ctrl_pdata->power_data.vreg_config,
		ctrl_pdata->power_data.num_vreg, 0);
	if (ret) {
		pr_err("%s: Panel power off failed\n", __func__);
		return ret;
@@ -865,11 +883,24 @@ static int msm_dsi_cont_on(struct mdss_panel_data *pdata)
{
	struct mdss_panel_info *pinfo;
	int ret = 0;
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;

	if (pdata == NULL) {
		pr_err("%s: Invalid input data\n", __func__);
		ret = -EINVAL;
		return ret;
	}


	pr_debug("%s:\n", __func__);

	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
				panel_data);

	pinfo = &pdata->panel_info;
	ret = msm_dsi_regulator_enable();
	ret = msm_dss_enable_vreg(
		ctrl_pdata->power_data.vreg_config,
		ctrl_pdata->power_data.num_vreg, 1);
	if (ret) {
		pr_err("%s: DSI power on failed\n", __func__);
		return ret;
@@ -912,11 +943,109 @@ static int msm_dsi_debug_init(void)
	return rc;
}

static int dsi_get_panel_cfg(char *panel_cfg)
{
	int rc;
	struct mdss_panel_cfg *pan_cfg = NULL;

	if (!panel_cfg)
		return MDSS_PANEL_INTF_INVALID;

	pan_cfg = mdp3_panel_intf_type(MDSS_PANEL_INTF_DSI);
	if (IS_ERR(pan_cfg)) {
		panel_cfg[0] = 0;
		return PTR_ERR(pan_cfg);
	} else if (!pan_cfg) {
		panel_cfg[0] = 0;
		return 0;
	}

	pr_debug("%s:%d: cfg:[%s]\n", __func__, __LINE__,
		 pan_cfg->arg_cfg);
	rc = strlcpy(panel_cfg, pan_cfg->arg_cfg,
				MDSS_MAX_PANEL_LEN);
	return rc;
}

/**
 * dsi_find_panel_of_node(): find device node of dsi panel
 * @pdev: platform_device of the dsi ctrl node
 * @panel_cfg: string containing intf specific config data
 *
 * Function finds the panel device node using the interface
 * specific configuration data. This configuration data is
 * could be derived from the result of bootloader's GCDB
 * panel detection mechanism. If such config data doesn't
 * exist then this panel returns the default panel configured
 * in the device tree.
 *
 * returns pointer to panel node on success, NULL on error.
 */
static struct device_node *dsi_find_panel_of_node(
		struct platform_device *pdev, char *panel_cfg)
{
	int l;
	char *panel_name;
	struct device_node *dsi_pan_node = NULL, *mdss_node = NULL;

	if (!panel_cfg)
		return NULL;

	l = strlen(panel_cfg);
	if (!l) {
		/* no panel cfg chg, parse dt */
		pr_debug("%s:%d: no cmd line cfg present\n",
			 __func__, __LINE__);
		dsi_pan_node = of_parse_phandle(
			pdev->dev.of_node,
			"qcom,dsi-pref-prim-pan", 0);
		if (!dsi_pan_node) {
			pr_err("%s:can't find panel phandle\n",
			       __func__);
			return NULL;
		}
	} else {
		if (panel_cfg[0] != '0') {
			pr_err("%s:%d:ctrl id=[%d] not supported\n",
			       __func__, __LINE__, panel_cfg[0]);
			return NULL;
		}
		/*
		 * skip first two chars '<dsi_ctrl_id>' and
		 * ':' to get to the panel name
		 */
		panel_name = panel_cfg + 2;
		pr_debug("%s:%d:%s:%s\n", __func__, __LINE__,
			 panel_cfg, panel_name);

		mdss_node = of_parse_phandle(pdev->dev.of_node,
					     "qcom,mdss-mdp", 0);

		if (!mdss_node) {
			pr_err("%s: %d: mdss_node null\n",
			       __func__, __LINE__);
			return NULL;
		}
		dsi_pan_node = of_find_node_by_name(mdss_node,
						    panel_name);
		if (!dsi_pan_node) {
			pr_err("%s: invalid pan node\n",
			       __func__);
			return NULL;
		}
	}
	return dsi_pan_node;
}

static int msm_dsi_probe(struct platform_device *pdev)
{
	struct dsi_interface intf;
	char panel_cfg[MDSS_MAX_PANEL_LEN];
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
	int rc = 0;
	struct device_node *dsi_pan_node = NULL;
	bool cmd_cfg_cont_splash = false;
	struct resource *mdss_dsi_mres;

	pr_debug("%s\n", __func__);

@@ -924,24 +1053,40 @@ static int msm_dsi_probe(struct platform_device *pdev)
	if (rc)
		return rc;

	if (pdev->dev.of_node) {
		struct resource *mdss_dsi_mres;
	if (!pdev->dev.of_node) {
		pr_err("%s: Device node is not accessible\n", __func__);
		rc = -ENODEV;
		goto error_no_mem;
	}
	pdev->id = 0;

	ctrl_pdata = platform_get_drvdata(pdev);
	if (!ctrl_pdata) {
		ctrl_pdata = devm_kzalloc(&pdev->dev,
			sizeof(struct mdss_dsi_ctrl_pdata), GFP_KERNEL);
		if (!ctrl_pdata) {
			pr_err("%s: FAILED: cannot alloc dsi ctrl\n", __func__);
			rc = -ENOMEM;
			goto error_no_mem;
		}
		platform_set_drvdata(pdev, ctrl_pdata);
	}

	mdss_dsi_mres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mdss_dsi_mres) {
		pr_err("%s:%d unable to get the MDSS reg resources",
							__func__, __LINE__);
			return -ENOMEM;
		rc = -ENOMEM;
		goto error_io_resource;
	} else {
			dsi_host_private->dsi_reg_size =
						resource_size(mdss_dsi_mres);
			dsi_host_private->dsi_base = ioremap(
						mdss_dsi_mres->start,
		dsi_host_private->dsi_reg_size = resource_size(mdss_dsi_mres);
		dsi_host_private->dsi_base = ioremap(mdss_dsi_mres->start,
						dsi_host_private->dsi_reg_size);
		if (!dsi_host_private->dsi_base) {
			pr_err("%s:%d unable to remap dsi resources",
							__func__, __LINE__);
				return -ENOMEM;
			rc = -ENOMEM;
			goto error_io_resource;
		}
	}

@@ -950,36 +1095,62 @@ static int msm_dsi_probe(struct platform_device *pdev)
		pr_err("%s:%d unable to get the MDSS irq resources",
							__func__, __LINE__);
		rc = -ENODEV;
			goto dsi_probe_error;
		goto error_irq_resource;
	} else {
		rc = msm_dsi_irq_init(&pdev->dev, mdss_dsi_mres->start);
		if (rc) {
				dev_err(&pdev->dev,
					"%s: failed to init irq, rc=%d\n",
			dev_err(&pdev->dev, "%s: failed to init irq, rc=%d\n",
								__func__, rc);
				goto dsi_probe_error;
			goto error_irq_resource;
		}
	}

		rc = msm_dsi_io_init(pdev);
	rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
	if (rc) {
			dev_err(&pdev->dev,
				"%s: failed to init DSI IO, rc=%d\n",
		dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n",
								__func__, rc);
			goto dsi_probe_error;
		goto error_platform_pop;
	}

	/* DSI panels can be different between controllers */
	rc = dsi_get_panel_cfg(panel_cfg);
	if (!rc)
		/* dsi panel cfg not present */
		pr_warn("%s:%d:dsi specific cfg not present\n",
							 __func__, __LINE__);

	/* find panel device node */
	dsi_pan_node = dsi_find_panel_of_node(pdev, panel_cfg);
	if (!dsi_pan_node) {
		pr_err("%s: can't find panel node %s\n", __func__,
								panel_cfg);
		goto error_pan_node;
	}

		rc = of_platform_populate(pdev->dev.of_node,
					NULL, NULL, &pdev->dev);
	cmd_cfg_cont_splash = mdp3_panel_get_boot_cfg() ? true : false;

	rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, cmd_cfg_cont_splash);
	if (rc) {
			dev_err(&pdev->dev,
				"%s: failed to add child nodes, rc=%d\n",
		pr_err("%s: dsi panel init failed\n", __func__);
		goto error_pan_node;
	}

	rc = dsi_ctrl_config_init(pdev, ctrl_pdata);
	if (rc) {
		dev_err(&pdev->dev, "%s: failed to parse mdss dtsi rc=%d\n",
								__func__, rc);
			goto dsi_probe_error;
		goto error_pan_node;
	}

	rc = msm_dsi_io_init(pdev, &(ctrl_pdata->power_data));
	if (rc) {
		dev_err(&pdev->dev, "%s: failed to init DSI IO, rc=%d\n",
								__func__, rc);
		goto error_io_init;
	}

	pr_debug("%s: Dsi Ctrl->0 initialized\n", __func__);

	dsi_host_private->dis_dev = pdev->dev;
	intf.on = msm_dsi_on;
	intf.off = msm_dsi_off;
@@ -992,25 +1163,51 @@ static int msm_dsi_probe(struct platform_device *pdev)
	dsi_register_interface(&intf);

	msm_dsi_debug_init();

	rc = dsi_panel_device_register_v2(pdev, ctrl_pdata);
	if (rc) {
		pr_err("%s: dsi panel dev reg failed\n", __func__);
		goto error_device_register;
	}
	pr_debug("%s success\n", __func__);
	return 0;
dsi_probe_error:
error_device_register:
	msm_dsi_io_deinit(pdev, &(ctrl_pdata->power_data));
error_io_init:
	dsi_ctrl_config_deinit(pdev, ctrl_pdata);
error_pan_node:
	of_node_put(dsi_pan_node);
error_platform_pop:
	msm_dsi_disable_irq();
error_irq_resource:
	if (dsi_host_private->dsi_base) {
		iounmap(dsi_host_private->dsi_base);
		dsi_host_private->dsi_base = NULL;
	}
	msm_dsi_io_deinit();
error_io_resource:
	devm_kfree(&pdev->dev, ctrl_pdata);
error_no_mem:
	msm_dsi_deinit();

	return rc;
}

static int msm_dsi_remove(struct platform_device *pdev)
{
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = platform_get_drvdata(pdev);
	if (!ctrl_pdata) {
		pr_err("%s: no driver data\n", __func__);
		return -ENODEV;
	}

	msm_dsi_disable_irq();
	msm_dsi_io_deinit();
	msm_dsi_io_deinit(pdev, &(ctrl_pdata->power_data));
	dsi_ctrl_config_deinit(pdev, ctrl_pdata);
	iounmap(dsi_host_private->dsi_base);
	dsi_host_private->dsi_base = NULL;
	msm_dsi_deinit();
	devm_kfree(&pdev->dev, ctrl_pdata);

	return 0;
}

+9 −61
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@
#include "dsi_host_v2.h"

struct msm_dsi_io_private {
	struct regulator *vdda_vreg;
	struct clk *dsi_byte_clk;
	struct clk *dsi_esc_clk;
	struct clk *dsi_pixel_clk;
@@ -51,7 +50,7 @@ void msm_dsi_ahb_ctrl(int enable)
	}
}

int msm_dsi_io_init(struct platform_device *dev)
int msm_dsi_io_init(struct platform_device *pdev, struct dss_module_power *mp)
{
	int rc;

@@ -64,25 +63,29 @@ int msm_dsi_io_init(struct platform_device *dev)
		}
	}

	rc = msm_dsi_clk_init(dev);
	rc = msm_dsi_clk_init(pdev);
	if (rc) {
		pr_err("fail to initialize DSI clock\n");
		return rc;
	}

	rc = msm_dsi_regulator_init(dev);
	rc = msm_dss_config_vreg(&pdev->dev, mp->vreg_config,
						mp->num_vreg, 1);
	if (rc) {
		pr_err("fail to initialize DSI regulator\n");
		return rc;
	}

	return 0;
}

void msm_dsi_io_deinit(void)
void msm_dsi_io_deinit(struct platform_device *pdev,
				 struct dss_module_power *mp)
{
	if (dsi_io_private) {
		msm_dsi_clk_deinit();
		msm_dsi_regulator_deinit();
		msm_dss_config_vreg(&pdev->dev, mp->vreg_config,
					mp->num_vreg, 0);
		kfree(dsi_io_private);
		dsi_io_private = NULL;
	}
@@ -242,61 +245,6 @@ int msm_dsi_clk_disable(void)
	return 0;
}

int msm_dsi_regulator_init(struct platform_device *dev)
{
	int ret = 0;

	dsi_io_private->vdda_vreg = devm_regulator_get(&dev->dev, "vdda");
	if (IS_ERR(dsi_io_private->vdda_vreg)) {
		ret = PTR_ERR(dsi_io_private->vdda_vreg);
		pr_err("could not get vdda 8110_l4, ret=%d\n", ret);
		return ret;
	}

	ret = regulator_set_voltage(dsi_io_private->vdda_vreg, DSI_VDDA_VOLTAGE,
					DSI_VDDA_VOLTAGE);
	if (ret)
		pr_err("vdd_io_vreg->set_voltage failed, ret=%d\n", ret);

	return ret;
}

void msm_dsi_regulator_deinit(void)
{
	if (!IS_ERR(dsi_io_private->vdda_vreg)) {
		devm_regulator_put(dsi_io_private->vdda_vreg);
		dsi_io_private->vdda_vreg = NULL;
	}
}

int msm_dsi_regulator_enable(void)
{
	int ret;

	ret = regulator_enable(dsi_io_private->vdda_vreg);
	if (ret) {
		pr_err("%s: Failed to enable regulator.\n", __func__);
		return ret;
	}
	msleep(20); /*per DSI controller spec*/
	return ret;
}

int msm_dsi_regulator_disable(void)
{
	int ret;

	ret = regulator_disable(dsi_io_private->vdda_vreg);
	if (ret) {
		pr_err("%s: Failed to disable regulator.\n", __func__);
		return ret;
	}
	wmb();
	msleep(20); /*per DSI controller spec*/

	return ret;
}

static void msm_dsi_phy_strength_init(unsigned char *ctrl_base,
					struct mdss_dsi_phy_ctrl *pd)
{
+4 −10
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@

void msm_dsi_ahb_ctrl(int enable);

int msm_dsi_io_init(struct platform_device *dev);
int msm_dsi_io_init(struct platform_device *dev,
				struct dss_module_power *mp);

void msm_dsi_io_deinit(void);
void msm_dsi_io_deinit(struct platform_device *dev,
				struct dss_module_power *mp);

int msm_dsi_clk_init(struct platform_device *dev);

@@ -38,14 +40,6 @@ int msm_dsi_clk_enable(void);

int msm_dsi_clk_disable(void);

int msm_dsi_regulator_init(struct platform_device *dev);

void msm_dsi_regulator_deinit(void);

int msm_dsi_regulator_enable(void);

int msm_dsi_regulator_disable(void);

int msm_dsi_phy_init(unsigned char *ctrl_base,
			struct mdss_panel_data *pdata);

+0 −922

File deleted.

Preview size limit exceeded, changes collapsed.

Loading