hwmon: (pc87360) Fix device resource declaration
It's not OK to call platform_device_add_resources() multiple times in a row. Despite its name, this functions sets the resources, it doesn't add them. So we have to prepare an array with all the resources, and then call platform_device_add_resources() once. Before this fix, only the last I/O resource would be actually registered. The other I/O resources were leaked. Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: Jim Cromie <jim.cromie@gmail.com> Cc: stable@kernel.org
This commit is contained in:
parent
df149d02ea
commit
b9783dcebe
|
@ -1610,11 +1610,8 @@ static struct pc87360_data *pc87360_update_device(struct device *dev)
|
||||||
|
|
||||||
static int __init pc87360_device_add(unsigned short address)
|
static int __init pc87360_device_add(unsigned short address)
|
||||||
{
|
{
|
||||||
struct resource res = {
|
struct resource res[3];
|
||||||
.name = "pc87360",
|
int err, i, res_count;
|
||||||
.flags = IORESOURCE_IO,
|
|
||||||
};
|
|
||||||
int err, i;
|
|
||||||
|
|
||||||
pdev = platform_device_alloc("pc87360", address);
|
pdev = platform_device_alloc("pc87360", address);
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
|
@ -1623,22 +1620,28 @@ static int __init pc87360_device_add(unsigned short address)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(res, 0, 3 * sizeof(struct resource));
|
||||||
|
res_count = 0;
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if (!extra_isa[i])
|
if (!extra_isa[i])
|
||||||
continue;
|
continue;
|
||||||
res.start = extra_isa[i];
|
res[res_count].start = extra_isa[i];
|
||||||
res.end = extra_isa[i] + PC87360_EXTENT - 1;
|
res[res_count].end = extra_isa[i] + PC87360_EXTENT - 1;
|
||||||
|
res[res_count].name = "pc87360",
|
||||||
|
res[res_count].flags = IORESOURCE_IO,
|
||||||
|
|
||||||
err = acpi_check_resource_conflict(&res);
|
err = acpi_check_resource_conflict(&res[res_count]);
|
||||||
if (err)
|
if (err)
|
||||||
goto exit_device_put;
|
goto exit_device_put;
|
||||||
|
|
||||||
err = platform_device_add_resources(pdev, &res, 1);
|
res_count++;
|
||||||
if (err) {
|
|
||||||
printk(KERN_ERR "pc87360: Device resource[%d] "
|
|
||||||
"addition failed (%d)\n", i, err);
|
|
||||||
goto exit_device_put;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = platform_device_add_resources(pdev, res, res_count);
|
||||||
|
if (err) {
|
||||||
|
printk(KERN_ERR "pc87360: Device resources addition failed "
|
||||||
|
"(%d)\n", err);
|
||||||
|
goto exit_device_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = platform_device_add(pdev);
|
err = platform_device_add(pdev);
|
||||||
|
|
Loading…
Reference in New Issue