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

Commit cf229037 authored by Sergio Paracuellos's avatar Sergio Paracuellos Committed by Greg Kroah-Hartman
Browse files

staging: mt7621-gpio: use custom xlate function



The default gpio.of_xlate function assumes there is one gpio chip
for each devicetree node. Device tree had changed to only use one node,
which corresponds to 3 different gpio chips now. For that approach
to work we need a custom xlate function.

Signed-off-by: default avatarSergio Paracuellos <sergio.paracuellos@gmail.com>
Reviewed-by: default avatarNeilBrown <neil@brown.name>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent de7d1793
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -205,6 +205,22 @@ static inline const char * const mediatek_gpio_bank_name(int bank)
	return bank_names[bank];
}

static int
mediatek_gpio_xlate(struct gpio_chip *chip,
		    const struct of_phandle_args *spec, u32 *flags)
{
	int gpio = spec->args[0];
	struct mtk_gc *rg = to_mediatek_gpio(chip);

	if (rg->bank != gpio / MTK_BANK_WIDTH)
		return -EINVAL;

	if (flags)
		*flags = spec->args[1];

	return gpio % MTK_BANK_WIDTH;
}

static int
mediatek_gpio_bank_probe(struct platform_device *pdev,
			 struct device_node *node, int bank)
@@ -220,6 +236,8 @@ mediatek_gpio_bank_probe(struct platform_device *pdev,
	spin_lock_init(&rg->lock);
	rg->chip.of_node = node;
	rg->bank = bank;
	rg->chip.of_gpio_n_cells = 2;
	rg->chip.of_xlate = mediatek_gpio_xlate;
	rg->chip.label = mediatek_gpio_bank_name(rg->bank);

	dat = gpio->gpio_membase + GPIO_REG_DATA + (rg->bank * GPIO_BANK_WIDE);