Register SPI controllers through device tree. We will wire up the clocks at a later stage. Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 3353228a04a004ec67073871f40cf58dc4e209aa Mon Sep 17 00:00:00 2001
 | 
						|
From: Jonas Gorski <jonas.gorski@gmail.com>
 | 
						|
Date: Mon, 7 Sep 2015 21:01:38 +0200
 | 
						|
Subject: [PATCH 4/8] spi/bcm63xx: add support for probing through devicetree
 | 
						|
 | 
						|
Add required binding support to probe through device tree.
 | 
						|
 | 
						|
Use the compatible instead of the resource size for identifiying the
 | 
						|
block type, and allow reducing the number of cs lines through OF.
 | 
						|
 | 
						|
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
 | 
						|
---
 | 
						|
 drivers/spi/spi-bcm63xx.c | 42 ++++++++++++++++++++++++++++++++++++------
 | 
						|
 1 file changed, 36 insertions(+), 6 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/spi/spi-bcm63xx.c
 | 
						|
+++ b/drivers/spi/spi-bcm63xx.c
 | 
						|
@@ -26,6 +26,7 @@
 | 
						|
 #include <linux/completion.h>
 | 
						|
 #include <linux/err.h>
 | 
						|
 #include <linux/pm_runtime.h>
 | 
						|
+#include <linux/of.h>
 | 
						|
 
 | 
						|
 /* BCM 6338/6348 SPI core */
 | 
						|
 #define SPI_6348_RSET_SIZE		64
 | 
						|
@@ -485,21 +486,48 @@ static const struct platform_device_id b
 | 
						|
 	},
 | 
						|
 };
 | 
						|
 
 | 
						|
+static const struct of_device_id bcm63xx_spi_of_match[] = {
 | 
						|
+	{ .compatible = "brcm,bcm6348-spi", .data = &bcm6348_spi_reg_offsets },
 | 
						|
+	{ .compatible = "brcm,bcm6358-spi", .data = &bcm6358_spi_reg_offsets },
 | 
						|
+	{ },
 | 
						|
+};
 | 
						|
+
 | 
						|
 static int bcm63xx_spi_probe(struct platform_device *pdev)
 | 
						|
 {
 | 
						|
 	struct resource *r;
 | 
						|
 	const unsigned long *bcm63xx_spireg;
 | 
						|
 	struct device *dev = &pdev->dev;
 | 
						|
-	int irq;
 | 
						|
+	int irq, bus_num;
 | 
						|
 	struct spi_master *master;
 | 
						|
 	struct clk *clk;
 | 
						|
 	struct bcm63xx_spi *bs;
 | 
						|
 	int ret;
 | 
						|
+	u32 num_cs = BCM63XX_SPI_MAX_CS;
 | 
						|
 
 | 
						|
-	if (!pdev->id_entry->driver_data)
 | 
						|
-		return -EINVAL;
 | 
						|
+	if (dev->of_node) {
 | 
						|
+		const struct of_device_id *match;
 | 
						|
 
 | 
						|
-	bcm63xx_spireg = (const unsigned long *)pdev->id_entry->driver_data;
 | 
						|
+		match = of_match_node(bcm63xx_spi_of_match, dev->of_node);
 | 
						|
+		if (!match)
 | 
						|
+			return -EINVAL;
 | 
						|
+		bcm63xx_spireg = match->data;
 | 
						|
+
 | 
						|
+		of_property_read_u32(dev->of_node, "num-cs", &num_cs);
 | 
						|
+		if (num_cs > BCM63XX_SPI_MAX_CS) {
 | 
						|
+			dev_warn(dev, "unsupported number of cs (%i), reducing to 8\n",
 | 
						|
+				 num_cs);
 | 
						|
+			num_cs = BCM63XX_SPI_MAX_CS;
 | 
						|
+		}
 | 
						|
+
 | 
						|
+		bus_num = -1;
 | 
						|
+	} else if (pdev->id_entry->driver_data) {
 | 
						|
+		const struct platform_device_id *match = pdev->id_entry;
 | 
						|
+
 | 
						|
+		bcm63xx_spireg = (const unsigned long *)match->driver_data;
 | 
						|
+		bus_num = BCM63XX_SPI_BUS_NUM;
 | 
						|
+	} else {
 | 
						|
+		return -EINVAL;
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	irq = platform_get_irq(pdev, 0);
 | 
						|
 	if (irq < 0) {
 | 
						|
@@ -544,8 +572,9 @@ static int bcm63xx_spi_probe(struct plat
 | 
						|
 		goto out_err;
 | 
						|
 	}
 | 
						|
 
 | 
						|
-	master->bus_num = BCM63XX_SPI_BUS_NUM;
 | 
						|
-	master->num_chipselect = BCM63XX_SPI_MAX_CS;
 | 
						|
+	master->dev.of_node = dev->of_node;
 | 
						|
+	master->bus_num = bus_num;
 | 
						|
+	master->num_chipselect = num_cs;
 | 
						|
 	master->transfer_one_message = bcm63xx_spi_transfer_one;
 | 
						|
 	master->mode_bits = MODEBITS;
 | 
						|
 	master->bits_per_word_mask = SPI_BPW_MASK(8);
 | 
						|
@@ -634,6 +663,7 @@ static struct platform_driver bcm63xx_sp
 | 
						|
 	.driver = {
 | 
						|
 		.name	= "bcm63xx-spi",
 | 
						|
 		.pm	= &bcm63xx_spi_pm_ops,
 | 
						|
+		.of_match_table = bcm63xx_spi_of_match,
 | 
						|
 	},
 | 
						|
 	.id_table	= bcm63xx_spi_dev_match,
 | 
						|
 	.probe		= bcm63xx_spi_probe,
 |