brcm2708: update to latest patches from RPi foundation
[openwrt/staging/chunkeey.git] / target / linux / brcm2708 / patches-4.19 / 950-0791-Add-universal-device-tree-overlay-for-SPI-devices.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0791-Add-universal-device-tree-overlay-for-SPI-devices.patch b/target/linux/brcm2708/patches-4.19/950-0791-Add-universal-device-tree-overlay-for-SPI-devices.patch
new file mode 100644 (file)
index 0000000..ce027e7
--- /dev/null
@@ -0,0 +1,273 @@
+From 4d19be9132ca10cf582450a86dcb2c41f227f589 Mon Sep 17 00:00:00 2001
+From: Ed Spiridonov <edo.rus@gmail.com>
+Date: Tue, 10 Dec 2019 22:45:04 +0300
+Subject: [PATCH] Add universal device tree overlay for SPI devices
+
+Just specify the SPI address and device name ("compatible" property).
+This overlay lacks any device-specific parameter support!
+(some of them could be added later)
+
+Examples:
+1. SPI NOR flash on spi0.1, maximum SPI clock frequency 45MHz:
+    dtoverlay=anyspi:spi0-1,dev="jedec,spi-nor",speed=45000000
+2. MCP3204 ADC on spi1.2, maximum SPI clock frequency 500kHz:
+    dtoverlay=anyspi:spi1-2,dev="microchip,mcp3204"
+
+Signed-off-by: Ed Spiridonov <edo.rus@gmail.com>
+---
+ arch/arm/boot/dts/overlays/Makefile           |   1 +
+ arch/arm/boot/dts/overlays/README             |  23 ++
+ arch/arm/boot/dts/overlays/anyspi-overlay.dts | 205 ++++++++++++++++++
+ 3 files changed, 229 insertions(+)
+ create mode 100755 arch/arm/boot/dts/overlays/anyspi-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -15,6 +15,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
+       allo-katana-dac-audio.dtbo \
+       allo-piano-dac-pcm512x-audio.dtbo \
+       allo-piano-dac-plus-pcm512x-audio.dtbo \
++      anyspi.dtbo \
+       apds9960.dtbo \
+       applepi-dac.dtbo \
+       at86rf233.dtbo \
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -441,6 +441,29 @@ Params: 24db_digital_gain       Allow ga
+                                 better voice quality. (default Off)
++Name:   anyspi
++Info:   Universal device tree overlay for SPI devices
++
++        Just specify the SPI address and device name ("compatible" property).
++        This overlay lacks any device-specific parameter support!
++
++        For devices on spi1 or spi2, the interfaces should be enabled
++        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
++
++        Examples:
++        1. SPI NOR flash on spi0.1, maximum SPI clock frequency 45MHz:
++            dtoverlay=anyspi:spi0-1,dev="jedec,spi-nor",speed=45000000
++        2. MCP3204 ADC on spi1.2, maximum SPI clock frequency 500kHz:
++            dtoverlay=anyspi:spi1-2,dev="microchip,mcp3204"
++Load:   dtoverlay=anyspi,<param>=<val>
++Params: spi<n>-<m>              Configure device at spi<n>, cs<m>
++                                (boolean, required)
++        dev                     Set device name to search compatible module
++                                (string, required)
++        speed                   Set SPI clock frequency in Hz
++                                (integer, optional, default 500000)
++
++
+ Name:   apds9960
+ Info:   Configures the AVAGO APDS9960 digital proximity, ambient light, RGB and
+         gesture sensor
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/anyspi-overlay.dts
+@@ -0,0 +1,205 @@
++/*
++ * Universal device tree overlay for SPI devices
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835";
++
++      fragment@0 {
++              target = <&spidev0>;
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@1 {
++              target = <&spidev1>;
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@2 {
++              target-path = "spi1/spidev@0";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@3 {
++              target-path = "spi1/spidev@1";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@4 {
++              target-path = "spi1/spidev@2";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@5 {
++              target-path = "spi2/spidev@0";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@6 {
++              target-path = "spi2/spidev@1";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@7 {
++              target-path = "spi2/spidev@2";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@8 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_00: anyspi@0 {
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@9 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_01: anyspi@1 {
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@10 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_10: anyspi@0 {
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@11 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_11: anyspi@1 {
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@12 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_12: anyspi@2 {
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@13 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_20: anyspi@0 {
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@14 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_21: anyspi@1 {
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      fragment@15 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      anyspi_22: anyspi@2 {
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                      };
++              };
++      };
++
++      __overrides__ {
++              spi0-0 = <0>, "+0+8";
++              spi0-1 = <0>, "+1+9";
++              spi1-0 = <0>, "+2+10";
++              spi1-1 = <0>, "+3+11";
++              spi1-2 = <0>, "+4+12";
++              spi2-0 = <0>, "+5+13";
++              spi2-1 = <0>, "+6+14";
++              spi2-2 = <0>, "+7+15";
++              dev = <&anyspi_00>,"compatible",
++                    <&anyspi_01>,"compatible",
++                    <&anyspi_10>,"compatible",
++                    <&anyspi_11>,"compatible",
++                    <&anyspi_12>,"compatible",
++                    <&anyspi_20>,"compatible",
++                    <&anyspi_21>,"compatible",
++                    <&anyspi_22>,"compatible";
++              speed = <&anyspi_00>, "spi-max-frequency:0",
++                      <&anyspi_01>, "spi-max-frequency:0",
++                      <&anyspi_10>, "spi-max-frequency:0",
++                      <&anyspi_11>, "spi-max-frequency:0",
++                      <&anyspi_12>, "spi-max-frequency:0",
++                      <&anyspi_20>, "spi-max-frequency:0",
++                      <&anyspi_21>, "spi-max-frequency:0",
++                      <&anyspi_22>, "spi-max-frequency:0";
++      };
++};