From 5de6baef9b5d9e3a84e0c3752cfb7eaef2eb1a0f Mon Sep 17 00:00:00 2001 From: notro Date: Sun, 27 Jul 2014 20:12:58 +0200 Subject: [PATCH 052/114] spi: bcm2708: add device tree support Add DT support to driver and add to .dtsi file. Setup pins and spidev in .dts file. SPI is disabled by default. Signed-off-by: Noralf Tronnes BCM2708: don't register SPI controller when using DT The device for the SPI controller is in the Device Tree. Only register the device when not using DT. Signed-off-by: Noralf Tronnes spi: bcm2835: make driver available on ARCH_BCM2708 Make this driver available on ARCH_BCM2708 Signed-off-by: Noralf Tronnes bcm2708: Remove the prohibition on mixing SPIDEV and DT --- arch/arm/boot/dts/bcm2708-rpi-b.dts | 32 ++++++++++++++++++++++++++++++++ arch/arm/boot/dts/bcm2708.dtsi | 18 ++++++++++++++++++ arch/arm/mach-bcm2708/bcm2708.c | 19 ++++++++++++++++--- drivers/spi/Kconfig | 2 +- drivers/spi/spi-bcm2708.c | 8 ++++++++ 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/arch/arm/boot/dts/bcm2708-rpi-b.dts b/arch/arm/boot/dts/bcm2708-rpi-b.dts index e319c8e..30107fb 100644 --- a/arch/arm/boot/dts/bcm2708-rpi-b.dts +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts @@ -5,4 +5,36 @@ / { compatible = "brcm,bcm2708"; model = "Raspberry Pi"; + + aliases { + spi0 = &spi0; + }; +}; + +&gpio { + spi0_pins: spi0_pins { + brcm,pins = <7 8 9 10 11>; + brcm,function = <4>; /* alt0 */ + }; +}; + +&spi0 { + pinctrl-names = "default"; + pinctrl-0 = <&spi0_pins>; + + spidev@0{ + compatible = "spidev"; + reg = <0>; /* CE0 */ + #address-cells = <1>; + #size-cells = <0>; + spi-max-frequency = <500000>; + }; + + spidev@1{ + compatible = "spidev"; + reg = <1>; /* CE1 */ + #address-cells = <1>; + #size-cells = <0>; + spi-max-frequency = <500000>; + }; }; diff --git a/arch/arm/boot/dts/bcm2708.dtsi b/arch/arm/boot/dts/bcm2708.dtsi index b2920c8..e90bf4c 100644 --- a/arch/arm/boot/dts/bcm2708.dtsi +++ b/arch/arm/boot/dts/bcm2708.dtsi @@ -38,11 +38,29 @@ interrupt-controller; #interrupt-cells = <2>; }; + + spi0: spi@7e204000 { + compatible = "brcm,bcm2708-spi"; + reg = <0x7e204000 0x1000>; + interrupts = <2 22>; + clocks = <&clk_spi>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; }; clocks { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>; + + clk_spi: clock@2 { + compatible = "fixed-clock"; + reg = <2>; + #clock-cells = <0>; + clock-output-names = "spi"; + clock-frequency = <250000000>; + }; }; }; diff --git a/arch/arm/mach-bcm2708/bcm2708.c b/arch/arm/mach-bcm2708/bcm2708.c index 0e5bd43..a2069f8 100644 --- a/arch/arm/mach-bcm2708/bcm2708.c +++ b/arch/arm/mach-bcm2708/bcm2708.c @@ -486,6 +486,7 @@ static struct platform_device bcm2708_alsa_devices[] = { }, }; +#ifndef CONFIG_OF static struct resource bcm2708_spi_resources[] = { { .start = SPI0_BASE, @@ -509,6 +510,7 @@ static struct platform_device bcm2708_spi_device = { .dma_mask = &bcm2708_spi_dmamask, .coherent_dma_mask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON)}, }; +#endif #ifdef CONFIG_BCM2708_SPIDEV static struct spi_board_info bcm2708_spi_devices[] = { @@ -670,6 +672,16 @@ int __init bcm_register_device(struct platform_device *pdev) return ret; } +/* + * Use this macro for platform devices that are present in the Device Tree. + * This way the device is only added on non-DT builds. + */ +#ifdef CONFIG_OF +#define bcm_register_device_dt(pdev) +#else +#define bcm_register_device_dt(pdev) bcm_register_device(pdev) +#endif + int calc_rsts(int partition) { return PM_PASSWORD | @@ -784,7 +796,7 @@ void __init bcm2708_init(void) for (i = 0; i < ARRAY_SIZE(bcm2708_alsa_devices); i++) bcm_register_device(&bcm2708_alsa_devices[i]); - bcm_register_device(&bcm2708_spi_device); + bcm_register_device_dt(&bcm2708_spi_device); bcm_register_device(&bcm2708_bsc0_device); bcm_register_device(&bcm2708_bsc1_device); @@ -824,8 +836,9 @@ void __init bcm2708_init(void) system_serial_low = serial; #ifdef CONFIG_BCM2708_SPIDEV - spi_register_board_info(bcm2708_spi_devices, - ARRAY_SIZE(bcm2708_spi_devices)); + if (!use_dt) + spi_register_board_info(bcm2708_spi_devices, + ARRAY_SIZE(bcm2708_spi_devices)); #endif } diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 71b4741..a5238ab 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -77,7 +77,7 @@ config SPI_ATMEL config SPI_BCM2835 tristate "BCM2835 SPI controller" - depends on ARCH_BCM2835 || COMPILE_TEST + depends on ARCH_BCM2835 || ARCH_BCM2708 || COMPILE_TEST help This selects a driver for the Broadcom BCM2835 SPI master. diff --git a/drivers/spi/spi-bcm2708.c b/drivers/spi/spi-bcm2708.c index 349d21f..041b5e2 100644 --- a/drivers/spi/spi-bcm2708.c +++ b/drivers/spi/spi-bcm2708.c @@ -512,6 +512,7 @@ static int bcm2708_spi_probe(struct platform_device *pdev) master->setup = bcm2708_spi_setup; master->transfer = bcm2708_spi_transfer; master->cleanup = bcm2708_spi_cleanup; + master->dev.of_node = pdev->dev.of_node; platform_set_drvdata(pdev, master); bs = spi_master_get_devdata(master); @@ -596,10 +597,17 @@ static int bcm2708_spi_remove(struct platform_device *pdev) return 0; } +static const struct of_device_id bcm2708_spi_match[] = { + { .compatible = "brcm,bcm2708-spi", }, + {} +}; +MODULE_DEVICE_TABLE(of, bcm2708_spi_match); + static struct platform_driver bcm2708_spi_driver = { .driver = { .name = DRV_NAME, .owner = THIS_MODULE, + .of_match_table = bcm2708_spi_match, }, .probe = bcm2708_spi_probe, .remove = bcm2708_spi_remove, -- 1.8.3.2