[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