This provides a GPIO interface supporting inputs and outputs.
          The I2C versions of the chips can be used as interrupt-controller.
 
-config PINCTRL_MESON
-       bool
-       depends on OF
-       select PINMUX
-       select PINCONF
-       select GENERIC_PINCONF
-       select GPIOLIB
-       select OF_GPIO
-       select REGMAP_MMIO
-
 config PINCTRL_OXNAS
        bool
        depends on OF
 source "drivers/pinctrl/vt8500/Kconfig"
 source "drivers/pinctrl/mediatek/Kconfig"
 source "drivers/pinctrl/zte/Kconfig"
+source "drivers/pinctrl/meson/Kconfig"
 
 config PINCTRL_XWAY
        bool
 
--- /dev/null
+menuconfig PINCTRL_MESON
+       bool "Amlogic SoC pinctrl drivers"
+       depends on ARCH_MESON
+       depends on OF
+       select PINMUX
+       select PINCONF
+       select GENERIC_PINCONF
+       select GPIOLIB
+       select OF_GPIO
+       select REGMAP_MMIO
+
+if PINCTRL_MESON
+
+config PINCTRL_MESON8
+       bool "Meson 8 SoC pinctrl driver"
+       depends on ARM
+       default y
+
+config PINCTRL_MESON8B
+       bool "Meson 8b SoC pinctrl driver"
+       depends on ARM
+       default y
+
+config PINCTRL_MESON_GXBB
+       bool "Meson gxbb SoC pinctrl driver"
+       depends on ARM64
+       default y
+
+config PINCTRL_MESON_GXL
+       bool "Meson gxl SoC pinctrl driver"
+       depends on ARM64
+       default y
+
+endif
 
-obj-y  += pinctrl-meson8.o pinctrl-meson8b.o
-obj-y  += pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
-obj-y  += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON) += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
+obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
+obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
+obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
 
        BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
        .name           = "periphs-banks",
        .pins           = meson_gxbb_periphs_pins,
        .groups         = meson_gxbb_periphs_groups,
        .num_banks      = ARRAY_SIZE(meson_gxbb_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
        .name           = "aobus-banks",
        .pins           = meson_gxbb_aobus_pins,
        .groups         = meson_gxbb_aobus_groups,
        .num_funcs      = ARRAY_SIZE(meson_gxbb_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson_gxbb_aobus_banks),
 };
+
+static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
+               .data = &meson_gxbb_periphs_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
+               .data = &meson_gxbb_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson_gxbb_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson-gxbb-pinctrl",
+               .of_match_table = meson_gxbb_pinctrl_dt_match,
+       },
+};
+builtin_platform_driver(meson_gxbb_pinctrl_driver);
 
        BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
        .name           = "periphs-banks",
        .pins           = meson_gxl_periphs_pins,
        .groups         = meson_gxl_periphs_groups,
        .num_banks      = ARRAY_SIZE(meson_gxl_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
        .name           = "aobus-banks",
        .pins           = meson_gxl_aobus_pins,
        .groups         = meson_gxl_aobus_groups,
        .num_funcs      = ARRAY_SIZE(meson_gxl_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson_gxl_aobus_banks),
 };
+
+static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson-gxl-periphs-pinctrl",
+               .data = &meson_gxl_periphs_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson-gxl-aobus-pinctrl",
+               .data = &meson_gxl_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson_gxl_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson-gxl-pinctrl",
+               .of_match_table = meson_gxl_pinctrl_dt_match,
+       },
+};
+builtin_platform_driver(meson_gxl_pinctrl_driver);
 
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/pinctrl/pinconf-generic.h>
 #include <linux/pinctrl/pinconf.h>
 #include <linux/pinctrl/pinctrl.h>
        return !!(val & BIT(bit));
 }
 
-static const struct of_device_id meson_pinctrl_dt_match[] = {
-       {
-               .compatible = "amlogic,meson8-cbus-pinctrl",
-               .data = &meson8_cbus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8b-cbus-pinctrl",
-               .data = &meson8b_cbus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8-aobus-pinctrl",
-               .data = &meson8_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson8b-aobus-pinctrl",
-               .data = &meson8b_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
-               .data = &meson_gxbb_periphs_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
-               .data = &meson_gxbb_aobus_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxl-periphs-pinctrl",
-               .data = &meson_gxl_periphs_pinctrl_data,
-       },
-       {
-               .compatible = "amlogic,meson-gxl-aobus-pinctrl",
-               .data = &meson_gxl_aobus_pinctrl_data,
-       },
-       { },
-};
-
 static int meson_gpiolib_register(struct meson_pinctrl *pc)
 {
        int ret;
        return 0;
 }
 
-static int meson_pinctrl_probe(struct platform_device *pdev)
+int meson_pinctrl_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct meson_pinctrl *pc;
        int ret;
                return -ENOMEM;
 
        pc->dev = dev;
-       match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
-       pc->data = (struct meson_pinctrl_data *) match->data;
+       pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
 
-       ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
+       ret = meson_pinctrl_parse_dt(pc, dev->of_node);
        if (ret)
                return ret;
 
 
        return meson_gpiolib_register(pc);
 }
-
-static struct platform_driver meson_pinctrl_driver = {
-       .probe          = meson_pinctrl_probe,
-       .driver = {
-               .name   = "meson-pinctrl",
-               .of_match_table = meson_pinctrl_dt_match,
-       },
-};
-builtin_platform_driver(meson_pinctrl_driver);
 
 
 #include <linux/gpio.h>
 #include <linux/pinctrl/pinctrl.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/types.h>
 
 
 #define MESON_PIN(x) PINCTRL_PIN(x, #x)
 
-extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
+/* Common probe function */
+int meson_pinctrl_probe(struct platform_device *pdev);
 
        BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
        .name           = "cbus-banks",
        .pins           = meson8_cbus_pins,
        .groups         = meson8_cbus_groups,
        .num_banks      = ARRAY_SIZE(meson8_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
        .name           = "ao-bank",
        .pins           = meson8_aobus_pins,
        .groups         = meson8_aobus_groups,
        .num_funcs      = ARRAY_SIZE(meson8_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson8_aobus_banks),
 };
+
+static const struct of_device_id meson8_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson8-cbus-pinctrl",
+               .data = &meson8_cbus_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson8-aobus-pinctrl",
+               .data = &meson8_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson8_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson8-pinctrl",
+               .of_match_table = meson8_pinctrl_dt_match,
+       },
+};
+builtin_platform_driver(meson8_pinctrl_driver);
 
        BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
        .name           = "cbus-banks",
        .pins           = meson8b_cbus_pins,
        .groups         = meson8b_cbus_groups,
        .num_banks      = ARRAY_SIZE(meson8b_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
        .name           = "aobus-banks",
        .pins           = meson8b_aobus_pins,
        .groups         = meson8b_aobus_groups,
        .num_funcs      = ARRAY_SIZE(meson8b_aobus_functions),
        .num_banks      = ARRAY_SIZE(meson8b_aobus_banks),
 };
+
+static const struct of_device_id meson8b_pinctrl_dt_match[] = {
+       {
+               .compatible = "amlogic,meson8b-cbus-pinctrl",
+               .data = &meson8b_cbus_pinctrl_data,
+       },
+       {
+               .compatible = "amlogic,meson8b-aobus-pinctrl",
+               .data = &meson8b_aobus_pinctrl_data,
+       },
+       { },
+};
+
+static struct platform_driver meson8b_pinctrl_driver = {
+       .probe          = meson_pinctrl_probe,
+       .driver = {
+               .name   = "meson8b-pinctrl",
+               .of_match_table = meson8b_pinctrl_dt_match,
+       },
+};
+builtin_platform_driver(meson8b_pinctrl_driver);