The charge-control subsystem in the ChromeOS EC is not strictly tied to its USB-PD subsystem. Since commit 7613bc0d116a ("mfd: cros_ec: Don't load charger with UCSI") the presence of EC_FEATURE_UCSI_PPM would inhibit the probing of the charge-control driver. Furthermore recent versions of the EC firmware in Framework laptops hard-disable EC_FEATURE_USB_PD to avoid probing cros-usbpd-charger, which then also breaks cros-charge-control.
Instead use the dedicated EC_FEATURE_CHARGER.
Link: https://github.com/FrameworkComputer/EmbeddedController/commit/1d7bcf1d50137... Fixes: 555b5fcdb844 ("mfd: cros_ec: Register charge control subdevice") Cc: stable@vger.kernel.org Tested-by: Tom Vincent linux@tlvince.com Signed-off-by: Thomas Weißschuh linux@weissschuh.net --- Changes in v2: - Rebase onto v6.16-rc1 - Pick up tested-by from Tom - Also Cc stable@ - Link to v1: https://lore.kernel.org/r/20250521-cros-ec-mfd-chctl-probe-v1-1-6ebfe3a6efa7... --- drivers/mfd/cros_ec_dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c index 9f84a52b48d6a8994d23edba999398684303ee64..dc80a272726bb16b58253418999021cd56dfd975 100644 --- a/drivers/mfd/cros_ec_dev.c +++ b/drivers/mfd/cros_ec_dev.c @@ -87,7 +87,6 @@ static const struct mfd_cell cros_ec_sensorhub_cells[] = { };
static const struct mfd_cell cros_usbpd_charger_cells[] = { - { .name = "cros-charge-control", }, { .name = "cros-usbpd-charger", }, { .name = "cros-usbpd-logger", }, }; @@ -112,6 +111,10 @@ static const struct mfd_cell cros_ec_ucsi_cells[] = { { .name = "cros_ec_ucsi", }, };
+static const struct mfd_cell cros_ec_charge_control_cells[] = { + { .name = "cros-charge-control", }, +}; + static const struct cros_feature_to_cells cros_subdevices[] = { { .id = EC_FEATURE_CEC, @@ -148,6 +151,11 @@ static const struct cros_feature_to_cells cros_subdevices[] = { .mfd_cells = cros_ec_keyboard_leds_cells, .num_cells = ARRAY_SIZE(cros_ec_keyboard_leds_cells), }, + { + .id = EC_FEATURE_CHARGER, + .mfd_cells = cros_ec_charge_control_cells, + .num_cells = ARRAY_SIZE(cros_ec_charge_control_cells), + }, };
static const struct mfd_cell cros_ec_platform_cells[] = {
--- base-commit: 19272b37aa4f83ca52bdf9c16d5d81bdd1354494 change-id: 20250521-cros-ec-mfd-chctl-probe-64a63ac9c160
Best regards,
On Mon, Jun 09, 2025 at 11:39:35AM +0200, Thomas Weißschuh wrote:
The charge-control subsystem in the ChromeOS EC is not strictly tied to its USB-PD subsystem. Since commit 7613bc0d116a ("mfd: cros_ec: Don't load charger with UCSI") the presence of EC_FEATURE_UCSI_PPM would inhibit the probing of the charge-control driver. Furthermore recent versions of the EC firmware in Framework laptops hard-disable EC_FEATURE_USB_PD to avoid probing cros-usbpd-charger, which then also breaks cros-charge-control.
Instead use the dedicated EC_FEATURE_CHARGER.
Link: https://github.com/FrameworkComputer/EmbeddedController/commit/1d7bcf1d50137... Fixes: 555b5fcdb844 ("mfd: cros_ec: Register charge control subdevice") Cc: stable@vger.kernel.org Tested-by: Tom Vincent linux@tlvince.com Signed-off-by: Thomas Weißschuh linux@weissschuh.net
Reviewed-by: Tzung-Bi Shih tzungbi@kernel.org
On Mon, 09 Jun 2025, Thomas Weißschuh wrote:
The charge-control subsystem in the ChromeOS EC is not strictly tied to its USB-PD subsystem. Since commit 7613bc0d116a ("mfd: cros_ec: Don't load charger with UCSI") the presence of EC_FEATURE_UCSI_PPM would inhibit the probing of the charge-control driver. Furthermore recent versions of the EC firmware in Framework laptops hard-disable EC_FEATURE_USB_PD to avoid probing cros-usbpd-charger, which then also breaks cros-charge-control.
Instead use the dedicated EC_FEATURE_CHARGER.
Link: https://github.com/FrameworkComputer/EmbeddedController/commit/1d7bcf1d50137... Fixes: 555b5fcdb844 ("mfd: cros_ec: Register charge control subdevice") Cc: stable@vger.kernel.org Tested-by: Tom Vincent linux@tlvince.com Signed-off-by: Thomas Weißschuh linux@weissschuh.net
Changes in v2:
- Rebase onto v6.16-rc1
- Pick up tested-by from Tom
- Also Cc stable@
- Link to v1: https://lore.kernel.org/r/20250521-cros-ec-mfd-chctl-probe-v1-1-6ebfe3a6efa7...
Whoops, I already applied v1. However, I did all of these things manually.
drivers/mfd/cros_ec_dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c index 9f84a52b48d6a8994d23edba999398684303ee64..dc80a272726bb16b58253418999021cd56dfd975 100644 --- a/drivers/mfd/cros_ec_dev.c +++ b/drivers/mfd/cros_ec_dev.c @@ -87,7 +87,6 @@ static const struct mfd_cell cros_ec_sensorhub_cells[] = { }; static const struct mfd_cell cros_usbpd_charger_cells[] = {
- { .name = "cros-charge-control", }, { .name = "cros-usbpd-charger", }, { .name = "cros-usbpd-logger", },
}; @@ -112,6 +111,10 @@ static const struct mfd_cell cros_ec_ucsi_cells[] = { { .name = "cros_ec_ucsi", }, }; +static const struct mfd_cell cros_ec_charge_control_cells[] = {
- { .name = "cros-charge-control", },
+};
static const struct cros_feature_to_cells cros_subdevices[] = { { .id = EC_FEATURE_CEC, @@ -148,6 +151,11 @@ static const struct cros_feature_to_cells cros_subdevices[] = { .mfd_cells = cros_ec_keyboard_leds_cells, .num_cells = ARRAY_SIZE(cros_ec_keyboard_leds_cells), },
- {
.id = EC_FEATURE_CHARGER,
.mfd_cells = cros_ec_charge_control_cells,
.num_cells = ARRAY_SIZE(cros_ec_charge_control_cells),
- },
}; static const struct mfd_cell cros_ec_platform_cells[] = {
base-commit: 19272b37aa4f83ca52bdf9c16d5d81bdd1354494 change-id: 20250521-cros-ec-mfd-chctl-probe-64a63ac9c160
Best regards,
Thomas Weißschuh linux@weissschuh.net
linux-stable-mirror@lists.linaro.org