From b50fd8c2b3abdd557bd7d2bb5628f03b20801350 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Tue, 7 Feb 2017 12:31:02 +0100 Subject: brcm63xx: register SPI controllers through DT Register SPI controllers through device tree. We will wire up the clocks at a later stage. Signed-off-by: Jonas Gorski --- ...-add-support-for-probing-through-devicetr.patch | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 target/linux/brcm63xx/patches-4.4/001-4.12-03-spi-bcm63xx-add-support-for-probing-through-devicetr.patch (limited to 'target/linux/brcm63xx/patches-4.4/001-4.12-03-spi-bcm63xx-add-support-for-probing-through-devicetr.patch') diff --git a/target/linux/brcm63xx/patches-4.4/001-4.12-03-spi-bcm63xx-add-support-for-probing-through-devicetr.patch b/target/linux/brcm63xx/patches-4.4/001-4.12-03-spi-bcm63xx-add-support-for-probing-through-devicetr.patch new file mode 100644 index 0000000000..51054625ee --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/001-4.12-03-spi-bcm63xx-add-support-for-probing-through-devicetr.patch @@ -0,0 +1,98 @@ +From 3353228a04a004ec67073871f40cf58dc4e209aa Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +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 +--- + 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 + #include + #include ++#include + + /* 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, -- cgit v1.2.3