blob: 2b50cbe6aca90089a12cd9b8f774ec59690bbdf4 [file] [log] [blame]
Liam Girdwood0ca06a02005-07-29 16:13:36 +02001/*
2 * Linux driver model AC97 bus interface
3 *
4 * Author: Nicolas Pitre
5 * Created: Jan 14, 2005
6 * Copyright: (C) MontaVista Software Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 */
13
Jaroslav Kysela5049c352005-08-22 12:19:14 +020014#include <linux/module.h>
Liam Girdwood0ca06a02005-07-29 16:13:36 +020015#include <linux/init.h>
16#include <linux/device.h>
17#include <linux/string.h>
Mark Brown96841ba2008-12-02 15:15:50 +000018#include <sound/ac97_codec.h>
Liam Girdwood0ca06a02005-07-29 16:13:36 +020019
20/*
Nicolas Pitre3a91e952005-09-16 18:46:36 +020021 * Let drivers decide whether they want to support given codec from their
Jeffrin Josed0359c62010-12-06 19:27:53 +053022 * probe method. Drivers have direct access to the struct snd_ac97
23 * structure and may decide based on the id field amongst other things.
Liam Girdwood0ca06a02005-07-29 16:13:36 +020024 */
25static int ac97_bus_match(struct device *dev, struct device_driver *drv)
26{
Nicolas Pitre3a91e952005-09-16 18:46:36 +020027 return 1;
Liam Girdwood0ca06a02005-07-29 16:13:36 +020028}
29
Martin Langer66e27782007-02-05 13:02:35 +010030#ifdef CONFIG_PM
Liam Girdwood0ca06a02005-07-29 16:13:36 +020031static int ac97_bus_suspend(struct device *dev, pm_message_t state)
32{
33 int ret = 0;
34
Nicolas Pitre90b66e82005-09-16 18:50:53 +020035 if (dev->driver && dev->driver->suspend)
Russell King9480e302005-10-28 09:52:56 -070036 ret = dev->driver->suspend(dev, state);
37
Liam Girdwood0ca06a02005-07-29 16:13:36 +020038 return ret;
39}
40
41static int ac97_bus_resume(struct device *dev)
42{
43 int ret = 0;
44
Nicolas Pitre90b66e82005-09-16 18:50:53 +020045 if (dev->driver && dev->driver->resume)
Russell King9480e302005-10-28 09:52:56 -070046 ret = dev->driver->resume(dev);
47
Liam Girdwood0ca06a02005-07-29 16:13:36 +020048 return ret;
49}
Martin Langer66e27782007-02-05 13:02:35 +010050#endif /* CONFIG_PM */
Liam Girdwood0ca06a02005-07-29 16:13:36 +020051
52struct bus_type ac97_bus_type = {
53 .name = "ac97",
54 .match = ac97_bus_match,
Martin Langer66e27782007-02-05 13:02:35 +010055#ifdef CONFIG_PM
Liam Girdwood0ca06a02005-07-29 16:13:36 +020056 .suspend = ac97_bus_suspend,
57 .resume = ac97_bus_resume,
Martin Langer66e27782007-02-05 13:02:35 +010058#endif /* CONFIG_PM */
Liam Girdwood0ca06a02005-07-29 16:13:36 +020059};
60
61static int __init ac97_bus_init(void)
62{
63 return bus_register(&ac97_bus_type);
64}
65
66subsys_initcall(ac97_bus_init);
67
68static void __exit ac97_bus_exit(void)
69{
70 bus_unregister(&ac97_bus_type);
71}
72
73module_exit(ac97_bus_exit);
74
75EXPORT_SYMBOL(ac97_bus_type);
76
77MODULE_LICENSE("GPL");