Message ID | 20230604145642.200577-8-paul@crapouillou.net (mailing list archive) |
---|---|
State | Accepted |
Commit | c9f4b25272843bcf6a86809915ccfb4fd7436c91 |
Headers | show |
Series | MIPS: CI20: Add WiFi / Bluetooth support | expand |
> Am 04.06.2023 um 16:56 schrieb Paul Cercueil <paul@crapouillou.net>: > > Wire the WiFi/Bluetooth chip properly in the Device Tree. > > - Provide it with the correct regulators and clocks; > - Change the MMC I/O bus to 1.8V which seems to be enough; > - Change the MMC I/O bus frequency to 25 MHz as 50 MHz causes errors; > - Fix the Bluetooth powerdown GPIO being inverted and add reset GPIO; > - Convert host-wakeup-gpios to IRQ. > > With these changes, the WiFi works properly with the latest firmware > provided by linux-firmware. The Bluetooth does not work very well here, > as I cannot get my wireless keyboard to pair; but it does detect it, and > it does see the key presses when I type the pairing code. > > Signed-off-by: Paul Cercueil <paul@crapouillou.net> > --- > arch/mips/boot/dts/ingenic/ci20.dts | 88 ++++++++++++++++++++++++----- > 1 file changed, 73 insertions(+), 15 deletions(-) > > diff --git a/arch/mips/boot/dts/ingenic/ci20.dts b/arch/mips/boot/dts/ingenic/ci20.dts > index bdbd064c90e1..cec0caa2350c 100644 > --- a/arch/mips/boot/dts/ingenic/ci20.dts > +++ b/arch/mips/boot/dts/ingenic/ci20.dts > @@ -97,10 +97,15 @@ ir: ir { > gpios = <&gpe 3 GPIO_ACTIVE_LOW>; > }; > > - wlan0_power: fixedregulator-1 { > + bt_power: fixedregulator-1 { > compatible = "regulator-fixed"; > > - regulator-name = "wlan0_power"; > + regulator-name = "bt_power"; > + regulator-min-microvolt = <3300000>; > + regulator-max-microvolt = <3300000>; > + regulator-settling-time-us = <1400>; > + > + vin-supply = <&vcc_50>; > > gpio = <&gpb 19 0>; > enable-active-high; > @@ -116,6 +121,40 @@ otg_power: fixedregulator-2 { > gpio = <&gpf 15 0>; > enable-active-high; > }; > + > + wifi_power: fixedregulator-4 { > + compatible = "regulator-fixed"; > + > + regulator-name = "wifi_power"; > + > + /* > + * Technically it's 5V, the WiFi chip has its own internal > + * regulators; but the MMC/SD subsystem won't accept such a > + * value. > + */ > + regulator-min-microvolt = <3300000>; > + regulator-max-microvolt = <3300000>; > + regulator-settling-time-us = <150000>; > + > + vin-supply = <&bt_power>; > + }; > + > + vcc_33v: fixedregulator-5 { why is this defined here? It is used earlier in [3/9] and not directly related to WiFi / Bluetooth So please move into [3/9] or even before [3/9] as a separate patch. > + compatible = "regulator-fixed"; > + > + regulator-name = "vcc_33v"; > + regulator-min-microvolt = <3300000>; > + regulator-max-microvolt = <3300000>; > + regulator-always-on; > + }; > + > + wifi_pwrseq: pwrseq { > + compatible = "mmc-pwrseq-simple"; > + reset-gpios = <&gpf 7 GPIO_ACTIVE_LOW>; > + > + clocks = <&rtc_dev>; > + clock-names = "ext_clock"; > + }; > }; > > &ext { > @@ -161,24 +200,33 @@ &mmc0 { > pinctrl-0 = <&pins_mmc0>; > > cd-gpios = <&gpf 20 GPIO_ACTIVE_LOW>; > + vmmc-supply = <&vcc_33v>; > + vqmmc-supply = <&vcc_33v>; > }; > > &mmc1 { > status = "okay"; > > bus-width = <4>; > - max-frequency = <50000000>; > + max-frequency = <25000000>; > + mmc-pwrseq = <&wifi_pwrseq>; > + vmmc-supply = <&wifi_power>; > + vqmmc-supply = <&wifi_io>; > non-removable; > > pinctrl-names = "default"; > pinctrl-0 = <&pins_mmc1>; > > - brcmf: wifi@1 { > -/* reg = <4>;*/ > - compatible = "brcm,bcm4330-fmac"; > - vcc-supply = <&wlan0_power>; > - device-wakeup-gpios = <&gpd 9 GPIO_ACTIVE_HIGH>; > - shutdown-gpios = <&gpf 7 GPIO_ACTIVE_LOW>; > + #address-cells = <1>; > + #size-cells = <0>; > + > + wifi@1 { > + compatible = "brcm,bcm4329-fmac"; > + reg = <1>; > + > + interrupt-parent = <&gpd>; > + interrupts = <9 IRQ_TYPE_EDGE_FALLING>; > + interrupt-names = "host-wake"; > }; > }; > > @@ -205,11 +253,20 @@ &uart2 { > > bluetooth { > compatible = "brcm,bcm4330-bt"; > - reset-gpios = <&gpf 8 GPIO_ACTIVE_HIGH>; > - vcc-supply = <&wlan0_power>; > + > + vbat-supply = <&bt_power>; > + vddio-supply = <&wifi_io>; > + > + interrupt-parent = <&gpf>; > + interrupts = <6 IRQ_TYPE_EDGE_RISING>; > + interrupt-names = "host-wakeup"; > + > + clocks = <&rtc_dev>; > + clock-names = "lpo"; > + > + reset-gpios = <&gpf 8 GPIO_ACTIVE_LOW>; > device-wakeup-gpios = <&gpf 5 GPIO_ACTIVE_HIGH>; > - host-wakeup-gpios = <&gpf 6 GPIO_ACTIVE_HIGH>; > - shutdown-gpios = <&gpf 4 GPIO_ACTIVE_LOW>; > + shutdown-gpios = <&gpf 4 GPIO_ACTIVE_HIGH>; > }; > }; > > @@ -270,8 +327,9 @@ vcc_25: LDO5 { > regulator-always-on; > }; > wifi_io: LDO6 { > - regulator-min-microvolt = <2500000>; > - regulator-max-microvolt = <2500000>; > + regulator-min-microvolt = <1800000>; > + regulator-max-microvolt = <1800000>; > + regulator-settling-time-us = <150000>; > inl-supply = <&vcc_33v>; > }; > cim_io_28: LDO7 { > -- > 2.39.2 >
diff --git a/arch/mips/boot/dts/ingenic/ci20.dts b/arch/mips/boot/dts/ingenic/ci20.dts index bdbd064c90e1..cec0caa2350c 100644 --- a/arch/mips/boot/dts/ingenic/ci20.dts +++ b/arch/mips/boot/dts/ingenic/ci20.dts @@ -97,10 +97,15 @@ ir: ir { gpios = <&gpe 3 GPIO_ACTIVE_LOW>; }; - wlan0_power: fixedregulator-1 { + bt_power: fixedregulator-1 { compatible = "regulator-fixed"; - regulator-name = "wlan0_power"; + regulator-name = "bt_power"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-settling-time-us = <1400>; + + vin-supply = <&vcc_50>; gpio = <&gpb 19 0>; enable-active-high; @@ -116,6 +121,40 @@ otg_power: fixedregulator-2 { gpio = <&gpf 15 0>; enable-active-high; }; + + wifi_power: fixedregulator-4 { + compatible = "regulator-fixed"; + + regulator-name = "wifi_power"; + + /* + * Technically it's 5V, the WiFi chip has its own internal + * regulators; but the MMC/SD subsystem won't accept such a + * value. + */ + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-settling-time-us = <150000>; + + vin-supply = <&bt_power>; + }; + + vcc_33v: fixedregulator-5 { + compatible = "regulator-fixed"; + + regulator-name = "vcc_33v"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + wifi_pwrseq: pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&gpf 7 GPIO_ACTIVE_LOW>; + + clocks = <&rtc_dev>; + clock-names = "ext_clock"; + }; }; &ext { @@ -161,24 +200,33 @@ &mmc0 { pinctrl-0 = <&pins_mmc0>; cd-gpios = <&gpf 20 GPIO_ACTIVE_LOW>; + vmmc-supply = <&vcc_33v>; + vqmmc-supply = <&vcc_33v>; }; &mmc1 { status = "okay"; bus-width = <4>; - max-frequency = <50000000>; + max-frequency = <25000000>; + mmc-pwrseq = <&wifi_pwrseq>; + vmmc-supply = <&wifi_power>; + vqmmc-supply = <&wifi_io>; non-removable; pinctrl-names = "default"; pinctrl-0 = <&pins_mmc1>; - brcmf: wifi@1 { -/* reg = <4>;*/ - compatible = "brcm,bcm4330-fmac"; - vcc-supply = <&wlan0_power>; - device-wakeup-gpios = <&gpd 9 GPIO_ACTIVE_HIGH>; - shutdown-gpios = <&gpf 7 GPIO_ACTIVE_LOW>; + #address-cells = <1>; + #size-cells = <0>; + + wifi@1 { + compatible = "brcm,bcm4329-fmac"; + reg = <1>; + + interrupt-parent = <&gpd>; + interrupts = <9 IRQ_TYPE_EDGE_FALLING>; + interrupt-names = "host-wake"; }; }; @@ -205,11 +253,20 @@ &uart2 { bluetooth { compatible = "brcm,bcm4330-bt"; - reset-gpios = <&gpf 8 GPIO_ACTIVE_HIGH>; - vcc-supply = <&wlan0_power>; + + vbat-supply = <&bt_power>; + vddio-supply = <&wifi_io>; + + interrupt-parent = <&gpf>; + interrupts = <6 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "host-wakeup"; + + clocks = <&rtc_dev>; + clock-names = "lpo"; + + reset-gpios = <&gpf 8 GPIO_ACTIVE_LOW>; device-wakeup-gpios = <&gpf 5 GPIO_ACTIVE_HIGH>; - host-wakeup-gpios = <&gpf 6 GPIO_ACTIVE_HIGH>; - shutdown-gpios = <&gpf 4 GPIO_ACTIVE_LOW>; + shutdown-gpios = <&gpf 4 GPIO_ACTIVE_HIGH>; }; }; @@ -270,8 +327,9 @@ vcc_25: LDO5 { regulator-always-on; }; wifi_io: LDO6 { - regulator-min-microvolt = <2500000>; - regulator-max-microvolt = <2500000>; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-settling-time-us = <150000>; inl-supply = <&vcc_33v>; }; cim_io_28: LDO7 {
Wire the WiFi/Bluetooth chip properly in the Device Tree. - Provide it with the correct regulators and clocks; - Change the MMC I/O bus to 1.8V which seems to be enough; - Change the MMC I/O bus frequency to 25 MHz as 50 MHz causes errors; - Fix the Bluetooth powerdown GPIO being inverted and add reset GPIO; - Convert host-wakeup-gpios to IRQ. With these changes, the WiFi works properly with the latest firmware provided by linux-firmware. The Bluetooth does not work very well here, as I cannot get my wireless keyboard to pair; but it does detect it, and it does see the key presses when I type the pairing code. Signed-off-by: Paul Cercueil <paul@crapouillou.net> --- arch/mips/boot/dts/ingenic/ci20.dts | 88 ++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 15 deletions(-)