Skip to content

Commit

Permalink
[media] davinci: vpif: Add suspend/resume callbacks to vpif driver
Browse files Browse the repository at this point in the history
add clock enable and disable in probe and remove functions.
Probe will succeed only if the device clock is provided instead of
assuming that the clock is always enabled. VPIF clock has to be
dealt with during suspend and resume. Implement power management
callbacks to VPIF driver to disable/enable clock on suspend/resume
respectively.

Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Manjunath Hadli authored and Mauro Carvalho Chehab committed Jul 30, 2012
1 parent 3d5946d commit 31415d0
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions drivers/media/video/davinci/vpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <mach/hardware.h>

#include "vpif.h"
Expand All @@ -40,6 +42,7 @@ static struct resource *res;
spinlock_t vpif_lock;

void __iomem *vpif_base;
struct clk *vpif_clk;

/**
* ch_params: video standard configuration parameters for vpif
Expand Down Expand Up @@ -434,26 +437,64 @@ static int __init vpif_probe(struct platform_device *pdev)
goto fail;
}

vpif_clk = clk_get(&pdev->dev, "vpif");
if (IS_ERR(vpif_clk)) {
status = PTR_ERR(vpif_clk);
goto clk_fail;
}
clk_enable(vpif_clk);

spin_lock_init(&vpif_lock);
dev_info(&pdev->dev, "vpif probe success\n");
return 0;

clk_fail:
iounmap(vpif_base);
fail:
release_mem_region(res->start, res_len);
return status;
}

static int __devexit vpif_remove(struct platform_device *pdev)
{
if (vpif_clk) {
clk_disable(vpif_clk);
clk_put(vpif_clk);
}

iounmap(vpif_base);
release_mem_region(res->start, res_len);
return 0;
}

#ifdef CONFIG_PM
static int vpif_suspend(struct device *dev)
{
clk_disable(vpif_clk);
return 0;
}

static int vpif_resume(struct device *dev)
{
clk_enable(vpif_clk);
return 0;
}

static const struct dev_pm_ops vpif_pm = {
.suspend = vpif_suspend,
.resume = vpif_resume,
};

#define vpif_pm_ops (&vpif_pm)
#else
#define vpif_pm_ops NULL
#endif

static struct platform_driver vpif_driver = {
.driver = {
.name = "vpif",
.owner = THIS_MODULE,
.pm = vpif_pm_ops,
},
.remove = __devexit_p(vpif_remove),
.probe = vpif_probe,
Expand Down

0 comments on commit 31415d0

Please sign in to comment.