Title: [6172] trunk: add support for sport0..3 and random combos thereof
Revision
6172
Author
vapier
Date
2009-03-14 11:29:51 -0500 (Sat, 14 Mar 2009)

Log Message

add support for sport0..3 and random combos thereof

Modified Paths


Diff

Modified: trunk/arch/blackfin/include/asm/bfin_sport.h (6171 => 6172)


--- trunk/arch/blackfin/include/asm/bfin_sport.h	2009-03-14 14:49:44 UTC (rev 6171)
+++ trunk/arch/blackfin/include/asm/bfin_sport.h	2009-03-14 16:29:51 UTC (rev 6172)
@@ -126,7 +126,7 @@
 	int tx_len;
 	int tx_sent;
 
-	int sport_err_irq;
+	int err_irq;
 
 	struct mutex mutex;	/* mutual exclusion semaphore */
 	struct task_struct *task;

Modified: trunk/drivers/char/bfin_sport.c (6171 => 6172)


--- trunk/drivers/char/bfin_sport.c	2009-03-14 14:49:44 UTC (rev 6171)
+++ trunk/drivers/char/bfin_sport.c	2009-03-14 16:29:51 UTC (rev 6172)
@@ -34,19 +34,50 @@
 static int sport_minor;
 static int sport_nr_devs = SPORT_NR_DEVS;	/* number of bare sport devices */
 
-struct sport_dev *sport_devices;	/* allocated in sport_init_module */
-
-unsigned short bfin_char_pin_req_sport0[] = {
-	P_SPORT0_TFS, P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
-	P_SPORT0_DRPRI, P_SPORT0_RSCLK, P_SPORT0_DRSEC, P_SPORT0_DTSEC, 0
+/* XXX: this should get pushed to platform device */
+#define SPORT_REQ(x) \
+	[x] = {P_SPORT##x##_TFS, P_SPORT##x##_DTPRI, P_SPORT##x##_TSCLK, P_SPORT##x##_DTSEC, \
+	       P_SPORT##x##_RFS, P_SPORT##x##_DRPRI, P_SPORT##x##_RSCLK, P_SPORT##x##_DRSEC, 0}
+static u16 sport_req[][9] = {
+#ifdef SPORT0_TCR1
+	SPORT_REQ(0),
+#endif
+#ifdef SPORT1_TCR1
+	SPORT_REQ(1),
+#endif
+#ifdef SPORT2_TCR1
+	SPORT_REQ(2),
+#endif
+#ifdef SPORT3_TCR1
+	SPORT_REQ(3),
+#endif
 };
 
-unsigned short bfin_char_pin_req_sport1[] = {
-	P_SPORT1_TFS, P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS,
-	P_SPORT1_DRPRI, P_SPORT1_RSCLK, P_SPORT1_DRSEC, P_SPORT1_DTSEC, 0
+#define SPORT_PARAMS(x) \
+	[x] = { \
+		.dma_rx_chan = CH_SPORT##x##_RX, \
+		.dma_tx_chan = CH_SPORT##x##_TX, \
+		.rx_irq      = IRQ_SPORT##x##_RX, \
+		.tx_irq      = IRQ_SPORT##x##_TX, \
+		.err_irq     = IRQ_SPORT##x##_ERROR, \
+		.regs        = (struct sport_register *)SPORT##x##_TCR1, \
+	}
+static struct sport_dev sport_devices[] = {
+#ifdef SPORT0_TCR1
+	SPORT_PARAMS(0),
+#endif
+#ifdef SPORT1_TCR1
+	SPORT_PARAMS(1),
+#endif
+#ifdef SPORT2_TCR1
+	SPORT_PARAMS(2),
+#endif
+#ifdef SPORT3_TCR1
+	SPORT_PARAMS(3),
+#endif
 };
 
-#define DRV_NAME "bfin-sportdev"
+#define DRV_NAME "bfin_sport"
 
 static irqreturn_t dma_rx_irq_handler(int irq, void *dev_id);
 static irqreturn_t dma_tx_irq_handler(int irq, void *dev_id);
@@ -406,44 +437,36 @@
 	dev->tx_sent = 0;
 	dev->wait_con = 0;
 
-	ret = request_irq(dev->tx_irq, sport_tx_handler, IRQF_SHARED, "sport_tx", dev);
+	ret = request_irq(dev->tx_irq, sport_tx_handler, IRQF_SHARED, DRV_NAME "-tx", dev);
 	if (ret) {
 		printk(KERN_ERR "Unable to request sport tx irq\n");
 		goto fail;
 	}
 
-	ret = request_irq(dev->rx_irq, sport_rx_handler, IRQF_SHARED, "sport_rx", dev);
+	ret = request_irq(dev->rx_irq, sport_rx_handler, IRQF_SHARED, DRV_NAME "-rx", dev);
 	if (ret) {
 		printk(KERN_ERR "Unable to request sport rx irq\n");
 		goto fail1;
 	}
 
-	ret = request_irq(dev->sport_err_irq, sport_err_handler, 0, "sport_err", dev);
+	ret = request_irq(dev->err_irq, sport_err_handler, 0, DRV_NAME "-err", dev);
 	if (ret) {
 		printk(KERN_ERR "Unable to request sport err irq\n");
 		goto fail2;
 	}
 
-	switch (dev->sport_num) {
-	case 0:
-		ret = peripheral_request_list(bfin_char_pin_req_sport0, DRV_NAME);
-		break;
-	case 1:
-		ret = peripheral_request_list(bfin_char_pin_req_sport1, DRV_NAME);
-		break;
-	default:
-		ret = -EINVAL;
-	}
-	if (ret)
+	ret = peripheral_request_list(sport_req[dev->sport_num], DRV_NAME);
+	if (ret) {
+		printk(KERN_ERR DRV_NAME ": Requesting Peripherals failed\n");
 		goto fail3;
+	}
 
 	dev->task = current;
 
 	return 0;
 
  fail3:
-	printk(KERN_ERR DRV_NAME ": Requesting Peripherals failed\n");
-	free_irq(dev->sport_err_irq, dev);
+	free_irq(dev->err_irq, dev);
  fail2:
 	free_irq(dev->rx_irq, dev);
  fail1:
@@ -472,14 +495,10 @@
 		free_irq(dev->tx_irq, dev);
 		free_irq(dev->rx_irq, dev);
 	}
-	free_irq(dev->sport_err_irq, dev);
+	free_irq(dev->err_irq, dev);
 
-	if (dev->sport_num == 0)
-		peripheral_free_list(bfin_char_pin_req_sport0);
+	peripheral_free_list(sport_req[dev->sport_num]);
 
-	if (dev->sport_num == 1)
-		peripheral_free_list(bfin_char_pin_req_sport1);
-
 	return 0;
 }
 
@@ -660,20 +679,19 @@
 	unsigned short i;
 	p = buf;
 
-	if (sport_devices) {
-		for (i = 0; i < sport_nr_devs; ++i)
-			p += sprintf(p,
-				     "sport%d:\nrx_irq=%d, rx_received=%d, tx_irq=%d, tx_sent=%d,\n"
-				     "mode=%d, channels=%d, data_format=%d, word_len=%d.\n",
-				     i, sport_devices[i].rx_irq,
-				     sport_devices[i].rx_received,
-				     sport_devices[i].tx_irq,
-				     sport_devices[i].tx_sent,
-				     sport_devices[i].config.mode,
-				     sport_devices[i].config.channels,
-				     sport_devices[i].config.data_format,
-				     sport_devices[i].config.word_len);
-	}
+	for (i = 0; i < sport_nr_devs; ++i)
+		p += sprintf(p,
+			"sport%d:\nrx_irq=%d, rx_received=%d, tx_irq=%d, tx_sent=%d,\n"
+			"mode=%d, channels=%d, data_format=%d, word_len=%d.\n",
+			i, sport_devices[i].rx_irq,
+			sport_devices[i].rx_received,
+			sport_devices[i].tx_irq,
+			sport_devices[i].tx_sent,
+			sport_devices[i].config.mode,
+			sport_devices[i].config.channels,
+			sport_devices[i].config.data_format,
+			sport_devices[i].config.word_len);
+
 	return p - buf;
 }
 
@@ -690,16 +708,13 @@
 
 static CLASS_ATTR(status, S_IRUGO, &sport_status_show, NULL);
 
-static void sport_cleanup_module(void)
+static void __exit sport_cleanup_module(void)
 {
 	int i;
 	dev_t devno = MKDEV(sport_major, sport_minor);
 
-	if (sport_devices) {
-		for (i = 0; i < sport_nr_devs; ++i)
-			cdev_del(&sport_devices[i].cdev);
-		kfree(sport_devices);
-	}
+	for (i = 0; i < sport_nr_devs; ++i)
+		cdev_del(&sport_devices[i].cdev);
 
 	unregister_chrdev_region(devno, sport_nr_devs);
 }
@@ -729,16 +744,10 @@
 		return result;
 	}
 
-	sport_devices = kcalloc(sport_nr_devs, sizeof(*sport_devices), GFP_KERNEL);
-	if (!sport_devices) {
-		sport_cleanup_module();
-		return -ENOMEM;
-	}
-
 	sport_class = class_create(THIS_MODULE, "sport");
 	result = class_create_file(sport_class, &class_attr_status);
 	if (result) {
-		sport_cleanup_module();
+		unregister_chrdev_region(dev, sport_nr_devs);
 		return result;
 	}
 	for (minor = 0; minor < sport_nr_devs; minor++)
@@ -752,18 +761,6 @@
 		mutex_init(&sport_devices[i].mutex);
 		init_waitqueue_head(&sport_devices[i].waitq);
 	}
-	sport_devices[0].regs = (struct sport_register *)SPORT0_TCR1;
-	sport_devices[0].dma_rx_chan = CH_SPORT0_RX;
-	sport_devices[0].dma_tx_chan = CH_SPORT0_TX;
-	sport_devices[0].rx_irq = IRQ_SPORT0_RX;
-	sport_devices[0].tx_irq = IRQ_SPORT0_TX;
-	sport_devices[0].sport_err_irq = IRQ_SPORT0_ERROR;
-	sport_devices[1].regs = (struct sport_register *)SPORT1_TCR1;
-	sport_devices[1].dma_rx_chan = CH_SPORT1_RX;
-	sport_devices[1].dma_tx_chan = CH_SPORT1_TX;
-	sport_devices[1].rx_irq = IRQ_SPORT1_RX;
-	sport_devices[1].tx_irq = IRQ_SPORT1_TX;
-	sport_devices[1].sport_err_irq = IRQ_SPORT1_ERROR;
 
 	return 0;
 }
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to