aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/davinci
diff options
context:
space:
mode:
authorManjunath Hadli <manjunath.hadli@ti.com>2012-04-13 03:50:55 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 18:08:20 -0400
commit3d5946dcfd4d221126f3f190c5ca4ea41c20f138 (patch)
tree1e7451ef7b202754162210826f8aa30a40507ce7 /drivers/media/video/davinci
parente9530dac31c0c0296242e9209c89f5a580a2d64b (diff)
[media] davinci: vpif capture:Add power management support
Implement power management operations - suspend and resume as part of dev_pm_ops for VPIF capture driver. 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>
Diffstat (limited to 'drivers/media/video/davinci')
-rw-r--r--drivers/media/video/davinci/vpif_capture.c73
1 files changed, 61 insertions, 12 deletions
diff --git a/drivers/media/video/davinci/vpif_capture.c b/drivers/media/video/davinci/vpif_capture.c
index 1d4427aa08a5..2727919fe251 100644
--- a/drivers/media/video/davinci/vpif_capture.c
+++ b/drivers/media/video/davinci/vpif_capture.c
@@ -2312,26 +2312,70 @@ static int vpif_remove(struct platform_device *device)
2312 return 0; 2312 return 0;
2313} 2313}
2314 2314
2315#ifdef CONFIG_PM
2315/** 2316/**
2316 * vpif_suspend: vpif device suspend 2317 * vpif_suspend: vpif device suspend
2317 *
2318 * TODO: Add suspend code here
2319 */ 2318 */
2320static int 2319static int vpif_suspend(struct device *dev)
2321vpif_suspend(struct device *dev)
2322{ 2320{
2323 return -1; 2321
2322 struct common_obj *common;
2323 struct channel_obj *ch;
2324 int i;
2325
2326 for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) {
2327 /* Get the pointer to the channel object */
2328 ch = vpif_obj.dev[i];
2329 common = &ch->common[VPIF_VIDEO_INDEX];
2330 mutex_lock(&common->lock);
2331 if (ch->usrs && common->io_usrs) {
2332 /* Disable channel */
2333 if (ch->channel_id == VPIF_CHANNEL0_VIDEO) {
2334 enable_channel0(0);
2335 channel0_intr_enable(0);
2336 }
2337 if (ch->channel_id == VPIF_CHANNEL1_VIDEO ||
2338 common->started == 2) {
2339 enable_channel1(0);
2340 channel1_intr_enable(0);
2341 }
2342 }
2343 mutex_unlock(&common->lock);
2344 }
2345
2346 return 0;
2324} 2347}
2325 2348
2326/** 2349/*
2327 * vpif_resume: vpif device suspend 2350 * vpif_resume: vpif device suspend
2328 *
2329 * TODO: Add resume code here
2330 */ 2351 */
2331static int 2352static int vpif_resume(struct device *dev)
2332vpif_resume(struct device *dev)
2333{ 2353{
2334 return -1; 2354 struct common_obj *common;
2355 struct channel_obj *ch;
2356 int i;
2357
2358 for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) {
2359 /* Get the pointer to the channel object */
2360 ch = vpif_obj.dev[i];
2361 common = &ch->common[VPIF_VIDEO_INDEX];
2362 mutex_lock(&common->lock);
2363 if (ch->usrs && common->io_usrs) {
2364 /* Disable channel */
2365 if (ch->channel_id == VPIF_CHANNEL0_VIDEO) {
2366 enable_channel0(1);
2367 channel0_intr_enable(1);
2368 }
2369 if (ch->channel_id == VPIF_CHANNEL1_VIDEO ||
2370 common->started == 2) {
2371 enable_channel1(1);
2372 channel1_intr_enable(1);
2373 }
2374 }
2375 mutex_unlock(&common->lock);
2376 }
2377
2378 return 0;
2335} 2379}
2336 2380
2337static const struct dev_pm_ops vpif_dev_pm_ops = { 2381static const struct dev_pm_ops vpif_dev_pm_ops = {
@@ -2339,11 +2383,16 @@ static const struct dev_pm_ops vpif_dev_pm_ops = {
2339 .resume = vpif_resume, 2383 .resume = vpif_resume,
2340}; 2384};
2341 2385
2386#define vpif_pm_ops (&vpif_dev_pm_ops)
2387#else
2388#define vpif_pm_ops NULL
2389#endif
2390
2342static __refdata struct platform_driver vpif_driver = { 2391static __refdata struct platform_driver vpif_driver = {
2343 .driver = { 2392 .driver = {
2344 .name = "vpif_capture", 2393 .name = "vpif_capture",
2345 .owner = THIS_MODULE, 2394 .owner = THIS_MODULE,
2346 .pm = &vpif_dev_pm_ops, 2395 .pm = vpif_pm_ops,
2347 }, 2396 },
2348 .probe = vpif_probe, 2397 .probe = vpif_probe,
2349 .remove = vpif_remove, 2398 .remove = vpif_remove,