[PATCH v4 14/34] drm/exynos: hdmi: remove the i2c drivers and use devtree

Inki Dae inki.dae at samsung.com
Wed Feb 19 03:43:38 PST 2014


2014-01-31 6:19 GMT+09:00 Sean Paul <seanpaul at chromium.org>:
> From: Daniel Kurtz <djkurtz at chromium.org>
>
> 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 <djkurtz at chromium.org>
> [seanpaul changed to phandle lookup instead of using of node name]
> Signed-off-by: Sean Paul <seanpaul at chromium.org>
> ---
>
> 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 <sw0312.kim at samsung.com>
> - *     Inki Dae <inki.dae at samsung.com>
> - *
> - * 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 <drm/drmP.h>
> -
> -#include <linux/kernel.h>
> -#include <linux/i2c.h>
> -#include <linux/of.h>
> -
> -#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 <linux/regulator/consumer.h>
>  #include <linux/io.h>
>  #include <linux/of.h>
> +#include <linux/i2c.h>
>  #include <linux/of_gpio.h>
>
>  #include <drm/exynos_drm.h>
> @@ -40,8 +41,6 @@
>  #include "exynos_drm_drv.h"
>  #include "exynos_drm_hdmi.h"
>
> -#include "exynos_hdmi.h"
> -
>  #include <linux/gpio.h>
>  #include <media/s5p_hdmi.h>
>
> @@ -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 <inki.dae at samsung.com>
> - *     Seung-Woo Kim <sw0312.kim at samsung.com>
> - *
> - * 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 <sw0312.kim at samsung.com>
> - *     Inki Dae <inki.dae at samsung.com>
> - *
> - * 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 <drm/drmP.h>
> -
> -#include <linux/kernel.h>
> -#include <linux/i2c.h>
> -#include <linux/of.h>
> -
> -#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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list