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

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
...@@ -3,12 +3,10 @@ ...@@ -3,12 +3,10 @@
#include <core/subdev.h> #include <core/subdev.h>
struct nkvm_iccsense_rail;
struct nvkm_iccsense { struct nvkm_iccsense {
struct nvkm_subdev subdev; struct nvkm_subdev subdev;
u8 rail_count;
bool data_valid; bool data_valid;
struct nvkm_iccsense_rail *rails; struct list_head rails;
}; };
int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **); int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **);
......
...@@ -689,7 +689,7 @@ nouveau_hwmon_init(struct drm_device *dev) ...@@ -689,7 +689,7 @@ nouveau_hwmon_init(struct drm_device *dev)
goto error; 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, ret = sysfs_create_group(&hwmon_dev->kobj,
&hwmon_power_attrgroup); &hwmon_power_attrgroup);
if (ret) if (ret)
......
...@@ -98,25 +98,21 @@ nvkm_iccsense_ina3221_read(struct nvkm_iccsense *iccsense, ...@@ -98,25 +98,21 @@ nvkm_iccsense_ina3221_read(struct nvkm_iccsense *iccsense,
int int
nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense) nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense)
{ {
int result = 0, i; int result = 0;
struct nvkm_iccsense_rail *rail;
if (!iccsense) if (!iccsense)
return -EINVAL; return -EINVAL;
if (iccsense->rail_count == 0) list_for_each_entry(rail, &iccsense->rails, head) {
return -ENODEV;
for (i = 0; i < iccsense->rail_count; ++i) {
int res; int res;
struct nvkm_iccsense_rail *rail = &iccsense->rails[i];
if (!rail->read) if (!rail->read)
return -ENODEV; return -ENODEV;
res = rail->read(iccsense, rail); res = rail->read(iccsense, rail);
if (res >= 0) if (res < 0)
result += res;
else
return res; return res;
result += res;
} }
return result; return result;
} }
...@@ -125,9 +121,12 @@ static void * ...@@ -125,9 +121,12 @@ static void *
nvkm_iccsense_dtor(struct nvkm_subdev *subdev) nvkm_iccsense_dtor(struct nvkm_subdev *subdev)
{ {
struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev); struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
struct nvkm_iccsense_rail *rail, *tmp;
if (iccsense->rails) list_for_each_entry_safe(rail, tmp, &iccsense->rails, head) {
kfree(iccsense->rails); list_del(&rail->head);
kfree(rail);
}
return iccsense; return iccsense;
} }
...@@ -145,11 +144,6 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev) ...@@ -145,11 +144,6 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
|| !stbl.nr_entry) || !stbl.nr_entry)
return 0; return 0;
iccsense->rails = kmalloc(sizeof(*iccsense->rails) * stbl.nr_entry,
GFP_KERNEL);
if (!iccsense->rails)
return -ENOMEM;
iccsense->data_valid = true; iccsense->data_valid = true;
for (i = 0; i < stbl.nr_entry; ++i) { for (i = 0; i < stbl.nr_entry; ++i) {
struct pwr_rail_t *r = &stbl.rail[i]; struct pwr_rail_t *r = &stbl.rail[i];
...@@ -184,7 +178,10 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev) ...@@ -184,7 +178,10 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
continue; continue;
} }
rail = &iccsense->rails[iccsense->rail_count]; rail = kmalloc(sizeof(*rail), GFP_KERNEL);
if (!rail)
return -ENOMEM;
switch (extdev.type) { switch (extdev.type) {
case NVBIOS_EXTDEV_INA209: case NVBIOS_EXTDEV_INA209:
rail->read = nvkm_iccsense_ina209_read; rail->read = nvkm_iccsense_ina209_read;
...@@ -201,7 +198,7 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev) ...@@ -201,7 +198,7 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
rail->rail = r->rail; rail->rail = r->rail;
rail->mohm = r->resistor_mohm; rail->mohm = r->resistor_mohm;
rail->i2c = &i2c_bus->i2c; rail->i2c = &i2c_bus->i2c;
++iccsense->rail_count; list_add_tail(&rail->head, &iccsense->rails);
} }
return 0; return 0;
} }
...@@ -224,6 +221,7 @@ nvkm_iccsense_new_(struct nvkm_device *device, int index, ...@@ -224,6 +221,7 @@ nvkm_iccsense_new_(struct nvkm_device *device, int index,
{ {
if (!(*iccsense = kzalloc(sizeof(**iccsense), GFP_KERNEL))) if (!(*iccsense = kzalloc(sizeof(**iccsense), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
INIT_LIST_HEAD(&(*iccsense)->rails);
nvkm_iccsense_ctor(device, index, *iccsense); nvkm_iccsense_ctor(device, index, *iccsense);
return 0; return 0;
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <subdev/iccsense.h> #include <subdev/iccsense.h>
struct nvkm_iccsense_rail { struct nvkm_iccsense_rail {
struct list_head head;
int (*read)(struct nvkm_iccsense *, struct nvkm_iccsense_rail *); int (*read)(struct nvkm_iccsense *, struct nvkm_iccsense_rail *);
struct i2c_adapter *i2c; struct i2c_adapter *i2c;
u8 addr; u8 addr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment