summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/davinci/vpif.c18
-rw-r--r--drivers/media/platform/davinci/vpif_capture.c27
-rw-r--r--drivers/media/platform/davinci/vpif_display.c24
3 files changed, 42 insertions, 27 deletions
diff --git a/drivers/media/platform/davinci/vpif.c b/drivers/media/platform/davinci/vpif.c
index 03b4e51bb13a..97ef770266af 100644
--- a/drivers/media/platform/davinci/vpif.c
+++ b/drivers/media/platform/davinci/vpif.c
@@ -20,8 +20,10 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/spinlock.h>
@@ -437,11 +439,12 @@ static void vpif_pdev_release(struct device *dev)
static int vpif_probe(struct platform_device *pdev)
{
- static struct resource *res_irq;
+ static struct resource res_irq;
struct platform_device *pdev_capture, *pdev_display;
struct device_node *endpoint = NULL;
struct vpif_data *data;
int ret;
+ int irq;
vpif_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(vpif_base))
@@ -471,12 +474,13 @@ static int vpif_probe(struct platform_device *pdev)
* For DT platforms, manually create platform_devices for
* capture/display drivers.
*/
- res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
- if (!res_irq) {
- dev_warn(&pdev->dev, "Missing IRQ resource.\n");
- ret = -EINVAL;
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ ret = irq;
goto err_put_rpm;
}
+ res_irq = (struct resource)DEFINE_RES_IRQ_NAMED(irq, of_node_full_name(pdev->dev.of_node));
+ res_irq.flags |= irq_get_trigger_type(irq);
pdev_capture = kzalloc(sizeof(*pdev_capture), GFP_KERNEL);
if (!pdev_capture) {
@@ -486,7 +490,7 @@ static int vpif_probe(struct platform_device *pdev)
pdev_capture->name = "vpif_capture";
pdev_capture->id = -1;
- pdev_capture->resource = res_irq;
+ pdev_capture->resource = &res_irq;
pdev_capture->num_resources = 1;
pdev_capture->dev.dma_mask = pdev->dev.dma_mask;
pdev_capture->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
@@ -505,7 +509,7 @@ static int vpif_probe(struct platform_device *pdev)
pdev_display->name = "vpif_display";
pdev_display->id = -1;
- pdev_display->resource = res_irq;
+ pdev_display->resource = &res_irq;
pdev_display->num_resources = 1;
pdev_display->dev.dma_mask = pdev->dev.dma_mask;
pdev_display->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c
index 8fe55374c5a3..bf76c5c83743 100644
--- a/drivers/media/platform/davinci/vpif_capture.c
+++ b/drivers/media/platform/davinci/vpif_capture.c
@@ -1607,7 +1607,6 @@ static __init int vpif_probe(struct platform_device *pdev)
{
struct vpif_subdev_info *subdevdata;
struct i2c_adapter *i2c_adap;
- struct resource *res;
int subdev_count;
int res_idx = 0;
int i, err;
@@ -1632,17 +1631,23 @@ static __init int vpif_probe(struct platform_device *pdev)
goto vpif_free;
}
- while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) {
- err = devm_request_irq(&pdev->dev, res->start, vpif_channel_isr,
- IRQF_SHARED, VPIF_DRIVER_NAME,
- (void *)(&vpif_obj.dev[res_idx]->
- channel_id));
- if (err) {
- err = -EINVAL;
+ do {
+ int irq;
+
+ err = platform_get_irq_optional(pdev, res_idx);
+ if (err < 0 && err != -ENXIO)
goto vpif_unregister;
- }
- res_idx++;
- }
+ if (err > 0)
+ irq = err;
+ else
+ break;
+
+ err = devm_request_irq(&pdev->dev, irq, vpif_channel_isr,
+ IRQF_SHARED, VPIF_DRIVER_NAME,
+ (void *)(&vpif_obj.dev[res_idx]->channel_id));
+ if (err)
+ goto vpif_unregister;
+ } while (++res_idx);
vpif_obj.config = pdev->dev.platform_data;
diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c
index 59f6b782e104..fca148b66471 100644
--- a/drivers/media/platform/davinci/vpif_display.c
+++ b/drivers/media/platform/davinci/vpif_display.c
@@ -1221,7 +1221,6 @@ static __init int vpif_probe(struct platform_device *pdev)
{
struct vpif_subdev_info *subdevdata;
struct i2c_adapter *i2c_adap;
- struct resource *res;
int subdev_count;
int res_idx = 0;
int i, err;
@@ -1245,18 +1244,25 @@ static __init int vpif_probe(struct platform_device *pdev)
goto vpif_free;
}
- while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) {
- err = devm_request_irq(&pdev->dev, res->start, vpif_channel_isr,
- IRQF_SHARED, VPIF_DRIVER_NAME,
- (void *)(&vpif_obj.dev[res_idx]->
- channel_id));
+ do {
+ int irq;
+
+ err = platform_get_irq_optional(pdev, res_idx);
+ if (err < 0 && err != -ENXIO)
+ goto vpif_unregister;
+ if (err > 0)
+ irq = err;
+ else
+ break;
+
+ err = devm_request_irq(&pdev->dev, irq, vpif_channel_isr,
+ IRQF_SHARED, VPIF_DRIVER_NAME,
+ (void *)(&vpif_obj.dev[res_idx]->channel_id));
if (err) {
- err = -EINVAL;
vpif_err("VPIF IRQ request failed\n");
goto vpif_unregister;
}
- res_idx++;
- }
+ } while (++res_idx);
vpif_obj.config = pdev->dev.platform_data;
subdev_count = vpif_obj.config->subdev_count;