Title: [6168] trunk/drivers/net/irda: Revised bfin_sir driver (v4) according suggestions from lkml
Revision
6168
Author
gyang
Date
2009-03-13 01:31:03 -0500 (Fri, 13 Mar 2009)

Log Message

Revised bfin_sir driver (v4) according suggestions from lkml

Modified Paths


Diff

Modified: trunk/drivers/net/irda/Kconfig (6167 => 6168)


--- trunk/drivers/net/irda/Kconfig	2009-03-10 20:02:52 UTC (rev 6167)
+++ trunk/drivers/net/irda/Kconfig	2009-03-13 06:31:03 UTC (rev 6168)
@@ -22,7 +22,7 @@
 	depends on BLACKFIN && IRDA
 	default n
 	help
-	  Say Y here if your want to enable SIR function on Blackfin UART 
+	  Say Y here if your want to enable SIR function on Blackfin UART
 	  devices.
 
 	  To activate this driver you can start irattach like:
@@ -33,22 +33,22 @@
 	  Note that you need to turn off one of the serial drivers for SIR
 	  to use that UART.
 
-config BFIN_SIR3
-	bool "Blackfin SIR on UART3"
-	depends on BFIN_SIR && !SERIAL_BFIN_UART3 && (BF54x)
+config BFIN_SIR0
+	bool "Blackfin SIR on UART0"
+	depends on BFIN_SIR && !SERIAL_BFIN_UART0
 
 config BFIN_SIR1
 	bool "Blackfin SIR on UART1"
 	depends on BFIN_SIR && !SERIAL_BFIN_UART1 && (!BF531 && !BF532 && !BF533 && !BF561)
 
-config BFIN_SIR0
-	bool "Blackfin SIR on UART0"
-	depends on BFIN_SIR && !SERIAL_BFIN_UART0
-
 config BFIN_SIR2
 	bool "Blackfin SIR on UART2"
 	depends on BFIN_SIR && !SERIAL_BFIN_UART2 && (BF54x || BF538 || BF539)
 
+config BFIN_SIR3
+	bool "Blackfin SIR on UART3"
+	depends on BFIN_SIR && !SERIAL_BFIN_UART3 && (BF54x)
+
 choice
 	prompt "SIR Mode"
 	depends on BFIN_SIR

Modified: trunk/drivers/net/irda/bfin_sir.c (6167 => 6168)


--- trunk/drivers/net/irda/bfin_sir.c	2009-03-10 20:02:52 UTC (rev 6167)
+++ trunk/drivers/net/irda/bfin_sir.c	2009-03-13 06:31:03 UTC (rev 6168)
@@ -1,7 +1,7 @@
 /*
  * Blackfin Infra-red Driver
  *
- * Copyright 2006-2008 Analog Devices Inc.
+ * Copyright 2006-2009 Analog Devices Inc.
  *
  * Enter bugs at http://blackfin.uclinux.org/
  *
@@ -94,7 +94,9 @@
 {
 	int ret = -EINVAL;
 	unsigned int quot;
-	unsigned short val, lsr, lcr = 0;
+	unsigned short val, lsr, lcr;
+	static int utime;
+	int count = 10;
 
 	lcr = WLS(8);
 
@@ -105,12 +107,17 @@
 	case 57600:
 	case 115200:
 
-		quot = (port->clk + (8 * speed)) / (16 * speed);
+		quot = (port->clk + (8 * speed)) / (16 * speed)\
+						- ANOMALY_05000230;
 
 		do {
+			udelay(utime);
 			lsr = SIR_UART_GET_LSR(port);
-		} while (!(lsr & TEMT));
+		} while (!(lsr & TEMT) && count--);
 
+		/* The useconds for 1 bits to transmit */
+		utime = 1000000 / speed + 1;
+
 		/* Clear UCEN bit to reset the UART state machine
 		 * and control registers
 		 */
@@ -123,7 +130,6 @@
 		SSYNC();
 
 		SIR_UART_PUT_DLL(port, quot & 0xFF);
-		SSYNC();
 		SIR_UART_PUT_DLH(port, (quot >> 8) & 0xFF);
 		SSYNC();
 
@@ -138,7 +144,6 @@
 		SIR_UART_PUT_GCTL(port, val);
 
 		ret = 0;
-		/*printk(KERN_DEBUG "bfin_sir: Set new speed %d\n", speed);*/
 		break;
 	default:
 		printk(KERN_WARNING "bfin_sir: Invalid speed %d\n", speed);
@@ -275,7 +280,7 @@
 	struct bfin_sir_port *port = self->sir_port;
 
 	spin_lock(&self->lock);
-	if (!(get_dma_curr_irqstat(port->tx_dma_channel)&DMA_RUN)) {
+	if (!(get_dma_curr_irqstat(port->tx_dma_channel) & DMA_RUN)) {
 		clear_dma_irqstat(port->tx_dma_channel);
 		bfin_sir_stop_tx(port);
 
@@ -353,7 +358,7 @@
 	clear_dma_irqstat(port->rx_dma_channel);
 	spin_unlock(&self->lock);
 
-	mod_timer(&(port->rx_dma_timer), jiffies + DMA_SIR_RX_FLUSH_JIFS);
+	mod_timer(&port->rx_dma_timer, jiffies + DMA_SIR_RX_FLUSH_JIFS);
 	return IRQ_HANDLED;
 }
 #endif /* CONFIG_SIR_BFIN_DMA */
@@ -365,12 +370,12 @@
 #endif /* CONFIG_SIR_BFIN_DMA */
 
 	if (request_dma(port->rx_dma_channel, "BFIN_UART_RX") < 0) {
-		printk(KERN_WARNING "bfin_sir: Unable to attach SIR RX DMA channel\n");
+		dev_warn(&dev->dev, "Unable to attach SIR RX DMA channel\n");
 		return -EBUSY;
 	}
 
 	if (request_dma(port->tx_dma_channel, "BFIN_UART_TX") < 0) {
-		printk(KERN_WARNING "bfin_sir: Unable to attach SIR TX DMA channel\n");
+		dev_warn(&dev->dev, "Unable to attach SIR TX DMA channel\n");
 		free_dma(port->rx_dma_channel);
 		return -EBUSY;
 	}
@@ -402,12 +407,12 @@
 #else
 
 	if (request_irq(port->irq, bfin_sir_rx_int, IRQF_DISABLED, "BFIN_SIR_RX", dev)) {
-		printk(KERN_WARNING "bfin_sir: Unable to attach SIR RX interrupt\n");
+		dev_warn(&dev->dev, "Unable to attach SIR RX interrupt\n");
 		return -EBUSY;
 	}
 
 	if (request_irq(port->irq+1, bfin_sir_tx_int, IRQF_DISABLED, "BFIN_SIR_TX", dev)) {
-		printk(KERN_WARNING "bfin_sir: Unable to attach SIR TX interrupt\n");
+		dev_warn(&dev->dev, "Unable to attach SIR TX interrupt\n");
 		free_irq(port->irq, dev);
 		return -EBUSY;
 	}
@@ -563,7 +568,7 @@
 				ret = bfin_sir_set_speed(port, rq->ifr_baudrate);
 				bfin_sir_enable_rx(port);
 			} else {
-				printk(KERN_WARNING "bfin_sir: SIOCSBANDWIDTH: !netif_running\n");
+				dev_warn(&dev->dev, "SIOCSBANDWIDTH: !netif_running\n");
 				ret = 0;
 			}
 		}
@@ -678,22 +683,26 @@
 	struct bfin_sir_self *self;
 	unsigned int baudrate_mask;
 	struct bfin_sir_port *sir_port;
-	int err = 0;
+	int err;
 
-	err = peripheral_request(per[pdev->id][0], DRIVER_NAME);
-	if (err)
-		return err;
-	err = peripheral_request(per[pdev->id][1], DRIVER_NAME);
-	if (err)
-		return err;
+	if (pdev->id >= 0 && pdev->id < ARRAY_SIZE(per) && \
+				per[pdev->id][3] == pdev->id) {
+		err = peripheral_request_list(per[pdev->id], DRIVER_NAME);
+		if (err)
+			return err;
+	} else {
+		dev_err(&pdev->dev, "Invalid pdev id, please check board file\n");
+		return -ENODEV;
+	}
 
-	sir_port = kmalloc(sizeof(struct bfin_sir_port), GFP_KERNEL);
+	err = -ENOMEM;
+	sir_port = kmalloc(sizeof(*sir_port), GFP_KERNEL);
 	if (!sir_port)
 		goto err_mem_0;
 
 	bfin_sir_init_ports(sir_port, pdev);
 
-	dev = alloc_irdadev(sizeof(struct bfin_sir_self));
+	dev = alloc_irdadev(sizeof(*self));
 	if (!dev)
 		goto err_mem_1;
 
@@ -729,6 +738,10 @@
 		baudrate_mask |= IR_38400;
 	case 19200:
 		baudrate_mask |= IR_19200;
+	case 9600:
+		break;
+	default:
+		dev_warn(&pdev->dev, "Invalid maximum baud rate, using 9600\n");
 	}
 
 	self->qos.baud_rate.bits &= baudrate_mask;
@@ -740,17 +753,18 @@
 	err = register_netdev(dev);
 
 	if (err) {
+		kfree(self->tx_buff.head);
 err_mem_3:
-		kfree(self->tx_buff.head);
+		kfree(self->rx_buff.head);
 err_mem_2:
-		kfree(self->rx_buff.head);
+		free_netdev(dev);
 err_mem_1:
-		free_netdev(dev);
+		kfree(sir_port);
 err_mem_0:
-		kfree(sir_port);
-	}
-	if (err == 0)
+		peripheral_free_list(per[pdev->id]);
+	} else
 		platform_set_drvdata(pdev, sir_port);
+
 	return err;
 }
 
@@ -801,6 +815,6 @@
 module_param(max_rate, int, 0);
 MODULE_PARM_DESC(max_rate, "Maximum baud rate (115200, 57600, 38400, 19200, 9600)");
 
-MODULE_AUTHOR("Graf.Yang <[email protected]>");
+MODULE_AUTHOR("Graf Yang <[email protected]>");
 MODULE_DESCRIPTION("Blackfin IrDA driver");
 MODULE_LICENSE("GPL");

Modified: trunk/drivers/net/irda/bfin_sir.h (6167 => 6168)


--- trunk/drivers/net/irda/bfin_sir.h	2009-03-10 20:02:52 UTC (rev 6167)
+++ trunk/drivers/net/irda/bfin_sir.h	2009-03-13 06:31:03 UTC (rev 6168)
@@ -1,7 +1,7 @@
 /*
  * Blackfin Infra-red Driver
  *
- * Copyright 2006-2008 Analog Devices Inc.
+ * Copyright 2006-2009 Analog Devices Inc.
  *
  * Enter bugs at http://blackfin.uclinux.org/
  *
@@ -31,7 +31,7 @@
 	char *buf;
 	int head;
 	int tail;
-	};
+};
 #endif
 
 struct bfin_sir_port {
@@ -139,9 +139,10 @@
 }
 #endif
 
-static unsigned short per[][2] = {
-	{P_UART0_RX, P_UART0_TX},
-	{P_UART1_RX, P_UART1_TX},
-	{P_UART2_RX, P_UART2_TX},
-	{P_UART3_RX, P_UART3_TX},
-	};
+static const unsigned short per[][4] = {
+	/* rx pin      tx pin     NULL  uart_number */
+	{P_UART0_RX, P_UART0_TX,    0,    0},
+	{P_UART1_RX, P_UART1_TX,    0,    1},
+	{P_UART2_RX, P_UART2_TX,    0,    2},
+	{P_UART3_RX, P_UART3_TX,    0,    3},
+};
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to