On 09/10/2017 12:17, Jerome Brunet wrote:
> This change prepare the introduction of new meson SoC. This new SoC will
> share the same gpio/pinconf registers but the pinmux part will be
> different. While the format of the data associated with each pinmux group
> will change, the way to handle pinmuxing will be similar.
> 
> To deal with this new situation, the meson_pmx_struture is kept but the
> data associated to it is now generic. This allows to reuse the basic
> functions which would otherwise be copy/pasted in each pinmux driver
> (such as getting the name a count of groups and functions) Only the
> functions actually using this specific data is taken out of the common
> code and is handling the SoC pinmuxing
> 
> Signed-off-by: Jerome Brunet <[email protected]>
> ---
>  drivers/pinctrl/meson/Kconfig              |   7 ++
>  drivers/pinctrl/meson/Makefile             |   1 +
>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 
> +++++++++++++++++++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 +++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson.c      |  96 ++------------------------
>  drivers/pinctrl/meson/pinctrl-meson.h      |  31 +++------
>  drivers/pinctrl/meson/pinctrl-meson8.c     |   3 +
>  drivers/pinctrl/meson/pinctrl-meson8b.c    |   3 +
>  10 files changed, 193 insertions(+), 109 deletions(-)
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h
> 
> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> index 15655bfd39b6..8968603ef6b2 100644
> --- a/drivers/pinctrl/meson/Kconfig
> +++ b/drivers/pinctrl/meson/Kconfig
> @@ -16,21 +16,28 @@ if PINCTRL_MESON
>  config PINCTRL_MESON8
>       bool "Meson 8 SoC pinctrl driver"
>       depends on ARM
> +     select PINCTRL_MESON_PMX
>       default y
>  
>  config PINCTRL_MESON8B
>       bool "Meson 8b SoC pinctrl driver"
>       depends on ARM
> +     select PINCTRL_MESON_PMX
>       default y
>  
>  config PINCTRL_MESON_GXBB
>       bool "Meson gxbb SoC pinctrl driver"
>       depends on ARM64
> +     select PINCTRL_MESON_PMX
>       default y
>  
>  config PINCTRL_MESON_GXL
>       bool "Meson gxl SoC pinctrl driver"
>       depends on ARM64
> +     select PINCTRL_MESON_PMX
>       default y
>  
> +config PINCTRL_MESON_PMX
> +     bool
> +
>  endif
> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> index a6ef5ff4e9b1..752ae5fdd59a 100644
> --- a/drivers/pinctrl/meson/Makefile
> +++ b/drivers/pinctrl/meson/Makefile
> @@ -1,4 +1,5 @@
>  obj-y += pinctrl-meson.o
> +obj-$(CONFIG_PINCTRL_MESON_PMX) += pinctrl-meson-pmx.o
>  obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
>  obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
>  obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c 
> b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> index a87bdb17414b..a0571d175091 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxbb-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
>       MESON_PIN(GPIOZ_0),
> @@ -834,6 +835,7 @@ static struct meson_pinctrl_data 
> meson_gxbb_periphs_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson_gxbb_periphs_groups),
>       .num_funcs      = ARRAY_SIZE(meson_gxbb_periphs_functions),
>       .num_banks      = ARRAY_SIZE(meson_gxbb_periphs_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> @@ -846,6 +848,7 @@ static struct meson_pinctrl_data 
> meson_gxbb_aobus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson_gxbb_aobus_groups),
>       .num_funcs      = ARRAY_SIZE(meson_gxbb_aobus_functions),
>       .num_banks      = ARRAY_SIZE(meson_gxbb_aobus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c 
> b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> index 088ac94f76b0..2f51af6a244d 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxl-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
>       MESON_PIN(GPIOZ_0),
> @@ -819,6 +820,7 @@ static struct meson_pinctrl_data 
> meson_gxl_periphs_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson_gxl_periphs_groups),
>       .num_funcs      = ARRAY_SIZE(meson_gxl_periphs_functions),
>       .num_banks      = ARRAY_SIZE(meson_gxl_periphs_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> @@ -831,6 +833,7 @@ static struct meson_pinctrl_data 
> meson_gxl_aobus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson_gxl_aobus_groups),
>       .num_funcs      = ARRAY_SIZE(meson_gxl_aobus_functions),
>       .num_banks      = ARRAY_SIZE(meson_gxl_aobus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.c 
> b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> new file mode 100644
> index 000000000000..062381891760
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> @@ -0,0 +1,107 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <[email protected]>
> + * Copyright (C) 2017 Jerome Brunet  <[email protected]>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/* For this first generation of pinctrl driver every pinmux group can be
> + * enabled by a specific bit in the first register range. When all groups for
> + * a given pin are disabled the pin acts as a GPIO.
> + */
> +#include <linux/device.h>
> +#include <linux/regmap.h>
> +#include <linux/pinctrl/pinctrl.h>
> +#include <linux/pinctrl/pinmux.h>
> +
> +#include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
> +
> +/**
> + * meson_pmx_disable_other_groups() - disable other groups using a given pin
> + *
> + * @pc:              meson pin controller device
> + * @pin:     number of the pin
> + * @sel_group:       index of the selected group, or -1 if none
> + *
> + * The function disables all pinmux groups using a pin except the
> + * selected one. If @sel_group is -1 all groups are disabled, leaving
> + * the pin in GPIO mode.
> + */
> +static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> +                                        unsigned int pin, int sel_group)
> +{
> +     struct meson_pmx_group *group;
> +     struct meson_pmx_data *pmx_data;
> +     int i, j;
> +
> +     for (i = 0; i < pc->data->num_groups; i++) {
> +             group = &pc->data->groups[i];
> +             pmx_data = (struct meson_pmx_data *)group->data;
> +             if (pmx_data->is_gpio || i == sel_group)
> +                     continue;
> +
> +             for (j = 0; j < group->num_pins; j++) {
> +                     if (group->pins[j] == pin) {
> +                             /* We have found a group using the pin */
> +                             regmap_update_bits(pc->reg_mux,
> +                                                pmx_data->reg * 4,
> +                                                BIT(pmx_data->bit), 0);
> +                     }
> +             }
> +     }
> +}
> +
> +static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> +                          unsigned group_num)
> +{
> +     struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +     struct meson_pmx_func *func = &pc->data->funcs[func_num];
> +     struct meson_pmx_group *group = &pc->data->groups[group_num];
> +     struct meson_pmx_data *pmx_data =
> +             (struct meson_pmx_data *)group->data;
> +     int i, ret = 0;
> +
> +     dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> +             group->name);
> +
> +     /*
> +      * Disable groups using the same pin.
> +      * The selected group is not disabled to avoid glitches.
> +      */
> +     for (i = 0; i < group->num_pins; i++)
> +             meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> +
> +     /* Function 0 (GPIO) doesn't need any additional setting */
> +     if (func_num)
> +             ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
> +                                      BIT(pmx_data->bit), 
> BIT(pmx_data->bit));
> +
> +     return ret;
> +}
> +
> +static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> +                               struct pinctrl_gpio_range *range,
> +                               unsigned offset)
> +{
> +     struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +
> +     meson_pmx_disable_other_groups(pc, offset, -1);
> +
> +     return 0;
> +}
> +
> +const struct pinmux_ops meson_pmx_ops = {
> +     .set_mux = meson_pmx_set_mux,
> +     .get_functions_count = meson_pmx_get_funcs_count,
> +     .get_function_name = meson_pmx_get_func_name,
> +     .get_function_groups = meson_pmx_get_groups,
> +     .gpio_request_enable = meson_pmx_request_gpio,
> +};
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.h 
> b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> new file mode 100644
> index 000000000000..e1ceb50014c2
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> @@ -0,0 +1,48 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <[email protected]>
> + * Copyright (C) 2017 Jerome Brunet  <[email protected]>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +struct meson_pmx_data {
> +     bool is_gpio;
> +     unsigned int reg;
> +     unsigned int bit;
> +};
> +
> +#define PMX_DATA(r, b, g)                                            \
> +     {                                                               \
> +             .reg = r,                                               \
> +             .bit = b,                                               \
> +             .is_gpio = g,                                           \
> +     }
> +
> +#define GROUP(grp, r, b)                                             \
> +     {                                                               \
> +             .name = #grp,                                           \
> +             .pins = grp ## _pins,                                   \
> +             .num_pins = ARRAY_SIZE(grp ## _pins),                   \
> +             .data = (const struct meson_pmx_data[]){                \
> +                     PMX_DATA(r, b, false),                          \
> +             },                                                      \
> +      }
> +
> +#define GPIO_GROUP(gpio)                                             \
> +     {                                                               \
> +             .name = #gpio,                                          \
> +             .pins = (const unsigned int[]){ gpio },                 \
> +             .num_pins = 1,                                          \
> +             .data = (const struct meson_pmx_data[]){                \
> +                     PMX_DATA(0, 0, true),                           \
> +             },                                                      \
> +     }
> +
> +extern const struct pinmux_ops meson_pmx_ops;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c 
> b/drivers/pinctrl/meson/pinctrl-meson.c
> index 8fc1f1b45435..47ee8349f306 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> @@ -31,10 +31,6 @@
>   * In some cases the register ranges for pull enable and pull
>   * direction are the same and thus there are only 3 register ranges.
>   *
> - * Every pinmux group can be enabled by a specific bit in the first
> - * register range; when all groups for a given pin are disabled the
> - * pin acts as a GPIO.
> - *
>   * For the pull and GPIO configuration every bank uses a contiguous
>   * set of bits in the register sets described above; the same register
>   * can be shared by more banks with different offsets.
> @@ -147,94 +143,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
>       .pin_dbg_show           = meson_pin_dbg_show,
>  };
>  
> -/**
> - * meson_pmx_disable_other_groups() - disable other groups using a given pin
> - *
> - * @pc:              meson pin controller device
> - * @pin:     number of the pin
> - * @sel_group:       index of the selected group, or -1 if none
> - *
> - * The function disables all pinmux groups using a pin except the
> - * selected one. If @sel_group is -1 all groups are disabled, leaving
> - * the pin in GPIO mode.
> - */
> -static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> -                                        unsigned int pin, int sel_group)
> -{
> -     struct meson_pmx_group *group;
> -     int i, j;
> -
> -     for (i = 0; i < pc->data->num_groups; i++) {
> -             group = &pc->data->groups[i];
> -             if (group->is_gpio || i == sel_group)
> -                     continue;
> -
> -             for (j = 0; j < group->num_pins; j++) {
> -                     if (group->pins[j] == pin) {
> -                             /* We have found a group using the pin */
> -                             regmap_update_bits(pc->reg_mux,
> -                                                group->reg * 4,
> -                                                BIT(group->bit), 0);
> -                     }
> -             }
> -     }
> -}
> -
> -static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> -                          unsigned group_num)
> -{
> -     struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -     struct meson_pmx_func *func = &pc->data->funcs[func_num];
> -     struct meson_pmx_group *group = &pc->data->groups[group_num];
> -     int i, ret = 0;
> -
> -     dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> -             group->name);
> -
> -     /*
> -      * Disable groups using the same pin.
> -      * The selected group is not disabled to avoid glitches.
> -      */
> -     for (i = 0; i < group->num_pins; i++)
> -             meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> -
> -     /* Function 0 (GPIO) doesn't need any additional setting */
> -     if (func_num)
> -             ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
> -                                      BIT(group->bit), BIT(group->bit));
> -
> -     return ret;
> -}
> -
> -static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> -                               struct pinctrl_gpio_range *range,
> -                               unsigned offset)
> -{
> -     struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -
> -     meson_pmx_disable_other_groups(pc, offset, -1);
> -
> -     return 0;
> -}
> -
> -static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
>  {
>       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>       return pc->data->num_funcs;
>  }
>  
> -static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> -                                        unsigned selector)
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +                                 unsigned selector)
>  {
>       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>       return pc->data->funcs[selector].name;
>  }
>  
> -static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> -                             const char * const **groups,
> -                             unsigned * const num_groups)
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> +                      const char * const **groups,
> +                      unsigned * const num_groups)
>  {
>       struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
> @@ -244,14 +170,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev 
> *pcdev, unsigned selector,
>       return 0;
>  }
>  
> -static const struct pinmux_ops meson_pmx_ops = {
> -     .set_mux = meson_pmx_set_mux,
> -     .get_functions_count = meson_pmx_get_funcs_count,
> -     .get_function_name = meson_pmx_get_func_name,
> -     .get_function_groups = meson_pmx_get_groups,
> -     .gpio_request_enable = meson_pmx_request_gpio,
> -};
> -
>  static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
>                            unsigned long *configs, unsigned num_configs)
>  {
> @@ -610,7 +528,7 @@ int meson_pinctrl_probe(struct platform_device *pdev)
>       pc->desc.name           = "pinctrl-meson";
>       pc->desc.owner          = THIS_MODULE;
>       pc->desc.pctlops        = &meson_pctrl_ops;
> -     pc->desc.pmxops         = &meson_pmx_ops;
> +     pc->desc.pmxops         = pc->data->pmx_ops;
>       pc->desc.confops        = &meson_pinconf_ops;
>       pc->desc.pins           = pc->data->pins;
>       pc->desc.npins          = pc->data->num_pins;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h 
> b/drivers/pinctrl/meson/pinctrl-meson.h
> index 284157d43612..183b6e471635 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.h
> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> @@ -32,9 +32,7 @@ struct meson_pmx_group {
>       const char *name;
>       const unsigned int *pins;
>       unsigned int num_pins;
> -     bool is_gpio;
> -     unsigned int reg;
> -     unsigned int bit;
> +     const void *data;
>  };
>  
>  /**
> @@ -109,6 +107,7 @@ struct meson_pinctrl_data {
>       unsigned int num_funcs;
>       struct meson_bank *banks;
>       unsigned int num_banks;
> +     const struct pinmux_ops *pmx_ops;
>  };
>  
>  struct meson_pinctrl {
> @@ -124,23 +123,6 @@ struct meson_pinctrl {
>       struct device_node *of_node;
>  };
>  
> -#define GROUP(grp, r, b)                                             \
> -     {                                                               \
> -             .name = #grp,                                           \
> -             .pins = grp ## _pins,                                   \
> -             .num_pins = ARRAY_SIZE(grp ## _pins),                   \
> -             .reg = r,                                               \
> -             .bit = b,                                               \
> -      }
> -
> -#define GPIO_GROUP(gpio)                                             \
> -     {                                                               \
> -             .name = #gpio,                                          \
> -             .pins = (const unsigned int[]){ gpio },                 \
> -             .num_pins = 1,                                          \
> -             .is_gpio = true,                                        \
> -      }
> -
>  #define FUNCTION(fn)                                                 \
>       {                                                               \
>               .name = #fn,                                            \
> @@ -166,5 +148,14 @@ struct meson_pinctrl {
>  
>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>  
> +/* Common pmx functions */
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +                                 unsigned selector);
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
> +                      unsigned selector,
> +                      const char * const **groups,
> +                      unsigned * const num_groups);

Maybe the naming of the common functions should be changed to something generic
like meson_get_functions_name and meson_get_function_groups and leave "pmx" to 
the
first version pinmux control implementation.
Same for the ops, meson_pinmux_ops would be better.

> +
>  /* Common probe function */
>  int meson_pinctrl_probe(struct platform_device *pdev);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c 
> b/drivers/pinctrl/meson/pinctrl-meson8.c
> index 68b345fc105a..b1a7b992cdef 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> @@ -13,6 +13,7 @@
>  
>  #include <dt-bindings/gpio/meson8-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
>       MESON_PIN(GPIOX_0),
> @@ -1054,6 +1055,7 @@ static struct meson_pinctrl_data 
> meson8_cbus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson8_cbus_groups),
>       .num_funcs      = ARRAY_SIZE(meson8_cbus_functions),
>       .num_banks      = ARRAY_SIZE(meson8_cbus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> @@ -1066,6 +1068,7 @@ static struct meson_pinctrl_data 
> meson8_aobus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson8_aobus_groups),
>       .num_funcs      = ARRAY_SIZE(meson8_aobus_functions),
>       .num_banks      = ARRAY_SIZE(meson8_aobus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c 
> b/drivers/pinctrl/meson/pinctrl-meson8b.c
> index 4d61df09bc3f..05f59f3a0c4e 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson8b-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
>       MESON_PIN(GPIOX_0),
> @@ -914,6 +915,7 @@ static struct meson_pinctrl_data 
> meson8b_cbus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson8b_cbus_groups),
>       .num_funcs      = ARRAY_SIZE(meson8b_cbus_functions),
>       .num_banks      = ARRAY_SIZE(meson8b_cbus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> @@ -926,6 +928,7 @@ static struct meson_pinctrl_data 
> meson8b_aobus_pinctrl_data = {
>       .num_groups     = ARRAY_SIZE(meson8b_aobus_groups),
>       .num_funcs      = ARRAY_SIZE(meson8b_aobus_functions),
>       .num_banks      = ARRAY_SIZE(meson8b_aobus_banks),
> +     .pmx_ops        = &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> 

Apart the "pmx" confusing names :
Reviewed-by: Neil Armstrong <[email protected]>

Reply via email to