On 14/03/2019 17:37, Jerome Brunet wrote: > From: Guillaume La Roque <glaroque@xxxxxxxxxxxx> > > drive-strength is a new feature needed for G12A SoC. > the default DS setting after boot is usually 0.5mA and it is not enough for > many functions. We need to be able to set the drive strength to reliably > enable things like MMC, I2C, etc ... > > Signed-off-by: Guillaume La Roque <glaroque@xxxxxxxxxxxx> > Signed-off-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx> > --- > drivers/pinctrl/meson/pinctrl-meson-g12a.c | 36 ++--- > drivers/pinctrl/meson/pinctrl-meson.c | 166 ++++++++++++++++----- > drivers/pinctrl/meson/pinctrl-meson.h | 20 ++- > 3 files changed, 162 insertions(+), 60 deletions(-) > > diff --git a/drivers/pinctrl/meson/pinctrl-meson-g12a.c b/drivers/pinctrl/meson/pinctrl-meson-g12a.c > index d494492e98e9..3475cd7bd2af 100644 > --- a/drivers/pinctrl/meson/pinctrl-meson-g12a.c > +++ b/drivers/pinctrl/meson/pinctrl-meson-g12a.c [...] > static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin, > unsigned long *config) > { > struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev); > enum pin_config_param param = pinconf_to_config_param(*config); > u16 arg; > + int ret; > > switch (param) { > case PIN_CONFIG_BIAS_DISABLE: > @@ -291,6 +373,10 @@ static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin, > else > return -EINVAL; > break; > + case PIN_CONFIG_DRIVE_STRENGTH: > + ret = meson_pinconf_get_drive_strength(pc, pin, &arg); > + if (ret) > + return ret; Missing break here ! Neil > default: > return -ENOTSUPP; > } > diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h > index 5eaab925f427..1a88103dcb9b 100644 > --- a/drivers/pinctrl/meson/pinctrl-meson.h > +++ b/drivers/pinctrl/meson/pinctrl-meson.h > @@ -71,9 +71,20 @@ enum meson_reg_type { > REG_DIR, > REG_OUT, > REG_IN, > + REG_DS, > NUM_REG, > }; > > +/** > + * enum meson_pinconf_drv - value of drive-strength supported > + */ > +enum meson_pinconf_drv { > + MESON_PINCONF_DRV_500UA, > + MESON_PINCONF_DRV_2500UA, > + MESON_PINCONF_DRV_3000UA, > + MESON_PINCONF_DRV_4000UA, > +}; > + > /** > * struct meson bank > * > @@ -132,7 +143,8 @@ struct meson_pinctrl { > .num_groups = ARRAY_SIZE(fn ## _groups), \ > } > > -#define BANK(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib) \ > +#define BANK_DS(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib, \ > + dsr, dsb) \ > { \ > .name = n, \ > .first = f, \ > @@ -145,8 +157,12 @@ struct meson_pinctrl { > [REG_DIR] = { dr, db }, \ > [REG_OUT] = { or, ob }, \ > [REG_IN] = { ir, ib }, \ > + [REG_DS] = { dsr, dsb }, \ > }, \ > - } > + } > + > +#define BANK(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib) \ > + BANK_DS(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib, 0, 0) > > #define MESON_PIN(x) PINCTRL_PIN(x, #x) > >