On Thursday 22 September 2022 16:49:32 Stefan Roese wrote:
> On 22.09.22 13:25, Pali Rohár wrote:
> > Currently all GPIOs supported by CMD_EXT_CONTROL/CMD_GET_EXT_CONTROL_STATUS
> > commands (last 16 GPIOs) are available only when FEAT_PERIPH_MCU feature
> > bit is set. So do not register these GPIOs by U-Boot driver when this
> > feature bit is not set, so U-Boot 'gpio' command would see only GPIOs which
> > really exists.
> > 
> > Fixes: 5e4d24ccc115 ("gpio: Add Turris Omnia MCU driver")
> > Signed-off-by: Pali Rohár <p...@kernel.org>
> 
> Reviewed-by: Stefan Roese <s...@denx.de>

Stefan, will you send this fix into the master branch, so it would be
fixed in 2022.10 release?

> Thanks,
> Stefan
> 
> > ---
> >   drivers/gpio/turris_omnia_mcu.c | 19 +++++++++++++++----
> >   1 file changed, 15 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/gpio/turris_omnia_mcu.c 
> > b/drivers/gpio/turris_omnia_mcu.c
> > index 986ccde6bc70..2d2bf2d1dd69 100644
> > --- a/drivers/gpio/turris_omnia_mcu.c
> > +++ b/drivers/gpio/turris_omnia_mcu.c
> > @@ -16,6 +16,8 @@ enum commands_e {
> >     /* available if FEAT_EXT_CMDS bit is set in features */
> >     CMD_GET_EXT_STATUS_DWORD            = 0x11,
> > +
> > +   /* available if FEAT_EXT_CMDS and FEAT_PERIPH_MCU bits are set in 
> > featurs */
> >     CMD_EXT_CONTROL                     = 0x12,
> >     CMD_GET_EXT_CONTROL_STATUS          = 0x13,
> >   };
> > @@ -54,6 +56,7 @@ enum ctl_byte_e {
> >   /* CMD_GET_FEATURES */
> >   enum features_e {
> > +   FEAT_PERIPH_MCU         = BIT(0),
> >     FEAT_EXT_CMDS           = BIT(1),
> >   };
> > @@ -84,10 +87,12 @@ static int turris_omnia_mcu_get_function(struct udevice 
> > *dev, uint offset)
> >                     return -EINVAL;
> >             return GPIOF_INPUT;
> > -   /* bank 2 - supported only when FEAT_EXT_CMDS is set */
> > +   /* bank 2 - supported only when FEAT_EXT_CMDS and FEAT_PERIPH_MCU is 
> > set */
> >     case (16 + 32 + 0) ... (16 + 32 + 15):
> >             if (!(info->features & FEAT_EXT_CMDS))
> >                     return -EINVAL;
> > +           if (!(info->features & FEAT_PERIPH_MCU))
> > +                   return -EINVAL;
> >             return GPIOF_OUTPUT;
> >     default:
> > @@ -120,10 +125,12 @@ static int turris_omnia_mcu_get_value(struct udevice 
> > *dev, uint offset)
> >             return ((((u32)val32[3] << 24) | ((u32)val32[2] << 16) |
> >                      ((u32)val32[1] << 8) | val32[0]) >> (offset - 16)) & 
> > 0x1;
> > -   /* bank 2 - supported only when FEAT_EXT_CMDS is set */
> > +   /* bank 2 - supported only when FEAT_EXT_CMDS and FEAT_PERIPH_MCU is 
> > set */
> >     case (16 + 32 + 0) ... (16 + 32 + 15):
> >             if (!(info->features & FEAT_EXT_CMDS))
> >                     return -EINVAL;
> > +           if (!(info->features & FEAT_PERIPH_MCU))
> > +                   return -EINVAL;
> >             ret = dm_i2c_read(dev, CMD_GET_EXT_CONTROL_STATUS, val16, 2);
> >             if (ret)
> >                     return ret;
> > @@ -162,10 +169,12 @@ static int turris_omnia_mcu_set_value(struct udevice 
> > *dev, uint offset, int valu
> >             val16[0] = value ? val16[1] : 0;
> >             return dm_i2c_write(dev, CMD_GENERAL_CONTROL, val16, 
> > sizeof(val16));
> > -   /* bank 2 - supported only when FEAT_EXT_CMDS is set */
> > +   /* bank 2 - supported only when FEAT_EXT_CMDS and FEAT_PERIPH_MCU is 
> > set */
> >     case (16 + 32 + 0) ... (16 + 32 + 15):
> >             if (!(info->features & FEAT_EXT_CMDS))
> >                     return -EINVAL;
> > +           if (!(info->features & FEAT_PERIPH_MCU))
> > +                   return -EINVAL;
> >             val32[3] = BIT(offset - 16 - 32) >> 8;
> >             val32[2] = BIT(offset - 16 - 32) & 0xff;
> >             val32[1] = value ? val32[3] : 0;
> > @@ -282,8 +291,10 @@ static int turris_omnia_mcu_probe(struct udevice *dev)
> >     uc_priv->bank_name = "mcu_";
> > -   if (info->features & FEAT_EXT_CMDS)
> > +   if ((info->features & FEAT_EXT_CMDS) && (info->features & 
> > FEAT_PERIPH_MCU))
> >             uc_priv->gpio_count = 16 + 32 + 16;
> > +   else if (info->features & FEAT_EXT_CMDS)
> > +           uc_priv->gpio_count = 16 + 32;
> >     else
> >             uc_priv->gpio_count = 16;
> 
> Viele Grüße,
> Stefan Roese
> 
> -- 
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: s...@denx.de

Reply via email to