Skip to content

Commit 7949af4

Browse files
committed
hwmon: macsmc: Avoid global writable hwmon_chip_info
Should be squashed into "hwmon: add macsmc-hwmon driver" Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 3f0da76 commit 7949af4

1 file changed

Lines changed: 44 additions & 62 deletions

File tree

drivers/hwmon/macsmc-hwmon.c

Lines changed: 44 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,13 @@ struct macsmc_hwmon_fan {
4646
};
4747

4848
struct macsmc_hwmon_sensors {
49+
struct hwmon_channel_info channel_info;
4950
struct macsmc_hwmon_sensor *sensors;
5051
u32 n_sensors;
5152
};
5253

5354
struct macsmc_hwmon_fans {
55+
struct hwmon_channel_info channel_info;
5456
struct macsmc_hwmon_fan *fans;
5557
u32 n_fans;
5658
};
@@ -59,8 +61,9 @@ struct macsmc_hwmon {
5961
struct device *dev;
6062
struct apple_smc *smc;
6163
struct device *hwmon_dev;
64+
struct hwmon_chip_info chip_info;
6265
/* Chip + sensor types + NULL */
63-
struct hwmon_channel_info channel_infos[1 + NUM_SENSOR_TYPES + 1];
66+
const struct hwmon_channel_info *channel_infos[1 + NUM_SENSOR_TYPES + 1];
6467
struct macsmc_hwmon_sensors temp;
6568
struct macsmc_hwmon_sensors volt;
6669
struct macsmc_hwmon_sensors curr;
@@ -226,11 +229,6 @@ static const struct hwmon_ops macsmc_hwmon_ops = {
226229
.write = macsmc_hwmon_write,
227230
};
228231

229-
static struct hwmon_chip_info macsmc_hwmon_info = {
230-
.ops = &macsmc_hwmon_ops,
231-
.info = NULL, /* see macsmc_hwmon_create_infos */
232-
};
233-
234232
/*
235233
* Get the key metadata, including key data type, from the SMC.
236234
*/
@@ -450,99 +448,89 @@ static void macsmc_hwmon_populate_fan_configs(u32 *configs,
450448
configs[idx + 1] = 0;
451449
}
452450

453-
static int macsmc_hwmon_create_infos(struct macsmc_hwmon *hwmon,
454-
struct hwmon_channel_info **info_list)
451+
static const struct hwmon_channel_info * const macsmc_chip_channel_info =
452+
HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ);
453+
454+
static int macsmc_hwmon_create_infos(struct macsmc_hwmon *hwmon)
455455
{
456456
int i = 0;
457+
struct hwmon_channel_info *channel_info;
457458

458459
/* chip */
459-
hwmon->channel_infos[i].type = hwmon_chip;
460-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev, sizeof(u32) * 2,
461-
GFP_KERNEL);
462-
if (!hwmon->channel_infos[i].config)
463-
return -ENOMEM;
464-
macsmc_hwmon_populate_configs((u32 *)hwmon->channel_infos[i].config, 1,
465-
HWMON_C_REGISTER_TZ);
466-
info_list[i] = &hwmon->channel_infos[i];
460+
hwmon->channel_infos[i++] = macsmc_chip_channel_info;
467461

468462
if (hwmon->temp.n_sensors) {
469-
i++;
470-
hwmon->channel_infos[i].type = hwmon_temp;
471-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev,
463+
channel_info = &hwmon->temp.channel_info;
464+
channel_info->type = hwmon_temp;
465+
channel_info->config = devm_kzalloc(hwmon->dev,
472466
sizeof(u32) * hwmon->temp.n_sensors + 1,
473467
GFP_KERNEL);
474-
if (!hwmon->channel_infos[i].config)
468+
if (!channel_info->config)
475469
return -ENOMEM;
476470

477-
macsmc_hwmon_populate_configs((u32 *)hwmon->channel_infos[i].config,
471+
macsmc_hwmon_populate_configs((u32 *)channel_info->config,
478472
hwmon->temp.n_sensors,
479473
(HWMON_T_INPUT | HWMON_T_LABEL));
480-
481-
info_list[i] = &hwmon->channel_infos[i];
482-
474+
hwmon->channel_infos[i++] = channel_info;
483475
}
484476

485477
if (hwmon->volt.n_sensors) {
486-
i++;
487-
hwmon->channel_infos[i].type = hwmon_in;
488-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev,
478+
channel_info = &hwmon->volt.channel_info;
479+
channel_info->type = hwmon_in;
480+
channel_info->config = devm_kzalloc(hwmon->dev,
489481
sizeof(u32) * hwmon->volt.n_sensors + 1,
490482
GFP_KERNEL);
491-
if (!hwmon->channel_infos[i].config)
483+
if (!channel_info->config)
492484
return -ENOMEM;
493485

494-
macsmc_hwmon_populate_configs((u32 *)hwmon->channel_infos[i].config,
486+
macsmc_hwmon_populate_configs((u32 *)channel_info->config,
495487
hwmon->volt.n_sensors,
496488
(HWMON_I_INPUT | HWMON_I_LABEL));
497-
498-
info_list[i] = &hwmon->channel_infos[i];
489+
hwmon->channel_infos[i++] = channel_info;
499490
}
500491

501492
if (hwmon->curr.n_sensors) {
502-
i++;
503-
hwmon->channel_infos[i].type = hwmon_curr;
504-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev,
493+
channel_info = &hwmon->curr.channel_info;
494+
channel_info->type = hwmon_curr;
495+
channel_info->config = devm_kzalloc(hwmon->dev,
505496
sizeof(u32) * hwmon->curr.n_sensors + 1,
506497
GFP_KERNEL);
507-
if (!hwmon->channel_infos[i].config)
498+
if (!channel_info->config)
508499
return -ENOMEM;
509500

510-
macsmc_hwmon_populate_configs((u32 *)hwmon->channel_infos[i].config,
501+
macsmc_hwmon_populate_configs((u32 *)channel_info->config,
511502
hwmon->curr.n_sensors,
512503
(HWMON_C_INPUT | HWMON_C_LABEL));
513-
514-
info_list[i] = &hwmon->channel_infos[i];
504+
hwmon->channel_infos[i++] = channel_info;
515505
}
516506

517507
if (hwmon->power.n_sensors) {
518-
i++;
519-
hwmon->channel_infos[i].type = hwmon_power;
520-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev,
508+
channel_info = &hwmon->power.channel_info;
509+
channel_info->type = hwmon_power;
510+
channel_info->config = devm_kzalloc(hwmon->dev,
521511
sizeof(u32) * hwmon->power.n_sensors + 1,
522512
GFP_KERNEL);
523-
if (!hwmon->channel_infos[i].config)
513+
if (!channel_info->config)
524514
return -ENOMEM;
525515

526-
macsmc_hwmon_populate_configs((u32 *)hwmon->channel_infos[i].config,
516+
macsmc_hwmon_populate_configs((u32 *)channel_info->config,
527517
hwmon->power.n_sensors,
528518
(HWMON_P_INPUT | HWMON_P_LABEL));
529-
530-
info_list[i] = &hwmon->channel_infos[i];
519+
hwmon->channel_infos[i++] = channel_info;
531520
}
532521

533522
if (hwmon->fan.n_fans) {
534-
i++;
535-
hwmon->channel_infos[i].type = hwmon_fan;
536-
hwmon->channel_infos[i].config = devm_kzalloc(hwmon->dev,
523+
channel_info = &hwmon->fan.channel_info;
524+
channel_info->type = hwmon_fan;
525+
channel_info->config = devm_kzalloc(hwmon->dev,
537526
sizeof(u32) * hwmon->fan.n_fans + 1,
538527
GFP_KERNEL);
539-
if (!hwmon->channel_infos[i].config)
528+
if (!channel_info->config)
540529
return -ENOMEM;
541530

542-
macsmc_hwmon_populate_fan_configs((u32 *)hwmon->channel_infos[i].config,
531+
macsmc_hwmon_populate_fan_configs((u32 *)channel_info->config,
543532
hwmon->fan.n_fans, &hwmon->fan);
544-
545-
info_list[i] = &hwmon->channel_infos[i];
533+
hwmon->channel_infos[i++] = channel_info;
546534
}
547535

548536
return 0;
@@ -553,7 +541,6 @@ static int macsmc_hwmon_probe(struct platform_device *pdev)
553541
struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent);
554542
struct macsmc_hwmon *hwmon;
555543
struct device_node *hwmon_node;
556-
struct hwmon_channel_info **macsmc_chip_info = NULL;
557544
int ret = 0;
558545

559546
hwmon = devm_kzalloc(&pdev->dev, sizeof(struct macsmc_hwmon), GFP_KERNEL);
@@ -582,21 +569,16 @@ static int macsmc_hwmon_probe(struct platform_device *pdev)
582569
return -ENODEV;
583570
}
584571

585-
macsmc_chip_info = devm_kzalloc(hwmon->dev,
586-
sizeof(struct hwmon_channel_info *) * (1 + NUM_SENSOR_TYPES + 1),
587-
GFP_KERNEL);
588-
if (!macsmc_chip_info)
589-
return -ENOMEM;
590-
591-
ret = macsmc_hwmon_create_infos(hwmon, macsmc_chip_info);
572+
ret = macsmc_hwmon_create_infos(hwmon);
592573
if (ret)
593574
return ret;
594575

595-
macsmc_hwmon_info.info = (const struct hwmon_channel_info **)macsmc_chip_info;
576+
hwmon->chip_info.ops = &macsmc_hwmon_ops;
577+
hwmon->chip_info.info = (const struct hwmon_channel_info *const *)&hwmon->channel_infos;
596578

597579
hwmon->hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
598580
"macsmc_hwmon", hwmon,
599-
&macsmc_hwmon_info, NULL);
581+
&hwmon->chip_info, NULL);
600582
if (IS_ERR(hwmon->hwmon_dev))
601583
return dev_err_probe(hwmon->dev, PTR_ERR(hwmon->hwmon_dev),
602584
"Probing SMC hwmon device failed!\n");

0 commit comments

Comments
 (0)