Skip to content

Commit

Permalink
platform/x86/drivers/acerhdf: Check the interval value when it is set
Browse files Browse the repository at this point in the history
Currently the code checks the interval value when the temperature is
read which is bad for two reasons:

 - checking and setting the interval in the get_temp callback is
   inaccurate and awful, that can be done when changing the value.

 - Changing the thermal zone structure internals is an abuse of the
   exported structure, moreover no lock is taken here.

The goal of this patch is to solve the first item by using the 'set'
function called when changing the interval. The check is done there
and removed from the get_temp function. If the thermal zone was not
initialized yet, the interval is not updated in this case as that will
happen in the init function when registering the thermal zone device.

I don't have any hardware to test the changes.

Signed-off-by: Daniel Lezcano <[email protected]>
Acked-by: Peter Kaestle <[email protected]>
Acked-by: Hans de Goede <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
dlezcano committed Dec 7, 2020
1 parent a65181c commit f34a32f
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions drivers/platform/x86/acerhdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,10 @@ static void acerhdf_check_param(struct thermal_zone_device *thermal)
}
if (verbose)
pr_notice("interval changed to: %d\n", interval);
thermal->polling_delay = interval*1000;

if (thermal)
thermal->polling_delay = interval*1000;

prev_interval = interval;
}
}
Expand All @@ -349,8 +352,6 @@ static int acerhdf_get_ec_temp(struct thermal_zone_device *thermal, int *t)
{
int temp, err = 0;

acerhdf_check_param(thermal);

err = acerhdf_get_temp(&temp);
if (err)
return err;
Expand Down Expand Up @@ -823,8 +824,21 @@ MODULE_ALIAS("dmi:*:*Acer*:pnExtensa*5420*:");
module_init(acerhdf_init);
module_exit(acerhdf_exit);

static int interval_set_uint(const char *val, const struct kernel_param *kp)
{
int ret;

ret = param_set_uint(val, kp);
if (ret)
return ret;

acerhdf_check_param(thz_dev);

return 0;
}

static const struct kernel_param_ops interval_ops = {
.set = param_set_uint,
.set = interval_set_uint,
.get = param_get_uint,
};

Expand Down

0 comments on commit f34a32f

Please sign in to comment.