[PATCH 1/2 v2] sh_mobile_ceu: add soft reset function
Kuninori Morimoto <[email protected]>
| Newsgroups | gmane.comp.video.video4linux |
|---|---|
| Message-ID | <uy6pxephb.wl%[email protected]> |
Signed-off-by: Kuninori Morimoto <[email protected]> --- v1 -> v2 o it use msleep o it judge in_atomic or not it judge in_atomic because sh_mobile_ceu_soft_reset will also be called from atomic. drivers/media/video/sh_mobile_ceu_camera.c | 36 ++++++++++++++++++++++++--- 1 files changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index 0db88a5..3741ad6 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c @@ -135,6 +135,36 @@ static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs) return ioread32(priv->base + reg_offs); } +static void sh_mobile_ceu_soft_reset(struct sh_mobile_ceu_dev *pcdev) +{ + int t; + int atomic = in_atomic(); + + ceu_write(pcdev, CAPSR, 1 << 16); /* reset */ + + t = 10000; + while (t--) { + if (!(ceu_read(pcdev, CAPSR) & (1 << 16))) + break; + + if (atomic) + cpu_relax(); + else + msleep(1); + } + + t = 10000; + while (t--) { + if (!(ceu_read(pcdev, CSTSR) & 1)) + break; + + if (atomic) + cpu_relax(); + else + msleep(1); + } +} + /* * Videobuf operations */ @@ -366,9 +396,7 @@ static int sh_mobile_ceu_add_device(struct soc_camera_device *icd) clk_enable(pcdev->clk); - ceu_write(pcdev, CAPSR, 1 << 16); /* reset */ - while (ceu_read(pcdev, CSTSR) & 1) - msleep(1); + sh_mobile_ceu_soft_reset(pcdev); pcdev->icd = icd; err: @@ -386,7 +414,7 @@ static void sh_mobile_ceu_remove_device(struct soc_camera_device *icd) /* disable capture, disable interrupts */ ceu_write(pcdev, CEIER, 0); - ceu_write(pcdev, CAPSR, 1 << 16); /* reset */ + sh_mobile_ceu_soft_reset(pcdev); /* make sure active buffer is canceled */ spin_lock_irqsave(&pcdev->lock, flags); -- 1.6.0.4 -- video4linux-list mailing list Unsubscribe mailto:[email protected]?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list