diff mbox series

[v9,4/5] wifi: brcmfmac: Add optional lpo clock enable support

Message ID 20240810035141.439024-5-jacobe.zang@wesion.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series Add AP6275P wireless support | expand

Commit Message

Jacobe Zang Aug. 10, 2024, 3:51 a.m. UTC
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. Change function prototypes from void
to int and add appropriate errno's for return values that will be
send to bus when error occurred.

Co-developed-by: Ondrej Jirman <megi@xff.cz>
Signed-off-by: Ondrej Jirman <megi@xff.cz>
Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
---
 .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
 .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
 .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 +++++++++++--------
 .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
 .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
 .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
 .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
 7 files changed, 63 insertions(+), 36 deletions(-)

Comments

Sai Krishna Gajula Aug. 10, 2024, 9:44 a.m. UTC | #1
> -----Original Message-----
> From: Jacobe Zang <jacobe.zang@wesion.com>
> Sent: Saturday, August 10, 2024 9:22 AM
> To: robh@kernel.org; krzk+dt@kernel.org; heiko@sntech.de;
> kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; conor+dt@kernel.org;
> arend.vanspriel@broadcom.com
> Cc: efectn@protonmail.com; dsimic@manjaro.org; jagan@edgeble.ai;
> devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> rockchip@lists.infradead.org; linux-kernel@vger.kernel.org;
> arend@broadcom.com; linux-wireless@vger.kernel.org;
> netdev@vger.kernel.org; megi@xff.cz; duoming@zju.edu.cn;
> bhelgaas@google.com; minipli@grsecurity.net; brcm80211@lists.linux.dev;
> brcm80211-dev-list.pdl@broadcom.com; nick@khadas.com; Jacobe Zang
> <jacobe.zang@wesion.com>
> Subject:  [PATCH v9 4/5] wifi: brcmfmac: Add optional lpo clock
> enable support
> 
> 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. Change function prototypes from void to int and add
> appropriate errno's for return
> 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. Change function prototypes from void to int and add
> appropriate errno's for return values that will be send to bus when error
> occurred.
> 
> Co-developed-by: Ondrej Jirman <megi@xff.cz>
> Signed-off-by: Ondrej Jirman <megi@xff.cz>
> Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
> ---
>  .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
>  .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
>  .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 +++++++++++--------
> .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
>  .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
>  .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
>  .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
>  7 files changed, 63 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> index 13391c2d82aae..b2ede4e579c5c 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> @@ -947,8 +947,8 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev
> *sdiodev)
> 
>  	/* try to attach to the target device */
>  	sdiodev->bus = brcmf_sdio_probe(sdiodev);
> -	if (!sdiodev->bus) {
> -		ret = -ENODEV;
> +	if (IS_ERR(sdiodev->bus)) {
> +		ret = PTR_ERR(sdiodev->bus);
>  		goto out;
>  	}
>  	brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> index b24faae35873d..58d50918dd177 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> @@ -561,7 +561,8 @@ struct brcmf_mp_device
> *brcmf_get_module_param(struct device *dev,
>  	if (!found) {
>  		/* No platform data for this device, try OF and DMI data */
>  		brcmf_dmi_probe(settings, chip, chiprev);
> -		brcmf_of_probe(dev, bus_type, settings);
> +		if (brcmf_of_probe(dev, bus_type, settings) == -
> EPROBE_DEFER)
> +			return ERR_PTR(-EPROBE_DEFER);
>  		brcmf_acpi_probe(dev, bus_type, settings);
>  	}
>  	return settings;
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> index e406e11481a62..f19dc7355e0e8 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"
> @@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(struct device
> *dev,
>  	return 0;
>  }
> 
> -void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> -		    struct brcmf_mp_device *settings)
> +int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> +		   struct brcmf_mp_device *settings)
>  {
>  	struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
>  	struct device_node *root, *np = dev->of_node;
> +	struct clk *clk;
>  	const char *prop;

Small nit, please check if reverse x-mas tree order need to be follow here.

>  	int irq;
>  	int err;
>  	u32 irqf;
>  	u32 val;
> 
> +	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
> +		return 0;
> +
>  	/* Apple ARM64 platforms have their own idea of board type, passed
> in
>  	 * via the device tree. They also have an antenna SKU parameter
>  	 */
> @@ -105,7 +110,7 @@ void brcmf_of_probe(struct device *dev, enum
> brcmf_bus_type bus_type,
>  		board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
>  		if (!board_type) {
>  			of_node_put(root);
> -			return;
> +			return 0;
>  		}
>  		strreplace(board_type, '/', '-');
>  		settings->board_type = board_type;
> @@ -113,33 +118,39 @@ 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"))
> -		return;
> -
>  	err = brcmf_of_get_country_codes(dev, settings);
>  	if (err)
>  		brcmf_err("failed to get OF country code map (err=%d)\n",
> err);
> 
>  	of_get_mac_address(np, settings->mac);
> 
> -	if (bus_type != BRCMF_BUSTYPE_SDIO)
> -		return;
> +	if (bus_type == BRCMF_BUSTYPE_SDIO) {
> +		if (of_property_read_u32(np, "brcm,drive-strength", &val) ==
> 0)
> +			sdio->drive_strength = val;
> 
> -	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
> -		sdio->drive_strength = val;
> +		/* make sure there are interrupts defined in the node */
> +		if (!of_property_present(np, "interrupts"))
> +			return 0;
> 
> -	/* make sure there are interrupts defined in the node */
> -	if (!of_property_present(np, "interrupts"))
> -		return;
> +		irq = irq_of_parse_and_map(np, 0);
> +		if (!irq) {
> +			brcmf_err("interrupt could not be mapped\n");
> +			return 0;
> +		}
> +		irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
> +
> +		sdio->oob_irq_supported = true;
> +		sdio->oob_irq_nr = irq;
> +		sdio->oob_irq_flags = irqf;
> +	}
> 
> -	irq = irq_of_parse_and_map(np, 0);
> -	if (!irq) {
> -		brcmf_err("interrupt could not be mapped\n");
> -		return;
> +	clk = devm_clk_get_optional_enabled(dev, "lpo");
> +	if (!IS_ERR_OR_NULL(clk)) {
> +		brcmf_dbg(INFO, "enabling 32kHz clock\n");
> +		return clk_set_rate(clk, 32768);
> +	} else {
> +		return PTR_ERR_OR_ZERO(clk);
>  	}
> -	irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
> 
> -	sdio->oob_irq_supported = true;
> -	sdio->oob_irq_nr = irq;
> -	sdio->oob_irq_flags = irqf;
> +	return 0;

....
....

>  /* Detach and free everything */
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> index 9a105e6debe1f..f7db46ae44906 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> @@ -1272,6 +1272,9 @@ static int brcmf_usb_probe_cb(struct
> brcmf_usbdev_info *devinfo,
>  		ret = -ENOMEM;
>  		goto fail;
>  	}
> +	ret = PTR_ERR_OR_ZERO(devinfo->settings);
> +	if (ret < 0)
> +		goto fail;
> 
>  	if (!brcmf_usb_dlneeded(devinfo)) {
>  		ret = brcmf_alloc(devinfo->dev, devinfo->settings);
> --
> 2.34.1
> 
Reviewed-by:  Sai Krishna <saikrishnag@marvell.com>
Jacobe Zang Aug. 10, 2024, 10:08 a.m. UTC | #2
On 2024/8/10 17:44, Sai Krishna Gajula <saikrishnag@marvell.com> wrote:
> 
> > -----Original Message-----
> > From: Jacobe Zang <jacobe.zang@wesion.com>
> > Sent: Saturday, August 10, 2024 9:22 AM
> > To: robh@kernel.org; krzk+dt@kernel.org; heiko@sntech.de;
> > kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
> > kuba@kernel.org; pabeni@redhat.com; conor+dt@kernel.org;
> > arend.vanspriel@broadcom.com
> > Cc: efectn@protonmail.com; dsimic@manjaro.org; jagan@edgeble.ai;
> > devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> > rockchip@lists.infradead.org; linux-kernel@vger.kernel.org;
> > arend@broadcom.com; linux-wireless@vger.kernel.org;
> > netdev@vger.kernel.org; megi@xff.cz; duoming@zju.edu.cn;
> > bhelgaas@google.com; minipli@grsecurity.net; brcm80211@lists.linux.dev;
> > brcm80211-dev-list.pdl@broadcom.com; nick@khadas.com; Jacobe Zang
> > <jacobe.zang@wesion.com>
> > Subject:  [PATCH v9 4/5] wifi: brcmfmac: Add optional lpo clock
> > enable support
> >
> > 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. Change function prototypes from void to int and add
> > appropriate errno's for return
> > 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. Change function prototypes from void to int and add
> > appropriate errno's for return values that will be send to bus when error
> > occurred.
> >
> > Co-developed-by: Ondrej Jirman <megi@xff.cz>
> > Signed-off-by: Ondrej Jirman <megi@xff.cz>
> > Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> > Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
> > ---
> >   .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
> >   .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
> >   .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 +++++++++++--------
> > .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
> >   .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
> >   .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
> >   .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
> >   7 files changed, 63 insertions(+), 36 deletions(-)
> >
> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> > index 13391c2d82aae..b2ede4e579c5c 100644
> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
> > @@ -947,8 +947,8 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev
> > *sdiodev)
> >
> >   	/* try to attach to the target device */
> >   	sdiodev->bus = brcmf_sdio_probe(sdiodev);
> > -	if (!sdiodev->bus) {
> > -		ret = -ENODEV;
> > +	if (IS_ERR(sdiodev->bus)) {
> > +		ret = PTR_ERR(sdiodev->bus);
> >   		goto out;
> >   	}
> >   	brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> > index b24faae35873d..58d50918dd177 100644
> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
> > @@ -561,7 +561,8 @@ struct brcmf_mp_device
> > *brcmf_get_module_param(struct device *dev,
> >   	if (!found) {
> >   		/* No platform data for this device, try OF and DMI data */
> >   		brcmf_dmi_probe(settings, chip, chiprev);
> > -		brcmf_of_probe(dev, bus_type, settings);
> > +		if (brcmf_of_probe(dev, bus_type, settings) == -
> > EPROBE_DEFER)
> > +			return ERR_PTR(-EPROBE_DEFER);
> >   		brcmf_acpi_probe(dev, bus_type, settings);
> >   	}
> >   	return settings;
> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > index e406e11481a62..f19dc7355e0e8 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"
> > @@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(struct device
> > *dev,
> >   	return 0;
> >   }
> >
> > -void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> > -		    struct brcmf_mp_device *settings)
> > +int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> > +		   struct brcmf_mp_device *settings)
> >   {
> >   	struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
> >   	struct device_node *root, *np = dev->of_node;
> > +	struct clk *clk;
> >   	const char *prop;
> 
> Small nit, please check if reverse x-mas tree order need to be follow here.
> 
> >   	int irq;
> >   	int err;
> >   	u32 irqf;

It can be seen from this line that there should be no need to follow the reverse x-mas tree order. Because it is a struct variable, so place with other struct ones.

> >   	u32 val;
> >
> > +	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
> > +		return 0;
> > +
> >   	/* Apple ARM64 platforms have their own idea of board type, passed
> > in
> >   	 * via the device tree. They also have an antenna SKU parameter
> >   	 */
> > @@ -105,7 +110,7 @@ void brcmf_of_probe(struct device *dev, enum
> > brcmf_bus_type bus_type,
> >   		board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
> >   		if (!board_type) {
> >   			of_node_put(root);
> > -			return;
> > +			return 0;
> >   		}
> >   		strreplace(board_type, '/', '-');
> >   		settings->board_type = board_type;
> > @@ -113,33 +118,39 @@ 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"))
> > -		return;
> > -
> >   	err = brcmf_of_get_country_codes(dev, settings);
> >   	if (err)
> >   		brcmf_err("failed to get OF country code map (err=%d)\n",
> > err);
> >
> >   	of_get_mac_address(np, settings->mac);
> >
> > -	if (bus_type != BRCMF_BUSTYPE_SDIO)
> > -		return;
> > +	if (bus_type == BRCMF_BUSTYPE_SDIO) {
> > +		if (of_property_read_u32(np, "brcm,drive-strength", &val) ==
> > 0)
> > +			sdio->drive_strength = val;
> >
> > -	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
> > -		sdio->drive_strength = val;
> > +		/* make sure there are interrupts defined in the node */
> > +		if (!of_property_present(np, "interrupts"))
> > +			return 0;
> >
> > -	/* make sure there are interrupts defined in the node */
> > -	if (!of_property_present(np, "interrupts"))
> > -		return;
> > +		irq = irq_of_parse_and_map(np, 0);
> > +		if (!irq) {
> > +			brcmf_err("interrupt could not be mapped\n");
> > +			return 0;
> > +		}
> > +		irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
> > +
> > +		sdio->oob_irq_supported = true;
> > +		sdio->oob_irq_nr = irq;
> > +		sdio->oob_irq_flags = irqf;
> > +	}
> >
> > -	irq = irq_of_parse_and_map(np, 0);
> > -	if (!irq) {
> > -		brcmf_err("interrupt could not be mapped\n");
> > -		return;
> > +	clk = devm_clk_get_optional_enabled(dev, "lpo");
> > +	if (!IS_ERR_OR_NULL(clk)) {
> > +		brcmf_dbg(INFO, "enabling 32kHz clock\n");
> > +		return clk_set_rate(clk, 32768);
> > +	} else {
> > +		return PTR_ERR_OR_ZERO(clk);
> >   	}
> > -	irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
> >
> > -	sdio->oob_irq_supported = true;
> > -	sdio->oob_irq_nr = irq;
> > -	sdio->oob_irq_flags = irqf;
> > +	return 0;
> 
> ....
> ....
> 
> >   /* Detach and free everything */
> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> > index 9a105e6debe1f..f7db46ae44906 100644
> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> > @@ -1272,6 +1272,9 @@ static int brcmf_usb_probe_cb(struct
> > brcmf_usbdev_info *devinfo,
> >   		ret = -ENOMEM;
> >   		goto fail;
> >   	}
> > +	ret = PTR_ERR_OR_ZERO(devinfo->settings);
> > +	if (ret < 0)
> > +		goto fail;
> >
> >   	if (!brcmf_usb_dlneeded(devinfo)) {
> >   		ret = brcmf_alloc(devinfo->dev, devinfo->settings);
> > --
> > 2.34.1
> >
> Reviewed-by:  Sai Krishna <saikrishnag@marvell.com>
> 

--
Best Regards
Jacobe
Arend van Spriel Aug. 10, 2024, 11:23 a.m. UTC | #3
On August 10, 2024 5:52:11 AM Jacobe Zang <jacobe.zang@wesion.com> 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. Change function prototypes from void
> to int and add appropriate errno's for return values that will be
> send to bus when error occurred.
>
> Co-developed-by: Ondrej Jirman <megi@xff.cz>
> Signed-off-by: Ondrej Jirman <megi@xff.cz>
> Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
> ---
> .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
> .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
> .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 +++++++++++--------
> .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
> .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
> .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
> .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
> 7 files changed, 63 insertions(+), 36 deletions(-)

[...]

> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> index 6b38d9de71af6..461b7ff3be24b 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c

[...]

> @@ -4474,8 +4480,10 @@ struct brcmf_sdio *brcmf_sdio_probe(struct 
> brcmf_sdio_dev *sdiodev)
>  bus->brcmf_wq = wq;
>
>  /* attempt to attach to the dongle */
> - if (!(brcmf_sdio_probe_attach(bus))) {
> + probe_attach_result = brcmf_sdio_probe_attach(bus);

There is no need for probe_attach_result anymore. Just use ret variable 
instead.

> + if (probe_attach_result < 0) {
>  brcmf_err("brcmf_sdio_probe_attach failed\n");
> + ret = probe_attach_result;
>  goto fail;
>  }
Arend van Spriel Aug. 10, 2024, 6:32 p.m. UTC | #4
On 8/10/2024 12:08 PM, jacobe.zang@wesion.com wrote:
> 
> 
> On 2024/8/10 17:44, Sai Krishna Gajula <saikrishnag@marvell.com> wrote:
>>
>> > -----Original Message-----
>> > From: Jacobe Zang <jacobe.zang@wesion.com>
>> > Sent: Saturday, August 10, 2024 9:22 AM
>> > To: robh@kernel.org; krzk+dt@kernel.org; heiko@sntech.de;
>> > kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
>> > kuba@kernel.org; pabeni@redhat.com; conor+dt@kernel.org;
>> > arend.vanspriel@broadcom.com
>> > Cc: efectn@protonmail.com; dsimic@manjaro.org; jagan@edgeble.ai;
>> > devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; 
>> linux-
>> > rockchip@lists.infradead.org; linux-kernel@vger.kernel.org;
>> > arend@broadcom.com; linux-wireless@vger.kernel.org;
>> > netdev@vger.kernel.org; megi@xff.cz; duoming@zju.edu.cn;
>> > bhelgaas@google.com; minipli@grsecurity.net; brcm80211@lists.linux.dev;
>> > brcm80211-dev-list.pdl@broadcom.com; nick@khadas.com; Jacobe Zang
>> > <jacobe.zang@wesion.com>
>> > Subject:  [PATCH v9 4/5] wifi: brcmfmac: Add optional lpo clock
>> > enable support
>> >
>> > 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. Change function prototypes from void to int and add
>> > appropriate errno's for return
>> > 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. Change function prototypes from void to int and add
>> > appropriate errno's for return values that will be send to bus when 
>> error
>> > occurred.
>> >
>> > Co-developed-by: Ondrej Jirman <megi@xff.cz>
>> > Signed-off-by: Ondrej Jirman <megi@xff.cz>
>> > Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> > Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
>> > ---
>> >   .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
>> >   .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
>> >   .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 
>> +++++++++++--------
>> > .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
>> >   .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
>> >   .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
>> >   .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
>> >   7 files changed, 63 insertions(+), 36 deletions(-)
>> >
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > index 13391c2d82aae..b2ede4e579c5c 100644
>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > @@ -947,8 +947,8 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev
>> > *sdiodev)
>> >
>> >       /* try to attach to the target device */
>> >       sdiodev->bus = brcmf_sdio_probe(sdiodev);
>> > -    if (!sdiodev->bus) {
>> > -        ret = -ENODEV;
>> > +    if (IS_ERR(sdiodev->bus)) {
>> > +        ret = PTR_ERR(sdiodev->bus);
>> >           goto out;
>> >       }
>> >       brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > index b24faae35873d..58d50918dd177 100644
>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > @@ -561,7 +561,8 @@ struct brcmf_mp_device
>> > *brcmf_get_module_param(struct device *dev,
>> >       if (!found) {
>> >           /* No platform data for this device, try OF and DMI data */
>> >           brcmf_dmi_probe(settings, chip, chiprev);
>> > -        brcmf_of_probe(dev, bus_type, settings);
>> > +        if (brcmf_of_probe(dev, bus_type, settings) == -
>> > EPROBE_DEFER)
>> > +            return ERR_PTR(-EPROBE_DEFER);
>> >           brcmf_acpi_probe(dev, bus_type, settings);
>> >       }
>> >       return settings;
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>> > index e406e11481a62..f19dc7355e0e8 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"
>> > @@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(struct device
>> > *dev,
>> >       return 0;
>> >   }
>> >
>> > -void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>> > -            struct brcmf_mp_device *settings)
>> > +int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>> > +           struct brcmf_mp_device *settings)
>> >   {
>> >       struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
>> >       struct device_node *root, *np = dev->of_node;
>> > +    struct clk *clk;
>> >       const char *prop;
>>
>> Small nit, please check if reverse x-mas tree order need to be follow 
>> here.
>>
>> >       int irq;
>> >       int err;
>> >       u32 irqf;
> 
> It can be seen from this line that there should be no need to follow the 
> reverse x-mas tree order. Because it is a struct variable, so place with 
> other struct ones.

As driver maintainer I do not care about such neatness, but maybe Kalle 
has another preference. The code above looks fine to me.

Regards,
Arend
Arend van Spriel Aug. 10, 2024, 6:32 p.m. UTC | #5
On 8/10/2024 12:08 PM, jacobe.zang@wesion.com wrote:
> 
> 
> On 2024/8/10 17:44, Sai Krishna Gajula <saikrishnag@marvell.com> wrote:
>>
>> > -----Original Message-----
>> > From: Jacobe Zang <jacobe.zang@wesion.com>
>> > Sent: Saturday, August 10, 2024 9:22 AM
>> > To: robh@kernel.org; krzk+dt@kernel.org; heiko@sntech.de;
>> > kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
>> > kuba@kernel.org; pabeni@redhat.com; conor+dt@kernel.org;
>> > arend.vanspriel@broadcom.com
>> > Cc: efectn@protonmail.com; dsimic@manjaro.org; jagan@edgeble.ai;
>> > devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; 
>> linux-
>> > rockchip@lists.infradead.org; linux-kernel@vger.kernel.org;
>> > arend@broadcom.com; linux-wireless@vger.kernel.org;
>> > netdev@vger.kernel.org; megi@xff.cz; duoming@zju.edu.cn;
>> > bhelgaas@google.com; minipli@grsecurity.net; brcm80211@lists.linux.dev;
>> > brcm80211-dev-list.pdl@broadcom.com; nick@khadas.com; Jacobe Zang
>> > <jacobe.zang@wesion.com>
>> > Subject:  [PATCH v9 4/5] wifi: brcmfmac: Add optional lpo clock
>> > enable support
>> >
>> > 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. Change function prototypes from void to int and add
>> > appropriate errno's for return
>> > 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. Change function prototypes from void to int and add
>> > appropriate errno's for return values that will be send to bus when 
>> error
>> > occurred.
>> >
>> > Co-developed-by: Ondrej Jirman <megi@xff.cz>
>> > Signed-off-by: Ondrej Jirman <megi@xff.cz>
>> > Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>> > Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
>> > ---
>> >   .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
>> >   .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
>> >   .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53 
>> +++++++++++--------
>> > .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
>> >   .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
>> >   .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
>> >   .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
>> >   7 files changed, 63 insertions(+), 36 deletions(-)
>> >
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > index 13391c2d82aae..b2ede4e579c5c 100644
>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> > @@ -947,8 +947,8 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev
>> > *sdiodev)
>> >
>> >       /* try to attach to the target device */
>> >       sdiodev->bus = brcmf_sdio_probe(sdiodev);
>> > -    if (!sdiodev->bus) {
>> > -        ret = -ENODEV;
>> > +    if (IS_ERR(sdiodev->bus)) {
>> > +        ret = PTR_ERR(sdiodev->bus);
>> >           goto out;
>> >       }
>> >       brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > index b24faae35873d..58d50918dd177 100644
>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>> > @@ -561,7 +561,8 @@ struct brcmf_mp_device
>> > *brcmf_get_module_param(struct device *dev,
>> >       if (!found) {
>> >           /* No platform data for this device, try OF and DMI data */
>> >           brcmf_dmi_probe(settings, chip, chiprev);
>> > -        brcmf_of_probe(dev, bus_type, settings);
>> > +        if (brcmf_of_probe(dev, bus_type, settings) == -
>> > EPROBE_DEFER)
>> > +            return ERR_PTR(-EPROBE_DEFER);
>> >           brcmf_acpi_probe(dev, bus_type, settings);
>> >       }
>> >       return settings;
>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>> > index e406e11481a62..f19dc7355e0e8 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"
>> > @@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(struct device
>> > *dev,
>> >       return 0;
>> >   }
>> >
>> > -void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>> > -            struct brcmf_mp_device *settings)
>> > +int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>> > +           struct brcmf_mp_device *settings)
>> >   {
>> >       struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
>> >       struct device_node *root, *np = dev->of_node;
>> > +    struct clk *clk;
>> >       const char *prop;
>>
>> Small nit, please check if reverse x-mas tree order need to be follow 
>> here.
>>
>> >       int irq;
>> >       int err;
>> >       u32 irqf;
> 
> It can be seen from this line that there should be no need to follow the 
> reverse x-mas tree order. Because it is a struct variable, so place with 
> other struct ones.

As driver maintainer I do not care about such neatness, but maybe Kalle 
has another preference. The code above looks fine to me.

Regards,
Arend
Kalle Valo Aug. 11, 2024, 8:10 a.m. UTC | #6
Arend van Spriel <arend.vanspriel@broadcom.com> writes:

> On 8/10/2024 12:08 PM, jacobe.zang@wesion.com wrote:
>
>> On 2024/8/10 17:44, Sai Krishna Gajula <saikrishnag@marvell.com>
>> wrote:
>>>
>>> > -----Original Message-----
>>> > From: Jacobe Zang <jacobe.zang@wesion.com>
>>> > Sent: Saturday, August 10, 2024 9:22 AM
>>> > To: robh@kernel.org; krzk+dt@kernel.org; heiko@sntech.de;
>>> > kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
>>> > kuba@kernel.org; pabeni@redhat.com; conor+dt@kernel.org;
>>> > arend.vanspriel@broadcom.com
>>> > Cc: efectn@protonmail.com; dsimic@manjaro.org; jagan@edgeble.ai;
>>> > devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
>>> linux-
>>> > rockchip@lists.infradead.org; linux-kernel@vger.kernel.org;
>>> > arend@broadcom.com; linux-wireless@vger.kernel.org;
>>> > netdev@vger.kernel.org; megi@xff.cz; duoming@zju.edu.cn;
>>> > bhelgaas@google.com; minipli@grsecurity.net; brcm80211@lists.linux.dev;
>>> > brcm80211-dev-list.pdl@broadcom.com; nick@khadas.com; Jacobe Zang
>>> > <jacobe.zang@wesion.com>
>>> > Subject:  [PATCH v9 4/5] wifi: brcmfmac: Add optional lpo clock
>>> > enable support
>>> >
>>> > 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. Change function prototypes from void to int and add
>>> > appropriate errno's for return
>>> > 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. Change function prototypes from void to int and add
>>> > appropriate errno's for return values that will be send to bus
>>> when error
>>> > occurred.
>>> >
>>> > Co-developed-by: Ondrej Jirman <megi@xff.cz>
>>> > Signed-off-by: Ondrej Jirman <megi@xff.cz>
>>> > Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>>> > Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>>> > Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
>>> > ---
>>> >   .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  4 +-
>>> >   .../broadcom/brcm80211/brcmfmac/common.c      |  3 +-
>>> >   .../wireless/broadcom/brcm80211/brcmfmac/of.c | 53
>>> +++++++++++--------
>>> > .../wireless/broadcom/brcm80211/brcmfmac/of.h |  9 ++--
>>> >   .../broadcom/brcm80211/brcmfmac/pcie.c        |  3 ++
>>> >   .../broadcom/brcm80211/brcmfmac/sdio.c        | 24 ++++++---
>>> >   .../broadcom/brcm80211/brcmfmac/usb.c         |  3 ++
>>> >   7 files changed, 63 insertions(+), 36 deletions(-)
>>> >
>>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>>> > index 13391c2d82aae..b2ede4e579c5c 100644
>>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>>> > @@ -947,8 +947,8 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev
>>> > *sdiodev)
>>> >
>>> >       /* try to attach to the target device */
>>> >       sdiodev->bus = brcmf_sdio_probe(sdiodev);
>>> > -    if (!sdiodev->bus) {
>>> > -        ret = -ENODEV;
>>> > +    if (IS_ERR(sdiodev->bus)) {
>>> > +        ret = PTR_ERR(sdiodev->bus);
>>> >           goto out;
>>> >       }
>>> >       brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
>>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>>> > index b24faae35873d..58d50918dd177 100644
>>> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>>> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
>>> > @@ -561,7 +561,8 @@ struct brcmf_mp_device
>>> > *brcmf_get_module_param(struct device *dev,
>>> >       if (!found) {
>>> >           /* No platform data for this device, try OF and DMI data */
>>> >           brcmf_dmi_probe(settings, chip, chiprev);
>>> > -        brcmf_of_probe(dev, bus_type, settings);
>>> > +        if (brcmf_of_probe(dev, bus_type, settings) == -
>>> > EPROBE_DEFER)
>>> > +            return ERR_PTR(-EPROBE_DEFER);
>>> >           brcmf_acpi_probe(dev, bus_type, settings);
>>> >       }
>>> >       return settings;
>>> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>>> > b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>>> > index e406e11481a62..f19dc7355e0e8 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"
>>> > @@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(struct device
>>> > *dev,
>>> >       return 0;
>>> >   }
>>> >
>>> > -void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>>> > -            struct brcmf_mp_device *settings)
>>> > +int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>>> > +           struct brcmf_mp_device *settings)
>>> >   {
>>> >       struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
>>> >       struct device_node *root, *np = dev->of_node;
>>> > +    struct clk *clk;
>>> >       const char *prop;
>>>
>>> Small nit, please check if reverse x-mas tree order need to be
>>> follow here.
>>>
>>> >       int irq;
>>> >       int err;
>>> >       u32 irqf;
>> It can be seen from this line that there should be no need to follow
>> the reverse x-mas tree order. Because it is a struct variable, so
>> place with other struct ones.
>
> As driver maintainer I do not care about such neatness, but maybe
> Kalle has another preference. The code above looks fine to me.

We haven't been strongly requiring reverse x-mas tree in wireless code,
it has been just a preference. Also for me the code above looks fine.
diff mbox series

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index 13391c2d82aae..b2ede4e579c5c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -947,8 +947,8 @@  int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
 
 	/* try to attach to the target device */
 	sdiodev->bus = brcmf_sdio_probe(sdiodev);
-	if (!sdiodev->bus) {
-		ret = -ENODEV;
+	if (IS_ERR(sdiodev->bus)) {
+		ret = PTR_ERR(sdiodev->bus);
 		goto out;
 	}
 	brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
index b24faae35873d..58d50918dd177 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
@@ -561,7 +561,8 @@  struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
 	if (!found) {
 		/* No platform data for this device, try OF and DMI data */
 		brcmf_dmi_probe(settings, chip, chiprev);
-		brcmf_of_probe(dev, bus_type, settings);
+		if (brcmf_of_probe(dev, bus_type, settings) == -EPROBE_DEFER)
+			return ERR_PTR(-EPROBE_DEFER);
 		brcmf_acpi_probe(dev, bus_type, settings);
 	}
 	return settings;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
index e406e11481a62..f19dc7355e0e8 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"
@@ -65,17 +66,21 @@  static int brcmf_of_get_country_codes(struct device *dev,
 	return 0;
 }
 
-void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-		    struct brcmf_mp_device *settings)
+int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
+		   struct brcmf_mp_device *settings)
 {
 	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 0;
+
 	/* Apple ARM64 platforms have their own idea of board type, passed in
 	 * via the device tree. They also have an antenna SKU parameter
 	 */
@@ -105,7 +110,7 @@  void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
 		board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
 		if (!board_type) {
 			of_node_put(root);
-			return;
+			return 0;
 		}
 		strreplace(board_type, '/', '-');
 		settings->board_type = board_type;
@@ -113,33 +118,39 @@  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"))
-		return;
-
 	err = brcmf_of_get_country_codes(dev, settings);
 	if (err)
 		brcmf_err("failed to get OF country code map (err=%d)\n", err);
 
 	of_get_mac_address(np, settings->mac);
 
-	if (bus_type != BRCMF_BUSTYPE_SDIO)
-		return;
+	if (bus_type == BRCMF_BUSTYPE_SDIO) {
+		if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
+			sdio->drive_strength = val;
 
-	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
-		sdio->drive_strength = val;
+		/* make sure there are interrupts defined in the node */
+		if (!of_property_present(np, "interrupts"))
+			return 0;
 
-	/* make sure there are interrupts defined in the node */
-	if (!of_property_present(np, "interrupts"))
-		return;
+		irq = irq_of_parse_and_map(np, 0);
+		if (!irq) {
+			brcmf_err("interrupt could not be mapped\n");
+			return 0;
+		}
+		irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
+
+		sdio->oob_irq_supported = true;
+		sdio->oob_irq_nr = irq;
+		sdio->oob_irq_flags = irqf;
+	}
 
-	irq = irq_of_parse_and_map(np, 0);
-	if (!irq) {
-		brcmf_err("interrupt could not be mapped\n");
-		return;
+	clk = devm_clk_get_optional_enabled(dev, "lpo");
+	if (!IS_ERR_OR_NULL(clk)) {
+		brcmf_dbg(INFO, "enabling 32kHz clock\n");
+		return clk_set_rate(clk, 32768);
+	} else {
+		return PTR_ERR_OR_ZERO(clk);
 	}
-	irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
 
-	sdio->oob_irq_supported = true;
-	sdio->oob_irq_nr = irq;
-	sdio->oob_irq_flags = irqf;
+	return 0;
 }
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
index 10bf52253337e..ae124c73fc3b7 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
@@ -3,11 +3,12 @@ 
  * Copyright (c) 2014 Broadcom Corporation
  */
 #ifdef CONFIG_OF
-void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-		    struct brcmf_mp_device *settings);
+int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
+		   struct brcmf_mp_device *settings);
 #else
-static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-			   struct brcmf_mp_device *settings)
+static int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
+			  struct brcmf_mp_device *settings)
 {
+	return 0;
 }
 #endif /* CONFIG_OF */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 06698a714b523..c34405a6d38b8 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -2457,6 +2457,9 @@  brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 		ret = -ENOMEM;
 		goto fail;
 	}
+	ret = PTR_ERR_OR_ZERO(devinfo->settings);
+	if (ret < 0)
+		goto fail;
 
 	bus = kzalloc(sizeof(*bus), GFP_KERNEL);
 	if (!bus) {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 6b38d9de71af6..461b7ff3be24b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -3943,7 +3943,7 @@  static const struct brcmf_buscore_ops brcmf_sdio_buscore_ops = {
 	.write32 = brcmf_sdio_buscore_write32,
 };
 
-static bool
+static int
 brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
 {
 	struct brcmf_sdio_dev *sdiodev;
@@ -3953,6 +3953,7 @@  brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
 	u32 reg_val;
 	u32 drivestrength;
 	u32 enum_base;
+	int ret = -EBADE;
 
 	sdiodev = bus->sdiodev;
 	sdio_claim_host(sdiodev->func1);
@@ -4001,8 +4002,9 @@  brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
 						   BRCMF_BUSTYPE_SDIO,
 						   bus->ci->chip,
 						   bus->ci->chiprev);
-	if (!sdiodev->settings) {
+	if (IS_ERR_OR_NULL(sdiodev->settings)) {
 		brcmf_err("Failed to get device parameters\n");
+		ret = PTR_ERR_OR_ZERO(sdiodev->settings);
 		goto fail;
 	}
 	/* platform specific configuration:
@@ -4071,7 +4073,7 @@  brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
 	/* allocate header buffer */
 	bus->hdrbuf = kzalloc(MAX_HDR_READ + bus->head_align, GFP_KERNEL);
 	if (!bus->hdrbuf)
-		return false;
+		return -ENOMEM;
 	/* Locate an appropriately-aligned portion of hdrbuf */
 	bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0],
 				    bus->head_align);
@@ -4082,11 +4084,11 @@  brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
 	if (bus->poll)
 		bus->pollrate = 1;
 
-	return true;
+	return 0;
 
 fail:
 	sdio_release_host(sdiodev->func1);
-	return false;
+	return ret;
 }
 
 static int
@@ -4446,13 +4448,16 @@  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
 	struct brcmf_sdio *bus;
 	struct workqueue_struct *wq;
 	struct brcmf_fw_request *fwreq;
+	int probe_attach_result;
 
 	brcmf_dbg(TRACE, "Enter\n");
 
 	/* Allocate private bus interface state */
 	bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC);
-	if (!bus)
+	if (!bus) {
+		ret = -ENOMEM;
 		goto fail;
+	}
 
 	bus->sdiodev = sdiodev;
 	sdiodev->bus = bus;
@@ -4467,6 +4472,7 @@  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
 				     dev_name(&sdiodev->func1->dev));
 	if (!wq) {
 		brcmf_err("insufficient memory to create txworkqueue\n");
+		ret = -ENOMEM;
 		goto fail;
 	}
 	brcmf_sdiod_freezer_count(sdiodev);
@@ -4474,8 +4480,10 @@  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
 	bus->brcmf_wq = wq;
 
 	/* attempt to attach to the dongle */
-	if (!(brcmf_sdio_probe_attach(bus))) {
+	probe_attach_result = brcmf_sdio_probe_attach(bus);
+	if (probe_attach_result < 0) {
 		brcmf_err("brcmf_sdio_probe_attach failed\n");
+		ret = probe_attach_result;
 		goto fail;
 	}
 
@@ -4546,7 +4554,7 @@  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
 
 fail:
 	brcmf_sdio_remove(bus);
-	return NULL;
+	return ERR_PTR(ret);
 }
 
 /* Detach and free everything */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
index 9a105e6debe1f..f7db46ae44906 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -1272,6 +1272,9 @@  static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo,
 		ret = -ENOMEM;
 		goto fail;
 	}
+	ret = PTR_ERR_OR_ZERO(devinfo->settings);
+	if (ret < 0)
+		goto fail;
 
 	if (!brcmf_usb_dlneeded(devinfo)) {
 		ret = brcmf_alloc(devinfo->dev, devinfo->settings);