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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.