From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ajay kumar Subject: Re: [PATCH 7/7] drm/bridge: ptn3460: add drm_panel controls Date: Sat, 19 Apr 2014 01:25:27 +0530 Message-ID: References: <1397658786-26138-1-git-send-email-ajaykumar.rs@samsung.com> <1397658786-26138-8-git-send-email-ajaykumar.rs@samsung.com> <000501cf5ae8$27f19510$77d4bf30$%han@samsung.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0337596846==" Return-path: In-Reply-To: <000501cf5ae8$27f19510$77d4bf30$%han@samsung.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jingoo Han Cc: "linux-samsung-soc@vger.kernel.org" , Sean Paul , abrestic@chromium.org, sunil joshi , "dri-devel@lists.freedesktop.org" , a.hajda@samsung.com, Kyungmin Park , treding@nvidia.com, Prashanth G , Ajay Kumar , Rahul Sharma List-Id: linux-samsung-soc@vger.kernel.org --===============0337596846== Content-Type: multipart/alternative; boundary=bcaec547c9d5f7a36604f756871a --bcaec547c9d5f7a36604f756871a Content-Type: text/plain; charset=UTF-8 Hi Jingoo, On Fri, Apr 18, 2014 at 2:55 PM, Jingoo Han wrote: > On Wednesday, April 16, 2014 11:33 PM, Ajay Kumar wrote: > > > > attach ptn3460 connector to drm_panel and support drm_panel routines, > > if a valid drm_panel object is passed to ptn3460_init. > > > > Signed-off-by: Ajay Kumar > > --- > > drivers/gpu/drm/bridge/Kconfig | 1 + > > drivers/gpu/drm/bridge/ptn3460.c | 17 ++++++++++++++++- > > drivers/gpu/drm/exynos/exynos_dp_core.c | 15 +++++++++++---- > > include/drm/bridge/ptn3460.h | 6 ++++-- > > 4 files changed, 32 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/gpu/drm/bridge/Kconfig > b/drivers/gpu/drm/bridge/Kconfig > > index 884923f..3bc6845 100644 > > --- a/drivers/gpu/drm/bridge/Kconfig > > +++ b/drivers/gpu/drm/bridge/Kconfig > > @@ -2,4 +2,5 @@ config DRM_PTN3460 > > tristate "PTN3460 DP/LVDS bridge" > > depends on DRM > > select DRM_KMS_HELPER > > + select DRM_PANEL > > ---help--- > > diff --git a/drivers/gpu/drm/bridge/ptn3460.c > b/drivers/gpu/drm/bridge/ptn3460.c > > index f1d2afc..736c7a8 100644 > > --- a/drivers/gpu/drm/bridge/ptn3460.c > > +++ b/drivers/gpu/drm/bridge/ptn3460.c > > @@ -24,6 +24,7 @@ > > #include "drm_edid.h" > > #include "drm_crtc.h" > > #include "drm_crtc_helper.h" > > +#include > > Move '' as below. > > #include > #include > +#include > > #include "drmP.h" > > > > > > #include "bridge/ptn3460.h" > > > > @@ -38,6 +39,7 @@ struct ptn3460_bridge { > > struct i2c_client *client; > > struct drm_encoder *encoder; > > struct drm_bridge *bridge; > > + struct drm_panel *panel; > > struct edid *edid; > > int gpio_pd_n; > > int gpio_rst_n; > > @@ -126,6 +128,8 @@ static void ptn3460_pre_enable(struct drm_bridge > *bridge) > > gpio_set_value(ptn_bridge->gpio_rst_n, 1); > > } > > > > + drm_panel_pre_enable(ptn_bridge->panel); > > + > > /* > > * There's a bug in the PTN chip where it falsely asserts hotplug > before > > * it is fully functional. We're forced to wait for the maximum > start up > > @@ -142,6 +146,9 @@ static void ptn3460_pre_enable(struct drm_bridge > *bridge) > > > > static void ptn3460_enable(struct drm_bridge *bridge) > > { > > + struct ptn3460_bridge *ptn_bridge = bridge->driver_private; > > + > > + drm_panel_enable(ptn_bridge->panel); > > } > > > > static void ptn3460_disable(struct drm_bridge *bridge) > > @@ -153,6 +160,8 @@ static void ptn3460_disable(struct drm_bridge > *bridge) > > > > ptn_bridge->enabled = false; > > > > + drm_panel_disable(ptn_bridge->panel); > > + > > if (gpio_is_valid(ptn_bridge->gpio_rst_n)) > > gpio_set_value(ptn_bridge->gpio_rst_n, 1); > > > > @@ -265,7 +274,8 @@ struct drm_connector_funcs ptn3460_connector_funcs = > { > > }; > > > > int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, > > - struct i2c_client *client, struct device_node *node) > > + struct i2c_client *client, struct device_node *node, > > + struct drm_panel *panel) > > { > > int ret; > > struct drm_bridge *bridge; > > @@ -324,6 +334,11 @@ int ptn3460_init(struct drm_device *dev, struct > drm_encoder *encoder, > > goto err; > > } > > > > + if (panel) { > > + ptn_bridge->panel = panel; > > + drm_panel_attach(ptn_bridge->panel, > &ptn_bridge->connector); > > + } > > + > > bridge->driver_private = ptn_bridge; > > encoder->bridge = bridge; > > ptn_bridge->connector.polled = DRM_CONNECTOR_POLL_HPD; > > diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c > b/drivers/gpu/drm/exynos/exynos_dp_core.c > > index 6beeab6..7f550b6 100644 > > --- a/drivers/gpu/drm/exynos/exynos_dp_core.c > > +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c > > @@ -989,13 +989,14 @@ static bool find_bridge(const char *compat, struct > bridge_init *bridge) > > > > /* returns the number of bridges attached */ > > static int exynos_drm_attach_lcd_bridge(struct drm_device *dev, > > - struct drm_encoder *encoder) > > + struct drm_encoder *encoder, struct drm_panel *panel) > > { > > struct bridge_init bridge; > > int ret; > > > > if (find_bridge("nxp,ptn3460", &bridge)) { > > - ret = ptn3460_init(dev, encoder, bridge.client, > bridge.node); > > + ret = ptn3460_init(dev, encoder, bridge.client, > bridge.node, > > + > panel); > > 'panel' is too far. Please fix it as below. > > if (find_bridge("nxp,ptn3460", &bridge)) { > ret = ptn3460_init(dev, encoder, bridge.client, > bridge.node, > panel); > > Ok. > > > if (!ret) > > return 1; > > } > > @@ -1012,9 +1013,15 @@ static int exynos_dp_create_connector(struct > exynos_drm_display *display, > > dp->encoder = encoder; > > > > /* Pre-empt DP connector creation if there's a bridge */ > > - ret = exynos_drm_attach_lcd_bridge(dp->drm_dev, encoder); > > - if (ret) > > + ret = exynos_drm_attach_lcd_bridge(dp->drm_dev, encoder, > dp->drm_panel); > > + if (ret) { > > + /* Also set "dp->drm_panel = NULL" so that we don't end up > > + * controlling panel power both in exynos_dp and bridge > > + * DPMS routines. > > + */ > > Please fix it as below. > > + /* > + * Also set "dp->drm_panel = NULL" so that we don't end up > + * controlling panel power both in exynos_dp and bridge > + * DPMS routines. > + */ > > Right. I used wrong style for commenting! > Best regards, > Jingoo Han > > > + dp->drm_panel = NULL; > > return 0; > > + } > > > > connector->polled = DRM_CONNECTOR_POLL_HPD; > > > > diff --git a/include/drm/bridge/ptn3460.h b/include/drm/bridge/ptn3460.h > > index ff62344..570cebb 100644 > > --- a/include/drm/bridge/ptn3460.h > > +++ b/include/drm/bridge/ptn3460.h > > @@ -18,16 +18,18 @@ struct drm_device; > > struct drm_encoder; > > struct i2c_client; > > struct device_node; > > +struct drm_panel; > > > > #if defined(CONFIG_DRM_PTN3460) || defined(CONFIG_DRM_PTN3460_MODULE) > > > > int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, > > - struct i2c_client *client, struct device_node *node); > > + struct i2c_client *client, struct device_node *node, > > + struct drm_panel *panel); > > #else > > > > static inline int ptn3460_init(struct drm_device *dev, > > struct drm_encoder *encoder, struct i2c_client *client, > > - struct device_node *node) > > + struct device_node *node, struct drm_panel *panel) > > { > > return 0; > > } > > -- > > 1.8.1.2 > > Thanks and regards, Ajay Kumar --bcaec547c9d5f7a36604f756871a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi Jingoo,

On Fri, Apr 18, 2014 at 2:55 PM, Jingoo Han <jg1.han@samsu= ng.com> wrote:
On W= ednesday, April 16, 2014 11:33 PM, Ajay Kumar wrote:
>
> attach ptn3460 connector to drm_panel and support drm_panel routines,<= br> > if a valid drm_panel object is passed to ptn3460_init.
>
> Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
> ---
> =C2=A0drivers/gpu/drm/bridge/Kconfig =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0| =C2=A01 +
> =C2=A0drivers/gpu/drm/bridge/ptn3460.c =C2=A0 =C2=A0 =C2=A0 =C2=A0| 17= ++++++++++++++++-
> =C2=A0drivers/gpu/drm/exynos/exynos_dp_core.c | 15 +++++++++++----
> =C2=A0include/drm/bridge/ptn3460.h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0| =C2=A06 ++++--
> =C2=A04 files changed, 32 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/K= config
> index 884923f..3bc6845 100644
> --- a/drivers/gpu/drm/bridge/Kconfig
> +++ b/drivers/gpu/drm/bridge/Kconfig
> @@ -2,4 +2,5 @@ config DRM_PTN3460
> =C2=A0 =C2=A0 =C2=A0 tristate "PTN3460 DP/LVDS bridge"
> =C2=A0 =C2=A0 =C2=A0 depends on DRM
> =C2=A0 =C2=A0 =C2=A0 select DRM_KMS_HELPER
> + =C2=A0 =C2=A0 select DRM_PANEL
> =C2=A0 =C2=A0 =C2=A0 ---help---
> diff --git a/drivers/gpu/drm/bridge/ptn3460.c b/drivers/gpu/drm/bridge= /ptn3460.c
> index f1d2afc..736c7a8 100644
> --- a/drivers/gpu/drm/bridge/ptn3460.c
> +++ b/drivers/gpu/drm/bridge/ptn3460.c
> @@ -24,6 +24,7 @@
> =C2=A0#include "drm_edid.h"
> =C2=A0#include "drm_crtc.h"
> =C2=A0#include "drm_crtc_helper.h"
> +#include <drm/drm_panel.h>

Move '<drm/drm_panel.h>' as below.

#include <linux/gpio.h>
#include <linux/delay.h>
+#include <drm/drm_panel.h>

#include "drmP.h"


>
> =C2=A0#include "bridge/ptn3460.h"
>
> @@ -38,6 +39,7 @@ struct ptn3460_bridge {
> =C2=A0 =C2=A0 =C2=A0 struct i2c_client *client;
> =C2=A0 =C2=A0 =C2=A0 struct drm_encoder *encoder;
> =C2=A0 =C2=A0 =C2=A0 struct drm_bridge *bridge;
> + =C2=A0 =C2=A0 struct drm_panel *panel;
> =C2=A0 =C2=A0 =C2=A0 struct edid *edid;
> =C2=A0 =C2=A0 =C2=A0 int gpio_pd_n;
> =C2=A0 =C2=A0 =C2=A0 int gpio_rst_n;
> @@ -126,6 +128,8 @@ static void ptn3460_pre_enable(struct drm_bridge *= bridge)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 gpio_set_value(ptn_br= idge->gpio_rst_n, 1);
> =C2=A0 =C2=A0 =C2=A0 }
>
> + =C2=A0 =C2=A0 drm_panel_pre_enable(ptn_bridge->panel);
> +
> =C2=A0 =C2=A0 =C2=A0 /*
> =C2=A0 =C2=A0 =C2=A0 =C2=A0* There's a bug in the PTN chip where i= t falsely asserts hotplug before
> =C2=A0 =C2=A0 =C2=A0 =C2=A0* it is fully functional. We're forced = to wait for the maximum start up
> @@ -142,6 +146,9 @@ static void ptn3460_pre_enable(struct drm_bridge *= bridge)
>
> =C2=A0static void ptn3460_enable(struct drm_bridge *bridge)
> =C2=A0{
> + =C2=A0 =C2=A0 struct ptn3460_bridge *ptn_bridge =3D bridge->drive= r_private;
> +
> + =C2=A0 =C2=A0 drm_panel_enable(ptn_bridge->panel);
> =C2=A0}
>
> =C2=A0static void ptn3460_disable(struct drm_bridge *bridge)
> @@ -153,6 +160,8 @@ static void ptn3460_disable(struct drm_bridge *bri= dge)
>
> =C2=A0 =C2=A0 =C2=A0 ptn_bridge->enabled =3D false;
>
> + =C2=A0 =C2=A0 drm_panel_disable(ptn_bridge->panel);
> +
> =C2=A0 =C2=A0 =C2=A0 if (gpio_is_valid(ptn_bridge->gpio_rst_n))
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 gpio_set_value(ptn_br= idge->gpio_rst_n, 1);
>
> @@ -265,7 +274,8 @@ struct drm_connector_funcs ptn3460_connector_funcs= =3D {
> =C2=A0};
>
> =C2=A0int ptn3460_init(struct drm_device *dev, struct drm_encoder *enc= oder,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct i2c_client *client,= struct device_node *node)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct i2c_client *client,= struct device_node *node,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_panel *panel) > =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 int ret;
> =C2=A0 =C2=A0 =C2=A0 struct drm_bridge *bridge;
> @@ -324,6 +334,11 @@ int ptn3460_init(struct drm_device *dev, struct d= rm_encoder *encoder,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto err;
> =C2=A0 =C2=A0 =C2=A0 }
>
> + =C2=A0 =C2=A0 if (panel) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ptn_bridge->panel =3D p= anel;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 drm_panel_attach(ptn_bridg= e->panel, &ptn_bridge->connector);
> + =C2=A0 =C2=A0 }
> +
> =C2=A0 =C2=A0 =C2=A0 bridge->driver_private =3D ptn_bridge;
> =C2=A0 =C2=A0 =C2=A0 encoder->bridge =3D bridge;
> =C2=A0 =C2=A0 =C2=A0 ptn_bridge->connector.polled =3D DRM_CONNECTOR= _POLL_HPD;
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm= /exynos/exynos_dp_core.c
> index 6beeab6..7f550b6 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -989,13 +989,14 @@ static bool find_bridge(const char *compat, stru= ct bridge_init *bridge)
>
> =C2=A0/* returns the number of bridges attached */
> =C2=A0static int exynos_drm_attach_lcd_bridge(struct drm_device *dev,<= br> > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_encoder *encode= r)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_encoder *encode= r, struct drm_panel *panel)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 struct bridge_init bridge;
> =C2=A0 =C2=A0 =C2=A0 int ret;
>
> =C2=A0 =C2=A0 =C2=A0 if (find_bridge("nxp,ptn3460", &bri= dge)) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D ptn3460_init(dev, = encoder, bridge.client, bridge.node);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D ptn3460_init(dev, = encoder, bridge.client, bridge.node,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 panel);

'panel' is too far. Please fix it as below.

=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (find_bridge("nxp,ptn3460", &b= ridge)) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ret =3D ptn3460_init(dev, encoder, bridge.client, bridge.node,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pa= nel);

Ok.

> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ret)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 return 1;
> =C2=A0 =C2=A0 =C2=A0 }
> @@ -1012,9 +1013,15 @@ static int exynos_dp_create_connector(struct ex= ynos_drm_display *display,
> =C2=A0 =C2=A0 =C2=A0 dp->encoder =3D encoder;
>
> =C2=A0 =C2=A0 =C2=A0 /* Pre-empt DP connector creation if there's = a bridge */
> - =C2=A0 =C2=A0 ret =3D exynos_drm_attach_lcd_bridge(dp->drm_dev, e= ncoder);
> - =C2=A0 =C2=A0 if (ret)
> + =C2=A0 =C2=A0 ret =3D exynos_drm_attach_lcd_bridge(dp->drm_dev, e= ncoder, dp->drm_panel);
> + =C2=A0 =C2=A0 if (ret) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Also set "dp->d= rm_panel =3D NULL" so that we don't end up
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* controlling panel = power both in exynos_dp and bridge
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* DPMS routines.
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/

Please fix it as below.

=C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
=C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * Also set "d= p->drm_panel =3D NULL" so that we don't end up
=C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * = controlling panel power both in exynos_dp and bridge
=C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * DPMS routines. =C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */

Right. I used wrong style for commenting!
= =C2=A0
Best regards,
Jingoo Han

> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dp->drm_panel =3D NULL;=
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;
> + =C2=A0 =C2=A0 }
>
> =C2=A0 =C2=A0 =C2=A0 connector->polled =3D DRM_CONNECTOR_POLL_HPD;<= br> >
> diff --git a/include/drm/bridge/ptn3460.h b/include/drm/bridge/ptn3460= .h
> index ff62344..570cebb 100644
> --- a/include/drm/bridge/ptn3460.h
> +++ b/include/drm/bridge/ptn3460.h
> @@ -18,16 +18,18 @@ struct drm_device;
> =C2=A0struct drm_encoder;
> =C2=A0struct i2c_client;
> =C2=A0struct device_node;
> +struct drm_panel;
>
> =C2=A0#if defined(CONFIG_DRM_PTN3460) || defined(CONFIG_DRM_PTN3460_MO= DULE)
>
> =C2=A0int ptn3460_init(struct drm_device *dev, struct drm_encoder *enc= oder,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct i2c_client *client,= struct device_node *node);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct i2c_client *client,= struct device_node *node,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_panel *panel);<= br> > =C2=A0#else
>
> =C2=A0static inline int ptn3460_init(struct drm_device *dev,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct drm_encoder *e= ncoder, struct i2c_client *client,
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct device_node *node)<= br> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct device_node *node, = struct drm_panel *panel)
> =C2=A0{
> =C2=A0 =C2=A0 =C2=A0 return 0;
> =C2=A0}
> --
> 1.8.1.2


Thanks = and regards,
Ajay Kumar
--bcaec547c9d5f7a36604f756871a-- --===============0337596846== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel --===============0337596846==--