From 6510d9e0fe048fac6b9b29f62a4e7ab31e2cd034 Mon Sep 17 00:00:00 2001 From: Maxim Mikityanskiy Date: Sun, 21 Jun 2020 18:06:31 +0300 Subject: [PATCH 1/2] config: Set CONFIG_SERIAL_DEV_CTRL_TTYPORT=y in Raspberry Pi defconfigs The next patch adds a device tree overlay for Bluetooth. The Bluetooth device node is a child of uart0 (pl011). The children of pl011 are not registered as platform devices by of_platform_bus_create, because they fall into `of_device_is_compatible(bus, "arm,primecell")` check. These children are registered by of_serdev_register_devices, called through this chain of calls: - uart_add_one_port (drivers/tty/serial/amba-pl011.c) - tty_port_register_device_attr_serdev - serdev_tty_port_register - serdev_controller_add - of_serdev_register_devices serdev_tty_port_register depends on CONFIG_SERIAL_DEV_CTRL_TTYPORT, which in turn depends on CONFIG_SERIAL_DEV_BUS=y. This patch modifies the defconfigs of Raspberry Pi devices to set these options and allow to bind drivers to subnodes of UART devices that can be added by device tree overlays. Signed-off-by: Maxim Mikityanskiy --- arch/arm/configs/bcm2709_defconfig | 3 ++- arch/arm/configs/bcm2711_defconfig | 3 ++- arch/arm/configs/bcmrpi_defconfig | 3 ++- arch/arm64/configs/bcm2711_defconfig | 3 ++- arch/arm64/configs/bcmrpi3_defconfig | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig index 914c0177c307a3..42e318be75d762 100644 --- a/arch/arm/configs/bcm2709_defconfig +++ b/arch/arm/configs/bcm2709_defconfig @@ -648,7 +648,8 @@ CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_SC16IS7XX=m CONFIG_SERIAL_SC16IS7XX_SPI=y -CONFIG_SERIAL_DEV_BUS=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_TTY_PRINTK=y CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=y diff --git a/arch/arm/configs/bcm2711_defconfig b/arch/arm/configs/bcm2711_defconfig index a5f2c656e882cf..58df7533907733 100644 --- a/arch/arm/configs/bcm2711_defconfig +++ b/arch/arm/configs/bcm2711_defconfig @@ -659,7 +659,8 @@ CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_SC16IS7XX=m CONFIG_SERIAL_SC16IS7XX_SPI=y -CONFIG_SERIAL_DEV_BUS=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_TTY_PRINTK=y CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=y diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig index af80e7ff71955c..4f305554749def 100644 --- a/arch/arm/configs/bcmrpi_defconfig +++ b/arch/arm/configs/bcmrpi_defconfig @@ -638,7 +638,8 @@ CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_SC16IS7XX=m CONFIG_SERIAL_SC16IS7XX_SPI=y -CONFIG_SERIAL_DEV_BUS=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_TTY_PRINTK=y CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=y diff --git a/arch/arm64/configs/bcm2711_defconfig b/arch/arm64/configs/bcm2711_defconfig index 3f0c4629d2e5c1..7a8d54bfb76304 100644 --- a/arch/arm64/configs/bcm2711_defconfig +++ b/arch/arm64/configs/bcm2711_defconfig @@ -652,7 +652,8 @@ CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_SC16IS7XX=m CONFIG_SERIAL_SC16IS7XX_SPI=y -CONFIG_SERIAL_DEV_BUS=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_TTY_PRINTK=y CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=y diff --git a/arch/arm64/configs/bcmrpi3_defconfig b/arch/arm64/configs/bcmrpi3_defconfig index f349b006a858dc..139bd126d3eb1c 100644 --- a/arch/arm64/configs/bcmrpi3_defconfig +++ b/arch/arm64/configs/bcmrpi3_defconfig @@ -628,7 +628,8 @@ CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_SC16IS7XX=m CONFIG_SERIAL_SC16IS7XX_SPI=y -CONFIG_SERIAL_DEV_BUS=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y CONFIG_TTY_PRINTK=y CONFIG_HW_RANDOM=y CONFIG_RAW_DRIVER=y From 666ffde59c1dd47f2fe30b7ee39b31cec2bbd57d Mon Sep 17 00:00:00 2001 From: Maxim Mikityanskiy Date: Sat, 27 Jun 2020 13:08:26 +0300 Subject: [PATCH 2/2] ARM: dts: Add Bluetooth nodes for Raspberry Pi Add device tree nodes for Bluetooth on supported Raspberry Pi boards. It's disabled by default and can be enabled by `krnbt=on` dtparam. It's an alternative way of configuring Bluetooth, as compared to hciattach or btattach. When the dtparam is enabled, the Bluetooth driver is probed automatically and doesn't require any additional bring-up scripts. Note that Raspberry Pi 3 B rev 1.2 doesn't have the required hardware flow control pins of UART0 connected to the Bluetooth module, so the user should decrease the baudrate by passing `krnbt_baudrate=921600` dtparam to make it more stable. It resembles the behavior of the btuart script from Raspbian. The miniuart-bt overlay was modified to support Bluetooth probing with device tree, too. It's disabled by default and can be enabled by `krnbt=on` parameter of the miniuart-bt overlay. Signed-off-by: Maxim Mikityanskiy --- arch/arm/boot/dts/bcm2708-rpi-bt.dtsi | 26 +++++++++++++++++++ arch/arm/boot/dts/bcm2708-rpi-zero-w.dts | 1 + arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts | 1 + arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 1 + arch/arm/boot/dts/bcm2711-rpi-4-b.dts | 3 +-- arch/arm/boot/dts/bcm271x-rpi-bt.dtsi | 26 +++++++++++++++++++ arch/arm/boot/dts/overlays/README | 12 +++++++-- .../boot/dts/overlays/disable-bt-overlay.dts | 13 ++++++++-- .../boot/dts/overlays/miniuart-bt-overlay.dts | 21 ++++++++++++--- 9 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 arch/arm/boot/dts/bcm2708-rpi-bt.dtsi create mode 100644 arch/arm/boot/dts/bcm271x-rpi-bt.dtsi diff --git a/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi new file mode 100644 index 00000000000000..a18f80af97d324 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 + +&uart0 { + bt: bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <3000000>; + shutdown-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; +}; + +&uart1 { + minibt: bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <460800>; + shutdown-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; +}; + +/ { + __overrides__ { + krnbt = <&bt>,"status"; + krnbt_baudrate = <&bt>,"max-speed:0"; + }; +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts index 6ec6b88e03cedf..111f61915947a3 100644 --- a/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts +++ b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts @@ -4,6 +4,7 @@ #include "bcm2708-rpi.dtsi" #include "bcm283x-rpi-csi1-2lane.dtsi" #include "bcm283x-rpi-i2c0mux_0_28.dtsi" +#include "bcm2708-rpi-bt.dtsi" / { compatible = "raspberrypi,model-zero-w", "brcm,bcm2835"; diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts index 3ca70650287cb7..0d6a47118b83e1 100644 --- a/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts +++ b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts @@ -5,6 +5,7 @@ #include "bcm283x-rpi-lan7515.dtsi" #include "bcm283x-rpi-csi1-2lane.dtsi" #include "bcm283x-rpi-i2c0mux_0_44.dtsi" +#include "bcm271x-rpi-bt.dtsi" / { compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837"; diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts index abdf7e1c02476f..e833915a7854d3 100644 --- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts +++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts @@ -5,6 +5,7 @@ #include "bcm283x-rpi-smsc9514.dtsi" #include "bcm283x-rpi-csi1-2lane.dtsi" #include "bcm283x-rpi-i2c0mux_0_44.dtsi" +#include "bcm271x-rpi-bt.dtsi" / { compatible = "raspberrypi,3-model-b", "brcm,bcm2837"; diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts index 194764c73424f6..2913815aba6210 100644 --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts @@ -219,6 +219,7 @@ // Downstream rpi- changes #include "bcm270x.dtsi" +#include "bcm271x-rpi-bt.dtsi" / { soc { @@ -287,8 +288,6 @@ &uart0 { pinctrl-0 = <&uart0_pins &bt_pins>; status = "okay"; - - /delete-node/ bluetooth; }; &uart1 { diff --git a/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi new file mode 100644 index 00000000000000..6b9b79f74cf365 --- /dev/null +++ b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 + +&uart0 { + bt: bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <3000000>; + shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; +}; + +&uart1 { + minibt: bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <460800>; + shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; + status = "disabled"; + }; +}; + +/ { + __overrides__ { + krnbt = <&bt>,"status"; + krnbt_baudrate = <&bt>,"max-speed:0"; + }; +}; diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 073d7dadcc95a6..bd24434a07c227 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -162,6 +162,13 @@ Params: i2s Set to "on" to enable the i2s interface (default "off") + krnbt Set to "on" to enable autoprobing of Bluetooth + driver without need of hciattach/btattach + (default "off") + + krnbt_baudrate Set the baudrate of the PL011 UART when used + with krnbt=on + spi Set to "on" to enable the spi interfaces (default "off") @@ -1748,8 +1755,9 @@ Info: Switch the onboard Bluetooth function on Pi 3B, 3B+, 3A+, 4B and Zero W in which case use /dev/serial1 instead because it will always be correct. Furthermore, you must also set core_freq and core_freq_min to the same value in config.txt or the miniuart will not work. -Load: dtoverlay=miniuart-bt -Params: +Load: dtoverlay=miniuart-bt,= +Params: krnbt Set to "on" to enable autoprobing of Bluetooth + driver without need of hciattach/btattach Name: mmc diff --git a/arch/arm/boot/dts/overlays/disable-bt-overlay.dts b/arch/arm/boot/dts/overlays/disable-bt-overlay.dts index 2f1b655a133c38..d5a66e5d76a942 100644 --- a/arch/arm/boot/dts/overlays/disable-bt-overlay.dts +++ b/arch/arm/boot/dts/overlays/disable-bt-overlay.dts @@ -8,6 +8,8 @@ sudo systemctl disable hciuart */ +#include + /{ compatible = "brcm,bcm2835"; @@ -28,6 +30,13 @@ }; fragment@2 { + target = <&bt>; + __overlay__ { + status = "disabled"; + }; + }; + + fragment@3 { target = <&uart0_pins>; __overlay__ { brcm,pins; @@ -36,7 +45,7 @@ }; }; - fragment@3 { + fragment@4 { target = <&bt_pins>; __overlay__ { brcm,pins; @@ -45,7 +54,7 @@ }; }; - fragment@4 { + fragment@5 { target-path = "/aliases"; __overlay__ { serial0 = "/soc/serial@7e201000"; diff --git a/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts b/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts index 30d3d8549da0af..44d8e10ef735c9 100644 --- a/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts +++ b/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts @@ -15,6 +15,8 @@ this overlay is used. */ +#include + /{ compatible = "brcm,bcm2835"; @@ -28,6 +30,13 @@ }; fragment@1 { + target = <&bt>; + __overlay__ { + status = "disabled"; + }; + }; + + fragment@2 { target = <&uart1>; __overlay__ { pinctrl-names = "default"; @@ -36,7 +45,7 @@ }; }; - fragment@2 { + fragment@3 { target = <&uart0_pins>; __overlay__ { brcm,pins; @@ -45,7 +54,7 @@ }; }; - fragment@3 { + fragment@4 { target = <&uart1_pins>; __overlay__ { brcm,pins = <32 33>; @@ -54,7 +63,7 @@ }; }; - fragment@4 { + fragment@5 { target = <&gpio>; __overlay__ { fake_bt_cts: fake_bt_cts { @@ -64,11 +73,15 @@ }; }; - fragment@5 { + fragment@6 { target-path = "/aliases"; __overlay__ { serial0 = "/soc/serial@7e201000"; serial1 = "/soc/serial@7e215040"; }; }; + + __overrides__ { + krnbt = <&minibt>,"status"; + }; };