[alsa-devel] [PATCH] ALSA: ac97: Switch to dev_pm_ops

Convert the ac97_bus from legacy suspend/resume callbacks to dev_pm_ops.
Since there isn't anything special to do at the bus level the bus driver does not have to implement any callbacks. The device driver core will automatically pick up and execute the device's PM ops.
As there is only a single AC'97 driver implementing suspend and resume, update both the core and driver at the same time to avoid unnecessary code churn.
Signed-off-by: Lars-Peter Clausen lars@metafoo.de --- This patch touches code in both ALSA and the input subsystem. Ideally this patch will be merged via the ALSA tree. Given that the wm97xx touchscreen driver is not seeing too many changes these days the risk of conflicts should be low. --- drivers/input/touchscreen/wm97xx-core.c | 13 +++++++------ sound/ac97_bus.c | 26 -------------------------- 2 files changed, 7 insertions(+), 32 deletions(-)
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index b1ae779..1d11fd8 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c @@ -732,8 +732,8 @@ static int wm97xx_remove(struct device *dev) return 0; }
-#ifdef CONFIG_PM -static int wm97xx_suspend(struct device *dev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int wm97xx_suspend(struct device *dev) { struct wm97xx *wm = dev_get_drvdata(dev); u16 reg; @@ -799,9 +799,11 @@ static int wm97xx_resume(struct device *dev) return 0; }
+static SIMPLE_DEV_PM_OPS(wm97xx_pm_ops, wm97xx_suspend, wm97xx_resume); +#define WM97XX_PM_OPS (&wm97xx_pm_ops) + #else -#define wm97xx_suspend NULL -#define wm97xx_resume NULL +#define WM97XX_PM_OPS NULL #endif
/* @@ -836,8 +838,7 @@ static struct device_driver wm97xx_driver = { .owner = THIS_MODULE, .probe = wm97xx_probe, .remove = wm97xx_remove, - .suspend = wm97xx_suspend, - .resume = wm97xx_resume, + .pm = WM97XX_PM_OPS, };
static int __init wm97xx_init(void) diff --git a/sound/ac97_bus.c b/sound/ac97_bus.c index 2b50cbe..57a6dfc 100644 --- a/sound/ac97_bus.c +++ b/sound/ac97_bus.c @@ -27,35 +27,9 @@ static int ac97_bus_match(struct device *dev, struct device_driver *drv) return 1; }
-#ifdef CONFIG_PM -static int ac97_bus_suspend(struct device *dev, pm_message_t state) -{ - int ret = 0; - - if (dev->driver && dev->driver->suspend) - ret = dev->driver->suspend(dev, state); - - return ret; -} - -static int ac97_bus_resume(struct device *dev) -{ - int ret = 0; - - if (dev->driver && dev->driver->resume) - ret = dev->driver->resume(dev); - - return ret; -} -#endif /* CONFIG_PM */ - struct bus_type ac97_bus_type = { .name = "ac97", .match = ac97_bus_match, -#ifdef CONFIG_PM - .suspend = ac97_bus_suspend, - .resume = ac97_bus_resume, -#endif /* CONFIG_PM */ };
static int __init ac97_bus_init(void)

Hi,
On Thu, Aug 06, 2015 at 09:42:09PM +0200, Lars-Peter Clausen wrote:
Convert the ac97_bus from legacy suspend/resume callbacks to dev_pm_ops.
Since there isn't anything special to do at the bus level the bus driver does not have to implement any callbacks. The device driver core will automatically pick up and execute the device's PM ops.
As there is only a single AC'97 driver implementing suspend and resume, update both the core and driver at the same time to avoid unnecessary code churn.
Signed-off-by: Lars-Peter Clausen lars@metafoo.de
This patch touches code in both ALSA and the input subsystem. Ideally this patch will be merged via the ALSA tree. Given that the wm97xx touchscreen driver is not seeing too many changes these days the risk of conflicts should be low.
That will be fine once the comments below are addressed.
drivers/input/touchscreen/wm97xx-core.c | 13 +++++++------ sound/ac97_bus.c | 26 -------------------------- 2 files changed, 7 insertions(+), 32 deletions(-)
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index b1ae779..1d11fd8 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c @@ -732,8 +732,8 @@ static int wm97xx_remove(struct device *dev) return 0; }
-#ifdef CONFIG_PM -static int wm97xx_suspend(struct device *dev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int wm97xx_suspend(struct device *dev)
While we are changing it please drop #ifdef CONFIG_PM_SLEEP and annotate suspend and resume with __maybe_unused.
{ struct wm97xx *wm = dev_get_drvdata(dev); u16 reg; @@ -799,9 +799,11 @@ static int wm97xx_resume(struct device *dev) return 0; }
+static SIMPLE_DEV_PM_OPS(wm97xx_pm_ops, wm97xx_suspend, wm97xx_resume);
Pull this out of #ifdef block and kill entire #else/endif along with WM97XX_PM_OPS define: SIMPLE_DEV_PM_OPS will result in an empty structure if CONFIG_PM_SLEEP is not set.
+#define WM97XX_PM_OPS (&wm97xx_pm_ops)
#else -#define wm97xx_suspend NULL -#define wm97xx_resume NULL +#define WM97XX_PM_OPS NULL #endif
/* @@ -836,8 +838,7 @@ static struct device_driver wm97xx_driver = { .owner = THIS_MODULE, .probe = wm97xx_probe, .remove = wm97xx_remove,
- .suspend = wm97xx_suspend,
- .resume = wm97xx_resume,
- .pm = WM97XX_PM_OPS,
.pm &wm97xx_pm_ops,
};
static int __init wm97xx_init(void) diff --git a/sound/ac97_bus.c b/sound/ac97_bus.c index 2b50cbe..57a6dfc 100644 --- a/sound/ac97_bus.c +++ b/sound/ac97_bus.c @@ -27,35 +27,9 @@ static int ac97_bus_match(struct device *dev, struct device_driver *drv) return 1; }
-#ifdef CONFIG_PM -static int ac97_bus_suspend(struct device *dev, pm_message_t state) -{
- int ret = 0;
- if (dev->driver && dev->driver->suspend)
ret = dev->driver->suspend(dev, state);
- return ret;
-}
-static int ac97_bus_resume(struct device *dev) -{
- int ret = 0;
- if (dev->driver && dev->driver->resume)
ret = dev->driver->resume(dev);
- return ret;
-} -#endif /* CONFIG_PM */
struct bus_type ac97_bus_type = { .name = "ac97", .match = ac97_bus_match, -#ifdef CONFIG_PM
- .suspend = ac97_bus_suspend,
- .resume = ac97_bus_resume,
-#endif /* CONFIG_PM */ };
static int __init ac97_bus_init(void)
2.1.4
Thanks.

On 08/07/2015 12:55 AM, Dmitry Torokhov wrote: [...]
-#ifdef CONFIG_PM -static int wm97xx_suspend(struct device *dev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int wm97xx_suspend(struct device *dev)
While we are changing it please drop #ifdef CONFIG_PM_SLEEP and annotate suspend and resume with __maybe_unused.
We know that it is used when CONFIG_PM_SLEEP is defined and we know that it is unused CONFIG_PM_SLEEP is not defined. Marking the function as __maybe_unused will cause the compiler to not generate a warning when the function is really unused. Making this explicit works much better.
{ struct wm97xx *wm = dev_get_drvdata(dev); u16 reg; @@ -799,9 +799,11 @@ static int wm97xx_resume(struct device *dev) return 0; }
+static SIMPLE_DEV_PM_OPS(wm97xx_pm_ops, wm97xx_suspend, wm97xx_resume);
Pull this out of #ifdef block and kill entire #else/endif along with WM97XX_PM_OPS define: SIMPLE_DEV_PM_OPS will result in an empty structure if CONFIG_PM_SLEEP is not set.
It will create a struct dev_pm_ops full of NULLs. That's kind of counterproductive to removing PM related data and functions from the kernel if PM support is no enabled.
+#define WM97XX_PM_OPS (&wm97xx_pm_ops)
#else -#define wm97xx_suspend NULL -#define wm97xx_resume NULL +#define WM97XX_PM_OPS NULL #endif
[...]

On Fri, Aug 07, 2015 at 10:13:48AM +0200, Lars-Peter Clausen wrote:
On 08/07/2015 12:55 AM, Dmitry Torokhov wrote:
Pull this out of #ifdef block and kill entire #else/endif along with WM97XX_PM_OPS define: SIMPLE_DEV_PM_OPS will result in an empty structure if CONFIG_PM_SLEEP is not set.
It will create a struct dev_pm_ops full of NULLs. That's kind of counterproductive to removing PM related data and functions from the kernel if PM support is no enabled.
Indeed, a major goal of disabling PM support is to save space.

On Fri, Aug 07, 2015 at 02:30:05PM +0100, Mark Brown wrote:
On Fri, Aug 07, 2015 at 10:13:48AM +0200, Lars-Peter Clausen wrote:
On 08/07/2015 12:55 AM, Dmitry Torokhov wrote:
Pull this out of #ifdef block and kill entire #else/endif along with WM97XX_PM_OPS define: SIMPLE_DEV_PM_OPS will result in an empty structure if CONFIG_PM_SLEEP is not set.
It will create a struct dev_pm_ops full of NULLs. That's kind of counterproductive to removing PM related data and functions from the kernel if PM support is no enabled.
Indeed, a major goal of disabling PM support is to save space.
Then maybe we should adjust dev_pm_ops definition to omit members that are not used if given state is not supported? We have a lot of drivers that are not doing silly pointer #define games.

On Fri, Aug 07, 2015 at 09:30:29AM -0700, Dmitry Torokhov wrote:
On Fri, Aug 07, 2015 at 02:30:05PM +0100, Mark Brown wrote:
Indeed, a major goal of disabling PM support is to save space.
Then maybe we should adjust dev_pm_ops definition to omit members that are not used if given state is not supported? We have a lot of drivers that are not doing silly pointer #define games.
Yeah, I've always been vaugely surprised that we don't do that.

On Fri, Aug 07, 2015 at 10:13:48AM +0200, Lars-Peter Clausen wrote:
On 08/07/2015 12:55 AM, Dmitry Torokhov wrote: [...]
-#ifdef CONFIG_PM -static int wm97xx_suspend(struct device *dev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int wm97xx_suspend(struct device *dev)
While we are changing it please drop #ifdef CONFIG_PM_SLEEP and annotate suspend and resume with __maybe_unused.
We know that it is used when CONFIG_PM_SLEEP is defined and we know that it is unused CONFIG_PM_SLEEP is not defined. Marking the function as __maybe_unused will cause the compiler to not generate a warning when the function is really unused. Making this explicit works much better.
It will also drop the code form the final image and having the functions in provides better compile coverage.
Thanks.

On Fri, Aug 07, 2015 at 09:32:13AM -0700, Dmitry Torokhov wrote:
On Fri, Aug 07, 2015 at 10:13:48AM +0200, Lars-Peter Clausen wrote:
We know that it is used when CONFIG_PM_SLEEP is defined and we know that it is unused CONFIG_PM_SLEEP is not defined. Marking the function as __maybe_unused will cause the compiler to not generate a warning when the function is really unused. Making this explicit works much better.
It will also drop the code form the final image and having the functions in provides better compile coverage.
Just discussed this in person with Dmitry: I'll apply the patch just now for v4.3 and we can incrementally improve the ifdef handling after.

On 08/20/2015 06:33 PM, Mark Brown wrote:
On Fri, Aug 07, 2015 at 09:32:13AM -0700, Dmitry Torokhov wrote:
On Fri, Aug 07, 2015 at 10:13:48AM +0200, Lars-Peter Clausen wrote:
We know that it is used when CONFIG_PM_SLEEP is defined and we know that it is unused CONFIG_PM_SLEEP is not defined. Marking the function as __maybe_unused will cause the compiler to not generate a warning when the function is really unused. Making this explicit works much better.
It will also drop the code form the final image and having the functions in provides better compile coverage.
Just discussed this in person with Dmitry: I'll apply the patch just now for v4.3 and we can incrementally improve the ifdef handling after.
Great, thanks. I was about to send a patch with the ifdefs removed tomorrow.

On Thu, Aug 20, 2015 at 06:35:24PM +0200, Lars-Peter Clausen wrote:
On 08/20/2015 06:33 PM, Mark Brown wrote:
Just discussed this in person with Dmitry: I'll apply the patch just now for v4.3 and we can incrementally improve the ifdef handling after.
Great, thanks. I was about to send a patch with the ifdefs removed tomorrow.
Oh, that'd be even better if we could get that into v4.3 instead - this was partly given that I'd just met Dmitry and the merge window will be opening very soon. If you could get that patch done that'd be even better.

The patch
ALSA: ac97: Switch to dev_pm_ops
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
From ef3c79ff372b17a407b72e26d32af28919abdf39 Mon Sep 17 00:00:00 2001
From: Lars-Peter Clausen lars@metafoo.de Date: Thu, 6 Aug 2015 21:42:09 +0200 Subject: [PATCH] ALSA: ac97: Switch to dev_pm_ops
Convert the ac97_bus from legacy suspend/resume callbacks to dev_pm_ops.
Since there isn't anything special to do at the bus level the bus driver does not have to implement any callbacks. The device driver core will automatically pick up and execute the device's PM ops.
As there is only a single AC'97 driver implementing suspend and resume, update both the core and driver at the same time to avoid unnecessary code churn.
Signed-off-by: Lars-Peter Clausen lars@metafoo.de Signed-off-by: Mark Brown broonie@kernel.org --- drivers/input/touchscreen/wm97xx-core.c | 13 +++++++------ sound/ac97_bus.c | 26 -------------------------- 2 files changed, 7 insertions(+), 32 deletions(-)
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index b1ae779..1d11fd8 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c @@ -732,8 +732,8 @@ static int wm97xx_remove(struct device *dev) return 0; }
-#ifdef CONFIG_PM -static int wm97xx_suspend(struct device *dev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int wm97xx_suspend(struct device *dev) { struct wm97xx *wm = dev_get_drvdata(dev); u16 reg; @@ -799,9 +799,11 @@ static int wm97xx_resume(struct device *dev) return 0; }
+static SIMPLE_DEV_PM_OPS(wm97xx_pm_ops, wm97xx_suspend, wm97xx_resume); +#define WM97XX_PM_OPS (&wm97xx_pm_ops) + #else -#define wm97xx_suspend NULL -#define wm97xx_resume NULL +#define WM97XX_PM_OPS NULL #endif
/* @@ -836,8 +838,7 @@ static struct device_driver wm97xx_driver = { .owner = THIS_MODULE, .probe = wm97xx_probe, .remove = wm97xx_remove, - .suspend = wm97xx_suspend, - .resume = wm97xx_resume, + .pm = WM97XX_PM_OPS, };
static int __init wm97xx_init(void) diff --git a/sound/ac97_bus.c b/sound/ac97_bus.c index 55791a0..52e4bc5 100644 --- a/sound/ac97_bus.c +++ b/sound/ac97_bus.c @@ -89,35 +89,9 @@ static int ac97_bus_match(struct device *dev, struct device_driver *drv) return 1; }
-#ifdef CONFIG_PM -static int ac97_bus_suspend(struct device *dev, pm_message_t state) -{ - int ret = 0; - - if (dev->driver && dev->driver->suspend) - ret = dev->driver->suspend(dev, state); - - return ret; -} - -static int ac97_bus_resume(struct device *dev) -{ - int ret = 0; - - if (dev->driver && dev->driver->resume) - ret = dev->driver->resume(dev); - - return ret; -} -#endif /* CONFIG_PM */ - struct bus_type ac97_bus_type = { .name = "ac97", .match = ac97_bus_match, -#ifdef CONFIG_PM - .suspend = ac97_bus_suspend, - .resume = ac97_bus_resume, -#endif /* CONFIG_PM */ };
static int __init ac97_bus_init(void)
participants (3)
-
Dmitry Torokhov
-
Lars-Peter Clausen
-
Mark Brown