diff options
author | Manjunathappa, Prakash <prakash.pm@ti.com> | 2012-09-21 11:50:57 -0400 |
---|---|---|
committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-10-09 22:04:26 -0400 |
commit | 9dd44d5d2305862e61bf610b343658db38d9bd76 (patch) | |
tree | acf02bd6a526b83597db86ea0d1f5de2f0a403ae /drivers/video/da8xx-fb.c | |
parent | b8c4321f3d194469007f5f5f2b34ec278c264a04 (diff) |
da8xx-fb: add pm_runtime support
Add pm_runtime support to the da8xx-fb frame buffer driver.
Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Diffstat (limited to 'drivers/video/da8xx-fb.c')
-rw-r--r-- | drivers/video/da8xx-fb.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c index af2aa387ec17..4280d23e3300 100644 --- a/drivers/video/da8xx-fb.c +++ b/drivers/video/da8xx-fb.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/uaccess.h> | 28 | #include <linux/uaccess.h> |
29 | #include <linux/pm_runtime.h> | ||
29 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
30 | #include <linux/wait.h> | 31 | #include <linux/wait.h> |
31 | #include <linux/clk.h> | 32 | #include <linux/clk.h> |
@@ -1037,8 +1038,8 @@ static int __devexit fb_remove(struct platform_device *dev) | |||
1037 | dma_free_coherent(NULL, par->vram_size, par->vram_virt, | 1038 | dma_free_coherent(NULL, par->vram_size, par->vram_virt, |
1038 | par->vram_phys); | 1039 | par->vram_phys); |
1039 | free_irq(par->irq, par); | 1040 | free_irq(par->irq, par); |
1040 | clk_disable(par->lcdc_clk); | 1041 | pm_runtime_put_sync(&dev->dev); |
1041 | clk_put(par->lcdc_clk); | 1042 | pm_runtime_disable(&dev->dev); |
1042 | framebuffer_release(info); | 1043 | framebuffer_release(info); |
1043 | iounmap((void __iomem *)da8xx_fb_reg_base); | 1044 | iounmap((void __iomem *)da8xx_fb_reg_base); |
1044 | release_mem_region(lcdc_regs->start, resource_size(lcdc_regs)); | 1045 | release_mem_region(lcdc_regs->start, resource_size(lcdc_regs)); |
@@ -1272,9 +1273,9 @@ static int __devinit fb_probe(struct platform_device *device) | |||
1272 | ret = -ENODEV; | 1273 | ret = -ENODEV; |
1273 | goto err_ioremap; | 1274 | goto err_ioremap; |
1274 | } | 1275 | } |
1275 | ret = clk_enable(fb_clk); | 1276 | |
1276 | if (ret) | 1277 | pm_runtime_enable(&device->dev); |
1277 | goto err_clk_put; | 1278 | pm_runtime_get_sync(&device->dev); |
1278 | 1279 | ||
1279 | /* Determine LCD IP Version */ | 1280 | /* Determine LCD IP Version */ |
1280 | switch (lcdc_read(LCD_PID_REG)) { | 1281 | switch (lcdc_read(LCD_PID_REG)) { |
@@ -1302,7 +1303,7 @@ static int __devinit fb_probe(struct platform_device *device) | |||
1302 | if (i == ARRAY_SIZE(known_lcd_panels)) { | 1303 | if (i == ARRAY_SIZE(known_lcd_panels)) { |
1303 | dev_err(&device->dev, "GLCD: No valid panel found\n"); | 1304 | dev_err(&device->dev, "GLCD: No valid panel found\n"); |
1304 | ret = -ENODEV; | 1305 | ret = -ENODEV; |
1305 | goto err_clk_disable; | 1306 | goto err_pm_runtime_disable; |
1306 | } else | 1307 | } else |
1307 | dev_info(&device->dev, "GLCD: Found %s panel\n", | 1308 | dev_info(&device->dev, "GLCD: Found %s panel\n", |
1308 | fb_pdata->type); | 1309 | fb_pdata->type); |
@@ -1314,7 +1315,7 @@ static int __devinit fb_probe(struct platform_device *device) | |||
1314 | if (!da8xx_fb_info) { | 1315 | if (!da8xx_fb_info) { |
1315 | dev_dbg(&device->dev, "Memory allocation failed for fb_info\n"); | 1316 | dev_dbg(&device->dev, "Memory allocation failed for fb_info\n"); |
1316 | ret = -ENOMEM; | 1317 | ret = -ENOMEM; |
1317 | goto err_clk_disable; | 1318 | goto err_pm_runtime_disable; |
1318 | } | 1319 | } |
1319 | 1320 | ||
1320 | par = da8xx_fb_info->par; | 1321 | par = da8xx_fb_info->par; |
@@ -1476,11 +1477,9 @@ err_release_fb_mem: | |||
1476 | err_release_fb: | 1477 | err_release_fb: |
1477 | framebuffer_release(da8xx_fb_info); | 1478 | framebuffer_release(da8xx_fb_info); |
1478 | 1479 | ||
1479 | err_clk_disable: | 1480 | err_pm_runtime_disable: |
1480 | clk_disable(fb_clk); | 1481 | pm_runtime_put_sync(&device->dev); |
1481 | 1482 | pm_runtime_disable(&device->dev); | |
1482 | err_clk_put: | ||
1483 | clk_put(fb_clk); | ||
1484 | 1483 | ||
1485 | err_ioremap: | 1484 | err_ioremap: |
1486 | iounmap((void __iomem *)da8xx_fb_reg_base); | 1485 | iounmap((void __iomem *)da8xx_fb_reg_base); |
@@ -1503,7 +1502,7 @@ static int fb_suspend(struct platform_device *dev, pm_message_t state) | |||
1503 | 1502 | ||
1504 | fb_set_suspend(info, 1); | 1503 | fb_set_suspend(info, 1); |
1505 | lcd_disable_raster(true); | 1504 | lcd_disable_raster(true); |
1506 | clk_disable(par->lcdc_clk); | 1505 | pm_runtime_put_sync(&dev->dev); |
1507 | console_unlock(); | 1506 | console_unlock(); |
1508 | 1507 | ||
1509 | return 0; | 1508 | return 0; |
@@ -1514,7 +1513,7 @@ static int fb_resume(struct platform_device *dev) | |||
1514 | struct da8xx_fb_par *par = info->par; | 1513 | struct da8xx_fb_par *par = info->par; |
1515 | 1514 | ||
1516 | console_lock(); | 1515 | console_lock(); |
1517 | clk_enable(par->lcdc_clk); | 1516 | pm_runtime_get_sync(&dev->dev); |
1518 | if (par->blank == FB_BLANK_UNBLANK) { | 1517 | if (par->blank == FB_BLANK_UNBLANK) { |
1519 | lcd_enable_raster(); | 1518 | lcd_enable_raster(); |
1520 | 1519 | ||