Filter the attributes and only create those which are supported by the currently loaded configuration. The filtered attributes are saved in an attribute group to be easily created and removed. root_attrs_support is an array of all attributes and their support conditions. fw_version and fw_release_date are supported on all models so their condition is always true. Cc: Aakash Singh <mail@xxxxxxxxxxxxxxx> Cc: Jose Angel Pastrana <japp0005@xxxxxxxxxxxx> Signed-off-by: Nikita Kravets <teackot@xxxxxxxxx> --- drivers/platform/x86/msi-ec.c | 40 +++++++++++++++++++++++++++-------- drivers/platform/x86/msi-ec.h | 5 +++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/drivers/platform/x86/msi-ec.c b/drivers/platform/x86/msi-ec.c index 772b230fb47e..09472b21e093 100644 --- a/drivers/platform/x86/msi-ec.c +++ b/drivers/platform/x86/msi-ec.c @@ -872,22 +872,44 @@ static ssize_t fw_release_date_show(struct device *device, static DEVICE_ATTR_RO(fw_version); static DEVICE_ATTR_RO(fw_release_date); -static struct attribute *msi_root_attrs[] = { - &dev_attr_fw_version.attr, - &dev_attr_fw_release_date.attr, - NULL -}; - -static struct attribute_group msi_root_group = { - .attrs = msi_root_attrs, -}; +static struct attribute_group msi_root_group; /* * Sysfs platform driver */ +/* + * Copies supported attributes from `attributes` to `filtered` + */ +static void filter_attributes(struct attribute_support *attributes, + struct attribute **filtered, + size_t size) +{ + for (int i = 0, j = 0; i < size; i++) { + if (attributes[i].supported) + filtered[j++] = attributes[i].attribute; + } +} + static int msi_platform_probe(struct platform_device *pdev) { + struct attribute_support root_attrs_support[] = { + { + &dev_attr_fw_version.attr, + true, + }, + { + &dev_attr_fw_release_date.attr, + true, + }, + }; + + /* +1 to null-terminate the array */ + static struct attribute *root_attrs[ARRAY_SIZE(root_attrs_support) + 1] = {0}; + + filter_attributes(root_attrs_support, root_attrs, ARRAY_SIZE(root_attrs_support)); + msi_root_group.attrs = root_attrs; + return sysfs_create_group(&pdev->dev.kobj, &msi_root_group); } diff --git a/drivers/platform/x86/msi-ec.h b/drivers/platform/x86/msi-ec.h index be3533dc9cc6..f4198f0df5d9 100644 --- a/drivers/platform/x86/msi-ec.h +++ b/drivers/platform/x86/msi-ec.h @@ -119,4 +119,9 @@ struct msi_ec_conf { struct msi_ec_kbd_bl_conf kbd_bl; }; +struct attribute_support { + struct attribute *attribute; + bool supported; +}; + #endif // _MSI_EC_H_ -- 2.42.0