On Thu, Feb 20, 2025 at 11:40:04PM -0600, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@xxxxxxx> > > If no fw_build is recognized for the controller there is no point to > exposing the `do_flash` attribute. > > Add an is_visible callback to the attribute group and check for that > fw_build member to hide when not applicable. > > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > drivers/usb/typec/ucsi/ucsi_ccg.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c > index 663aca9421410..801a66efa9820 100644 > --- a/drivers/usb/typec/ucsi/ucsi_ccg.c > +++ b/drivers/usb/typec/ucsi/ucsi_ccg.c > @@ -1390,22 +1390,35 @@ static ssize_t do_flash_store(struct device *dev, > if (!flash) > return n; > > - if (uc->fw_build == 0x0) { > - dev_err(dev, "fail to flash FW due to missing FW build info\n"); > - return -EINVAL; > - } > - > schedule_work(&uc->work); > return n; > } > > +static umode_t ucsi_ccg_attrs_is_visible(struct kobject *kobj, struct attribute *attr, int idx) > +{ > + struct device *dev = kobj_to_dev(kobj); > + struct ucsi_ccg *uc = i2c_get_clientdata(to_i2c_client(dev)); > + > + if (!uc->fw_build) > + return 0; > + > + return attr->mode; > +} > + > static DEVICE_ATTR_WO(do_flash); > > static struct attribute *ucsi_ccg_attrs[] = { > &dev_attr_do_flash.attr, > NULL, > }; > -ATTRIBUTE_GROUPS(ucsi_ccg); > +static struct attribute_group ucsi_ccg_attr_group = { > + .attrs = ucsi_ccg_attrs, > + .is_visible = ucsi_ccg_attrs_is_visible, > +}; > +static const struct attribute_group *ucsi_ccg_groups[] = { > + &ucsi_ccg_attr_group, > + NULL, > +}; > > static int ucsi_ccg_probe(struct i2c_client *client) > { > -- > 2.43.0 -- heikki