|
|
|
Re: [PATCH 1/2 v3] sh_mobile_ceu: add soft reset function | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
Hi Morimoto-san
On Fri, 7 Aug 2009, Kuninori Morimoto wrote:
>
> Signed-off-by: Kuninori Morimoto <morimoto.kuninori@xxxxxxxxxxx>
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:video4linux-list-request@xxxxxxxxxx?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
[Linux Media] [Older V4L] [Linux DVB] [Video Disk Recorder] [Linux Kernel] [Asterisk] [Photo] [DCCP] [Netdev] [Xorg] [Util Linux NG] [Xfree86] [Free Photo Albums] [Fedora Users] [Fedora Women] [ALSA Users] [ALSA Devel] [SSH] [DVB Maintainers] [Linux USB] [Yosemite Information]
![]() |
![]() |