5 #ifndef __SOUND_HDAUDIO_H
6 #define __SOUND_HDAUDIO_H
8 #include <linux/device.h>
9 #include <sound/hda_verbs.h>
12 typedef u16 hda_nid_t;
17 struct hdac_widget_tree;
22 extern struct bus_type snd_hda_bus_type;
25 * HD-audio codec base device
31 unsigned int addr; /* codec address */
32 struct list_head list; /* list point for bus codec_list */
34 hda_nid_t afg; /* AFG node id */
35 hda_nid_t mfg; /* MFG node id */
38 unsigned int vendor_id;
39 unsigned int subsystem_id;
40 unsigned int revision_id;
41 unsigned int afg_function_id;
42 unsigned int mfg_function_id;
43 unsigned int afg_unsol:1;
44 unsigned int mfg_unsol:1;
46 unsigned int power_caps; /* FG power caps */
48 const char *vendor_name; /* codec vendor name */
49 const char *chip_name; /* codec chip name */
51 /* verb exec op override */
52 int (*exec_verb)(struct hdac_device *dev, unsigned int cmd,
53 unsigned int flags, unsigned int *res);
56 unsigned int num_nodes;
57 hda_nid_t start_nid, end_nid;
60 atomic_t in_pm; /* suspend/resume being performed */
63 struct hdac_widget_tree *widgets;
66 /* device/driver type used for matching */
77 #define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev)
79 int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
80 const char *name, unsigned int addr);
81 void snd_hdac_device_exit(struct hdac_device *dev);
82 int snd_hdac_device_register(struct hdac_device *codec);
83 void snd_hdac_device_unregister(struct hdac_device *codec);
85 int snd_hdac_refresh_widgets(struct hdac_device *codec);
87 unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
88 unsigned int verb, unsigned int parm);
89 int snd_hdac_exec_verb(struct hdac_device *codec, unsigned int cmd,
90 unsigned int flags, unsigned int *res);
91 int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid,
92 unsigned int verb, unsigned int parm, unsigned int *res);
93 int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm);
94 int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid,
95 hda_nid_t *conn_list, int max_conns);
96 int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
100 void snd_hdac_power_up(struct hdac_device *codec);
101 void snd_hdac_power_down(struct hdac_device *codec);
103 static inline void snd_hdac_power_up(struct hdac_device *codec) {}
104 static inline void snd_hdac_power_down(struct hdac_device *codec) {}
108 * HD-audio codec base driver
111 struct device_driver driver;
113 int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
114 void (*unsol_event)(struct hdac_device *dev, unsigned int event);
117 #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
120 * HD-audio bus base driver
122 struct hdac_bus_ops {
123 /* send a single command */
124 int (*command)(struct hdac_bus *bus, unsigned int cmd);
125 /* get a response from the last command */
126 int (*get_response)(struct hdac_bus *bus, unsigned int addr,
130 #define HDA_UNSOL_QUEUE_SIZE 64
134 const struct hdac_bus_ops *ops;
136 /* codec linked list */
137 struct list_head codec_list;
138 unsigned int num_codecs;
140 /* link caddr -> codec */
141 struct hdac_device *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1];
143 /* unsolicited event queue */
144 u32 unsol_queue[HDA_UNSOL_QUEUE_SIZE * 2]; /* ring buffer */
145 unsigned int unsol_rp, unsol_wp;
146 struct work_struct unsol_work;
148 /* bit flags of powered codecs */
149 unsigned long codec_powered;
152 bool sync_write:1; /* sync after verb write */
155 struct mutex cmd_mutex;
158 int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
159 const struct hdac_bus_ops *ops);
160 void snd_hdac_bus_exit(struct hdac_bus *bus);
161 int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
162 unsigned int cmd, unsigned int *res);
163 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
164 unsigned int cmd, unsigned int *res);
165 void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex);
167 int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec);
168 void snd_hdac_bus_remove_device(struct hdac_bus *bus,
169 struct hdac_device *codec);
171 static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
173 set_bit(codec->addr, &codec->bus->codec_powered);
176 static inline void snd_hdac_codec_link_down(struct hdac_device *codec)
178 clear_bit(codec->addr, &codec->bus->codec_powered);
181 #endif /* __SOUND_HDAUDIO_H */