Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 163510
b: refs/heads/master
c: 6d1386c
h: refs/heads/master
v: v3
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Aug 23, 2009
1 parent dd5e30f commit a40bef5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0246c4712c40294bd5e8335f0c15a38c8e52709f
refs/heads/master: 6d1386c6b8db54ac8d94c01194e0c27cd538532b
41 changes: 25 additions & 16 deletions trunk/drivers/media/video/sh_mobile_ceu_camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/videodev2.h>
#include <linux/clk.h>
#include <linux/pm_runtime.h>

#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
Expand Down Expand Up @@ -86,7 +86,6 @@ struct sh_mobile_ceu_dev {

unsigned int irq;
void __iomem *base;
struct clk *clk;
unsigned long video_limit;

/* lock used to protect videobuf */
Expand Down Expand Up @@ -361,7 +360,7 @@ static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
if (ret)
goto err;

clk_enable(pcdev->clk);
pm_runtime_get_sync(ici->dev);

ceu_write(pcdev, CAPSR, 1 << 16); /* reset */
while (ceu_read(pcdev, CSTSR) & 1)
Expand Down Expand Up @@ -395,7 +394,7 @@ static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd)
}
spin_unlock_irqrestore(&pcdev->lock, flags);

clk_disable(pcdev->clk);
pm_runtime_put_sync(ici->dev);

icd->ops->release(icd);

Expand Down Expand Up @@ -798,7 +797,6 @@ static int sh_mobile_ceu_probe(struct platform_device *pdev)
struct sh_mobile_ceu_dev *pcdev;
struct resource *res;
void __iomem *base;
char clk_name[8];
unsigned int irq;
int err = 0;

Expand Down Expand Up @@ -862,13 +860,9 @@ static int sh_mobile_ceu_probe(struct platform_device *pdev)
goto exit_release_mem;
}

snprintf(clk_name, sizeof(clk_name), "ceu%d", pdev->id);
pcdev->clk = clk_get(&pdev->dev, clk_name);
if (IS_ERR(pcdev->clk)) {
dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name);
err = PTR_ERR(pcdev->clk);
goto exit_free_irq;
}
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
pm_runtime_resume(&pdev->dev);

pcdev->ici.priv = pcdev;
pcdev->ici.dev = &pdev->dev;
Expand All @@ -878,12 +872,10 @@ static int sh_mobile_ceu_probe(struct platform_device *pdev)

err = soc_camera_host_register(&pcdev->ici);
if (err)
goto exit_free_clk;
goto exit_free_irq;

return 0;

exit_free_clk:
clk_put(pcdev->clk);
exit_free_irq:
free_irq(pcdev->irq, pcdev);
exit_release_mem:
Expand All @@ -904,7 +896,6 @@ static int sh_mobile_ceu_remove(struct platform_device *pdev)
struct sh_mobile_ceu_dev, ici);

soc_camera_host_unregister(soc_host);
clk_put(pcdev->clk);
free_irq(pcdev->irq, pcdev);
if (platform_get_resource(pdev, IORESOURCE_MEM, 1))
dma_release_declared_memory(&pdev->dev);
Expand All @@ -913,9 +904,27 @@ static int sh_mobile_ceu_remove(struct platform_device *pdev)
return 0;
}

static int sh_mobile_ceu_runtime_nop(struct device *dev)
{
/* Runtime PM callback shared between ->runtime_suspend()
* and ->runtime_resume(). Simply returns success.
*
* This driver re-initializes all registers after
* pm_runtime_get_sync() anyway so there is no need
* to save and restore registers here.
*/
return 0;
}

static struct dev_pm_ops sh_mobile_ceu_dev_pm_ops = {
.runtime_suspend = sh_mobile_ceu_runtime_nop,
.runtime_resume = sh_mobile_ceu_runtime_nop,
};

static struct platform_driver sh_mobile_ceu_driver = {
.driver = {
.name = "sh_mobile_ceu",
.pm = &sh_mobile_ceu_dev_pm_ops,
},
.probe = sh_mobile_ceu_probe,
.remove = sh_mobile_ceu_remove,
Expand Down

0 comments on commit a40bef5

Please sign in to comment.