|
@@ -1246,6 +1246,22 @@ static void __iomem *sirfsoc_rsc_of_iomap(void)
|
|
|
return of_iomap(np, 0);
|
|
|
}
|
|
|
|
|
|
+static int sirfsoc_gpio_of_xlate(struct gpio_chip *gc,
|
|
|
+ const struct of_phandle_args *gpiospec,
|
|
|
+ u32 *flags)
|
|
|
+{
|
|
|
+ if (gpiospec->args[0] > SIRFSOC_GPIO_NO_OF_BANKS * SIRFSOC_GPIO_BANK_SIZE)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (gc != &sgpio_bank[gpiospec->args[0] / SIRFSOC_GPIO_BANK_SIZE].chip.gc)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (flags)
|
|
|
+ *flags = gpiospec->args[1];
|
|
|
+
|
|
|
+ return gpiospec->args[0] % SIRFSOC_GPIO_BANK_SIZE;
|
|
|
+}
|
|
|
+
|
|
|
static int sirfsoc_pinmux_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
int ret;
|
|
@@ -1736,6 +1752,8 @@ static int sirfsoc_gpio_probe(struct device_node *np)
|
|
|
bank->chip.gc.ngpio = SIRFSOC_GPIO_BANK_SIZE;
|
|
|
bank->chip.gc.label = kstrdup(np->full_name, GFP_KERNEL);
|
|
|
bank->chip.gc.of_node = np;
|
|
|
+ bank->chip.gc.of_xlate = sirfsoc_gpio_of_xlate;
|
|
|
+ bank->chip.gc.of_gpio_n_cells = 2;
|
|
|
bank->chip.regs = regs;
|
|
|
bank->id = i;
|
|
|
bank->is_marco = is_marco;
|