From 61212b715b4fb37553dae33df1320c418824c854 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Wed, 6 May 2020 17:49:10 +0800 Subject: [PATCH] gpio: imx-rpmsg: register gpio chip after rpmsg channel ready Register gpio chip after rpmsg channel ready, otherwise consumer might use gpio before rpmsg channel ready, and cause issue. Late register the gpio chip could let consumer use defer probe correclty. Reported-by: Elven Wang Reviewed-by: Fugang Duan Signed-off-by: Peng Fan --- drivers/gpio/gpio-imx-rpmsg.c | 56 ++++++++++++++++------------------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/drivers/gpio/gpio-imx-rpmsg.c b/drivers/gpio/gpio-imx-rpmsg.c index 092c290942ba..418455fe5250 100644 --- a/drivers/gpio/gpio-imx-rpmsg.c +++ b/drivers/gpio/gpio-imx-rpmsg.c @@ -238,31 +238,6 @@ static int imx_rpmsg_gpio_direction_output(struct gpio_chip *gc, return gpio_send_message(port, &msg, &gpio_rpmsg, true); } -static int gpio_rpmsg_probe(struct rpmsg_device *rpdev) -{ - gpio_rpmsg.rpdev = rpdev; - dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", - rpdev->src, rpdev->dst); - - init_completion(&gpio_rpmsg.cmd_complete); - mutex_init(&gpio_rpmsg.lock); - - return 0; -} - -static struct rpmsg_device_id gpio_rpmsg_id_table[] = { - { .name = "rpmsg-io-channel" }, - {}, -}; - -static struct rpmsg_driver gpio_rpmsg_driver = { - .drv.name = "gpio_rpmsg", - .drv.owner = THIS_MODULE, - .id_table = gpio_rpmsg_id_table, - .probe = gpio_rpmsg_probe, - .callback = gpio_rpmsg_cb, -}; - static int imx_rpmsg_irq_set_type(struct irq_data *d, u32 type) { struct imx_rpmsg_gpio_port *port = irq_data_get_irq_chip_data(d); @@ -399,7 +374,6 @@ static int imx_rpmsg_gpio_probe(struct platform_device *pdev) return 0; } - static const struct of_device_id imx_rpmsg_gpio_dt_ids[] = { { .compatible = "fsl,imx-rpmsg-gpio" }, { /* sentinel */ } @@ -413,16 +387,36 @@ static struct platform_driver imx_rpmsg_gpio_driver = { .probe = imx_rpmsg_gpio_probe, }; -static int __init gpio_imx_rpmsg_init(void) +static int gpio_rpmsg_probe(struct rpmsg_device *rpdev) { - int ret; + gpio_rpmsg.rpdev = rpdev; + dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", + rpdev->src, rpdev->dst); - ret = register_rpmsg_driver(&gpio_rpmsg_driver); - if (ret) - return ret; + init_completion(&gpio_rpmsg.cmd_complete); + mutex_init(&gpio_rpmsg.lock); return platform_driver_register(&imx_rpmsg_gpio_driver); } + +static struct rpmsg_device_id gpio_rpmsg_id_table[] = { + { .name = "rpmsg-io-channel" }, + {}, +}; + +static struct rpmsg_driver gpio_rpmsg_driver = { + .drv.name = "gpio_rpmsg", + .drv.owner = THIS_MODULE, + .id_table = gpio_rpmsg_id_table, + .probe = gpio_rpmsg_probe, + .callback = gpio_rpmsg_cb, +}; + + +static int __init gpio_imx_rpmsg_init(void) +{ + return register_rpmsg_driver(&gpio_rpmsg_driver); +} device_initcall(gpio_imx_rpmsg_init); MODULE_AUTHOR("NXP Semiconductor");