drm/exynos/hdmi: convert to gpiod API
authorAndrzej Hajda <a.hajda@samsung.com>
Mon, 24 Oct 2016 10:12:24 +0000 (12:12 +0200)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:54:09 +0000 (13:54 +0900)
The patch converts API to gpiod and moves initialization code
to hdmi_resources_init.

Change-Id: I5136395b16f3f50defa81be6406d137f3c103e35
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_hdmi.c

index 96ca55b241c9f7137b747e1abd5c853a5bd1c71c..a769587f78e785e86a1c0f60e6ef371c646b0ac8 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
 #include <linux/clk.h>
+#include <linux/gpio/consumer.h>
 #include <linux/regulator/consumer.h>
 #include <linux/io.h>
 #include <linux/of_address.h>
@@ -46,9 +47,6 @@
 #include "exynos_drm_crtc.h"
 #include "exynos_mixer.h"
 
-#include <linux/gpio.h>
-#include <media/s5p_hdmi.h>
-
 #define ctx_from_connector(c)  container_of(c, struct hdmi_context, connector)
 
 #define HOTPLUG_DEBOUNCE_MS            1100
@@ -149,7 +147,7 @@ struct hdmi_context {
        void __iomem                    *regs_hdmiphy;
        struct i2c_client               *hdmiphy_port;
        struct i2c_adapter              *ddc_adpt;
-       int                             hpd_gpio;
+       struct gpio_desc                *hpd_gpio;
        int                             irq;
        struct regmap                   *pmureg;
        struct regmap                   *sysreg;
@@ -893,10 +891,10 @@ static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
 {
        struct hdmi_context *hdata = ctx_from_connector(connector);
 
-       hdata->hpd = gpio_get_value(hdata->hpd_gpio);
+       if (gpiod_get_value(hdata->hpd_gpio))
+               return connector_status_connected;
 
-       return hdata->hpd ? connector_status_connected :
-                       connector_status_disconnected;
+       return connector_status_disconnected;
 }
 
 static void hdmi_connector_destroy(struct drm_connector *connector)
@@ -1877,6 +1875,18 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
 
        DRM_DEBUG_KMS("HDMI resource init\n");
 
+       hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
+       if (IS_ERR(hdata->hpd_gpio)) {
+               DRM_ERROR("cannot get hpd gpio property\n");
+               return PTR_ERR(hdata->hpd_gpio);
+       }
+
+       hdata->irq = gpiod_to_irq(hdata->hpd_gpio);
+       if (hdata->irq < 0) {
+               DRM_ERROR("failed to get GPIO irq\n");
+               return  hdata->irq;
+       }
+
        ret = hdmi_clk_init(hdata);
        if (ret)
                return ret;
@@ -1904,30 +1914,6 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        return hdmi_bridge_init(hdata);
 }
 
-static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
-                                       (struct device *dev)
-{
-       struct device_node *np = dev->of_node;
-       struct s5p_hdmi_platform_data *pd;
-       u32 value;
-
-       pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
-       if (!pd)
-               goto err_data;
-
-       if (!of_find_property(np, "hpd-gpio", &value)) {
-               DRM_ERROR("no hpd gpio property found\n");
-               goto err_data;
-       }
-
-       pd->hpd_gpio = of_get_named_gpio(np, "hpd-gpio", 0);
-
-       return pd;
-
-err_data:
-       return NULL;
-}
-
 static struct of_device_id hdmi_match_types[] = {
        {
                .compatible = "samsung,exynos5-hdmi",
@@ -1991,7 +1977,6 @@ static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
 static int hdmi_probe(struct platform_device *pdev)
 {
        struct device_node *ddc_node, *phy_node;
-       struct s5p_hdmi_platform_data *pdata;
        const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct hdmi_context *hdata;
@@ -2001,10 +1986,6 @@ static int hdmi_probe(struct platform_device *pdev)
        if (!dev->of_node)
                return -ENODEV;
 
-       pdata = drm_hdmi_dt_parse_pdata(dev);
-       if (!pdata)
-               return -EINVAL;
-
        hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
        if (!hdata)
                return -ENOMEM;
@@ -2019,7 +2000,6 @@ static int hdmi_probe(struct platform_device *pdev)
                return -ENODEV;
        hdata->drv_data = match->data;
 
-       hdata->hpd_gpio = pdata->hpd_gpio;
        hdata->dev = dev;
 
        ret = hdmi_resources_init(hdata);
@@ -2035,12 +2015,6 @@ static int hdmi_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
-       if (ret) {
-               DRM_ERROR("failed to request HPD gpio\n");
-               return ret;
-       }
-
        ddc_node = hdmi_legacy_ddc_dt_binding(dev);
        if (ddc_node)
                goto out_get_ddc_adpt;
@@ -2088,13 +2062,6 @@ out_get_phy_port:
                }
        }
 
-       hdata->irq = gpio_to_irq(hdata->hpd_gpio);
-       if (hdata->irq < 0) {
-               DRM_ERROR("failed to get GPIO irq\n");
-               ret = hdata->irq;
-               goto err_hdmiphy;
-       }
-
        INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
 
        ret = devm_request_threaded_irq(dev, hdata->irq, NULL,