hwmon: (it87) Add DMI table for future extensions

Add in DMI matching table to match various board quirks and settings.
This will be useful for future extentions, but will start with the
existing definition of the Shuttle SN68PT.

Signed-off-by: Frank Crawford <frank@crawford.emu.id.au>
Link: https://lore.kernel.org/r/20221105232531.1619387-1-frank@crawford.emu.id.au
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Frank Crawford 2022-11-06 10:25:32 +11:00 committed by Guenter Roeck
parent 25f986887d
commit a1bedbcc1c

View File

@ -567,6 +567,14 @@ struct it87_data {
s8 auto_temp[NUM_AUTO_PWM][5]; /* [nr][0] is point1_temp_hyst */ s8 auto_temp[NUM_AUTO_PWM][5]; /* [nr][0] is point1_temp_hyst */
}; };
/* Board specific settings from DMI matching */
struct it87_dmi_data {
u8 skip_pwm; /* pwm channels to skip for this board */
};
/* Global for results from DMI matching, if needed */
static struct it87_dmi_data *dmi_data;
static int adc_lsb(const struct it87_data *data, int nr) static int adc_lsb(const struct it87_data *data, int nr)
{ {
int lsb; int lsb;
@ -2393,7 +2401,6 @@ static int __init it87_find(int sioaddr, unsigned short *address,
{ {
int err; int err;
u16 chip_type; u16 chip_type;
const char *board_vendor, *board_name;
const struct it87_devices *config; const struct it87_devices *config;
err = superio_enter(sioaddr); err = superio_enter(sioaddr);
@ -2812,24 +2819,9 @@ static int __init it87_find(int sioaddr, unsigned short *address,
if (sio_data->beep_pin) if (sio_data->beep_pin)
pr_info("Beeping is supported\n"); pr_info("Beeping is supported\n");
/* Disable specific features based on DMI strings */ /* Set values based on DMI matches */
board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); if (dmi_data)
board_name = dmi_get_system_info(DMI_BOARD_NAME); sio_data->skip_pwm |= dmi_data->skip_pwm;
if (board_vendor && board_name) {
if (strcmp(board_vendor, "nVIDIA") == 0 &&
strcmp(board_name, "FN68PT") == 0) {
/*
* On the Shuttle SN68PT, FAN_CTL2 is apparently not
* connected to a fan, but to something else. One user
* has reported instant system power-off when changing
* the PWM2 duty cycle, so we disable it.
* I use the board name string as the trigger in case
* the same board is ever used in other systems.
*/
pr_info("Disabling pwm2 due to hardware constraints\n");
sio_data->skip_pwm = BIT(1);
}
}
exit: exit:
superio_exit(sioaddr); superio_exit(sioaddr);
@ -3307,6 +3299,46 @@ exit_device_put:
return err; return err;
} }
/* callback function for DMI */
static int it87_dmi_cb(const struct dmi_system_id *dmi_entry)
{
dmi_data = dmi_entry->driver_data;
if (dmi_data && dmi_data->skip_pwm)
pr_info("Disabling pwm2 due to hardware constraints\n");
return 1;
}
/*
* On the Shuttle SN68PT, FAN_CTL2 is apparently not
* connected to a fan, but to something else. One user
* has reported instant system power-off when changing
* the PWM2 duty cycle, so we disable it.
* I use the board name string as the trigger in case
* the same board is ever used in other systems.
*/
static struct it87_dmi_data nvidia_fn68pt = {
.skip_pwm = BIT(1),
};
#define IT87_DMI_MATCH_VND(vendor, name, cb, data) \
{ \
.callback = cb, \
.matches = { \
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, vendor), \
DMI_EXACT_MATCH(DMI_BOARD_NAME, name), \
}, \
.driver_data = data, \
}
static const struct dmi_system_id it87_dmi_table[] __initconst = {
IT87_DMI_MATCH_VND("nVIDIA", "FN68PT", it87_dmi_cb, &nvidia_fn68pt),
{ }
};
MODULE_DEVICE_TABLE(dmi, it87_dmi_table);
static int __init sm_it87_init(void) static int __init sm_it87_init(void)
{ {
int sioaddr[2] = { REG_2E, REG_4E }; int sioaddr[2] = { REG_2E, REG_4E };
@ -3319,6 +3351,8 @@ static int __init sm_it87_init(void)
if (err) if (err)
return err; return err;
dmi_check_system(it87_dmi_table);
for (i = 0; i < ARRAY_SIZE(sioaddr); i++) { for (i = 0; i < ARRAY_SIZE(sioaddr); i++) {
memset(&sio_data, 0, sizeof(struct it87_sio_data)); memset(&sio_data, 0, sizeof(struct it87_sio_data));
isa_address[i] = 0; isa_address[i] = 0;