Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 057fcd42 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Kalle Valo
Browse files

bcma: gpio: use predictable base for all BCM47XX buses



Some BCM47XX SoC routers have LEDs connected to extra PCIe bcma buses.
Handling them in arch code requires predictable GPIO numbers.

Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 080465f2
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@

#include "bcma_private.h"

#define BCMA_GPIO_MAX_PINS	32

static inline struct bcma_drv_cc *bcma_gpio_get_cc(struct gpio_chip *chip)
{
	return container_of(chip, struct bcma_drv_cc, gpio);
@@ -204,6 +206,7 @@ static void bcma_gpio_irq_domain_exit(struct bcma_drv_cc *cc)

int bcma_gpio_init(struct bcma_drv_cc *cc)
{
	struct bcma_bus *bus = cc->core->bus;
	struct gpio_chip *chip = &cc->gpio;
	int err;

@@ -222,7 +225,7 @@ int bcma_gpio_init(struct bcma_drv_cc *cc)
	if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
		chip->of_node	= cc->core->dev.of_node;
#endif
	switch (cc->core->bus->chipinfo.id) {
	switch (bus->chipinfo.id) {
	case BCMA_CHIP_ID_BCM5357:
	case BCMA_CHIP_ID_BCM53572:
		chip->ngpio	= 32;
@@ -231,13 +234,17 @@ int bcma_gpio_init(struct bcma_drv_cc *cc)
		chip->ngpio	= 16;
	}

	/* There is just one SoC in one device and its GPIO addresses should be
	 * deterministic to address them more easily. The other buses could get
	 * a random base number. */
	if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
		chip->base		= 0;
	else
	/*
	 * On MIPS we register GPIO devices (LEDs, buttons) using absolute GPIO
	 * pin numbers. We don't have Device Tree there and we can't really use
	 * relative (per chip) numbers.
	 * So let's use predictable base for BCM47XX and "random" for all other.
	 */
#if IS_BUILTIN(CONFIG_BCM47XX)
	chip->base		= bus->num * BCMA_GPIO_MAX_PINS;
#else
	chip->base		= -1;
#endif

	err = bcma_gpio_irq_domain_init(cc);
	if (err)