Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform/chrome: cros_ec: Add a flag to track registration state

Introduce a `registered` flag to the `struct cros_ec_device` to allow
callers to determine if the device has been fully registered and is
ready for use.

This is a preparatory step to prevent race conditions where other drivers
might try to access the device before it is fully registered or after
it has been unregistered.

Link: https://lore.kernel.org/r/20250828083601.856083-5-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>

+26
+7
drivers/platform/chrome/cros_ec.c
··· 9 9 * battery charging and regulator control, firmware update. 10 10 */ 11 11 12 + #include <linux/cleanup.h> 12 13 #include <linux/interrupt.h> 13 14 #include <linux/module.h> 14 15 #include <linux/of_platform.h> ··· 317 316 goto exit; 318 317 } 319 318 319 + scoped_guard(mutex, &ec_dev->lock) 320 + ec_dev->registered = true; 321 + 320 322 dev_info(dev, "Chrome EC device registered\n"); 321 323 322 324 /* ··· 347 343 */ 348 344 void cros_ec_unregister(struct cros_ec_device *ec_dev) 349 345 { 346 + scoped_guard(mutex, &ec_dev->lock) 347 + ec_dev->registered = false; 348 + 350 349 if (ec_dev->mkbp_event_supported) 351 350 blocking_notifier_chain_unregister(&ec_dev->event_notifier, 352 351 &ec_dev->notifier_ready);
+15
drivers/platform/chrome/cros_ec_proto.c
··· 3 3 // 4 4 // Copyright (C) 2015 Google, Inc 5 5 6 + #include <linux/cleanup.h> 6 7 #include <linux/delay.h> 7 8 #include <linux/device.h> 8 9 #include <linux/limits.h> ··· 1153 1152 return resp.version_mask; 1154 1153 } 1155 1154 EXPORT_SYMBOL_GPL(cros_ec_get_cmd_versions); 1155 + 1156 + /** 1157 + * cros_ec_device_registered - Return if the ec_dev is registered. 1158 + * 1159 + * @ec_dev: EC device 1160 + * 1161 + * Return: true if registered. Otherwise, false. 1162 + */ 1163 + bool cros_ec_device_registered(struct cros_ec_device *ec_dev) 1164 + { 1165 + guard(mutex)(&ec_dev->lock); 1166 + return ec_dev->registered; 1167 + } 1168 + EXPORT_SYMBOL_GPL(cros_ec_device_registered); 1156 1169 1157 1170 MODULE_LICENSE("GPL"); 1158 1171 MODULE_DESCRIPTION("ChromeOS EC communication protocol helpers");
+4
include/linux/platform_data/cros_ec_proto.h
··· 128 128 * @dout_size: Size of dout buffer to allocate (zero to use static dout). 129 129 * @wake_enabled: True if this device can wake the system from sleep. 130 130 * @suspended: True if this device had been suspended. 131 + * @registered: True if this device had been registered. 131 132 * @cmd_xfer: Send command to EC and get response. 132 133 * Returns the number of bytes received if the communication 133 134 * succeeded, but that doesn't mean the EC was happy with the ··· 187 186 int dout_size; 188 187 bool wake_enabled; 189 188 bool suspended; 189 + bool registered; 190 190 int (*cmd_xfer)(struct cros_ec_device *ec, 191 191 struct cros_ec_command *msg); 192 192 int (*pkt_xfer)(struct cros_ec_device *ec, ··· 279 277 int cros_ec_cmd_readmem(struct cros_ec_device *ec_dev, u8 offset, u8 size, void *dest); 280 278 281 279 int cros_ec_get_cmd_versions(struct cros_ec_device *ec_dev, u16 cmd); 280 + 281 + bool cros_ec_device_registered(struct cros_ec_device *ec_dev); 282 282 283 283 /** 284 284 * cros_ec_get_time_ns() - Return time in ns.