drm: bridge: dw-hdmi: Move IRQ and IO resource allocation to common code
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 17 Jan 2017 08:28:57 +0000 (10:28 +0200)
committerArchit Taneja <architt@codeaurora.org>
Wed, 18 Jan 2017 03:59:32 +0000 (09:29 +0530)
There's no need to duplicate identical code in multiple drivers (two at
the moment, one more to come soon). Move it to the dw-hdmi core where it
can be shared. If resource allocation ever becomes device-specific later
we'll always have the option of splitting it out again.

While it at pass the platform device to the bind function to avoid
having to cast struct device to struct platform_device.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Jose Abreu <joabreu@synopsys.com>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20170117082910.27023-8-laurent.pinchart+renesas@ideasonboard.com
drivers/gpu/drm/bridge/dw-hdmi.c
drivers/gpu/drm/imx/dw_hdmi-imx.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
include/drm/bridge/dw_hdmi.h

index 488dc1a9204f33294b9ad54aec19598fa9aaaf72..563cbec47da65b90ebba8301c904bb9d148f50f6 100644 (file)
@@ -1843,14 +1843,16 @@ static int dw_hdmi_register(struct drm_encoder *encoder, struct dw_hdmi *hdmi)
        return 0;
 }
 
-int dw_hdmi_bind(struct device *dev, struct drm_encoder *encoder,
-                struct resource *iores, int irq,
+int dw_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder,
                 const struct dw_hdmi_plat_data *plat_data)
 {
+       struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct platform_device_info pdevinfo;
        struct device_node *ddc_node;
        struct dw_hdmi *hdmi;
+       struct resource *iores;
+       int irq;
        int ret;
        u32 val = 1;
        u8 config0;
@@ -1903,6 +1905,7 @@ int dw_hdmi_bind(struct device *dev, struct drm_encoder *encoder,
                dev_dbg(hdmi->dev, "no ddc property found\n");
        }
 
+       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        hdmi->regs = devm_ioremap_resource(dev, iores);
        if (IS_ERR(hdmi->regs)) {
                ret = PTR_ERR(hdmi->regs);
@@ -1945,6 +1948,10 @@ int dw_hdmi_bind(struct device *dev, struct drm_encoder *encoder,
 
        initialize_hdmi_ih_mutes(hdmi);
 
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               goto err_iahb;
+
        ret = devm_request_threaded_irq(dev, irq, dw_hdmi_hardirq,
                                        dw_hdmi_irq, IRQF_SHARED,
                                        dev_name(dev), hdmi);
@@ -2025,7 +2032,7 @@ int dw_hdmi_bind(struct device *dev, struct drm_encoder *encoder,
        if (hdmi->i2c)
                dw_hdmi_i2c_init(hdmi);
 
-       dev_set_drvdata(dev, hdmi);
+       platform_set_drvdata(pdev, hdmi);
 
        return 0;
 
index f79665801543cf692cbdd93246984720ac2587ea..f645275e6e635e5d310c7e83416f0648b41be5db 100644 (file)
@@ -207,8 +207,6 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
        struct drm_device *drm = data;
        struct drm_encoder *encoder;
        struct imx_hdmi *hdmi;
-       struct resource *iores;
-       int irq;
        int ret;
 
        if (!pdev->dev.of_node)
@@ -223,14 +221,6 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
        hdmi->dev = &pdev->dev;
        encoder = &hdmi->encoder;
 
-       irq = platform_get_irq(pdev, 0);
-       if (irq < 0)
-               return irq;
-
-       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!iores)
-               return -ENXIO;
-
        encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);
        /*
         * If we failed to find the CRTC(s) which this encoder is
@@ -249,7 +239,7 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
        drm_encoder_init(drm, encoder, &dw_hdmi_imx_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
-       ret = dw_hdmi_bind(dev, encoder, iores, irq, plat_data);
+       ret = dw_hdmi_bind(pdev, encoder, plat_data);
 
        /*
         * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(),
index e8fb5c56b22426b1d783b7e23325b4d96b4cc4c1..a6d4a0236e8f6c96ee9c5dafdcbd73591dc4e7f9 100644 (file)
@@ -257,8 +257,6 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
        struct drm_device *drm = data;
        struct drm_encoder *encoder;
        struct rockchip_hdmi *hdmi;
-       struct resource *iores;
-       int irq;
        int ret;
 
        if (!pdev->dev.of_node)
@@ -273,14 +271,6 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
        hdmi->dev = &pdev->dev;
        encoder = &hdmi->encoder;
 
-       irq = platform_get_irq(pdev, 0);
-       if (irq < 0)
-               return irq;
-
-       iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!iores)
-               return -ENXIO;
-
        encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);
        /*
         * If we failed to find the CRTC(s) which this encoder is
@@ -301,7 +291,7 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
        drm_encoder_init(drm, encoder, &dw_hdmi_rockchip_encoder_funcs,
                         DRM_MODE_ENCODER_TMDS, NULL);
 
-       ret = dw_hdmi_bind(dev, encoder, iores, irq, plat_data);
+       ret = dw_hdmi_bind(pdev, encoder, plat_data);
 
        /*
         * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(),
index 11edda631a9d2887273186bad232778e182485fe..94ff6edd070b53867cba48b836b0bc9fa1536cf2 100644 (file)
@@ -57,8 +57,7 @@ struct dw_hdmi_plat_data {
 };
 
 void dw_hdmi_unbind(struct device *dev);
-int dw_hdmi_bind(struct device *dev, struct drm_encoder *encoder,
-                struct resource *iores, int irq,
+int dw_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder,
                 const struct dw_hdmi_plat_data *plat_data);
 
 void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);