commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=a816942e8c256f6df6f80a326adeb0c078818e82
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/2012R1

Fix case indent as well.

Signed-off-by: Sonic Zhang <[email protected]>
---
 drivers/char/bfin_crc.c |  117 ++++++++++++++++++++++++++---------------------
 1 files changed, 65 insertions(+), 52 deletions(-)

diff --git a/drivers/char/bfin_crc.c b/drivers/char/bfin_crc.c
index 0fcd4f5..3f7d1d8 100644
--- a/drivers/char/bfin_crc.c
+++ b/drivers/char/bfin_crc.c
@@ -62,12 +62,13 @@ static void bfin_crc_config_dma(unsigned long dma_ch, unsigned char *addr,
 	enable_dma(dma_ch);
 }
 
-static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_info *info)
+static int bfin_crc_run(struct bfin_crc *crc)
 {
 	int ret = 0;
 	unsigned long control;
 	unsigned int timeout = 100000;
 	int mod_dir = 1;
+	struct crc_info *info = crc->info;
 
 	if (info->datasize == 0)
 		return 0;
@@ -77,7 +78,7 @@ static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_in
 	}
 
 	/* config CRC */
-	control = opmode << OPMODE_OFFSET;
+	control = crc->opmode << OPMODE_OFFSET;
 	control |= (info->bitmirr << BITMIRR_OFFSET);
 	control |= (info->bytmirr << BYTMIRR_OFFSET);
 	control |= (info->w16swp << W16SWP_OFFSET);
@@ -87,13 +88,13 @@ static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_in
 	control |= (info->cmpmirr << CMPMIRR_OFFSET);
 	control |= AUTOCLRZ;
 
-	if (opmode == MODE_DMACPY_CRC)
+	if (crc->opmode == MODE_DMACPY_CRC)
 		control |= OBRSTALL;
 
 	crc->regs->control = control;
 	SSYNC();
 
-	if (opmode == MODE_CALC_CRC || opmode == MODE_DMACPY_CRC) {
+	if (crc->opmode == MODE_CALC_CRC || crc->opmode == MODE_DMACPY_CRC) {
 		crc->regs->poly = info->crc_poly;
 		SSYNC();
 
@@ -116,22 +117,22 @@ static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_in
 	SSYNC();
 
 	/* setup CRC receive DMA */
-	switch (opmode) {
-		case MODE_DMACPY_CRC:
-			invalidate_dcache_range((unsigned long)info->out_addr,
-					(unsigned long)(info->out_addr + info->datasize));
-			if (info->out_addr < info->in_addr + info->datasize)
-				mod_dir = -1;
-			bfin_crc_config_dma(crc->dma_ch_dest, info->out_addr,
-					info->datasize, WNR, mod_dir);
-			break;
-		case MODE_DATA_FILL:
-			crc->regs->fillval = info->val_fill;
-			invalidate_dcache_range((unsigned long)info->out_addr,
-					(unsigned long)(info->out_addr + info->datasize));
-			bfin_crc_config_dma(crc->dma_ch_dest, info->out_addr,
-					info->datasize, WNR, 1);
-			break;
+	switch (crc->opmode) {
+	case MODE_DMACPY_CRC:
+		invalidate_dcache_range((unsigned long)info->out_addr,
+				(unsigned long)(info->out_addr + info->datasize));
+		if (info->out_addr < info->in_addr + info->datasize)
+			mod_dir = -1;
+		bfin_crc_config_dma(crc->dma_ch_dest, info->out_addr,
+				info->datasize, WNR, mod_dir);
+		break;
+	case MODE_DATA_FILL:
+		crc->regs->fillval = info->val_fill;
+		invalidate_dcache_range((unsigned long)info->out_addr,
+				(unsigned long)(info->out_addr + info->datasize));
+		bfin_crc_config_dma(crc->dma_ch_dest, info->out_addr,
+				info->datasize, WNR, 1);
+		break;
 	}
 
 	/* enable CRC operation */
@@ -139,20 +140,20 @@ static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_in
 	SSYNC();
 
 	/* setup CRC transfer DMA */
-	switch (opmode) {
-		case MODE_CALC_CRC:
-		case MODE_DATA_VERIFY:
-			flush_dcache_range((unsigned long)info->in_addr,
-					(unsigned long)(info->in_addr + info->datasize));
-			bfin_crc_config_dma(crc->dma_ch_src, info->in_addr,
-					info->datasize, 0, 1);
-			break;
-		case MODE_DMACPY_CRC:
-			flush_dcache_range((unsigned long)info->in_addr,
-					(unsigned long)(info->in_addr + info->datasize));
-			bfin_crc_config_dma(crc->dma_ch_src, info->in_addr,
-					info->datasize, 0, mod_dir);
-			break;
+	switch (crc->opmode) {
+	case MODE_CALC_CRC:
+	case MODE_DATA_VERIFY:
+		flush_dcache_range((unsigned long)info->in_addr,
+				(unsigned long)(info->in_addr + info->datasize));
+		bfin_crc_config_dma(crc->dma_ch_src, info->in_addr,
+				info->datasize, 0, 1);
+		break;
+	case MODE_DMACPY_CRC:
+		flush_dcache_range((unsigned long)info->in_addr,
+				(unsigned long)(info->in_addr + info->datasize));
+		bfin_crc_config_dma(crc->dma_ch_src, info->in_addr,
+				info->datasize, 0, mod_dir);
+		break;
 	}
 
 	/* wait for completion */
@@ -160,21 +161,10 @@ static int bfin_crc_run(struct bfin_crc *crc, unsigned int opmode, struct crc_in
 		dev_dbg(crc->mdev.this_device, "Completion waiting is interrupted.\n");
 		goto out;
 	}
-	if (opmode == MODE_DMACPY_CRC || opmode == MODE_DATA_FILL)
+	if (crc->opmode == MODE_DMACPY_CRC || crc->opmode == MODE_DATA_FILL)
 		while (crc->regs->status & OBR)
 			cpu_relax();
 
-	/* prepare results */
-	switch (opmode) {
-		case MODE_CALC_CRC:
-		case MODE_DMACPY_CRC:
-			info->crc_result = crc->regs->result;
-			break;
-		case MODE_DATA_VERIFY:
-			info->pos_verify = (crc->regs->status & CMPERR) ? crc->regs->datacntcap : 0;
-			break;
-	};
-
 out:
 	clear_dma_irqstat(crc->dma_ch_src);
 	clear_dma_irqstat(crc->dma_ch_dest);
@@ -197,8 +187,21 @@ static irqreturn_t bfin_crc_handler(int irq, void *dev_id)
 	if (crc->regs->status & DCNTEXP) {
 		crc->regs->status = DCNTEXP;
 		SSYNC();
+		/* prepare results */
+		switch (crc->opmode) {
+		case MODE_CALC_CRC:
+		case MODE_DMACPY_CRC:
+			crc->info->crc_result = crc->regs->result;
+			break;
+		case MODE_DATA_VERIFY:
+			crc->info->pos_verify =
+				(crc->regs->status & CMPERR) ? crc->regs->datacntcap : 0;
+			break;
+		};
 		if (crc->regs->control | BLKEN)
 			complete(&crc->c);
+
+		crc->regs->control &= ~BLKEN;
 		return IRQ_HANDLED;
 	} else
 		return IRQ_NONE;
@@ -312,27 +315,32 @@ static long bfin_crc_ioctl(struct file *filp,
 		goto out;
 	}
 
+	crc->info = &bfin_crc_info;
 	switch (cmd) {
 	case CRC_IOC_CALC_CRC:
-		ret = bfin_crc_run(crc, MODE_CALC_CRC, &bfin_crc_info);
+		crc->opmode = MODE_CALC_CRC;
 		break;
 	case CRC_IOC_MEMCPY_CRC:
-		ret = bfin_crc_run(crc, MODE_DMACPY_CRC, &bfin_crc_info);
+		crc->opmode = MODE_DMACPY_CRC;
 		break;
 	case CRC_IOC_VERIFY_VAL:
-		ret = bfin_crc_run(crc, MODE_DATA_VERIFY, &bfin_crc_info);
+		crc->opmode = MODE_DATA_VERIFY;
 		break;
 	case CRC_IOC_FILL_VAL:
-		ret = bfin_crc_run(crc, MODE_DATA_FILL, &bfin_crc_info);
+		crc->opmode = MODE_DATA_FILL;
 		break;
 	default:
 		ret = -ENOTTY;
+		goto out;
 	}
+	ret = bfin_crc_run(crc);
 
 	if (ret >= 0 && copy_to_user(argp, &bfin_crc_info, sizeof(bfin_crc_info)))
 		ret = -EFAULT;
 
 out:
+	crc->info = NULL;
+	crc->opmode = 0;
 	mutex_unlock(&crc->mutex);
 	return ret;
 }
@@ -346,6 +354,13 @@ out:
 static int bfin_crc_suspend(struct platform_device *pdev, pm_message_t state)
 {
 	struct bfin_crc *crc = platform_get_drvdata(pdev);
+	int i = 100000;
+
+	while ((crc->regs->control & BLKEN) && --i)
+		cpu_relax();
+
+	if (i == 0)
+		crc->regs->control &= ~BLKEN;
 
 	return 0;
 }
@@ -356,8 +371,6 @@ static int bfin_crc_suspend(struct platform_device *pdev, pm_message_t state)
  */
 static int bfin_crc_resume(struct platform_device *pdev)
 {
-	struct bfin_crc *crc = platform_get_drvdata(pdev);
-
 	return 0;
 }
 #else
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to