Skip to content

Commit

Permalink
Guard System76 EC specific functionality
Browse files Browse the repository at this point in the history
Certain functionality or its implementation in System76 EC firmware may
be different to the proprietary ODM EC firmware. Introduce a new bool,
`has_open_ec`, to guard our specific logic. Detect the use of this by
looking for a custom ACPI method name used in System76 firmware.

Signed-off-by: Tim Crawford <[email protected]>
  • Loading branch information
crawfxrd authored and jackpot51 committed Dec 21, 2021
1 parent a02b101 commit 04145b8
Showing 1 changed file with 27 additions and 23 deletions.
50 changes: 27 additions & 23 deletions system76_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ struct system76_data {
union acpi_object *nfan;
union acpi_object *ntmp;
struct input_dev *input;
bool has_open_ec;
};

static const struct acpi_device_id device_ids[] = {
Expand Down Expand Up @@ -286,20 +287,12 @@ static struct acpi_battery_hook system76_battery_hook = {

static void system76_battery_init(void)
{
acpi_handle handle;

handle = ec_get_handle();
if (handle && acpi_has_method(handle, "GBCT"))
battery_hook_register(&system76_battery_hook);
battery_hook_register(&system76_battery_hook);
}

static void system76_battery_exit(void)
{
acpi_handle handle;

handle = ec_get_handle();
if (handle && acpi_has_method(handle, "GBCT"))
battery_hook_unregister(&system76_battery_hook);
battery_hook_unregister(&system76_battery_hook);
}

/* Keyboard */
Expand Down Expand Up @@ -690,6 +683,10 @@ static int system76_add(struct acpi_device *acpi_dev)
acpi_dev->driver_data = data;
data->acpi_dev = acpi_dev;

// Some models do not run Open EC firmware. Check for an ACPI method that
// only exists on Open EC to guard functionality specific to it.
data->has_open_ec = acpi_has_method(acpi_device_handle(data->acpi_dev), "NFAN");

err = system76_get(data, "INIT");
if (err)
return err;
Expand Down Expand Up @@ -717,6 +714,7 @@ static int system76_add(struct acpi_device *acpi_dev)
data->kb_led.max_brightness = 5;
data->kb_color = -1;
}

err = devm_led_classdev_register(&acpi_dev->dev, &data->kb_led);
if (err)
return err;
Expand All @@ -735,27 +733,32 @@ static int system76_add(struct acpi_device *acpi_dev)
if (err)
goto error;

err = system76_get_object(data, "NFAN", &data->nfan);
if (err)
goto error;
if (data->has_open_ec) {
err = system76_get_object(data, "NFAN", &data->nfan);
if (err)
goto error;

err = system76_get_object(data, "NTMP", &data->ntmp);
if (err)
goto error;
err = system76_get_object(data, "NTMP", &data->ntmp);
if (err)
goto error;
}

data->therm = devm_hwmon_device_register_with_info(&acpi_dev->dev,
"system76_acpi", data, &thermal_chip_info, NULL);
err = PTR_ERR_OR_ZERO(data->therm);
if (err)
goto error;

system76_battery_init();
if (data->has_open_ec)
system76_battery_init();

return 0;

error:
kfree(data->ntmp);
kfree(data->nfan);
if (data->has_open_ec) {
kfree(data->ntmp);
kfree(data->nfan);
}
return err;
}

Expand All @@ -766,14 +769,15 @@ static int system76_remove(struct acpi_device *acpi_dev)

data = acpi_driver_data(acpi_dev);

system76_battery_exit();
if (data->has_open_ec) {
system76_battery_exit();
kfree(data->nfan);
kfree(data->ntmp);
}

devm_led_classdev_unregister(&acpi_dev->dev, &data->ap_led);
devm_led_classdev_unregister(&acpi_dev->dev, &data->kb_led);

kfree(data->nfan);
kfree(data->ntmp);

system76_get(data, "FINI");

return 0;
Expand Down

0 comments on commit 04145b8

Please sign in to comment.