Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: dts: sun8i: v40: bananapi-m2-berry: Add Bluetooth device node

The AP6212 is based on the Broadcom BCM43430 or BCM43438. The WiFi side
identifies as BCM43430, while the Bluetooth side identifies as BCM43438.

The Bluetooth side is connected to UART3 in a 4 wire configuration. Same
as the WiFi side, due to being the same chip and package, DLDO1 and
DLDO2 regulator outputs from the PMIC provide overall power via VBAT and
I/O power via VDDIO. The CLK_OUT_A clock output from the SoC provides
the LPO low power clock at 32.768 kHz.

This patch enables Bluetooth on this board, and also adds the missing
LPO clock on the WiFi side. There is also a PCM connection for
Bluetooth, but this is not covered here.

The LPO clock is fed from CLK_OUT_A, which needs to be muxed on pin
PI12. This can be represented in multiple ways. This patch puts the
pinctrl property in the pin controller node. This is due to limitations
in Linux, where pinmux settings, even the same one, can not be shared
by multiple devices. Thus we cannot put it in both the WiFi and
Bluetooth device nodes. Putting it the CCU node is another option, but
Linux's CCU driver does not handle pinctrl. Also the pin controller is
guaranteed to be initialized after the CCU, when clocks are available.
And any other devices that use muxed pins are guaranteed to be
initialized after the pin controller. Thus having the CLK_OUT_A pinmux
reference be in the pin controller node is a good choice without having
to deal with implementation issues.

Signed-off-by: Pablo Greco <pgreco@centosproject.org>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>

authored by

Pablo Greco and committed by
Maxime Ripard
3e4a856a 78f8e6d9

+38
+38
arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
··· 96 96 wifi_pwrseq: wifi_pwrseq { 97 97 compatible = "mmc-pwrseq-simple"; 98 98 reset-gpios = <&pio 6 10 GPIO_ACTIVE_LOW>; /* PG10 WIFI_EN */ 99 + clocks = <&ccu CLK_OUTA>; 100 + clock-names = "ext_clock"; 99 101 }; 100 102 }; 101 103 ··· 174 172 }; 175 173 176 174 &pio { 175 + pinctrl-names = "default"; 176 + pinctrl-0 = <&clk_out_a_pin>; 177 177 vcc-pa-supply = <&reg_aldo2>; 178 178 vcc-pc-supply = <&reg_dcdc1>; 179 179 vcc-pd-supply = <&reg_dcdc1>; ··· 237 233 regulator-name = "vcc-wifi-io"; 238 234 }; 239 235 236 + /* 237 + * Our WiFi chip needs both DLDO2 and DLDO3 to be powered at the same 238 + * time, with the two being in sync, to be able to meet maximum power 239 + * consumption during transmits. Since this is not really supported 240 + * right now, just use the two as always on, and we will fix it later. 241 + */ 242 + 240 243 &reg_dldo2 { 244 + regulator-always-on; 241 245 regulator-min-microvolt = <3300000>; 242 246 regulator-max-microvolt = <3300000>; 243 247 regulator-name = "vcc-wifi"; 248 + }; 249 + 250 + &reg_dldo3 { 251 + regulator-always-on; 252 + regulator-min-microvolt = <3300000>; 253 + regulator-max-microvolt = <3300000>; 254 + regulator-name = "vcc-wifi-2"; 244 255 }; 245 256 246 257 &reg_dldo4 { ··· 278 259 pinctrl-names = "default"; 279 260 pinctrl-0 = <&uart0_pb_pins>; 280 261 status = "okay"; 262 + }; 263 + 264 + &uart3 { 265 + pinctrl-names = "default"; 266 + pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>; 267 + uart-has-rtscts; 268 + status = "okay"; 269 + 270 + bluetooth { 271 + compatible = "brcm,bcm43438-bt"; 272 + clocks = <&ccu CLK_OUTA>; 273 + clock-names = "lpo"; 274 + vbat-supply = <&reg_dldo2>; 275 + vddio-supply = <&reg_dldo1>; 276 + device-wakeup-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */ 277 + /* TODO host wake line connected to PMIC GPIO pins */ 278 + shutdown-gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */ 279 + max-speed = <1500000>; 280 + }; 281 281 }; 282 282 283 283 &usbphy {