When cros_ec_sysfs probe is called before cros_ec_sensorhub probe routine, the |kb_wake_angle| attribute will not be displayed, even if there are two accelerometers in the chromebook.
Call sysfs_update_groups() when accelerometers are enumerated if the cros_ec sysfs attributes groups have already been created.
Fixes: d60ac88a62df ("mfd / platform / iio: cros_ec: Register sensor through sensorhub") Cc: stable@vger.kernel.org Signed-off-by: Gwendal Grignou gwendal@google.com --- Changes in v2: Rebase after .dev_groups is used.
drivers/platform/chrome/cros_ec_sensorhub.c | 6 +++++- drivers/platform/chrome/cros_ec_sysfs.c | 10 ++++++++++ include/linux/platform_data/cros_ec_proto.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/platform/chrome/cros_ec_sensorhub.c b/drivers/platform/chrome/cros_ec_sensorhub.c index 9c4af76a9956e..c69fec935fb50 100644 --- a/drivers/platform/chrome/cros_ec_sensorhub.c +++ b/drivers/platform/chrome/cros_ec_sensorhub.c @@ -106,8 +106,11 @@ static int cros_ec_sensorhub_register(struct device *dev, sensor_type[sensorhub->resp->info.type]++; }
- if (sensor_type[MOTIONSENSE_TYPE_ACCEL] >= 2) + if (sensor_type[MOTIONSENSE_TYPE_ACCEL] >= 2) { ec->has_kb_wake_angle = true; + if (ec->groups && sysfs_update_groups(&ec->class_dev.kobj, ec->groups)) + dev_warn(dev, "Unable to update cros-ec-sysfs"); + }
if (cros_ec_check_features(ec, EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS)) { diff --git a/drivers/platform/chrome/cros_ec_sysfs.c b/drivers/platform/chrome/cros_ec_sysfs.c index 114b9dbe981e7..b363f70270a38 100644 --- a/drivers/platform/chrome/cros_ec_sysfs.c +++ b/drivers/platform/chrome/cros_ec_sysfs.c @@ -340,11 +340,21 @@ static const struct attribute_group *cros_ec_attr_groups[] = { NULL, };
+static int cros_ec_sysfs_probe(struct platform_device *pd) +{ + struct cros_ec_dev *ec_dev = dev_get_drvdata(pd->dev.parent); + + ec_dev->groups = cros_ec_attr_groups; + + return 0; +} + static struct platform_driver cros_ec_sysfs_driver = { .driver = { .name = DRV_NAME, .dev_groups = cros_ec_attr_groups, }, + .probe = cros_ec_sysfs_probe, };
module_platform_driver(cros_ec_sysfs_driver); diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h index 02599687770c5..de940112f53ae 100644 --- a/include/linux/platform_data/cros_ec_proto.h +++ b/include/linux/platform_data/cros_ec_proto.h @@ -191,6 +191,7 @@ struct cros_ec_platform { /** * struct cros_ec_dev - ChromeOS EC device entry point. * @class_dev: Device structure used in sysfs. + * @groups: sysfs attributes groups for this EC. * @ec_dev: cros_ec_device structure to talk to the physical device. * @dev: Pointer to the platform device. * @debug_info: cros_ec_debugfs structure for debugging information. @@ -200,6 +201,7 @@ struct cros_ec_platform { */ struct cros_ec_dev { struct device class_dev; + const struct attribute_group **groups; struct cros_ec_device *ec_dev; struct device *dev; struct cros_ec_debugfs *debug_info;