Create a root attribute group and add the first platform device attributes: firmware version and firmware release date. Firmware version attribute uses an already present ec_get_firmware_version() function. Both features are present on all supported laptops. Cc: Aakash Singh <mail@xxxxxxxxxxxxxxx> Cc: Jose Angel Pastrana <japp0005@xxxxxxxxxxxx> Signed-off-by: Nikita Kravets <teackot@xxxxxxxxx> --- drivers/platform/x86/msi-ec.c | 67 ++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/msi-ec.c b/drivers/platform/x86/msi-ec.c index 12c559c9eac4..772b230fb47e 100644 --- a/drivers/platform/x86/msi-ec.c +++ b/drivers/platform/x86/msi-ec.c @@ -818,17 +818,82 @@ static struct acpi_battery_hook battery_hook = { .name = MSI_EC_DRIVER_NAME, }; +/* + * Sysfs platform device attributes + */ + +static ssize_t fw_version_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + u8 rdata[MSI_EC_FW_VERSION_LENGTH + 1]; + int result; + + result = ec_get_firmware_version(rdata); + if (result < 0) + return result; + + return sysfs_emit(buf, "%s\n", rdata); +} + +static ssize_t fw_release_date_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + u8 rdate[MSI_EC_FW_DATE_LENGTH + 1]; + u8 rtime[MSI_EC_FW_TIME_LENGTH + 1]; + int result; + int year, month, day, hour, minute, second; + + memset(rdate, 0, MSI_EC_FW_DATE_LENGTH + 1); + result = ec_read_seq(MSI_EC_FW_DATE_ADDRESS, + rdate, + MSI_EC_FW_DATE_LENGTH); + if (result < 0) + return result; + + result = sscanf(rdate, "%02d%02d%04d", &month, &day, &year); + if (result != 3) + return -EINVAL; + + memset(rtime, 0, MSI_EC_FW_TIME_LENGTH + 1); + result = ec_read_seq(MSI_EC_FW_TIME_ADDRESS, + rtime, + MSI_EC_FW_TIME_LENGTH); + if (result < 0) + return result; + + result = sscanf(rtime, "%02d:%02d:%02d", &hour, &minute, &second); + if (result != 3) + return -EINVAL; + + return sysfs_emit(buf, "%04d/%02d/%02d %02d:%02d:%02d\n", year, month, day, + hour, minute, second); +} + +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, +}; + /* * Sysfs platform driver */ static int msi_platform_probe(struct platform_device *pdev) { - return 0; + return sysfs_create_group(&pdev->dev.kobj, &msi_root_group); } static int msi_platform_remove(struct platform_device *pdev) { + sysfs_remove_group(&pdev->dev.kobj, &msi_root_group); return 0; } -- 2.42.0