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