Commit 0ff08433 authored by Jacobe Zang's avatar Jacobe Zang Committed by Kalle Valo
Browse files

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 values that will be
send to bus when error occurred.

Co-developed-by: default avatarOndrej Jirman <megi@xff.cz>
Signed-off-by: default avatarOndrej Jirman <megi@xff.cz>
Co-developed-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Reviewed-by: default avatarSai Krishna <saikrishnag@marvell.com>
Signed-off-by: default avatarJacobe Zang <jacobe.zang@wesion.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com> # On RK3588 EVB1
Acked-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20240910-wireless-mainline-v14-3-9d80fea5326d@wesion.com
parent 7ca3fac1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);
+2 −1
Original line number Diff line number Diff line
@@ -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;
+18 −7
Original line number Diff line number Diff line
@@ -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,12 +66,13 @@ 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,
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 of_phandle_args oirq;
	struct clk *clk;
	const char *prop;
	int irq;
	int err;
@@ -106,7 +108,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;
@@ -114,8 +116,15 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
		of_node_put(root);
	}

	clk = devm_clk_get_optional_enabled(dev, "lpo");
	if (IS_ERR(clk))
		return PTR_ERR(clk);

	brcmf_dbg(INFO, "%s LPO clock\n", clk ? "enable" : "no");
	clk_set_rate(clk, 32768);

	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
		return;
		return 0;

	err = brcmf_of_get_country_codes(dev, settings);
	if (err)
@@ -124,23 +133,25 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
	of_get_mac_address(np, settings->mac);

	if (bus_type != BRCMF_BUSTYPE_SDIO)
		return;
		return 0;

	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_irq_parse_one(np, 0, &oirq))
		return;
		return 0;

	irq = irq_create_of_mapping(&oirq);
	if (!irq) {
		brcmf_err("interrupt could not be mapped\n");
		return;
		return 0;
	}
	irqf = irq_get_trigger_type(irq);

	sdio->oob_irq_supported = true;
	sdio->oob_irq_nr = irq;
	sdio->oob_irq_flags = irqf;

	return 0;
}
+5 −4
Original line number Diff line number Diff line
@@ -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,
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,
static int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
			  struct brcmf_mp_device *settings)
{
	return 0;
}
#endif /* CONFIG_OF */
+3 −0
Original line number Diff line number Diff line
@@ -2452,6 +2452,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) {
Loading