Fix static platform_device causing module unloading to fail
Signed-off-by: Damien Nicolet <[email protected]>
---
drivers/w1/w1_sunxi.c | 48 ++++++++++++++++++++++++++++++++----------------
1 file changed, 32 insertions(+), 16 deletions(-)
diff --git a/drivers/w1/w1_sunxi.c b/drivers/w1/w1_sunxi.c
index de24f06..59d2996 100644
--- a/drivers/w1/w1_sunxi.c
+++ b/drivers/w1/w1_sunxi.c
@@ -9,35 +9,51 @@ static int gpio = -1;
module_param(gpio, int, 0444);
MODULE_PARM_DESC(gpio, "w1 gpio pin number");
-static struct w1_gpio_platform_data w1_gpio_pdata = {
- .pin = -1,
- .is_open_drain = 0,
-};
-
-static struct platform_device w1_device = {
- .name = "w1-gpio",
- .id = -1,
- .dev.platform_data = &w1_gpio_pdata,
-};
+static struct platform_device *w1_device;
static int __init w1_sunxi_init(void)
{
- int ret;
- if (!gpio_is_valid(gpio)) {
+ int ret = 0;
+ struct w1_gpio_platform_data w1_gpio_pdata = {
+ .pin = gpio,
+ .is_open_drain = 0,
+ };
+
+ if (!gpio_is_valid(w1_gpio_pdata.pin)) {
ret =
script_parser_fetch("w1_para", "gpio", &gpio, sizeof(int));
if (ret || !gpio_is_valid(gpio)) {
- pr_err("invalid gpio pin : %d\n", gpio);
+ pr_err("invalid gpio pin in fex configuration : %d\n",
+ gpio);
return -EINVAL;
}
+ w1_gpio_pdata.pin = gpio;
}
- w1_gpio_pdata.pin = gpio;
- return platform_device_register(&w1_device);
+
+ w1_device = platform_device_alloc("w1-gpio", 0);
+ if (!w1_device)
+ return -ENOMEM;
+
+ ret =
+ platform_device_add_data(w1_device, &w1_gpio_pdata,
+ sizeof(struct w1_gpio_platform_data));
+ if (ret)
+ goto err;
+
+ ret = platform_device_add(w1_device);
+ if (ret)
+ goto err;
+
+ return 0;
+
+err:
+ platform_device_put(w1_device);
+ return ret;
}
static void __exit w1_sunxi_exit(void)
{
- platform_device_unregister(&w1_device);
+ platform_device_unregister(w1_device);
}
module_init(w1_sunxi_init);
--
1.7.10.4
--
You received this message because you are subscribed to the Google Groups
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.