Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8638d0af authored by Guenter Roeck's avatar Guenter Roeck
Browse files

hwmon: (it87) Convert to use new hwmon API



Convert to use devm_hwmon_device_register_with_groups to simplify
code and reduce code size. This also attaches sysfs attributes
to the hwmon device and no longer to the platform device.

Tested-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent d3766848
Loading
Loading
Loading
Loading
+19 −74
Original line number Original line Diff line number Diff line
@@ -458,7 +458,7 @@ struct it87_sio_data {
 * The structure is dynamically allocated.
 * The structure is dynamically allocated.
 */
 */
struct it87_data {
struct it87_data {
	struct device *hwmon_dev;
	const struct attribute_group *groups[7];
	enum chips type;
	enum chips type;
	u16 features;
	u16 features;
	u8 peci_mask;
	u8 peci_mask;
@@ -1739,14 +1739,6 @@ static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2);
/* AVCC3 */
/* AVCC3 */
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0);
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0);


static ssize_t show_name(struct device *dev, struct device_attribute
			 *devattr, char *buf)
{
	struct it87_data *data = dev_get_drvdata(dev);
	return sprintf(buf, "%s\n", data->name);
}
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);

static umode_t it87_in_is_visible(struct kobject *kobj,
static umode_t it87_in_is_visible(struct kobject *kobj,
				  struct attribute *attr, int index)
				  struct attribute *attr, int index)
{
{
@@ -1887,10 +1879,10 @@ static umode_t it87_is_visible(struct kobject *kobj,
	struct device *dev = container_of(kobj, struct device, kobj);
	struct device *dev = container_of(kobj, struct device, kobj);
	struct it87_data *data = dev_get_drvdata(dev);
	struct it87_data *data = dev_get_drvdata(dev);


	if ((index == 3 || index == 4) && !data->has_vid)
	if ((index == 2 || index == 3) && !data->has_vid)
		return 0;
		return 0;


	if (index > 4 && !(data->in_internal & (1 << (index - 5))))
	if (index > 3 && !(data->in_internal & (1 << (index - 4))))
		return 0;
		return 0;


	return attr->mode;
	return attr->mode;
@@ -1899,10 +1891,9 @@ static umode_t it87_is_visible(struct kobject *kobj,
static struct attribute *it87_attributes[] = {
static struct attribute *it87_attributes[] = {
	&dev_attr_alarms.attr,
	&dev_attr_alarms.attr,
	&sensor_dev_attr_intrusion0_alarm.dev_attr.attr,
	&sensor_dev_attr_intrusion0_alarm.dev_attr.attr,
	&dev_attr_name.attr,
	&dev_attr_vrm.attr,				/* 2 */
	&dev_attr_vrm.attr,				/* 3 */
	&dev_attr_cpu0_vid.attr,			/* 3 */
	&dev_attr_cpu0_vid.attr,			/* 4 */
	&sensor_dev_attr_in3_label.dev_attr.attr,	/* 4 .. 7 */
	&sensor_dev_attr_in3_label.dev_attr.attr,	/* 5 .. 8 */
	&sensor_dev_attr_in7_label.dev_attr.attr,
	&sensor_dev_attr_in7_label.dev_attr.attr,
	&sensor_dev_attr_in8_label.dev_attr.attr,
	&sensor_dev_attr_in8_label.dev_attr.attr,
	&sensor_dev_attr_in9_label.dev_attr.attr,
	&sensor_dev_attr_in9_label.dev_attr.attr,
@@ -2460,16 +2451,6 @@ static int __init it87_find(int sioaddr, unsigned short *address,
	return err;
	return err;
}
}


static void it87_remove_files(struct device *dev)
{
	sysfs_remove_group(&dev->kobj, &it87_group);
	sysfs_remove_group(&dev->kobj, &it87_group_in);
	sysfs_remove_group(&dev->kobj, &it87_group_temp);
	sysfs_remove_group(&dev->kobj, &it87_group_fan);
	sysfs_remove_group(&dev->kobj, &it87_group_pwm);
	sysfs_remove_group(&dev->kobj, &it87_group_auto_pwm);
}

/* Called when we have found a new IT87. */
/* Called when we have found a new IT87. */
static void it87_init_device(struct platform_device *pdev)
static void it87_init_device(struct platform_device *pdev)
{
{
@@ -2646,7 +2627,7 @@ static int it87_probe(struct platform_device *pdev)
	struct device *dev = &pdev->dev;
	struct device *dev = &pdev->dev;
	struct it87_sio_data *sio_data = dev_get_platdata(dev);
	struct it87_sio_data *sio_data = dev_get_platdata(dev);
	int enable_pwm_interface;
	int enable_pwm_interface;
	int err = 0;
	struct device *hwmon_dev;


	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
	if (!devm_request_region(&pdev->dev, res->start, IT87_EC_EXTENT,
	if (!devm_request_region(&pdev->dev, res->start, IT87_EC_EXTENT,
@@ -2666,7 +2647,6 @@ static int it87_probe(struct platform_device *pdev)
	data->features = it87_devices[sio_data->type].features;
	data->features = it87_devices[sio_data->type].features;
	data->peci_mask = it87_devices[sio_data->type].peci_mask;
	data->peci_mask = it87_devices[sio_data->type].peci_mask;
	data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
	data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
	data->name = it87_devices[sio_data->type].name;
	/*
	/*
	 * IT8705F Datasheet 0.4.1, 3h == Version G.
	 * IT8705F Datasheet 0.4.1, 3h == Version G.
	 * IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
	 * IT8712F Datasheet 0.9.1, section 8.3.5 indicates 8h == Version J.
@@ -2742,59 +2722,25 @@ static int it87_probe(struct platform_device *pdev)
		data->vid = sio_data->vid_value;
		data->vid = sio_data->vid_value;
	}
	}


	/* Register sysfs hooks */
	/* Prepare for sysfs hooks */
	err = sysfs_create_group(&dev->kobj, &it87_group);
	data->groups[0] = &it87_group;
	if (err)
	data->groups[1] = &it87_group_in;
		return err;
	data->groups[2] = &it87_group_temp;

	data->groups[3] = &it87_group_fan;
	err = sysfs_create_group(&dev->kobj, &it87_group_in);
	if (err)
		goto error;

	err = sysfs_create_group(&dev->kobj, &it87_group_temp);
	if (err)
		goto error;

	err = sysfs_create_group(&dev->kobj, &it87_group_fan);
	if (err)
		goto error;


	if (enable_pwm_interface) {
	if (enable_pwm_interface) {
		data->has_pwm = (1 << ARRAY_SIZE(IT87_REG_PWM)) - 1;
		data->has_pwm = (1 << ARRAY_SIZE(IT87_REG_PWM)) - 1;
		data->has_pwm &= ~sio_data->skip_pwm;
		data->has_pwm &= ~sio_data->skip_pwm;


		err = sysfs_create_group(&dev->kobj, &it87_group_pwm);
		data->groups[4] = &it87_group_pwm;
		if (err)
		if (has_old_autopwm(data))
			goto error;
			data->groups[5] = &it87_group_auto_pwm;
		if (has_old_autopwm(data)) {
			err = sysfs_create_group(&dev->kobj,
						 &it87_group_auto_pwm);
			if (err)
				goto error;
		}
	}

	data->hwmon_dev = hwmon_device_register(dev);
	if (IS_ERR(data->hwmon_dev)) {
		err = PTR_ERR(data->hwmon_dev);
		goto error;
	}

	return 0;

error:
	it87_remove_files(dev);
	return err;
	}
	}


static int it87_remove(struct platform_device *pdev)
	hwmon_dev = devm_hwmon_device_register_with_groups(dev,
{
					it87_devices[sio_data->type].name,
	struct it87_data *data = platform_get_drvdata(pdev);
					data, data->groups);

	return PTR_ERR_OR_ZERO(hwmon_dev);
	hwmon_device_unregister(data->hwmon_dev);
	it87_remove_files(&pdev->dev);

	return 0;
}
}


static struct platform_driver it87_driver = {
static struct platform_driver it87_driver = {
@@ -2802,7 +2748,6 @@ static struct platform_driver it87_driver = {
		.name	= DRVNAME,
		.name	= DRVNAME,
	},
	},
	.probe	= it87_probe,
	.probe	= it87_probe,
	.remove	= it87_remove,
};
};


static int __init it87_device_add(int index, unsigned short address,
static int __init it87_device_add(int index, unsigned short address,