Re: [PATCH 1/2 v3] sh_mobile_ceu: add soft reset function
Guennadi Liakhovetski <[email protected]>
| Newsgroups | gmane.comp.video.video4linux |
|---|---|
| Message-ID | <[email protected]> |
Hi Morimoto-san On Fri, 7 Aug 2009, Kuninori Morimoto wrote: > > Signed-off-by: Kuninori Morimoto <[email protected]> I've updated both your patches on the top of my current tree and slightly cleaned them up - mainly multi-line comments. Also fixed one error in sh_mobile_ceu_add_device() (see below). Please, check if the stack at http://download.open-technology.de/soc-camera/20090826/ looks ok and still works for you. As usual, you find instructions on which tree and branch to use in 0000-base. > --- > v2 -> v3 > > o use udelay instead > o return err value > o print warning if time out > > drivers/media/video/sh_mobile_ceu_camera.c | 42 ++++++++++++++++++++++++--- > 1 files changed, 37 insertions(+), 5 deletions(-) > > diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c > index 0db88a5..24f3d28 100644 > --- a/drivers/media/video/sh_mobile_ceu_camera.c > +++ b/drivers/media/video/sh_mobile_ceu_camera.c > @@ -135,6 +135,40 @@ static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs) > return ioread32(priv->base + reg_offs); > } > > +static int sh_mobile_ceu_soft_reset(struct sh_mobile_ceu_dev *pcdev) > +{ > + int i, success = 0; > + struct soc_camera_device *icd = pcdev->icd; > + > + ceu_write(pcdev, CAPSR, 1 << 16); /* reset */ > + > + /* wait CSTSR.CPTON bit */ > + for (i = 0; i < 1000; i++) { > + if (!(ceu_read(pcdev, CSTSR) & 1)) { > + success++; > + break; > + } > + udelay(1); > + } > + > + /* wait CAPSR.CPKIL bit */ > + for (i = 0; i < 1000; i++) { > + if (!(ceu_read(pcdev, CAPSR) & (1 << 16))) { > + success++; > + break; > + } > + udelay(1); > + } > + > + > + if (2 != success) { > + dev_warn(&icd->dev, "soft reset time out\n"); > + return -EIO; > + } > + > + return 0; > +} > + > /* > * Videobuf operations > */ > @@ -366,11 +400,9 @@ 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); > - > pcdev->icd = icd; > + > + ret = sh_mobile_ceu_soft_reset(pcdev); > err: > return ret; This means, even in error case you'd have "pcdev->icd = icd" and a repeated call to sh_mobile_ceu_add_device() would return -EBUSY. I fixed this in my version. > } > @@ -386,7 +418,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 > Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ -- video4linux-list mailing list Unsubscribe mailto:[email protected]?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list