All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jingoo Han" <jingoohan1@gmail.com>
To: "'Yakir Yang'" <ykk@rock-chips.com>,
	"'Heiko Stuebner'" <heiko@sntech.de>,
	"'Russell King'" <rmk+kernel@arm.linux.org.uk>,
	"'Fabio Estevam'" <fabio.estevam@freescale.com>,
	"'Inki Dae'" <inki.dae@samsung.com>
Cc: <djkurtz@google.com>, <dianders@google.com>,
	"'Takashi Iwai'" <tiwai@suse.de>,
	"'Andrzej Hajda'" <a.hajda@samsung.com>,
	"'Thierry Reding'" <treding@nvidia.com>,
	"'Philipp Zabel'" <p.zabel@pengutronix.de>,
	"'David Airlie'" <airlied@linux.ie>,
	"'Gustavo Padovan'" <gustavo.padovan@collabora.co.uk>,
	"'Seung-Woo Kim'" <sw0312.kim@samsung.com>,
	"'Kyungmin Park'" <kyungmin.park@samsung.com>,
	"'Krzysztof Kozlowski'" <k.kozlowski@samsung.com>,
	"'Kukjin Kim'" <kgene@kernel.org>,
	"'Ajay Kumar'" <ajaykumar.rs@samsung.com>,
	"'Joonyoung Shim'" <jy0922.shim@samsung.com>,
	"'Vincent Palatin'" <vpalatin@chromium.org>,
	"'Mark Yao'" <mark.yao@rock-chips.com>,
	"'Andy Yan'" <andy.yan@rock-chips.com>,
	<dri-devel@lists.freedesktop.org>, <linux-kernel@vger.kernel.org>,
	<linux-samsung-soc@vger.kernel.org>,
	<linux-rockchip@lists.infradead.org>,
	<linux-arm-kernel@lists.infradead.org>,
	"'Jingoo Han'" <jingoohan1@gmail.com>
Subject: Re: [RFC PATCH 2/8] drm: exynos/dp: convert to drm bridge mode
Date: Thu, 6 Aug 2015 23:19:35 +0900	[thread overview]
Message-ID: <000001d0d052$f44fa3a0$dceeeae0$@com> (raw)
In-Reply-To: <1438870041-23130-1-git-send-email-ykk@rock-chips.com>

On Thursday, August 06, 2015 11:07 PM, Yakir Yang wrote:
> 
> In order to move exynos dp code to bridge directory,
> we need to convert driver drm bridge mode first. As
> dp driver already have a ptn3460 bridge, so we need
> to move ptn bridge to the next bridge of dp bridge.
> 
> Signed-off-by: Yakir Yang <ykk@rock-chips.com>
> ---
>  drivers/gpu/drm/exynos/exynos_dp_core.c | 196 ++++++++++++++++++++------------
>  drivers/gpu/drm/exynos/exynos_dp_core.h |   2 +
>  2 files changed, 126 insertions(+), 72 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
> index a8097a4..aa99e23 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

Please don't add this.
You just fixed some parts of this code. I don't find the reason
why you have to be added to author for this file.
If you want the title for an author, please send the patch
for a new IP, instead of modifying the exiting codes.

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -998,59 +999,6 @@ static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
>  	.best_encoder = exynos_dp_best_encoder,
>  };
> 
> -/* returns the number of bridges attached */
> -static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> -					struct drm_encoder *encoder)
> -{
> -	int ret;
> -
> -	encoder->bridge = dp->bridge;
> -	dp->bridge->encoder = encoder;
> -	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> -	if (ret) {
> -		DRM_ERROR("Failed to attach bridge to drm\n");
> -		return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -static int exynos_dp_create_connector(struct exynos_drm_display *display,
> -				      struct drm_encoder *encoder)
> -{
> -	struct exynos_dp_device *dp = display_to_dp(display);
> -	struct drm_connector *connector = &dp->connector;
> -	int ret;
> -
> -	dp->encoder = encoder;
> -
> -	/* Pre-empt DP connector creation if there's a bridge */
> -	if (dp->bridge) {
> -		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> -		if (!ret)
> -			return 0;
> -	}
> -
> -	connector->polled = DRM_CONNECTOR_POLL_HPD;
> -
> -	ret = drm_connector_init(dp->drm_dev, connector,
> -				 &exynos_dp_connector_funcs,
> -				 DRM_MODE_CONNECTOR_eDP);
> -	if (ret) {
> -		DRM_ERROR("Failed to initialize connector with drm\n");
> -		return ret;
> -	}
> -
> -	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> -	drm_connector_register(connector);
> -	drm_mode_connector_attach_encoder(connector, encoder);
> -
> -	if (dp->panel)
> -		ret = drm_panel_attach(dp->panel, &dp->connector);
> -
> -	return ret;
> -}
> -
>  static void exynos_dp_phy_init(struct exynos_dp_device *dp)
>  {
>  	if (dp->phy)
> @@ -1115,23 +1063,126 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp)
>  	}
>  }
> 
> -static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +/* returns the number of bridges attached */
> +static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> +		struct drm_encoder *encoder)
> +{
> +	int ret;
> +
> +	dp->bridge->next = dp->ptn_bridge;
> +	dp->bridge->encoder = encoder;
> +	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> +	if (ret) {
> +		DRM_ERROR("Failed to attach ptn bridge to drm\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int exynos_dp_bridge_attach(struct drm_bridge *bridge)
> +{
> +
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +	struct drm_encoder *encoder = dp->encoder;
> +	struct drm_connector *connector = &dp->connector;
> +	int ret;
> +
> +	if (!bridge->encoder) {
> +		DRM_ERROR("Parent encoder object not found");
> +		return -ENODEV;
> +	}
> +
> +	encoder->bridge = bridge;
> +
> +	/* Pre-empt DP connector creation if there's a bridge */
> +	if (dp->ptn_bridge) {
> +		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> +		if (ret)
> +			return -ENODEV;
> +	}
> +
> +	connector->polled = DRM_CONNECTOR_POLL_HPD;
> +
> +	ret = drm_connector_init(dp->drm_dev, connector,
> +			&exynos_dp_connector_funcs, DRM_MODE_CONNECTOR_eDP);
> +	if (ret) {
> +		DRM_ERROR("Failed to initialize connector with drm\n");
> +		return ret;
> +	}
> +
> +	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> +	drm_connector_register(connector);
> +	drm_mode_connector_attach_encoder(connector, encoder);
> +
> +	if (dp->panel)
> +		ret = drm_panel_attach(dp->panel, &dp->connector);
> +
> +	return ret;
> +}
> +
> +static void exynos_dp_bridge_nop(struct drm_bridge *bridge)
> +{
> +	/* do nothing */
> +}
> +
> +static void exynos_dp_bridge_enable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweron(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_ON;
> +}
> +
> +static void exynos_dp_bridge_disable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweroff(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_OFF;
> +}
> +
> +static const struct drm_bridge_funcs exynos_dp_bridge_funcs = {
> +	.enable = exynos_dp_bridge_enable,
> +	.disable = exynos_dp_bridge_disable,
> +	.pre_enable = exynos_dp_bridge_nop,
> +	.post_disable = exynos_dp_bridge_nop,
> +	.attach = exynos_dp_bridge_attach,
> +};
> +
> +static int exynos_dp_create_connector(struct exynos_drm_display *display,
> +				struct drm_encoder *encoder)
>  {
>  	struct exynos_dp_device *dp = display_to_dp(display);
> +	struct drm_device *drm_dev = dp->drm_dev;
> +	struct drm_bridge *bridge;
> +	int ret;
> 
> -	switch (mode) {
> -	case DRM_MODE_DPMS_ON:
> -		exynos_dp_poweron(dp);
> -		break;
> -	case DRM_MODE_DPMS_STANDBY:
> -	case DRM_MODE_DPMS_SUSPEND:
> -	case DRM_MODE_DPMS_OFF:
> -		exynos_dp_poweroff(dp);
> -		break;
> -	default:
> -		break;
> +	bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
> +	if (!bridge) {
> +		DRM_ERROR("failed to allocate for drm bridge\n");
> +		return -ENOMEM;
>  	}
> -	dp->dpms_mode = mode;
> +
> +	dp->bridge = bridge;
> +	dp->encoder = encoder;
> +
> +	bridge->driver_private = dp;
> +	bridge->encoder = dp->encoder;
> +	bridge->funcs = &exynos_dp_bridge_funcs;
> +
> +	ret = drm_bridge_attach(drm_dev, bridge);
> +	if (ret) {
> +		DRM_ERROR("failed to attach drm bridge\n");
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +{
> +	/* do nothing */
>  }
> 
>  static struct exynos_drm_display_ops exynos_dp_display_ops = {
> @@ -1243,7 +1294,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
>  		}
>  	}
> 
> -	if (!dp->panel && !dp->bridge) {
> +	if (!dp->panel && !dp->ptn_bridge) {
>  		ret = exynos_dp_dt_parse_panel(dp);
>  		if (ret)
>  			return ret;
> @@ -1316,7 +1367,7 @@ static void exynos_dp_unbind(struct device *dev, struct device *master,
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  }
> 
>  static const struct component_ops exynos_dp_ops = {
> @@ -1351,9 +1402,9 @@ static int exynos_dp_probe(struct platform_device *pdev)
>  	if (endpoint) {
>  		bridge_node = of_graph_get_remote_port_parent(endpoint);
>  		if (bridge_node) {
> -			dp->bridge = of_drm_find_bridge(bridge_node);
> +			dp->ptn_bridge = of_drm_find_bridge(bridge_node);
>  			of_node_put(bridge_node);
> -			if (!dp->bridge)
> +			if (!dp->ptn_bridge)
>  				return -EPROBE_DEFER;
>  		} else {
>  			return -EPROBE_DEFER;
> @@ -1375,7 +1426,7 @@ static int exynos_dp_suspend(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  	return 0;
>  }
> 
> @@ -1383,7 +1434,7 @@ static int exynos_dp_resume(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_ON);
> +	exynos_dp_bridge_enable(dp->bridge);
>  	return 0;
>  }
>  #endif
> @@ -1410,5 +1461,6 @@ struct platform_driver dp_driver = {
>  };
> 
>  MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
> +MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");

The same as above.

>  MODULE_DESCRIPTION("Samsung SoC DP Driver");
>  MODULE_LICENSE("GPL v2");
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.h b/drivers/gpu/drm/exynos/exynos_dp_core.h
> index c321ad5..f2584b8 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.h
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.h
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

The same as above.
Here, you just added 1 line. If we add someone to author
in this way, a lot of people should be added to author.

Best regards,
Jingoo Han

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -154,6 +155,7 @@ struct exynos_dp_device {
>  	struct drm_encoder	*encoder;
>  	struct drm_panel	*panel;
>  	struct drm_bridge	*bridge;
> +	struct drm_bridge	*ptn_bridge;
>  	struct clk		*clock;
>  	unsigned int		irq;
>  	void __iomem		*reg_base;
> --
> 2.1.2



WARNING: multiple messages have this Message-ID (diff)
From: "Jingoo Han" <jingoohan1@gmail.com>
To: 'Yakir Yang' <ykk@rock-chips.com>,
	'Heiko Stuebner' <heiko@sntech.de>,
	'Russell King' <rmk+kernel@arm.linux.org.uk>,
	'Fabio Estevam' <fabio.estevam@freescale.com>,
	'Inki Dae' <inki.dae@samsung.com>
Cc: djkurtz@google.com, dianders@google.com,
	'Takashi Iwai' <tiwai@suse.de>,
	'Andrzej Hajda' <a.hajda@samsung.com>,
	'Thierry Reding' <treding@nvidia.com>,
	'Philipp Zabel' <p.zabel@pengutronix.de>,
	'David Airlie' <airlied@linux.ie>,
	'Gustavo Padovan' <gustavo.padovan@collabora.co.uk>,
	'Seung-Woo Kim' <sw0312.kim@samsung.com>,
	'Kyungmin Park' <kyungmin.park@samsung.com>,
	'Krzysztof Kozlowski' <k.kozlowski@samsung.com>,
	'Kukjin Kim' <kgene@kernel.org>,
	'Ajay Kumar' <ajaykumar.rs@samsung.com>,
	'Joonyoung Shim' <jy0922.shim@samsung.com>,
	'Vincent Palatin' <vpalatin@chromium.org>,
	'Mark Yao' <mark.yao@rock-chips.com>,
	'Andy Yan' <andy.yan@rock-chips.com>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	linux-samsung-soc@vger.kernel.org,
	linux-rockchip@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org, 'Jing
Subject: Re: [RFC PATCH 2/8] drm: exynos/dp: convert to drm bridge mode
Date: Thu, 6 Aug 2015 23:19:35 +0900	[thread overview]
Message-ID: <000001d0d052$f44fa3a0$dceeeae0$@com> (raw)
In-Reply-To: <1438870041-23130-1-git-send-email-ykk@rock-chips.com>

On Thursday, August 06, 2015 11:07 PM, Yakir Yang wrote:
> 
> In order to move exynos dp code to bridge directory,
> we need to convert driver drm bridge mode first. As
> dp driver already have a ptn3460 bridge, so we need
> to move ptn bridge to the next bridge of dp bridge.
> 
> Signed-off-by: Yakir Yang <ykk@rock-chips.com>
> ---
>  drivers/gpu/drm/exynos/exynos_dp_core.c | 196 ++++++++++++++++++++------------
>  drivers/gpu/drm/exynos/exynos_dp_core.h |   2 +
>  2 files changed, 126 insertions(+), 72 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
> index a8097a4..aa99e23 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

Please don't add this.
You just fixed some parts of this code. I don't find the reason
why you have to be added to author for this file.
If you want the title for an author, please send the patch
for a new IP, instead of modifying the exiting codes.

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -998,59 +999,6 @@ static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
>  	.best_encoder = exynos_dp_best_encoder,
>  };
> 
> -/* returns the number of bridges attached */
> -static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> -					struct drm_encoder *encoder)
> -{
> -	int ret;
> -
> -	encoder->bridge = dp->bridge;
> -	dp->bridge->encoder = encoder;
> -	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> -	if (ret) {
> -		DRM_ERROR("Failed to attach bridge to drm\n");
> -		return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -static int exynos_dp_create_connector(struct exynos_drm_display *display,
> -				      struct drm_encoder *encoder)
> -{
> -	struct exynos_dp_device *dp = display_to_dp(display);
> -	struct drm_connector *connector = &dp->connector;
> -	int ret;
> -
> -	dp->encoder = encoder;
> -
> -	/* Pre-empt DP connector creation if there's a bridge */
> -	if (dp->bridge) {
> -		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> -		if (!ret)
> -			return 0;
> -	}
> -
> -	connector->polled = DRM_CONNECTOR_POLL_HPD;
> -
> -	ret = drm_connector_init(dp->drm_dev, connector,
> -				 &exynos_dp_connector_funcs,
> -				 DRM_MODE_CONNECTOR_eDP);
> -	if (ret) {
> -		DRM_ERROR("Failed to initialize connector with drm\n");
> -		return ret;
> -	}
> -
> -	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> -	drm_connector_register(connector);
> -	drm_mode_connector_attach_encoder(connector, encoder);
> -
> -	if (dp->panel)
> -		ret = drm_panel_attach(dp->panel, &dp->connector);
> -
> -	return ret;
> -}
> -
>  static void exynos_dp_phy_init(struct exynos_dp_device *dp)
>  {
>  	if (dp->phy)
> @@ -1115,23 +1063,126 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp)
>  	}
>  }
> 
> -static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +/* returns the number of bridges attached */
> +static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> +		struct drm_encoder *encoder)
> +{
> +	int ret;
> +
> +	dp->bridge->next = dp->ptn_bridge;
> +	dp->bridge->encoder = encoder;
> +	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> +	if (ret) {
> +		DRM_ERROR("Failed to attach ptn bridge to drm\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int exynos_dp_bridge_attach(struct drm_bridge *bridge)
> +{
> +
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +	struct drm_encoder *encoder = dp->encoder;
> +	struct drm_connector *connector = &dp->connector;
> +	int ret;
> +
> +	if (!bridge->encoder) {
> +		DRM_ERROR("Parent encoder object not found");
> +		return -ENODEV;
> +	}
> +
> +	encoder->bridge = bridge;
> +
> +	/* Pre-empt DP connector creation if there's a bridge */
> +	if (dp->ptn_bridge) {
> +		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> +		if (ret)
> +			return -ENODEV;
> +	}
> +
> +	connector->polled = DRM_CONNECTOR_POLL_HPD;
> +
> +	ret = drm_connector_init(dp->drm_dev, connector,
> +			&exynos_dp_connector_funcs, DRM_MODE_CONNECTOR_eDP);
> +	if (ret) {
> +		DRM_ERROR("Failed to initialize connector with drm\n");
> +		return ret;
> +	}
> +
> +	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> +	drm_connector_register(connector);
> +	drm_mode_connector_attach_encoder(connector, encoder);
> +
> +	if (dp->panel)
> +		ret = drm_panel_attach(dp->panel, &dp->connector);
> +
> +	return ret;
> +}
> +
> +static void exynos_dp_bridge_nop(struct drm_bridge *bridge)
> +{
> +	/* do nothing */
> +}
> +
> +static void exynos_dp_bridge_enable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweron(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_ON;
> +}
> +
> +static void exynos_dp_bridge_disable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweroff(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_OFF;
> +}
> +
> +static const struct drm_bridge_funcs exynos_dp_bridge_funcs = {
> +	.enable = exynos_dp_bridge_enable,
> +	.disable = exynos_dp_bridge_disable,
> +	.pre_enable = exynos_dp_bridge_nop,
> +	.post_disable = exynos_dp_bridge_nop,
> +	.attach = exynos_dp_bridge_attach,
> +};
> +
> +static int exynos_dp_create_connector(struct exynos_drm_display *display,
> +				struct drm_encoder *encoder)
>  {
>  	struct exynos_dp_device *dp = display_to_dp(display);
> +	struct drm_device *drm_dev = dp->drm_dev;
> +	struct drm_bridge *bridge;
> +	int ret;
> 
> -	switch (mode) {
> -	case DRM_MODE_DPMS_ON:
> -		exynos_dp_poweron(dp);
> -		break;
> -	case DRM_MODE_DPMS_STANDBY:
> -	case DRM_MODE_DPMS_SUSPEND:
> -	case DRM_MODE_DPMS_OFF:
> -		exynos_dp_poweroff(dp);
> -		break;
> -	default:
> -		break;
> +	bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
> +	if (!bridge) {
> +		DRM_ERROR("failed to allocate for drm bridge\n");
> +		return -ENOMEM;
>  	}
> -	dp->dpms_mode = mode;
> +
> +	dp->bridge = bridge;
> +	dp->encoder = encoder;
> +
> +	bridge->driver_private = dp;
> +	bridge->encoder = dp->encoder;
> +	bridge->funcs = &exynos_dp_bridge_funcs;
> +
> +	ret = drm_bridge_attach(drm_dev, bridge);
> +	if (ret) {
> +		DRM_ERROR("failed to attach drm bridge\n");
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +{
> +	/* do nothing */
>  }
> 
>  static struct exynos_drm_display_ops exynos_dp_display_ops = {
> @@ -1243,7 +1294,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
>  		}
>  	}
> 
> -	if (!dp->panel && !dp->bridge) {
> +	if (!dp->panel && !dp->ptn_bridge) {
>  		ret = exynos_dp_dt_parse_panel(dp);
>  		if (ret)
>  			return ret;
> @@ -1316,7 +1367,7 @@ static void exynos_dp_unbind(struct device *dev, struct device *master,
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  }
> 
>  static const struct component_ops exynos_dp_ops = {
> @@ -1351,9 +1402,9 @@ static int exynos_dp_probe(struct platform_device *pdev)
>  	if (endpoint) {
>  		bridge_node = of_graph_get_remote_port_parent(endpoint);
>  		if (bridge_node) {
> -			dp->bridge = of_drm_find_bridge(bridge_node);
> +			dp->ptn_bridge = of_drm_find_bridge(bridge_node);
>  			of_node_put(bridge_node);
> -			if (!dp->bridge)
> +			if (!dp->ptn_bridge)
>  				return -EPROBE_DEFER;
>  		} else {
>  			return -EPROBE_DEFER;
> @@ -1375,7 +1426,7 @@ static int exynos_dp_suspend(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  	return 0;
>  }
> 
> @@ -1383,7 +1434,7 @@ static int exynos_dp_resume(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_ON);
> +	exynos_dp_bridge_enable(dp->bridge);
>  	return 0;
>  }
>  #endif
> @@ -1410,5 +1461,6 @@ struct platform_driver dp_driver = {
>  };
> 
>  MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
> +MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");

The same as above.

>  MODULE_DESCRIPTION("Samsung SoC DP Driver");
>  MODULE_LICENSE("GPL v2");
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.h b/drivers/gpu/drm/exynos/exynos_dp_core.h
> index c321ad5..f2584b8 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.h
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.h
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

The same as above.
Here, you just added 1 line. If we add someone to author
in this way, a lot of people should be added to author.

Best regards,
Jingoo Han

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -154,6 +155,7 @@ struct exynos_dp_device {
>  	struct drm_encoder	*encoder;
>  	struct drm_panel	*panel;
>  	struct drm_bridge	*bridge;
> +	struct drm_bridge	*ptn_bridge;
>  	struct clk		*clock;
>  	unsigned int		irq;
>  	void __iomem		*reg_base;
> --
> 2.1.2

WARNING: multiple messages have this Message-ID (diff)
From: jingoohan1@gmail.com (Jingoo Han)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 2/8] drm: exynos/dp: convert to drm bridge mode
Date: Thu, 6 Aug 2015 23:19:35 +0900	[thread overview]
Message-ID: <000001d0d052$f44fa3a0$dceeeae0$@com> (raw)
In-Reply-To: <1438870041-23130-1-git-send-email-ykk@rock-chips.com>

On Thursday, August 06, 2015 11:07 PM, Yakir Yang wrote:
> 
> In order to move exynos dp code to bridge directory,
> we need to convert driver drm bridge mode first. As
> dp driver already have a ptn3460 bridge, so we need
> to move ptn bridge to the next bridge of dp bridge.
> 
> Signed-off-by: Yakir Yang <ykk@rock-chips.com>
> ---
>  drivers/gpu/drm/exynos/exynos_dp_core.c | 196 ++++++++++++++++++++------------
>  drivers/gpu/drm/exynos/exynos_dp_core.h |   2 +
>  2 files changed, 126 insertions(+), 72 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
> index a8097a4..aa99e23 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

Please don't add this.
You just fixed some parts of this code. I don't find the reason
why you have to be added to author for this file.
If you want the title for an author, please send the patch
for a new IP, instead of modifying the exiting codes.

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -998,59 +999,6 @@ static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
>  	.best_encoder = exynos_dp_best_encoder,
>  };
> 
> -/* returns the number of bridges attached */
> -static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> -					struct drm_encoder *encoder)
> -{
> -	int ret;
> -
> -	encoder->bridge = dp->bridge;
> -	dp->bridge->encoder = encoder;
> -	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> -	if (ret) {
> -		DRM_ERROR("Failed to attach bridge to drm\n");
> -		return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -static int exynos_dp_create_connector(struct exynos_drm_display *display,
> -				      struct drm_encoder *encoder)
> -{
> -	struct exynos_dp_device *dp = display_to_dp(display);
> -	struct drm_connector *connector = &dp->connector;
> -	int ret;
> -
> -	dp->encoder = encoder;
> -
> -	/* Pre-empt DP connector creation if there's a bridge */
> -	if (dp->bridge) {
> -		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> -		if (!ret)
> -			return 0;
> -	}
> -
> -	connector->polled = DRM_CONNECTOR_POLL_HPD;
> -
> -	ret = drm_connector_init(dp->drm_dev, connector,
> -				 &exynos_dp_connector_funcs,
> -				 DRM_MODE_CONNECTOR_eDP);
> -	if (ret) {
> -		DRM_ERROR("Failed to initialize connector with drm\n");
> -		return ret;
> -	}
> -
> -	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> -	drm_connector_register(connector);
> -	drm_mode_connector_attach_encoder(connector, encoder);
> -
> -	if (dp->panel)
> -		ret = drm_panel_attach(dp->panel, &dp->connector);
> -
> -	return ret;
> -}
> -
>  static void exynos_dp_phy_init(struct exynos_dp_device *dp)
>  {
>  	if (dp->phy)
> @@ -1115,23 +1063,126 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp)
>  	}
>  }
> 
> -static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +/* returns the number of bridges attached */
> +static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
> +		struct drm_encoder *encoder)
> +{
> +	int ret;
> +
> +	dp->bridge->next = dp->ptn_bridge;
> +	dp->bridge->encoder = encoder;
> +	ret = drm_bridge_attach(encoder->dev, dp->bridge);
> +	if (ret) {
> +		DRM_ERROR("Failed to attach ptn bridge to drm\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int exynos_dp_bridge_attach(struct drm_bridge *bridge)
> +{
> +
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +	struct drm_encoder *encoder = dp->encoder;
> +	struct drm_connector *connector = &dp->connector;
> +	int ret;
> +
> +	if (!bridge->encoder) {
> +		DRM_ERROR("Parent encoder object not found");
> +		return -ENODEV;
> +	}
> +
> +	encoder->bridge = bridge;
> +
> +	/* Pre-empt DP connector creation if there's a bridge */
> +	if (dp->ptn_bridge) {
> +		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
> +		if (ret)
> +			return -ENODEV;
> +	}
> +
> +	connector->polled = DRM_CONNECTOR_POLL_HPD;
> +
> +	ret = drm_connector_init(dp->drm_dev, connector,
> +			&exynos_dp_connector_funcs, DRM_MODE_CONNECTOR_eDP);
> +	if (ret) {
> +		DRM_ERROR("Failed to initialize connector with drm\n");
> +		return ret;
> +	}
> +
> +	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> +	drm_connector_register(connector);
> +	drm_mode_connector_attach_encoder(connector, encoder);
> +
> +	if (dp->panel)
> +		ret = drm_panel_attach(dp->panel, &dp->connector);
> +
> +	return ret;
> +}
> +
> +static void exynos_dp_bridge_nop(struct drm_bridge *bridge)
> +{
> +	/* do nothing */
> +}
> +
> +static void exynos_dp_bridge_enable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweron(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_ON;
> +}
> +
> +static void exynos_dp_bridge_disable(struct drm_bridge *bridge)
> +{
> +	struct exynos_dp_device *dp = bridge->driver_private;
> +
> +	exynos_dp_poweroff(dp);
> +	dp->dpms_mode = DRM_MODE_DPMS_OFF;
> +}
> +
> +static const struct drm_bridge_funcs exynos_dp_bridge_funcs = {
> +	.enable = exynos_dp_bridge_enable,
> +	.disable = exynos_dp_bridge_disable,
> +	.pre_enable = exynos_dp_bridge_nop,
> +	.post_disable = exynos_dp_bridge_nop,
> +	.attach = exynos_dp_bridge_attach,
> +};
> +
> +static int exynos_dp_create_connector(struct exynos_drm_display *display,
> +				struct drm_encoder *encoder)
>  {
>  	struct exynos_dp_device *dp = display_to_dp(display);
> +	struct drm_device *drm_dev = dp->drm_dev;
> +	struct drm_bridge *bridge;
> +	int ret;
> 
> -	switch (mode) {
> -	case DRM_MODE_DPMS_ON:
> -		exynos_dp_poweron(dp);
> -		break;
> -	case DRM_MODE_DPMS_STANDBY:
> -	case DRM_MODE_DPMS_SUSPEND:
> -	case DRM_MODE_DPMS_OFF:
> -		exynos_dp_poweroff(dp);
> -		break;
> -	default:
> -		break;
> +	bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
> +	if (!bridge) {
> +		DRM_ERROR("failed to allocate for drm bridge\n");
> +		return -ENOMEM;
>  	}
> -	dp->dpms_mode = mode;
> +
> +	dp->bridge = bridge;
> +	dp->encoder = encoder;
> +
> +	bridge->driver_private = dp;
> +	bridge->encoder = dp->encoder;
> +	bridge->funcs = &exynos_dp_bridge_funcs;
> +
> +	ret = drm_bridge_attach(drm_dev, bridge);
> +	if (ret) {
> +		DRM_ERROR("failed to attach drm bridge\n");
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
> +{
> +	/* do nothing */
>  }
> 
>  static struct exynos_drm_display_ops exynos_dp_display_ops = {
> @@ -1243,7 +1294,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
>  		}
>  	}
> 
> -	if (!dp->panel && !dp->bridge) {
> +	if (!dp->panel && !dp->ptn_bridge) {
>  		ret = exynos_dp_dt_parse_panel(dp);
>  		if (ret)
>  			return ret;
> @@ -1316,7 +1367,7 @@ static void exynos_dp_unbind(struct device *dev, struct device *master,
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  }
> 
>  static const struct component_ops exynos_dp_ops = {
> @@ -1351,9 +1402,9 @@ static int exynos_dp_probe(struct platform_device *pdev)
>  	if (endpoint) {
>  		bridge_node = of_graph_get_remote_port_parent(endpoint);
>  		if (bridge_node) {
> -			dp->bridge = of_drm_find_bridge(bridge_node);
> +			dp->ptn_bridge = of_drm_find_bridge(bridge_node);
>  			of_node_put(bridge_node);
> -			if (!dp->bridge)
> +			if (!dp->ptn_bridge)
>  				return -EPROBE_DEFER;
>  		} else {
>  			return -EPROBE_DEFER;
> @@ -1375,7 +1426,7 @@ static int exynos_dp_suspend(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_OFF);
> +	exynos_dp_bridge_disable(dp->bridge);
>  	return 0;
>  }
> 
> @@ -1383,7 +1434,7 @@ static int exynos_dp_resume(struct device *dev)
>  {
>  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
> 
> -	exynos_dp_dpms(&dp->display, DRM_MODE_DPMS_ON);
> +	exynos_dp_bridge_enable(dp->bridge);
>  	return 0;
>  }
>  #endif
> @@ -1410,5 +1461,6 @@ struct platform_driver dp_driver = {
>  };
> 
>  MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
> +MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");

The same as above.

>  MODULE_DESCRIPTION("Samsung SoC DP Driver");
>  MODULE_LICENSE("GPL v2");
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.h b/drivers/gpu/drm/exynos/exynos_dp_core.h
> index c321ad5..f2584b8 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.h
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.h
> @@ -3,6 +3,7 @@
>   *
>   * Copyright (C) 2012 Samsung Electronics Co., Ltd.
>   * Author: Jingoo Han <jg1.han@samsung.com>
> + *         Yakir Yang <ykk@rock-chips.com>

The same as above.
Here, you just added 1 line. If we add someone to author
in this way, a lot of people should be added to author.

Best regards,
Jingoo Han

>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of the GNU General Public License as published by the
> @@ -154,6 +155,7 @@ struct exynos_dp_device {
>  	struct drm_encoder	*encoder;
>  	struct drm_panel	*panel;
>  	struct drm_bridge	*bridge;
> +	struct drm_bridge	*ptn_bridge;
>  	struct clk		*clock;
>  	unsigned int		irq;
>  	void __iomem		*reg_base;
> --
> 2.1.2

  reply	other threads:[~2015-08-06 14:19 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-06 13:49 [RFC PATCH 0/8] Add Analogix Core Display Port Driver Yakir Yang
2015-08-06 13:49 ` Yakir Yang
2015-08-06 13:58 ` [RFC PATCH 1/8] drm: exynos/dp: fix code style Yakir Yang
2015-08-06 13:58   ` Yakir Yang
2015-08-06 14:04 ` Yakir Yang
2015-08-06 14:04   ` Yakir Yang
2015-08-06 15:05   ` Joe Perches
2015-08-06 15:05     ` Joe Perches
2015-08-06 15:05     ` Joe Perches
2015-08-06 15:20     ` Yakir Yang
2015-08-06 15:20       ` Yakir Yang
2015-08-06 15:20       ` Yakir Yang
2015-08-06 14:07 ` [RFC PATCH 2/8] drm: exynos/dp: convert to drm bridge mode Yakir Yang
2015-08-06 14:07   ` Yakir Yang
2015-08-06 14:19   ` Jingoo Han [this message]
2015-08-06 14:19     ` Jingoo Han
2015-08-06 14:19     ` Jingoo Han
2015-08-06 14:29     ` Yakir Yang
2015-08-06 14:29       ` Yakir Yang
2015-08-06 14:29       ` Yakir Yang
2015-08-07 11:25       ` Daniel Vetter
2015-08-07 11:25         ` Daniel Vetter
2015-08-07 13:18         ` Yakir Yang
2015-08-07 13:18           ` Yakir Yang
2015-08-06 14:19 ` [RFC PATCH 3/8] drm: bridge: analogix_dp: split exynos dp driver to bridge dir Yakir Yang
2015-08-06 14:19   ` Yakir Yang
2015-08-06 14:33   ` Jingoo Han
2015-08-06 14:33     ` Jingoo Han
2015-08-06 14:57     ` Yakir Yang
2015-08-06 14:57       ` Yakir Yang
2015-08-06 14:57       ` Yakir Yang
2015-08-06 14:19 ` [RFC PATCH 4/8] drm: rockchip/dp: add rockchip platform dp driver Yakir Yang
2015-08-06 14:19   ` Yakir Yang
2015-08-06 14:19   ` Yakir Yang
2015-08-06 14:19 ` [RFC PATCH 5/8] drm: bridge/analogix_dp: add platform device type support Yakir Yang
2015-08-06 14:19   ` Yakir Yang
2015-08-06 14:19   ` Yakir Yang
2015-08-06 14:22 ` [RFC PATCH 6/8] drm: bridge: analogix_dp: add some rk3288 special registers setting Yakir Yang
2015-08-06 14:22   ` Yakir Yang
2015-08-06 14:22   ` Yakir Yang
2015-08-06 14:24 ` [RFC PATCH 7/8] drm: bridge: analogix_dp: try force hpd after plug in lookup failed Yakir Yang
2015-08-06 14:24   ` Yakir Yang
2015-08-06 14:24   ` Yakir Yang
2015-08-06 14:26 ` [RFC PATCH 8/8] drm: bridge/analogix_dp: expand the delay time for hpd detect Yakir Yang
2015-08-06 14:26   ` Yakir Yang
2015-08-06 14:26   ` Yakir Yang
2015-08-06 14:41 ` [RFC PATCH 0/8] Add Analogix Core Display Port Driver Jingoo Han
2015-08-06 14:41   ` Jingoo Han
2015-08-06 14:41   ` Jingoo Han
2015-08-06 15:00   ` Yakir Yang
2015-08-06 15:00     ` Yakir Yang
2015-08-07  6:11     ` Ajay kumar
2015-08-07  8:17       ` Yakir Yang

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='000001d0d052$f44fa3a0$dceeeae0$@com' \
    --to=jingoohan1@gmail.com \
    --cc=a.hajda@samsung.com \
    --cc=airlied@linux.ie \
    --cc=ajaykumar.rs@samsung.com \
    --cc=andy.yan@rock-chips.com \
    --cc=dianders@google.com \
    --cc=djkurtz@google.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=fabio.estevam@freescale.com \
    --cc=gustavo.padovan@collabora.co.uk \
    --cc=heiko@sntech.de \
    --cc=inki.dae@samsung.com \
    --cc=jy0922.shim@samsung.com \
    --cc=k.kozlowski@samsung.com \
    --cc=kgene@kernel.org \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=mark.yao@rock-chips.com \
    --cc=p.zabel@pengutronix.de \
    --cc=rmk+kernel@arm.linux.org.uk \
    --cc=sw0312.kim@samsung.com \
    --cc=tiwai@suse.de \
    --cc=treding@nvidia.com \
    --cc=vpalatin@chromium.org \
    --cc=ykk@rock-chips.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.