123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- From 5de6baef9b5d9e3a84e0c3752cfb7eaef2eb1a0f Mon Sep 17 00:00:00 2001
- From: notro <notro@tronnes.org>
- 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 <notro@tronnes.org>
- 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 <notro@tronnes.org>
- spi: bcm2835: make driver available on ARCH_BCM2708
- Make this driver available on ARCH_BCM2708
- Signed-off-by: Noralf Tronnes <notro@tronnes.org>
- 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(-)
- --- 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>;
- + };
- };
- --- 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>;
- + };
- };
- };
- --- a/arch/arm/mach-bcm2708/bcm2708.c
- +++ b/arch/arm/mach-bcm2708/bcm2708.c
- @@ -486,6 +486,7 @@ static struct platform_device bcm2708_al
- },
- };
-
- +#ifndef CONFIG_OF
- static struct resource bcm2708_spi_resources[] = {
- {
- .start = SPI0_BASE,
- @@ -509,6 +510,7 @@ static struct platform_device bcm2708_sp
- .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 pl
- 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
- }
-
- --- 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.
-
- --- a/drivers/spi/spi-bcm2708.c
- +++ b/drivers/spi/spi-bcm2708.c
- @@ -512,6 +512,7 @@ static int bcm2708_spi_probe(struct plat
- 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 pla
- 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,
|