Commit 4aedcd4a authored by Neil Armstrong's avatar Neil Armstrong Committed by Lee Jones

mfd: rk8xx: fixup devices registration with PLATFORM_DEVID_AUTO

Since commit 210f418f ("mfd: rk8xx: Add rk806 support"), devices are
registered with "0" as id, causing devices to not have an automatic device id
and prevents having multiple RK8xx PMICs on the same system.

Properly pass PLATFORM_DEVID_AUTO to devm_mfd_add_devices() and since
it will ignore the cells .id with this special value, also cleanup
by removing all now ignored cells .id values.

Now we have the same behaviour as before rk806 introduction and rk806
retains the intended behavior.

This fixes a regression while booting the Odroid Go Ultra on v6.6.1:
sysfs: cannot create duplicate filename '/bus/platform/devices/rk808-clkout'
CPU: 3 PID: 97 Comm: kworker/u12:2 Not tainted 6.6.1 #1
Hardware name: Hardkernel ODROID-GO-Ultra (DT)
Workqueue: events_unbound deferred_probe_work_func
Call trace:
dump_backtrace+0x9c/0x11c
show_stack+0x18/0x24
dump_stack_lvl+0x78/0xc4
dump_stack+0x18/0x24
sysfs_warn_dup+0x64/0x80
sysfs_do_create_link_sd+0xf0/0xf8
sysfs_create_link+0x20/0x40
bus_add_device+0x114/0x160
device_add+0x3f0/0x7cc
platform_device_add+0x180/0x270
mfd_add_device+0x390/0x4a8
devm_mfd_add_devices+0xb0/0x150
rk8xx_probe+0x26c/0x410
rk8xx_i2c_probe+0x64/0x98
i2c_device_probe+0x104/0x2e8
really_probe+0x184/0x3c8
__driver_probe_device+0x7c/0x16c
driver_probe_device+0x3c/0x10c
__device_attach_driver+0xbc/0x158
bus_for_each_drv+0x80/0xdc
__device_attach+0x9c/0x1ac
device_initial_probe+0x14/0x20
bus_probe_device+0xac/0xb0
deferred_probe_work_func+0xa0/0xf4
process_one_work+0x1bc/0x378
worker_thread+0x1dc/0x3d4
kthread+0x104/0x118
ret_from_fork+0x10/0x20
rk8xx-i2c 0-001c: error -EEXIST: failed to add MFD devices
rk8xx-i2c: probe of 0-001c failed with error -17

Fixes: 210f418f ("mfd: rk8xx: Add rk806 support")
Reported-by: default avatarAdam Green <greena88@gmail.com>
Signed-off-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
Link: https://lore.kernel.org/r/20231116-topic-amlogic-upstream-fix-rk8xx-devid-auto-v2-1-3f1bad68ab9d@linaro.orgSigned-off-by: default avatarLee Jones <lee@kernel.org>
parent 92827c10
...@@ -53,76 +53,68 @@ static const struct resource rk817_charger_resources[] = { ...@@ -53,76 +53,68 @@ static const struct resource rk817_charger_resources[] = {
}; };
static const struct mfd_cell rk805s[] = { static const struct mfd_cell rk805s[] = {
{ .name = "rk808-clkout", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-clkout", },
{ .name = "rk808-regulator", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-regulator", },
{ .name = "rk805-pinctrl", .id = PLATFORM_DEVID_NONE, }, { .name = "rk805-pinctrl", },
{ {
.name = "rk808-rtc", .name = "rk808-rtc",
.num_resources = ARRAY_SIZE(rtc_resources), .num_resources = ARRAY_SIZE(rtc_resources),
.resources = &rtc_resources[0], .resources = &rtc_resources[0],
.id = PLATFORM_DEVID_NONE,
}, },
{ .name = "rk805-pwrkey", { .name = "rk805-pwrkey",
.num_resources = ARRAY_SIZE(rk805_key_resources), .num_resources = ARRAY_SIZE(rk805_key_resources),
.resources = &rk805_key_resources[0], .resources = &rk805_key_resources[0],
.id = PLATFORM_DEVID_NONE,
}, },
}; };
static const struct mfd_cell rk806s[] = { static const struct mfd_cell rk806s[] = {
{ .name = "rk805-pinctrl", .id = PLATFORM_DEVID_AUTO, }, { .name = "rk805-pinctrl", },
{ .name = "rk808-regulator", .id = PLATFORM_DEVID_AUTO, }, { .name = "rk808-regulator", },
{ {
.name = "rk805-pwrkey", .name = "rk805-pwrkey",
.resources = rk806_pwrkey_resources, .resources = rk806_pwrkey_resources,
.num_resources = ARRAY_SIZE(rk806_pwrkey_resources), .num_resources = ARRAY_SIZE(rk806_pwrkey_resources),
.id = PLATFORM_DEVID_AUTO,
}, },
}; };
static const struct mfd_cell rk808s[] = { static const struct mfd_cell rk808s[] = {
{ .name = "rk808-clkout", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-clkout", },
{ .name = "rk808-regulator", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-regulator", },
{ {
.name = "rk808-rtc", .name = "rk808-rtc",
.num_resources = ARRAY_SIZE(rtc_resources), .num_resources = ARRAY_SIZE(rtc_resources),
.resources = rtc_resources, .resources = rtc_resources,
.id = PLATFORM_DEVID_NONE,
}, },
}; };
static const struct mfd_cell rk817s[] = { static const struct mfd_cell rk817s[] = {
{ .name = "rk808-clkout", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-clkout", },
{ .name = "rk808-regulator", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-regulator", },
{ {
.name = "rk805-pwrkey", .name = "rk805-pwrkey",
.num_resources = ARRAY_SIZE(rk817_pwrkey_resources), .num_resources = ARRAY_SIZE(rk817_pwrkey_resources),
.resources = &rk817_pwrkey_resources[0], .resources = &rk817_pwrkey_resources[0],
.id = PLATFORM_DEVID_NONE,
}, },
{ {
.name = "rk808-rtc", .name = "rk808-rtc",
.num_resources = ARRAY_SIZE(rk817_rtc_resources), .num_resources = ARRAY_SIZE(rk817_rtc_resources),
.resources = &rk817_rtc_resources[0], .resources = &rk817_rtc_resources[0],
.id = PLATFORM_DEVID_NONE,
}, },
{ .name = "rk817-codec", .id = PLATFORM_DEVID_NONE, }, { .name = "rk817-codec", },
{ {
.name = "rk817-charger", .name = "rk817-charger",
.num_resources = ARRAY_SIZE(rk817_charger_resources), .num_resources = ARRAY_SIZE(rk817_charger_resources),
.resources = &rk817_charger_resources[0], .resources = &rk817_charger_resources[0],
.id = PLATFORM_DEVID_NONE,
}, },
}; };
static const struct mfd_cell rk818s[] = { static const struct mfd_cell rk818s[] = {
{ .name = "rk808-clkout", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-clkout", },
{ .name = "rk808-regulator", .id = PLATFORM_DEVID_NONE, }, { .name = "rk808-regulator", },
{ {
.name = "rk808-rtc", .name = "rk808-rtc",
.num_resources = ARRAY_SIZE(rtc_resources), .num_resources = ARRAY_SIZE(rtc_resources),
.resources = rtc_resources, .resources = rtc_resources,
.id = PLATFORM_DEVID_NONE,
}, },
}; };
...@@ -684,7 +676,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap ...@@ -684,7 +676,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
pre_init_reg[i].addr); pre_init_reg[i].addr);
} }
ret = devm_mfd_add_devices(dev, 0, cells, nr_cells, NULL, 0, ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, cells, nr_cells, NULL, 0,
regmap_irq_get_domain(rk808->irq_data)); regmap_irq_get_domain(rk808->irq_data));
if (ret) if (ret)
return dev_err_probe(dev, ret, "failed to add MFD devices\n"); return dev_err_probe(dev, ret, "failed to add MFD devices\n");
......
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