Re: [PATCH 1/2 v2] sh_mobile_ceu: add soft reset function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 6 Aug 2009, Kuninori Morimoto wrote:

> 
> Signed-off-by: Kuninori Morimoto <morimoto.kuninori@xxxxxxxxxxx>

Ok, I'm away for a week starting today, I'll have a look at your patches 
after I come back then.

Thanks
Guennadi

> ---
> 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
> 

---
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

[Index of Archives]     [Linux Media]     [Older V4L]     [Linux DVB]     [Video Disk Recorder]     [Linux Kernel]     [Asterisk]     [DCCP]     [Netdev]     [X.org]     [Util Linux]     [Xfree86]     [Free Photo Albums]     [Fedora Users]     [Fedora Women]     [ALSA Users]     [ALSA Devel]     [SSH]     [DVB Maintainers]     [Linux USB]     [Yosemite Information]
  Powered by Linux