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;
30 unsigned int elem_size;
31 unsigned int alloc_align;
36 * HD-audio codec base device
42 unsigned int addr; /* codec address */
43 struct list_head list; /* list point for bus codec_list */
45 hda_nid_t afg; /* AFG node id */
46 hda_nid_t mfg; /* MFG node id */
49 unsigned int vendor_id;
50 unsigned int subsystem_id;
51 unsigned int revision_id;
52 unsigned int afg_function_id;
53 unsigned int mfg_function_id;
54 unsigned int afg_unsol:1;
55 unsigned int mfg_unsol:1;
57 unsigned int power_caps; /* FG power caps */
59 const char *vendor_name; /* codec vendor name */
60 const char *chip_name; /* codec chip name */
62 /* verb exec op override */
63 int (*exec_verb)(struct hdac_device *dev, unsigned int cmd,
64 unsigned int flags, unsigned int *res);
67 unsigned int num_nodes;
68 hda_nid_t start_nid, end_nid;
71 atomic_t in_pm; /* suspend/resume being performed */
74 struct hdac_widget_tree *widgets;
77 struct regmap *regmap;
78 struct snd_array vendor_verbs;
79 bool lazy_cache:1; /* don't wake up for writes */
80 bool caps_overwriting:1; /* caps overwrite being in process */
83 /* device/driver type used for matching */
94 #define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev)
96 int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
97 const char *name, unsigned int addr);
98 void snd_hdac_device_exit(struct hdac_device *dev);
99 int snd_hdac_device_register(struct hdac_device *codec);
100 void snd_hdac_device_unregister(struct hdac_device *codec);
102 int snd_hdac_refresh_widgets(struct hdac_device *codec);
104 unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
105 unsigned int verb, unsigned int parm);
106 int snd_hdac_exec_verb(struct hdac_device *codec, unsigned int cmd,
107 unsigned int flags, unsigned int *res);
108 int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid,
109 unsigned int verb, unsigned int parm, unsigned int *res);
110 int _snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm,
112 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid,
114 int snd_hdac_override_parm(struct hdac_device *codec, hda_nid_t nid,
115 unsigned int parm, unsigned int val);
116 int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid,
117 hda_nid_t *conn_list, int max_conns);
118 int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
119 hda_nid_t *start_id);
122 * snd_hdac_read_parm - read a codec parameter
123 * @codec: the codec object
124 * @nid: NID to read a parameter
125 * @parm: parameter to read
127 * Returns -1 for error. If you need to distinguish the error more
128 * strictly, use _snd_hdac_read_parm() directly.
130 static inline int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid,
135 return _snd_hdac_read_parm(codec, nid, parm, &val) < 0 ? -1 : val;
139 void snd_hdac_power_up(struct hdac_device *codec);
140 void snd_hdac_power_down(struct hdac_device *codec);
142 static inline void snd_hdac_power_up(struct hdac_device *codec) {}
143 static inline void snd_hdac_power_down(struct hdac_device *codec) {}
147 * HD-audio codec base driver
150 struct device_driver driver;
152 int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
153 void (*unsol_event)(struct hdac_device *dev, unsigned int event);
156 #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
159 * HD-audio bus base driver
161 struct hdac_bus_ops {
162 /* send a single command */
163 int (*command)(struct hdac_bus *bus, unsigned int cmd);
164 /* get a response from the last command */
165 int (*get_response)(struct hdac_bus *bus, unsigned int addr,
169 #define HDA_UNSOL_QUEUE_SIZE 64
173 const struct hdac_bus_ops *ops;
175 /* codec linked list */
176 struct list_head codec_list;
177 unsigned int num_codecs;
179 /* link caddr -> codec */
180 struct hdac_device *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1];
182 /* unsolicited event queue */
183 u32 unsol_queue[HDA_UNSOL_QUEUE_SIZE * 2]; /* ring buffer */
184 unsigned int unsol_rp, unsol_wp;
185 struct work_struct unsol_work;
187 /* bit flags of powered codecs */
188 unsigned long codec_powered;
191 bool sync_write:1; /* sync after verb write */
194 struct mutex cmd_mutex;
197 int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
198 const struct hdac_bus_ops *ops);
199 void snd_hdac_bus_exit(struct hdac_bus *bus);
200 int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
201 unsigned int cmd, unsigned int *res);
202 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
203 unsigned int cmd, unsigned int *res);
204 void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex);
206 int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec);
207 void snd_hdac_bus_remove_device(struct hdac_bus *bus,
208 struct hdac_device *codec);
210 static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
212 set_bit(codec->addr, &codec->bus->codec_powered);
215 static inline void snd_hdac_codec_link_down(struct hdac_device *codec)
217 clear_bit(codec->addr, &codec->bus->codec_powered);
221 * generic array helpers
223 void *snd_array_new(struct snd_array *array);
224 void snd_array_free(struct snd_array *array);
225 static inline void snd_array_init(struct snd_array *array, unsigned int size,
228 array->elem_size = size;
229 array->alloc_align = align;
232 static inline void *snd_array_elem(struct snd_array *array, unsigned int idx)
234 return array->list + idx * array->elem_size;
237 static inline unsigned int snd_array_index(struct snd_array *array, void *ptr)
239 return (unsigned long)(ptr - array->list) / array->elem_size;
242 #endif /* __SOUND_HDAUDIO_H */