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

Commit 92224e75 authored by Karol Herbst's avatar Karol Herbst Committed by Ben Skeggs
Browse files

drm/nouveau/iccsense: convert to linked list



v2: add list_del calls

Signed-off-by: default avatarKarol Herbst <nouveau@karolherbst.de>
Reviewed-by: default avatarMartin Peres <martin.peres@free.fr>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d03e0f27
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -3,12 +3,10 @@

#include <core/subdev.h>

struct nkvm_iccsense_rail;
struct nvkm_iccsense {
	struct nvkm_subdev subdev;
	u8 rail_count;
	bool data_valid;
	struct nvkm_iccsense_rail *rails;
	struct list_head rails;
};

int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **);
+1 −1
Original line number Diff line number Diff line
@@ -689,7 +689,7 @@ nouveau_hwmon_init(struct drm_device *dev)
			goto error;
	}

	if (iccsense && iccsense->data_valid && iccsense->rail_count) {
	if (iccsense && iccsense->data_valid && !list_empty(&iccsense->rails)) {
		ret = sysfs_create_group(&hwmon_dev->kobj,
					 &hwmon_power_attrgroup);
		if (ret)
+16 −18
Original line number Diff line number Diff line
@@ -98,25 +98,21 @@ nvkm_iccsense_ina3221_read(struct nvkm_iccsense *iccsense,
int
nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense)
{
	int result = 0, i;
	int result = 0;
	struct nvkm_iccsense_rail *rail;

	if (!iccsense)
		return -EINVAL;

	if (iccsense->rail_count == 0)
		return -ENODEV;

	for (i = 0; i < iccsense->rail_count; ++i) {
	list_for_each_entry(rail, &iccsense->rails, head) {
		int res;
		struct nvkm_iccsense_rail *rail = &iccsense->rails[i];
		if (!rail->read)
			return -ENODEV;

		res = rail->read(iccsense, rail);
		if (res >= 0)
			result += res;
		else
		if (res < 0)
			return res;
		result += res;
	}
	return result;
}
@@ -125,9 +121,12 @@ static void *
nvkm_iccsense_dtor(struct nvkm_subdev *subdev)
{
	struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
	struct nvkm_iccsense_rail *rail, *tmp;

	if (iccsense->rails)
		kfree(iccsense->rails);
	list_for_each_entry_safe(rail, tmp, &iccsense->rails, head) {
		list_del(&rail->head);
		kfree(rail);
	}

	return iccsense;
}
@@ -145,11 +144,6 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
	    || !stbl.nr_entry)
		return 0;

	iccsense->rails = kmalloc(sizeof(*iccsense->rails) * stbl.nr_entry,
	                          GFP_KERNEL);
	if (!iccsense->rails)
		return -ENOMEM;

	iccsense->data_valid = true;
	for (i = 0; i < stbl.nr_entry; ++i) {
		struct pwr_rail_t *r = &stbl.rail[i];
@@ -184,7 +178,10 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
			continue;
		}

		rail = &iccsense->rails[iccsense->rail_count];
		rail = kmalloc(sizeof(*rail), GFP_KERNEL);
		if (!rail)
			return -ENOMEM;

		switch (extdev.type) {
		case NVBIOS_EXTDEV_INA209:
			rail->read = nvkm_iccsense_ina209_read;
@@ -201,7 +198,7 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
		rail->rail = r->rail;
		rail->mohm = r->resistor_mohm;
		rail->i2c = &i2c_bus->i2c;
		++iccsense->rail_count;
		list_add_tail(&rail->head, &iccsense->rails);
	}
	return 0;
}
@@ -224,6 +221,7 @@ nvkm_iccsense_new_(struct nvkm_device *device, int index,
{
	if (!(*iccsense = kzalloc(sizeof(**iccsense), GFP_KERNEL)))
		return -ENOMEM;
	INIT_LIST_HEAD(&(*iccsense)->rails);
	nvkm_iccsense_ctor(device, index, *iccsense);
	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
#include <subdev/iccsense.h>

struct nvkm_iccsense_rail {
	struct list_head head;
	int (*read)(struct nvkm_iccsense *, struct nvkm_iccsense_rail *);
	struct i2c_adapter *i2c;
	u8 addr;