drm/nouveau/iccsense: convert to linked list

v2: add list_del calls

Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
Reviewed-by: Martin Peres <martin.peres@free.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Karol Herbst 2016-03-28 14:24:30 +02:00 committed by Ben Skeggs
parent d03e0f2748
commit 92224e751f
4 changed files with 19 additions and 22 deletions

View file

@ -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 **);

View file

@ -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)

View file

@ -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;
}

View file

@ -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;