From mboxrd@z Thu Jan 1 00:00:00 1970 From: Inki Dae Subject: Re: [PATCH v4 14/34] drm/exynos: hdmi: remove the i2c drivers and use devtree Date: Wed, 19 Feb 2014 20:43:38 +0900 Message-ID: References: <1391116773-28471-1-git-send-email-seanpaul@chromium.org> <1391116773-28471-15-git-send-email-seanpaul@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-we0-f171.google.com (mail-we0-f171.google.com [74.125.82.171]) by gabe.freedesktop.org (Postfix) with ESMTP id 05EB0FACE9 for ; Wed, 19 Feb 2014 03:43:39 -0800 (PST) Received: by mail-we0-f171.google.com with SMTP id u56so229176wes.16 for ; Wed, 19 Feb 2014 03:43:39 -0800 (PST) In-Reply-To: <1391116773-28471-15-git-send-email-seanpaul@chromium.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org To: Sean Paul Cc: =?ISO-8859-1?Q?St=E9phane_Marchesin?= , DRI mailing list List-Id: dri-devel@lists.freedesktop.org 2014-01-31 6:19 GMT+09:00 Sean Paul : > From: Daniel Kurtz > > The i2c client was previously being passed into the hdmi driver via a > dedicated i2c driver, and then a global variable. This patch removes all > of that and just uses the device tree to get the i2c_client. This patch > also properly references the client so we don't lose it before we're > done with it. > > Signed-off-by: Daniel Kurtz > [seanpaul changed to phandle lookup instead of using of node name] > Signed-off-by: Sean Paul > --- > > Changes in v2: > - Change include to linux/i2c.h instead of linux/of_i2c.h > Changes in v3: None > Changes in v4: > - Changed to find phy via phandle instead of by name > > .../devicetree/bindings/video/exynos_hdmi.txt | 5 ++ > drivers/gpu/drm/exynos/Makefile | 1 - > drivers/gpu/drm/exynos/exynos_ddc.c | 63 --------------------- > drivers/gpu/drm/exynos/exynos_hdmi.c | 59 +++++++++----------- > drivers/gpu/drm/exynos/exynos_hdmi.h | 23 -------- > drivers/gpu/drm/exynos/exynos_hdmiphy.c | 65 ---------------------- > 6 files changed, 32 insertions(+), 184 deletions(-) > delete mode 100644 drivers/gpu/drm/exynos/exynos_ddc.c > delete mode 100644 drivers/gpu/drm/exynos/exynos_hdmi.h > delete mode 100644 drivers/gpu/drm/exynos/exynos_hdmiphy.c > > diff --git a/Documentation/devicetree/bindings/video/exynos_hdmi.txt b/Documentation/devicetree/bindings/video/exynos_hdmi.txt > index 50decf8..f9187a2 100644 > --- a/Documentation/devicetree/bindings/video/exynos_hdmi.txt > +++ b/Documentation/devicetree/bindings/video/exynos_hdmi.txt > @@ -25,6 +25,9 @@ Required properties: > sclk_pixel. > - clock-names: aliases as per driver requirements for above clock IDs: > "hdmi", "sclk_hdmi", "sclk_pixel", "sclk_hdmiphy" and "mout_hdmi". > +- ddc: phandle to the hdmi ddc node > +- phy: phandle to the hdmi phy node > + > Example: > > hdmi { > @@ -32,4 +35,6 @@ Example: > reg = <0x14530000 0x100000>; > interrupts = <0 95 0>; > hpd-gpio = <&gpx3 7 1>; > + ddc = <&hdmi_ddc_node>; > + phy = <&hdmi_phy_node>; > }; > diff --git a/drivers/gpu/drm/exynos/Makefile b/drivers/gpu/drm/exynos/Makefile > index 639b49e..819961a 100644 > --- a/drivers/gpu/drm/exynos/Makefile > +++ b/drivers/gpu/drm/exynos/Makefile > @@ -12,7 +12,6 @@ exynosdrm-$(CONFIG_DRM_EXYNOS_IOMMU) += exynos_drm_iommu.o > exynosdrm-$(CONFIG_DRM_EXYNOS_DMABUF) += exynos_drm_dmabuf.o > exynosdrm-$(CONFIG_DRM_EXYNOS_FIMD) += exynos_drm_fimd.o > exynosdrm-$(CONFIG_DRM_EXYNOS_HDMI) += exynos_hdmi.o exynos_mixer.o \ > - exynos_ddc.o exynos_hdmiphy.o \ > exynos_drm_hdmi.o > exynosdrm-$(CONFIG_DRM_EXYNOS_VIDI) += exynos_drm_vidi.o > exynosdrm-$(CONFIG_DRM_EXYNOS_G2D) += exynos_drm_g2d.o > diff --git a/drivers/gpu/drm/exynos/exynos_ddc.c b/drivers/gpu/drm/exynos/exynos_ddc.c > deleted file mode 100644 > index 6a8c84e..0000000 > --- a/drivers/gpu/drm/exynos/exynos_ddc.c > +++ /dev/null > @@ -1,63 +0,0 @@ > -/* > - * Copyright (C) 2011 Samsung Electronics Co.Ltd > - * Authors: > - * Seung-Woo Kim > - * Inki Dae > - * > - * 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 > - * Free Software Foundation; either version 2 of the License, or (at your > - * option) any later version. > - * > - */ > - > -#include > - > -#include > -#include > -#include > - > -#include "exynos_drm_drv.h" > -#include "exynos_hdmi.h" > - > -static int s5p_ddc_probe(struct i2c_client *client, > - const struct i2c_device_id *dev_id) > -{ > - hdmi_attach_ddc_client(client); > - > - dev_info(&client->adapter->dev, > - "attached %s into i2c adapter successfully\n", > - client->name); > - > - return 0; > -} > - > -static int s5p_ddc_remove(struct i2c_client *client) > -{ > - dev_info(&client->adapter->dev, > - "detached %s from i2c adapter successfully\n", > - client->name); > - > - return 0; > -} > - > -static struct of_device_id hdmiddc_match_types[] = { > - { > - .compatible = "samsung,exynos5-hdmiddc", > - }, { > - .compatible = "samsung,exynos4210-hdmiddc", > - }, { > - /* end node */ > - } > -}; > - > -struct i2c_driver ddc_driver = { > - .driver = { > - .name = "exynos-hdmiddc", > - .owner = THIS_MODULE, > - .of_match_table = hdmiddc_match_types, > - }, > - .probe = s5p_ddc_probe, > - .remove = s5p_ddc_remove, > - .command = NULL, > -}; > diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c > index 7e70228..97a0e57 100644 > --- a/drivers/gpu/drm/exynos/exynos_hdmi.c > +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c > @@ -33,6 +33,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -40,8 +41,6 @@ > #include "exynos_drm_drv.h" > #include "exynos_drm_hdmi.h" > > -#include "exynos_hdmi.h" > - > #include > #include > > @@ -1855,20 +1854,6 @@ fail: > return -ENODEV; > } > > -static struct i2c_client *hdmi_ddc, *hdmi_hdmiphy; > - > -void hdmi_attach_ddc_client(struct i2c_client *ddc) > -{ > - if (ddc) > - hdmi_ddc = ddc; > -} > - > -void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy) > -{ > - if (hdmiphy) > - hdmi_hdmiphy = hdmiphy; > -} > - > static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata > (struct device *dev) > { > @@ -1913,6 +1898,7 @@ static int hdmi_probe(struct platform_device *pdev) > struct s5p_hdmi_platform_data *pdata; > struct resource *res; > const struct of_device_id *match; > + struct device_node *ddc_node, *phy_node; > int ret; > > if (!dev->of_node) > @@ -1963,21 +1949,30 @@ static int hdmi_probe(struct platform_device *pdev) > } > > /* DDC i2c driver */ > - if (i2c_add_driver(&ddc_driver)) { > - DRM_ERROR("failed to register ddc i2c driver\n"); > - return -ENOENT; > + ddc_node = of_parse_phandle(dev->of_node, "ddc", 0); > + if (!ddc_node) { > + DRM_ERROR("Failed to find ddc node in device tree\n"); > + return -ENODEV; > + } > + hdata->ddc_port = of_find_i2c_device_by_node(ddc_node); As Tomasz commented, it would better to get i2c_adapter instead of i2c_client. > + if (!hdata->ddc_port) { > + DRM_ERROR("Failed to get ddc i2c client by node\n"); > + return -ENODEV; > } > - > - hdata->ddc_port = hdmi_ddc; > > /* hdmiphy i2c driver */ > - if (i2c_add_driver(&hdmiphy_driver)) { > - DRM_ERROR("failed to register hdmiphy i2c driver\n"); > - ret = -ENOENT; > + phy_node = of_parse_phandle(dev->of_node, "phy", 0); > + if (!phy_node) { > + DRM_ERROR("Failed to find hdmiphy node in device tree\n"); > + ret = -ENODEV; > + goto err_ddc; > + } > + hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node); You should also consider other SoCs having APB PHY, not I2C PHY. Actually, Exynos5420 SoC has APB PHY. Thanks, Inki Dae > + if (!hdata->hdmiphy_port) { > + DRM_ERROR("Failed to get hdmi phy i2c client from node\n"); > + ret = -ENODEV; > goto err_ddc; > } > - > - hdata->hdmiphy_port = hdmi_hdmiphy; > > hdata->irq = gpio_to_irq(hdata->hpd_gpio); > if (hdata->irq < 0) { > @@ -2008,22 +2003,22 @@ static int hdmi_probe(struct platform_device *pdev) > return 0; > > err_hdmiphy: > - i2c_del_driver(&hdmiphy_driver); > + put_device(&hdata->hdmiphy_port->dev); > err_ddc: > - i2c_del_driver(&ddc_driver); > + put_device(&hdata->ddc_port->dev); > return ret; > } > > static int hdmi_remove(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > + struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev); > + struct hdmi_context *hdata = ctx->ctx; > > pm_runtime_disable(dev); > > - /* hdmiphy i2c driver */ > - i2c_del_driver(&hdmiphy_driver); > - /* DDC i2c driver */ > - i2c_del_driver(&ddc_driver); > + put_device(&hdata->hdmiphy_port->dev); > + put_device(&hdata->ddc_port->dev); > > return 0; > } > diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.h b/drivers/gpu/drm/exynos/exynos_hdmi.h > deleted file mode 100644 > index 0ddf395..0000000 > --- a/drivers/gpu/drm/exynos/exynos_hdmi.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* > - * > - * Copyright (c) 2011 Samsung Electronics Co., Ltd. > - * Authors: > - * Inki Dae > - * Seung-Woo Kim > - * > - * 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 > - * Free Software Foundation; either version 2 of the License, or (at your > - * option) any later version. > - */ > - > -#ifndef _EXYNOS_HDMI_H_ > -#define _EXYNOS_HDMI_H_ > - > -void hdmi_attach_ddc_client(struct i2c_client *ddc); > -void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy); > - > -extern struct i2c_driver hdmiphy_driver; > -extern struct i2c_driver ddc_driver; > - > -#endif > diff --git a/drivers/gpu/drm/exynos/exynos_hdmiphy.c b/drivers/gpu/drm/exynos/exynos_hdmiphy.c > deleted file mode 100644 > index 59abb14..0000000 > --- a/drivers/gpu/drm/exynos/exynos_hdmiphy.c > +++ /dev/null > @@ -1,65 +0,0 @@ > -/* > - * Copyright (C) 2011 Samsung Electronics Co.Ltd > - * Authors: > - * Seung-Woo Kim > - * Inki Dae > - * > - * 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 > - * Free Software Foundation; either version 2 of the License, or (at your > - * option) any later version. > - * > - */ > - > -#include > - > -#include > -#include > -#include > - > -#include "exynos_drm_drv.h" > -#include "exynos_hdmi.h" > - > - > -static int hdmiphy_probe(struct i2c_client *client, > - const struct i2c_device_id *id) > -{ > - hdmi_attach_hdmiphy_client(client); > - > - dev_info(&client->adapter->dev, "attached s5p_hdmiphy " > - "into i2c adapter successfully\n"); > - > - return 0; > -} > - > -static int hdmiphy_remove(struct i2c_client *client) > -{ > - dev_info(&client->adapter->dev, "detached s5p_hdmiphy " > - "from i2c adapter successfully\n"); > - > - return 0; > -} > - > -static struct of_device_id hdmiphy_match_types[] = { > - { > - .compatible = "samsung,exynos5-hdmiphy", > - }, { > - .compatible = "samsung,exynos4210-hdmiphy", > - }, { > - .compatible = "samsung,exynos4212-hdmiphy", > - }, { > - /* end node */ > - } > -}; > - > -struct i2c_driver hdmiphy_driver = { > - .driver = { > - .name = "exynos-hdmiphy", > - .owner = THIS_MODULE, > - .of_match_table = hdmiphy_match_types, > - }, > - .probe = hdmiphy_probe, > - .remove = hdmiphy_remove, > - .command = NULL, > -}; > -EXPORT_SYMBOL(hdmiphy_driver); > -- > 1.8.5.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel