* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-12 15:46 ` [PATCH v2 1/3] sdio: Provide a bustype shutdown function Uwe Kleine-König
@ 2026-01-15 1:26 ` Shawn Lin
2026-01-15 8:23 ` Uwe Kleine-König
2026-01-19 9:16 ` Johannes Berg
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Shawn Lin @ 2026-01-15 1:26 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: shawn.lin, linux-wireless, linux-mmc, Ulf Hansson, Ping-Ke Shih,
Johannes Berg
在 2026/01/12 星期一 23:46, Uwe Kleine-König 写道:
> To prepare sdio drivers to migrate away from struct device_driver::shutdown
> (and then eventually remove that callback) create a serdev driver shutdown
/s/serdev driver/sdio driver ?
> callback and migration code to keep the existing behaviour. Note this
> introduces a warning for each driver that isn't converted yet to that
> callback at register time.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
> ---
> drivers/mmc/core/sdio_bus.c | 25 +++++++++++++++++++++++++
> include/linux/mmc/sdio_func.h | 1 +
> 2 files changed, 26 insertions(+)
>
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index 10799772494a..6e5bdc2f0cc8 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -232,6 +232,15 @@ static void sdio_bus_remove(struct device *dev)
> pm_runtime_put_sync(dev);
> }
>
> +static void sdio_bus_shutdown(struct device *dev)
> +{
> + struct sdio_driver *drv = to_sdio_driver(dev->driver);
> + struct sdio_func *func = dev_to_sdio_func(dev);
> +
> + if (dev->driver && drv->shutdown)
> + drv->shutdown(func);
> +}
Seem bogus check as a few line ahead, you used dev->driver to get
sdio_driver already. Otherwise the reset looks good.
> +
> static const struct dev_pm_ops sdio_bus_pm_ops = {
> SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume)
> SET_RUNTIME_PM_OPS(
> @@ -248,6 +257,7 @@ static const struct bus_type sdio_bus_type = {
> .uevent = sdio_bus_uevent,
> .probe = sdio_bus_probe,
> .remove = sdio_bus_remove,
> + .shutdown = sdio_bus_shutdown,
> .pm = &sdio_bus_pm_ops,
> };
>
> @@ -261,6 +271,14 @@ void sdio_unregister_bus(void)
> bus_unregister(&sdio_bus_type);
> }
>
> +static void sdio_legacy_shutdown(struct sdio_func *func)
> +{
> + struct device *dev = &func->dev;
> + struct device_driver *driver = dev->driver;
> +
> + driver->shutdown(dev);
> +}
> +
> /**
> * __sdio_register_driver - register a function driver
> * @drv: SDIO function driver
> @@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
> drv->drv.bus = &sdio_bus_type;
> drv->drv.owner = owner;
>
> + /*
> + * This driver needs updating. Note that driver_register() warns about
> + * this, so we're not adding another warning here.
> + */
> + if (!drv->shutdown && drv->drv.shutdown)
> + drv->shutdown = sdio_legacy_shutdown;
> +
> return driver_register(&drv->drv);
> }
> EXPORT_SYMBOL_GPL(__sdio_register_driver);
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index fed1f5f4a8d3..4534bf462aac 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -78,6 +78,7 @@ struct sdio_driver {
>
> int (*probe)(struct sdio_func *, const struct sdio_device_id *);
> void (*remove)(struct sdio_func *);
> + void (*shutdown)(struct sdio_func *);
>
> struct device_driver drv;
> };
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-15 1:26 ` Shawn Lin
@ 2026-01-15 8:23 ` Uwe Kleine-König
0 siblings, 0 replies; 12+ messages in thread
From: Uwe Kleine-König @ 2026-01-15 8:23 UTC (permalink / raw)
To: Shawn Lin, Ulf Hansson, Johannes Berg
Cc: linux-wireless, linux-mmc, Ping-Ke Shih
[-- Attachment #1: Type: text/plain, Size: 1798 bytes --]
On Thu, Jan 15, 2026 at 09:26:21AM +0800, Shawn Lin wrote:
> 在 2026/01/12 星期一 23:46, Uwe Kleine-König 写道:
> > To prepare sdio drivers to migrate away from struct device_driver::shutdown
> > (and then eventually remove that callback) create a serdev driver shutdown
>
> /s/serdev driver/sdio driver ?
Oh, indeed. Thanks for catching that.
> > callback and migration code to keep the existing behaviour. Note this
> > introduces a warning for each driver that isn't converted yet to that
> > callback at register time.
> >
> > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
> > ---
> > drivers/mmc/core/sdio_bus.c | 25 +++++++++++++++++++++++++
> > include/linux/mmc/sdio_func.h | 1 +
> > 2 files changed, 26 insertions(+)
> >
> > diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> > index 10799772494a..6e5bdc2f0cc8 100644
> > --- a/drivers/mmc/core/sdio_bus.c
> > +++ b/drivers/mmc/core/sdio_bus.c
> > @@ -232,6 +232,15 @@ static void sdio_bus_remove(struct device *dev)
> > pm_runtime_put_sync(dev);
> > }
> > +static void sdio_bus_shutdown(struct device *dev)
> > +{
> > + struct sdio_driver *drv = to_sdio_driver(dev->driver);
> > + struct sdio_func *func = dev_to_sdio_func(dev);
> > +
> > + if (dev->driver && drv->shutdown)
> > + drv->shutdown(func);
> > +}
>
> Seem bogus check as a few line ahead, you used dev->driver to get
> sdio_driver already. Otherwise the reset looks good.
to_sdio_driver(dev->driver) however is only pointer arithmetic and
doesn't dereference the pointer. So this is not a bug in the class
check-for-NULL-after-dereference. TTBOMY the code if fine as is.
Should I resend for the typo, or can this be fixed up while applying?
Best regards
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-12 15:46 ` [PATCH v2 1/3] sdio: Provide a bustype shutdown function Uwe Kleine-König
2026-01-15 1:26 ` Shawn Lin
@ 2026-01-19 9:16 ` Johannes Berg
2026-01-19 15:00 ` Ulf Hansson
2026-01-20 10:27 ` Ulf Hansson
3 siblings, 0 replies; 12+ messages in thread
From: Johannes Berg @ 2026-01-19 9:16 UTC (permalink / raw)
To: Uwe Kleine-König, Ulf Hansson, Ping-Ke Shih
Cc: linux-wireless, linux-mmc
On Mon, 2026-01-12 at 16:46 +0100, Uwe Kleine-König wrote:
> To prepare sdio drivers to migrate away from struct device_driver::shutdown
> (and then eventually remove that callback) create a serdev driver shutdown
> callback and migration code to keep the existing behaviour. Note this
> introduces a warning for each driver that isn't converted yet to that
> callback at register time.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Ulf, could you send an ACK for taking this through wireless?
Thanks,
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-12 15:46 ` [PATCH v2 1/3] sdio: Provide a bustype shutdown function Uwe Kleine-König
2026-01-15 1:26 ` Shawn Lin
2026-01-19 9:16 ` Johannes Berg
@ 2026-01-19 15:00 ` Ulf Hansson
2026-01-19 18:25 ` Uwe Kleine-König
2026-01-20 10:27 ` Ulf Hansson
3 siblings, 1 reply; 12+ messages in thread
From: Ulf Hansson @ 2026-01-19 15:00 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Ping-Ke Shih, Johannes Berg, linux-wireless, linux-mmc
On Mon, 12 Jan 2026 at 16:47, Uwe Kleine-König
<u.kleine-koenig@baylibre.com> wrote:
>
> To prepare sdio drivers to migrate away from struct device_driver::shutdown
> (and then eventually remove that callback) create a serdev driver shutdown
> callback and migration code to keep the existing behaviour. Note this
> introduces a warning for each driver that isn't converted yet to that
> callback at register time.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
> ---
> drivers/mmc/core/sdio_bus.c | 25 +++++++++++++++++++++++++
> include/linux/mmc/sdio_func.h | 1 +
> 2 files changed, 26 insertions(+)
>
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index 10799772494a..6e5bdc2f0cc8 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -232,6 +232,15 @@ static void sdio_bus_remove(struct device *dev)
> pm_runtime_put_sync(dev);
> }
>
> +static void sdio_bus_shutdown(struct device *dev)
> +{
> + struct sdio_driver *drv = to_sdio_driver(dev->driver);
> + struct sdio_func *func = dev_to_sdio_func(dev);
> +
> + if (dev->driver && drv->shutdown)
> + drv->shutdown(func);
> +}
> +
> static const struct dev_pm_ops sdio_bus_pm_ops = {
> SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume)
> SET_RUNTIME_PM_OPS(
> @@ -248,6 +257,7 @@ static const struct bus_type sdio_bus_type = {
> .uevent = sdio_bus_uevent,
> .probe = sdio_bus_probe,
> .remove = sdio_bus_remove,
> + .shutdown = sdio_bus_shutdown,
> .pm = &sdio_bus_pm_ops,
> };
>
> @@ -261,6 +271,14 @@ void sdio_unregister_bus(void)
> bus_unregister(&sdio_bus_type);
> }
>
> +static void sdio_legacy_shutdown(struct sdio_func *func)
> +{
> + struct device *dev = &func->dev;
> + struct device_driver *driver = dev->driver;
> +
> + driver->shutdown(dev);
> +}
> +
> /**
> * __sdio_register_driver - register a function driver
> * @drv: SDIO function driver
> @@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
> drv->drv.bus = &sdio_bus_type;
> drv->drv.owner = owner;
>
> + /*
> + * This driver needs updating. Note that driver_register() warns about
> + * this, so we're not adding another warning here.
> + */
> + if (!drv->shutdown && drv->drv.shutdown)
> + drv->shutdown = sdio_legacy_shutdown;
> +
Is this added only to keep the series bisectable or are there other
(except those you fix in the series) sdio func drivers that make use
of the shutdown callback?
In any case, when are you planning to remove this?
> return driver_register(&drv->drv);
> }
> EXPORT_SYMBOL_GPL(__sdio_register_driver);
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index fed1f5f4a8d3..4534bf462aac 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -78,6 +78,7 @@ struct sdio_driver {
>
> int (*probe)(struct sdio_func *, const struct sdio_device_id *);
> void (*remove)(struct sdio_func *);
> + void (*shutdown)(struct sdio_func *);
>
> struct device_driver drv;
> };
> --
> 2.47.3
>
Kind regards
Uffe
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-19 15:00 ` Ulf Hansson
@ 2026-01-19 18:25 ` Uwe Kleine-König
2026-01-20 10:25 ` Ulf Hansson
0 siblings, 1 reply; 12+ messages in thread
From: Uwe Kleine-König @ 2026-01-19 18:25 UTC (permalink / raw)
To: Ulf Hansson; +Cc: Ping-Ke Shih, Johannes Berg, linux-wireless, linux-mmc
[-- Attachment #1: Type: text/plain, Size: 1225 bytes --]
Hello Ulf,
On Mon, Jan 19, 2026 at 04:00:48PM +0100, Ulf Hansson wrote:
> On Mon, 12 Jan 2026 at 16:47, Uwe Kleine-König
> <u.kleine-koenig@baylibre.com> wrote:
> > @@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
> > drv->drv.bus = &sdio_bus_type;
> > drv->drv.owner = owner;
> >
> > + /*
> > + * This driver needs updating. Note that driver_register() warns about
> > + * this, so we're not adding another warning here.
> > + */
> > + if (!drv->shutdown && drv->drv.shutdown)
> > + drv->shutdown = sdio_legacy_shutdown;
> > +
>
> Is this added only to keep the series bisectable or are there other
> (except those you fix in the series) sdio func drivers that make use
> of the shutdown callback?
It's kept because I don't know if there are any other sdio driver in
flight and these would break silently when they are applied between this
series and the removal of the callbacks from struct device_driver.
> In any case, when are you planning to remove this?
So my plan is to remove this in a series where the last patch is the
modification to struct driver.
Best regards
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-19 18:25 ` Uwe Kleine-König
@ 2026-01-20 10:25 ` Ulf Hansson
0 siblings, 0 replies; 12+ messages in thread
From: Ulf Hansson @ 2026-01-20 10:25 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Ping-Ke Shih, Johannes Berg, linux-wireless, linux-mmc
On Mon, 19 Jan 2026 at 19:25, Uwe Kleine-König
<u.kleine-koenig@baylibre.com> wrote:
>
> Hello Ulf,
>
> On Mon, Jan 19, 2026 at 04:00:48PM +0100, Ulf Hansson wrote:
> > On Mon, 12 Jan 2026 at 16:47, Uwe Kleine-König
> > <u.kleine-koenig@baylibre.com> wrote:
> > > @@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
> > > drv->drv.bus = &sdio_bus_type;
> > > drv->drv.owner = owner;
> > >
> > > + /*
> > > + * This driver needs updating. Note that driver_register() warns about
> > > + * this, so we're not adding another warning here.
> > > + */
> > > + if (!drv->shutdown && drv->drv.shutdown)
> > > + drv->shutdown = sdio_legacy_shutdown;
> > > +
> >
> > Is this added only to keep the series bisectable or are there other
> > (except those you fix in the series) sdio func drivers that make use
> > of the shutdown callback?
>
> It's kept because I don't know if there are any other sdio driver in
> flight and these would break silently when they are applied between this
> series and the removal of the callbacks from struct device_driver.
>
> > In any case, when are you planning to remove this?
>
> So my plan is to remove this in a series where the last patch is the
> modification to struct driver.
Okay, thanks for clarifying!
Kind regards
Uffe
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-12 15:46 ` [PATCH v2 1/3] sdio: Provide a bustype shutdown function Uwe Kleine-König
` (2 preceding siblings ...)
2026-01-19 15:00 ` Ulf Hansson
@ 2026-01-20 10:27 ` Ulf Hansson
2026-01-20 10:29 ` Johannes Berg
3 siblings, 1 reply; 12+ messages in thread
From: Ulf Hansson @ 2026-01-20 10:27 UTC (permalink / raw)
To: Uwe Kleine-König, Johannes Berg
Cc: Ping-Ke Shih, linux-wireless, linux-mmc
On Mon, 12 Jan 2026 at 16:47, Uwe Kleine-König
<u.kleine-koenig@baylibre.com> wrote:
>
> To prepare sdio drivers to migrate away from struct device_driver::shutdown
> (and then eventually remove that callback) create a serdev driver shutdown
> callback and migration code to keep the existing behaviour. Note this
> introduces a warning for each driver that isn't converted yet to that
> callback at register time.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Johannes, please pick this via your tree. And sorry for the delay in
reviewing this!
Kind regards
Uffe
> ---
> drivers/mmc/core/sdio_bus.c | 25 +++++++++++++++++++++++++
> include/linux/mmc/sdio_func.h | 1 +
> 2 files changed, 26 insertions(+)
>
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index 10799772494a..6e5bdc2f0cc8 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -232,6 +232,15 @@ static void sdio_bus_remove(struct device *dev)
> pm_runtime_put_sync(dev);
> }
>
> +static void sdio_bus_shutdown(struct device *dev)
> +{
> + struct sdio_driver *drv = to_sdio_driver(dev->driver);
> + struct sdio_func *func = dev_to_sdio_func(dev);
> +
> + if (dev->driver && drv->shutdown)
> + drv->shutdown(func);
> +}
> +
> static const struct dev_pm_ops sdio_bus_pm_ops = {
> SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume)
> SET_RUNTIME_PM_OPS(
> @@ -248,6 +257,7 @@ static const struct bus_type sdio_bus_type = {
> .uevent = sdio_bus_uevent,
> .probe = sdio_bus_probe,
> .remove = sdio_bus_remove,
> + .shutdown = sdio_bus_shutdown,
> .pm = &sdio_bus_pm_ops,
> };
>
> @@ -261,6 +271,14 @@ void sdio_unregister_bus(void)
> bus_unregister(&sdio_bus_type);
> }
>
> +static void sdio_legacy_shutdown(struct sdio_func *func)
> +{
> + struct device *dev = &func->dev;
> + struct device_driver *driver = dev->driver;
> +
> + driver->shutdown(dev);
> +}
> +
> /**
> * __sdio_register_driver - register a function driver
> * @drv: SDIO function driver
> @@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
> drv->drv.bus = &sdio_bus_type;
> drv->drv.owner = owner;
>
> + /*
> + * This driver needs updating. Note that driver_register() warns about
> + * this, so we're not adding another warning here.
> + */
> + if (!drv->shutdown && drv->drv.shutdown)
> + drv->shutdown = sdio_legacy_shutdown;
> +
> return driver_register(&drv->drv);
> }
> EXPORT_SYMBOL_GPL(__sdio_register_driver);
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index fed1f5f4a8d3..4534bf462aac 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -78,6 +78,7 @@ struct sdio_driver {
>
> int (*probe)(struct sdio_func *, const struct sdio_device_id *);
> void (*remove)(struct sdio_func *);
> + void (*shutdown)(struct sdio_func *);
>
> struct device_driver drv;
> };
> --
> 2.47.3
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/3] sdio: Provide a bustype shutdown function
2026-01-20 10:27 ` Ulf Hansson
@ 2026-01-20 10:29 ` Johannes Berg
0 siblings, 0 replies; 12+ messages in thread
From: Johannes Berg @ 2026-01-20 10:29 UTC (permalink / raw)
To: Ulf Hansson, Uwe Kleine-König
Cc: Ping-Ke Shih, linux-wireless, linux-mmc
On Tue, 2026-01-20 at 11:27 +0100, Ulf Hansson wrote:
> On Mon, 12 Jan 2026 at 16:47, Uwe Kleine-König
> <u.kleine-koenig@baylibre.com> wrote:
> >
> > To prepare sdio drivers to migrate away from struct device_driver::shutdown
> > (and then eventually remove that callback) create a serdev driver shutdown
> > callback and migration code to keep the existing behaviour. Note this
> > introduces a warning for each driver that isn't converted yet to that
> > callback at register time.
> >
> > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
>
> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
>
> Johannes, please pick this via your tree. And sorry for the delay in
> reviewing this!
Will do, no worries at all, thanks!
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread