linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Archit Taneja <architt@codeaurora.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: dri-devel@lists.freedesktop.org, airlied@linux.ie,
	daniel@ffwll.ch, treding@nvidia.com,
	linux-arm-msm@vger.kernel.org, srinivas.kandagatla@linaro.org,
	andy.green@linaro.org, lars@metafoo.de, xinliang.liu@linaro.org,
	amit.kucheria@linaro.org, robdclark@gmail.com
Subject: Re: [PATCH v3 4/7] drm/i2c: adv7511: Create a MIPI DSI device
Date: Fri, 22 Apr 2016 10:40:07 +0530	[thread overview]
Message-ID: <5719B22F.9090206@codeaurora.org> (raw)
In-Reply-To: <3839655.kGse9ULfeB@avalon>

Hi Laurent,


On 04/22/2016 03:59 AM, Laurent Pinchart wrote:
> Hi Archit,
>
> Thank you for the patch.
>
> On Wednesday 09 Mar 2016 16:27:15 Archit Taneja wrote:
>> In order to pass DSI specific parameters to the DSI host, we need the
>> driver to create a mipi_dsi_device DSI device that attaches to the
>> host.
>>
>> Use of_graph helpers to get the DSI host DT node. Create a MIPI DSI
>> device using this host. Finally, attach this device to the DSI host.
>>
>> Populate DT parameters (number of data lanes for now) that are required
>> for DSI RX to work correctly. Hardcode few other parameters (rgb,
>> embedded_sync) for now.
>>
>> Signed-off-by: Archit Taneja <architt@codeaurora.org>
>
> This adds a hard dependency on CONFIG_DRM_MIPI_DSI, otherwise the kernel won't
> link. As the ADV7511 doesn't require DSI, could you make it optional with
> conditional compilation to avoid pulling in dead code ?

You're right. The driver's Kconfig should at least select DRM_MIPI_DSI 
in the current state to make sure we don't break build.

Do you suggest we create another config option for ADV7533, which
selects DRM_MIPI_DSI and builds the ADV7533 parts? Or did you mean
something else?

Thanks for the review.

Archit

>
>> ---
>>   drivers/gpu/drm/i2c/adv7511.c | 130 ++++++++++++++++++++++++++++++++++++---
>>   1 file changed, 123 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i2c/adv7511.c b/drivers/gpu/drm/i2c/adv7511.c
>> index 75be17c..6c2a89a 100644
>> --- a/drivers/gpu/drm/i2c/adv7511.c
>> +++ b/drivers/gpu/drm/i2c/adv7511.c
>> @@ -11,6 +11,7 @@
>>   #include <linux/i2c.h>
>>   #include <linux/module.h>
>>   #include <linux/of_device.h>
>> +#include <linux/of_graph.h>
>>   #include <linux/regmap.h>
>>   #include <linux/slab.h>
>>
>> @@ -19,6 +20,7 @@
>>   #include <drm/drm_atomic_helper.h>
>>   #include <drm/drm_crtc_helper.h>
>>   #include <drm/drm_edid.h>
>> +#include <drm/drm_mipi_dsi.h>
>>
>>   #include "adv7511.h"
>>
>> @@ -56,6 +58,11 @@ struct adv7511 {
>>
>>   	struct gpio_desc *gpio_pd;
>>
>> +	/* ADV7533 DSI RX related params */
>> +	struct device_node *host_node;
>> +	struct mipi_dsi_device *dsi;
>> +	u8 num_dsi_lanes;
>> +
>>   	enum adv7511_type type;
>>   };
>>
>> @@ -392,8 +399,10 @@ static void adv7511_set_link_config(struct adv7511
>> *adv7511,
>>
>>   static void adv7533_dsi_power_on(struct adv7511 *adv)
>>   {
>> -	/* set number of dsi lanes (hardcoded to 4 for now) */
>> -	regmap_write(adv->regmap_cec, 0x1c, 0x4 << 4);
>> +	struct mipi_dsi_device *dsi = adv->dsi;
>> +
>> +	/* set number of dsi lanes */
>> +	regmap_write(adv->regmap_cec, 0x1c, dsi->lanes << 4);
>>   	/* disable internal timing generator */
>>   	regmap_write(adv->regmap_cec, 0x27, 0x0b);
>>   	/* enable hdmi */
>> @@ -889,6 +898,51 @@ static void adv7511_bridge_mode_set(struct drm_bridge
>> *bridge, adv7511_mode_set(adv, mode, adj_mode);
>>   }
>>
>> +static int adv7533_attach_dsi(struct adv7511 *adv)
>> +{
>> +	struct device *dev = &adv->i2c_main->dev;
>> +	struct mipi_dsi_host *host;
>> +	struct mipi_dsi_device *dsi;
>> +	int ret = 0;
>> +	const struct mipi_dsi_device_info info = { .type = "adv7533",
>> +						   .channel = 0,
>> +						   .node = NULL,
>> +						 };
>> +
>> +	host = of_find_mipi_dsi_host_by_node(adv->host_node);
>> +	if (!host) {
>> +		dev_err(dev, "failed to find dsi host\n");
>> +		return -EPROBE_DEFER;
>> +	}
>> +
>> +	dsi = mipi_dsi_device_register_full(host, &info);
>> +	if (IS_ERR(dsi)) {
>> +		dev_err(dev, "failed to create dsi device\n");
>> +		ret = PTR_ERR(dsi);
>> +		goto err_dsi_device;
>> +	}
>> +
>> +	adv->dsi = dsi;
>> +
>> +	dsi->lanes = adv->num_dsi_lanes;
>> +	dsi->format = MIPI_DSI_FMT_RGB888;
>> +	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
>> +			  MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
>> +
>> +	ret = mipi_dsi_attach(dsi);
>> +	if (ret < 0) {
>> +		dev_err(dev, "failed to attach dsi to host\n");
>> +		goto err_dsi_attach;
>> +	}
>> +
>> +	return 0;
>> +
>> +err_dsi_attach:
>> +	mipi_dsi_device_unregister(dsi);
>> +err_dsi_device:
>> +	return ret;
>> +}
>> +
>>   static int adv7511_bridge_attach(struct drm_bridge *bridge)
>>   {
>>   	struct adv7511 *adv = bridge_to_adv7511(bridge);
>> @@ -912,6 +966,9 @@ static int adv7511_bridge_attach(struct drm_bridge
>> *bridge) &adv7511_connector_helper_funcs);
>>   	drm_mode_connector_attach_encoder(&adv->connector, bridge->encoder);
>>
>> +	if (adv->type == ADV7533)
>> +		ret = adv7533_attach_dsi(adv);
>> +
>>   	return ret;
>>   }
>>
>> @@ -1009,6 +1066,41 @@ static int adv7511_parse_dt(struct device_node *np,
>>   	return 0;
>>   }
>>
>> +static int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
>> +{
>> +	u32 num_lanes;
>> +	struct device_node *endpoint;
>> +
>> +	of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
>> +
>> +	if (num_lanes < 1 || num_lanes > 4)
>> +		return -EINVAL;
>> +
>> +	adv->num_dsi_lanes = num_lanes;
>> +
>> +	endpoint = of_graph_get_next_endpoint(np, NULL);
>> +	if (!endpoint) {
>> +		DRM_ERROR("ADV7533 DSI input endpoint not found\n");
>> +		return -ENODEV;
>> +	}
>> +
>> +	adv->host_node = of_graph_get_remote_port_parent(endpoint);
>> +	if (!adv->host_node) {
>> +		DRM_ERROR("DSI host node not found\n");
>> +		of_node_put(endpoint);
>> +		return -ENODEV;
>> +	}
>> +
>> +	of_node_put(endpoint);
>> +	of_node_put(adv->host_node);
>> +
>> +	/* TODO: Check if these need to be parsed by DT or not */
>> +	adv->rgb = true;
>> +	adv->embedded_sync = false;
>> +
>> +	return 0;
>> +}
>> +
>>   static const int edid_i2c_addr = 0x7e;
>>   static const int packet_i2c_addr = 0x70;
>>   static const int cec_i2c_addr = 0x78;
>> @@ -1038,11 +1130,12 @@ static int adv7511_probe(struct i2c_client *i2c,
>> const struct i2c_device_id *id)
>>
>>   	memset(&link_config, 0, sizeof(link_config));
>>
>> -	if (adv7511->type == ADV7511) {
>> +	if (adv7511->type == ADV7511)
>>   		ret = adv7511_parse_dt(dev->of_node, &link_config);
>> -		if (ret)
>> -			return ret;
>> -	}
>> +	else
>> +		ret = adv7533_parse_dt(dev->of_node, adv7511);
>> +	if (ret)
>> +		return ret;
>>
>>   	/*
>>   	 * The power down GPIO is optional. If present, toggle it from active to
>> @@ -1155,6 +1248,11 @@ static int adv7511_remove(struct i2c_client *i2c)
>>   {
>>   	struct adv7511 *adv7511 = i2c_get_clientdata(i2c);
>>
>> +	if (adv7511->type == ADV7533) {
>> +		mipi_dsi_detach(adv7511->dsi);
>> +		mipi_dsi_device_unregister(adv7511->dsi);
>> +	}
>> +
>>   	drm_bridge_remove(&adv7511->bridge);
>>
>>   	i2c_unregister_device(adv7511->i2c_cec);
>> @@ -1183,6 +1281,10 @@ static const struct of_device_id adv7511_of_ids[] = {
>> };
>>   MODULE_DEVICE_TABLE(of, adv7511_of_ids);
>>
>> +static struct mipi_dsi_driver adv7533_dsi_driver = {
>> +	.driver.name = "adv7533",
>> +};
>> +
>>   static struct i2c_driver adv7511_driver = {
>>   	.driver = {
>>   		.name = "adv7511",
>> @@ -1193,7 +1295,21 @@ static struct i2c_driver adv7511_driver = {
>>   	.remove = adv7511_remove,
>>   };
>>
>> -module_i2c_driver(adv7511_driver);
>> +static int __init adv7511_init(void)
>> +{
>> +	mipi_dsi_driver_register(&adv7533_dsi_driver);
>> +
>> +	return i2c_add_driver(&adv7511_driver);
>> +}
>> +module_init(adv7511_init);
>> +
>> +static void __exit adv7511_exit(void)
>> +{
>> +	i2c_del_driver(&adv7511_driver);
>> +
>> +	mipi_dsi_driver_unregister(&adv7533_dsi_driver);
>> +}
>> +module_exit(adv7511_exit);
>>
>>   MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
>>   MODULE_DESCRIPTION("ADV7511 HDMI transmitter driver");
>

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora 
Forum, hosted by The Linux Foundation

  reply	other threads:[~2016-04-22  5:10 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-27  6:16 [PATCH 0/5] drm/i2c: adv7511: ADV7533 support Archit Taneja
2015-07-27  6:16 ` [PATCH 1/5] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2015-07-27  6:16 ` [PATCH 2/5] drm/i2c: adv7511: Initial support for adv7533 Archit Taneja
2015-07-28  3:27   ` Bjorn Andersson
2015-08-03  5:39     ` Archit Taneja
2015-07-27  6:16 ` [PATCH 3/5] drm/i2c: adv7511: Refactor encoder slave functions Archit Taneja
2015-07-27  8:59   ` Laurent Pinchart
2015-07-28  8:17     ` Archit Taneja
2015-07-28 14:38       ` Boris Brezillon
2015-07-31  5:26         ` Archit Taneja
2015-07-31  9:12           ` Boris Brezillon
2015-07-31 10:38             ` Archit Taneja
2015-07-31 12:13             ` Rob Clark
2015-07-31 12:58               ` Boris Brezillon
2015-07-31 14:48                 ` Rob Clark
2015-08-03 12:03                   ` Andrzej Hajda
2015-08-03 14:04                     ` Rob Clark
2015-08-04  5:16                       ` Andrzej Hajda
2015-08-04 12:24                         ` Rob Clark
2015-09-02  6:30                           ` Archit Taneja
2015-12-03 15:02     ` Rob Clark
2015-12-03 15:28       ` Laurent Pinchart
2015-12-03 15:55         ` Rob Clark
2015-12-03 16:06           ` Laurent Pinchart
2015-12-03 16:11           ` Archit Taneja
2016-01-09 17:03             ` Archit Taneja
2015-07-27  6:16 ` [PATCH 4/5] drm/i2c: adv7511: Add drm_bridge/connector for ADV7533 Archit Taneja
2015-07-27  6:16 ` [PATCH 5/5] drm/i2c: adv7511: Create mipi_dsi_device " Archit Taneja
2015-09-07 11:36 ` [PATCH v2 0/5] drm/i2c: adv7511: ADV7533 support Archit Taneja
2015-09-07 11:36   ` [PATCH v2 1/5] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2015-09-07 11:36   ` [PATCH v2 2/5] drm/i2c: adv7511: Initial support for adv7533 Archit Taneja
2015-09-07 11:36   ` [PATCH v2 3/5] drm/i2c: adv7511: Refactor encoder slave functions Archit Taneja
2015-09-07 11:36   ` [PATCH v2 4/5] drm/i2c: adv7511: Add drm_bridge/connector for ADV7533 Archit Taneja
2015-09-07 11:36   ` [PATCH v2 5/5] drm/i2c: adv7511: Add dsi driver for adv7533 Archit Taneja
2016-03-09 10:57   ` [PATCH v3 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-03-09 10:57     ` [PATCH v3 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-03-09 10:57     ` [PATCH v3 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-03-09 10:57     ` [PATCH v3 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-03-09 10:57     ` [PATCH v3 4/7] drm/i2c: adv7511: Create a MIPI DSI device Archit Taneja
2016-04-21 22:29       ` Laurent Pinchart
2016-04-22  5:10         ` Archit Taneja [this message]
2016-05-03  6:57           ` Archit Taneja
2016-05-09 20:38             ` Laurent Pinchart
2016-05-11 10:19               ` Archit Taneja
2016-03-09 10:57     ` [PATCH v3 5/7] drm/i2c: adv7511: Use internal timing generator Archit Taneja
2016-03-09 10:57     ` [PATCH v3 6/7] drm/i2c: adv7511: Change number of DSI lanes dynamically Archit Taneja
     [not found]     ` <1457521038-5906-1-git-send-email-architt-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-03-09 10:57       ` [PATCH v3 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-03-17 19:12         ` Rob Herring
2016-04-21 22:32         ` Laurent Pinchart
2016-04-22  5:40           ` Archit Taneja
     [not found]             ` <5719B942.8070907-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-05-16 12:01               ` Laurent Pinchart
2016-05-17  3:43                 ` Archit Taneja
2016-05-17  4:18                   ` Xinliang Liu
2016-05-24  5:15                     ` Archit Taneja
2016-04-14 14:56     ` [PATCH v3 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-04-21 22:33       ` Laurent Pinchart
2016-04-22  5:45         ` Archit Taneja
2016-04-17 11:31     ` Xinliang Liu
2016-04-18  9:48       ` Archit Taneja
2016-04-19  8:44         ` Xinliang Liu
2016-04-21 22:36         ` Laurent Pinchart
2016-04-22  5:44           ` Archit Taneja
2016-05-03  1:52     ` Xinliang Liu
2016-05-03  6:53       ` Archit Taneja
2016-05-16 10:41     ` [PATCH v4 " Archit Taneja
2016-05-16 10:41       ` [PATCH v4 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-05-16 10:41       ` [PATCH v4 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-05-16 10:41       ` [PATCH v4 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-05-16 10:41       ` [PATCH v4 4/7] drm/i2c: adv7533: Create a MIPI DSI device Archit Taneja
2016-05-16 10:41       ` [PATCH v4 5/7] drm/i2c: adv7533: Use internal timing generator Archit Taneja
2016-05-16 10:41       ` [PATCH v4 6/7] drm/i2c: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-05-16 10:41       ` [PATCH v4 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-06-08 10:27       ` [PATCH v5 0/7] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-06-08 10:27         ` [PATCH v5 1/7] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-06-08 10:27         ` [PATCH v5 2/7] drm/i2c: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-06-08 10:27         ` [PATCH v5 3/7] drm/i2c: adv7511: Initial support for ADV7533 Archit Taneja
2016-06-08 10:27         ` [PATCH v5 4/7] drm/i2c: adv7533: Create a MIPI DSI device Archit Taneja
2016-06-08 10:27         ` [PATCH v5 5/7] drm/i2c: adv7533: Use internal timing generator Archit Taneja
2016-06-08 10:27         ` [PATCH v5 6/7] drm/i2c: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-06-08 10:27         ` [PATCH v5 7/7] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja
2016-06-17  7:53         ` [PATCH v6 0/8] drm/i2c: adv7511: ADV7533 support Archit Taneja
2016-06-17  7:53           ` [PATCH v6 1/8] drm/i2c: adv7511: Convert to drm_bridge Archit Taneja
2016-06-17  7:53           ` [PATCH v6 2/8] drm/i2c: adv7511: Move to bridge folder Archit Taneja
2016-06-17  7:53           ` [PATCH v6 3/8] drm/bridge: adv7511: Fix mutex deadlock when interrupts are disabled Archit Taneja
2016-06-17  7:53           ` [PATCH v6 4/8] drm/bridge: adv7533: Initial support for ADV7533 Archit Taneja
2016-06-17  7:53           ` [PATCH v6 5/8] drm/bridge: adv7533: Create a MIPI DSI device Archit Taneja
2016-06-17  7:53           ` [PATCH v6 6/8] drm/bridge: adv7533: Use internal timing generator Archit Taneja
2016-06-17  7:53           ` [PATCH v6 7/8] drm/bridge: adv7533: Change number of DSI lanes dynamically Archit Taneja
2016-06-17  7:53           ` [PATCH v6 8/8] dt-bindings: drm/bridge: Update bindings for ADV7533 Archit Taneja

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5719B22F.9090206@codeaurora.org \
    --to=architt@codeaurora.org \
    --cc=airlied@linux.ie \
    --cc=amit.kucheria@linaro.org \
    --cc=andy.green@linaro.org \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=lars@metafoo.de \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=robdclark@gmail.com \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=treding@nvidia.com \
    --cc=xinliang.liu@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).