提交 b9783dce 编写于 作者: J Jean Delvare

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: NJean Delvare <khali@linux-fr.org>
Cc: Jim Cromie <jim.cromie@gmail.com>
Cc: stable@kernel.org
上级 df149d02
......@@ -1610,11 +1610,8 @@ static struct pc87360_data *pc87360_update_device(struct device *dev)
static int __init pc87360_device_add(unsigned short address)
{
struct resource res = {
.name = "pc87360",
.flags = IORESOURCE_IO,
};
int err, i;
struct resource res[3];
int err, i, res_count;
pdev = platform_device_alloc("pc87360", address);
if (!pdev) {
......@@ -1623,23 +1620,29 @@ static int __init pc87360_device_add(unsigned short address)
goto exit;
}
memset(res, 0, 3 * sizeof(struct resource));
res_count = 0;
for (i = 0; i < 3; i++) {
if (!extra_isa[i])
continue;
res.start = extra_isa[i];
res.end = extra_isa[i] + PC87360_EXTENT - 1;
res[res_count].start = extra_isa[i];
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)
goto exit_device_put;
err = platform_device_add_resources(pdev, &res, 1);
res_count++;
}
err = platform_device_add_resources(pdev, res, res_count);
if (err) {
printk(KERN_ERR "pc87360: Device resource[%d] "
"addition failed (%d)\n", i, err);
printk(KERN_ERR "pc87360: Device resources addition failed "
"(%d)\n", err);
goto exit_device_put;
}
}
err = platform_device_add(pdev);
if (err) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册