Title: [9204] trunk/drivers/char/bfin_sport.c: bfin_sport: clean up new ndso code
Revision
9204
Author
vapier
Date
2010-10-15 19:05:47 -0400 (Fri, 15 Oct 2010)

Log Message

bfin_sport: clean up new ndso code

- make irq management dynamic
- check return value of copy_to_user
- add 32bit support
- fix decl-before-statements
- drop tx_sent clearing in 16bit write
- fix unused variable warning

Modified Paths

Diff

Modified: trunk/drivers/char/bfin_sport.c (9203 => 9204)


--- trunk/drivers/char/bfin_sport.c	2010-10-15 22:48:30 UTC (rev 9203)
+++ trunk/drivers/char/bfin_sport.c	2010-10-15 23:05:47 UTC (rev 9204)
@@ -48,7 +48,6 @@
 
 	int sport_mode;
 	int sport_clkdiv;
-	int irq_notfreed;
 
 	struct mutex mutex;
 	unsigned int open_count;
@@ -214,6 +213,16 @@
 			rcr2 |= RXSE;
 	}
 
+	if (!config->dma_enabled) {
+		if (config->mode == NDSO_MODE) {
+			disable_irq(dev->tx_irq);
+			disable_irq(dev->rx_irq);
+		} else {
+			enable_irq(dev->tx_irq);
+			enable_irq(dev->rx_irq);
+		}
+	}
+
 	/* Using internal clock */
 	if (config->int_clk) {
 		u_long sclk = get_sclk();
@@ -329,22 +338,31 @@
 	dev->regs->rcr1 |= RSPEN;
 	if (cfg->word_len <= 8)
 		while (dev->rx_received < dev->rx_len) {
+			u8 *buf = (void *)dev->rx_buf + dev->rx_received;
 			dev->regs->tx16 = 0x00;
 			while (!(dev->regs->stat & RXNE))
 				cpu_relax();
-			u8 *buf = (void *)dev->rx_buf + dev->rx_received;
 			*buf = dev->regs->rx16;
 			dev->rx_received += 1;
 		}
 	else if (cfg->word_len <= 16)
 		while (dev->rx_received < dev->rx_len) {
+			u16 *buf = (void *)dev->rx_buf + dev->rx_received;
 			dev->regs->tx16 = 0x0000;
 			while (!(dev->regs->stat & RXNE))
 				cpu_relax();
-			u16 *buf = (void *)dev->rx_buf + dev->rx_received;
 			*buf = dev->regs->rx16;
 			dev->rx_received += 2;
 		}
+	else
+		while (dev->rx_received < dev->rx_len) {
+			u32 *buf = (void *)dev->rx_buf + dev->rx_received;
+			dev->regs->tx32 = 0x0000;
+			while (!(dev->regs->stat & RXNE))
+				cpu_relax();
+			*buf = dev->regs->rx32;
+			dev->rx_received += 4;
+		}
 	dev->regs->tcr1 &= ~TSPEN;
 	dev->regs->rcr1 &= ~RSPEN;
 }
@@ -393,7 +411,7 @@
 static void sport_ndso_tx_write(struct sport_dev *dev)
 {
 	struct sport_config *cfg = &dev->config;
-	int i, dummy;
+	int dummy;
 
 	dev->regs->tcr1 |= TSPEN;
 	dev->regs->rcr1 |= RSPEN;
@@ -406,7 +424,7 @@
 				cpu_relax();
 			dummy = dev->regs->rx16;
 		}
-	else if (cfg->word_len <= 16) {
+	else if (cfg->word_len <= 16)
 		while (dev->tx_sent < dev->tx_len) {
 			u16 *buf = (void *)dev->tx_buf + dev->tx_sent;
 			dev->regs->tx16 = *buf;
@@ -415,8 +433,15 @@
 				cpu_relax();
 			dummy = dev->regs->rx16;
 		}
-		dev->tx_sent = 0;
-	}
+	else
+		while (dev->tx_sent < dev->tx_len) {
+			u32 *buf = (void *)dev->tx_buf + dev->tx_sent;
+			dev->regs->tx32 = *buf;
+			dev->tx_sent += 4;
+			while (!(dev->regs->stat & RXNE))
+				cpu_relax();
+			dummy = dev->regs->rx32;
+		}
 	dev->regs->tcr1 &= ~TSPEN;
 	dev->regs->rcr1 &= ~RSPEN;
 }
@@ -574,7 +599,6 @@
 	}
 
 	dev->sport_clkdiv = 0x24;
-	dev->irq_notfreed = 1;
  done:
 	mutex_unlock(&dev->mutex);
 	return 0;
@@ -613,11 +637,8 @@
 		free_dma(dev->dma_rx_chan);
 		free_dma(dev->dma_tx_chan);
 	} else {
-		if (dev->irq_notfreed) {
-			free_irq(dev->tx_irq, dev);
-			free_irq(dev->rx_irq, dev);
-			dev->irq_notfreed = 0;
-		}
+		free_irq(dev->tx_irq, dev);
+		free_irq(dev->rx_irq, dev);
 	}
 	free_irq(dev->err_irq, dev);
 
@@ -677,11 +698,6 @@
 	}
 
 	if (dev->sport_mode == NDSO_MODE) {
-		if (dev->irq_notfreed) {
-			free_irq(dev->tx_irq, dev);
-			free_irq(dev->rx_irq, dev);
-			dev->irq_notfreed = 0;
-		}
 		sport_ndso_rx_read(dev);
 		goto out;
 	}
@@ -749,11 +765,6 @@
 		dev->tx_len = count;
 		dev->tx_sent = 0;
 		if (dev->sport_mode == NDSO_MODE) {
-			if (dev->irq_notfreed) {
-				free_irq(dev->tx_irq, dev);
-				free_irq(dev->rx_irq, dev);
-				dev->irq_notfreed = 0;
-			}
 			sport_ndso_tx_write(dev);
 			goto out;
 		}
@@ -794,7 +805,8 @@
 
 	case SPORT_IOC_GET_SYSTEMCLOCK:
 		value = get_sclk();
-		copy_to_user((unsigned long *)arg, &value, sizeof(unsigned long));
+		if (copy_to_user((void *)arg, &value, sizeof(value)))
+			return -EFAULT;
 		break;
 
 	case SPORT_IOC_SET_BAUDRATE:
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to