On Wed, Jul 31, 2024 at 2:15 PM Arend van Spriel <arend.vanspriel@xxxxxxxxxxxx> wrote: > > On 7/31/2024 12:16 PM, Alexey Charkov wrote: > > Hi Jacobe, > > > > > > On 31/07/2024 9:11 am, Jacobe Zang wrote: > > > WiFi modules often require 32kHz clock to function. Add support to > > > enable the clock to PCIe driver and move "brcm,bcm4329-fmac" check > > > to the top of brcmf_of_probe > > > > > > Co-developed-by: Ondrej Jirman <megi@xxxxxx> > > > Signed-off-by: Ondrej Jirman <megi@xxxxxx> > > > Signed-off-by: Jacobe Zang <jacobe.zang@xxxxxxxxxx> > > > --- > > > .../net/wireless/broadcom/brcm80211/brcmfmac/of.c | 12 +++++++++++- > > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c > > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c > > > index e406e11481a62..7e0a2ad5c7c8a 100644 > > > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c > > > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c > > > @@ -6,6 +6,7 @@ > > > #include <linux/of.h> > > > #include <linux/of_irq.h> > > > #include <linux/of_net.h> > > > +#include <linux/clk.h> > > > > > > #include <defs.h> > > > #include "debug.h" > > > @@ -70,12 +71,16 @@ void brcmf_of_probe(struct device *dev, enum > > brcmf_bus_type bus_type, > > > { > > > struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio; > > > struct device_node *root, *np = dev->of_node; > > > + struct clk *clk; > > > const char *prop; > > > int irq; > > > int err; > > > u32 irqf; > > > u32 val; > > > > > > + if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) > > > + return; > > > > Did you test this? The DTS patch you sent as part of this series doesn't > > list "brcm,bcm4329-fmac" in the compatible, so this will probably return > > right here, skipping over the rest of your patch. > > > > Please test before resending, both with and without the driver for the > > Bluetooth part of the chip (since it also touches clocks). > > > > You are also changing the behavior for other systems by putting this > > check further up the probe path, which might break things for no reason. > > Better put your clk-related addition below where this check was > > originally, rather than reorder stuff you don't have to reorder. > > That was upon my suggestion. That check was originally at the top of the > function, but people added stuff before that. I agree that makes the > compatible "brcm,brcm4329-fmac" required which is what the textual > binding stated before the switch to YAML was made: > > """ > Broadcom BCM43xx Fullmac wireless SDIO devices > > This node provides properties for controlling the Broadcom wireless > device. The > node is expected to be specified as a child node to the SDIO controller that > connects the device to the system. > > Required properties: > > - compatible : Should be "brcm,bcm4329-fmac". > """ > > Not sure whether this is still true for YAML version (poor YAML reading > skills ;-) ), but it should as the switch from textual to YAML should > not have changed the bindings specification. > > > > + > > > /* Apple ARM64 platforms have their own idea of board type, > > passed in > > > * via the device tree. They also have an antenna SKU parameter > > > */ > > > @@ -113,8 +118,13 @@ void brcmf_of_probe(struct device *dev, enum > > brcmf_bus_type bus_type, > > > of_node_put(root); > > > } > > > > > > - if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) > > > + clk = devm_clk_get_optional_enabled(dev, "lpo"); > > > + if (!IS_ERR_OR_NULL(clk)) { > > > + brcmf_dbg(INFO, "enabling 32kHz clock\n"); > > > + clk_set_rate(clk, 32768); > > > + } else { > > > return; > > > > Why return here? If the clock is optional, a lot of systems will not > > have it - that shouldn't prevent the driver from probing. And you are > > still not handling the -EPROBE_DEFER case which was mentioned on your > > previous submission. > > Right. The else statement above could/should be: > > } else if (clk && PTR_ERR(clk) == -EPROBE_DEFER) { > return PTR_ERR(clk); > } ... plus change the function prototype to return int and propagate that error code through brcmf_get_module_param to brcmf_pcie_probe's return value. I guess checking clk for NULL is also redundant in this case? Best, Alexey