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 */
81 bool cache_coef
:1; /* cache COEF read/write too */
84 /* device/driver type used for matching */
95 #define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev)
97 int snd_hdac_device_init(struct hdac_device
*dev
, struct hdac_bus
*bus
,
98 const char *name
, unsigned int addr
);
99 void snd_hdac_device_exit(struct hdac_device
*dev
);
100 int snd_hdac_device_register(struct hdac_device
*codec
);
101 void snd_hdac_device_unregister(struct hdac_device
*codec
);
103 int snd_hdac_refresh_widgets(struct hdac_device
*codec
);
105 unsigned int snd_hdac_make_cmd(struct hdac_device
*codec
, hda_nid_t nid
,
106 unsigned int verb
, unsigned int parm
);
107 int snd_hdac_exec_verb(struct hdac_device
*codec
, unsigned int cmd
,
108 unsigned int flags
, unsigned int *res
);
109 int snd_hdac_read(struct hdac_device
*codec
, hda_nid_t nid
,
110 unsigned int verb
, unsigned int parm
, unsigned int *res
);
111 int _snd_hdac_read_parm(struct hdac_device
*codec
, hda_nid_t nid
, int parm
,
113 int snd_hdac_read_parm_uncached(struct hdac_device
*codec
, hda_nid_t nid
,
115 int snd_hdac_override_parm(struct hdac_device
*codec
, hda_nid_t nid
,
116 unsigned int parm
, unsigned int val
);
117 int snd_hdac_get_connections(struct hdac_device
*codec
, hda_nid_t nid
,
118 hda_nid_t
*conn_list
, int max_conns
);
119 int snd_hdac_get_sub_nodes(struct hdac_device
*codec
, hda_nid_t nid
,
120 hda_nid_t
*start_id
);
123 * snd_hdac_read_parm - read a codec parameter
124 * @codec: the codec object
125 * @nid: NID to read a parameter
126 * @parm: parameter to read
128 * Returns -1 for error. If you need to distinguish the error more
129 * strictly, use _snd_hdac_read_parm() directly.
131 static inline int snd_hdac_read_parm(struct hdac_device
*codec
, hda_nid_t nid
,
136 return _snd_hdac_read_parm(codec
, nid
, parm
, &val
) < 0 ? -1 : val
;
140 void snd_hdac_power_up(struct hdac_device
*codec
);
141 void snd_hdac_power_down(struct hdac_device
*codec
);
142 void snd_hdac_power_up_pm(struct hdac_device
*codec
);
143 void snd_hdac_power_down_pm(struct hdac_device
*codec
);
145 static inline void snd_hdac_power_up(struct hdac_device
*codec
) {}
146 static inline void snd_hdac_power_down(struct hdac_device
*codec
) {}
147 static inline void snd_hdac_power_up_pm(struct hdac_device
*codec
) {}
148 static inline void snd_hdac_power_down_pm(struct hdac_device
*codec
) {}
152 * HD-audio codec base driver
155 struct device_driver driver
;
157 int (*match
)(struct hdac_device
*dev
, struct hdac_driver
*drv
);
158 void (*unsol_event
)(struct hdac_device
*dev
, unsigned int event
);
161 #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
164 * HD-audio bus base driver
166 struct hdac_bus_ops
{
167 /* send a single command */
168 int (*command
)(struct hdac_bus
*bus
, unsigned int cmd
);
169 /* get a response from the last command */
170 int (*get_response
)(struct hdac_bus
*bus
, unsigned int addr
,
174 #define HDA_UNSOL_QUEUE_SIZE 64
178 const struct hdac_bus_ops
*ops
;
180 /* codec linked list */
181 struct list_head codec_list
;
182 unsigned int num_codecs
;
184 /* link caddr -> codec */
185 struct hdac_device
*caddr_tbl
[HDA_MAX_CODEC_ADDRESS
+ 1];
187 /* unsolicited event queue */
188 u32 unsol_queue
[HDA_UNSOL_QUEUE_SIZE
* 2]; /* ring buffer */
189 unsigned int unsol_rp
, unsol_wp
;
190 struct work_struct unsol_work
;
192 /* bit flags of powered codecs */
193 unsigned long codec_powered
;
196 bool sync_write
:1; /* sync after verb write */
199 struct mutex cmd_mutex
;
202 int snd_hdac_bus_init(struct hdac_bus
*bus
, struct device
*dev
,
203 const struct hdac_bus_ops
*ops
);
204 void snd_hdac_bus_exit(struct hdac_bus
*bus
);
205 int snd_hdac_bus_exec_verb(struct hdac_bus
*bus
, unsigned int addr
,
206 unsigned int cmd
, unsigned int *res
);
207 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus
*bus
, unsigned int addr
,
208 unsigned int cmd
, unsigned int *res
);
209 void snd_hdac_bus_queue_event(struct hdac_bus
*bus
, u32 res
, u32 res_ex
);
211 int snd_hdac_bus_add_device(struct hdac_bus
*bus
, struct hdac_device
*codec
);
212 void snd_hdac_bus_remove_device(struct hdac_bus
*bus
,
213 struct hdac_device
*codec
);
215 static inline void snd_hdac_codec_link_up(struct hdac_device
*codec
)
217 set_bit(codec
->addr
, &codec
->bus
->codec_powered
);
220 static inline void snd_hdac_codec_link_down(struct hdac_device
*codec
)
222 clear_bit(codec
->addr
, &codec
->bus
->codec_powered
);
226 * generic array helpers
228 void *snd_array_new(struct snd_array
*array
);
229 void snd_array_free(struct snd_array
*array
);
230 static inline void snd_array_init(struct snd_array
*array
, unsigned int size
,
233 array
->elem_size
= size
;
234 array
->alloc_align
= align
;
237 static inline void *snd_array_elem(struct snd_array
*array
, unsigned int idx
)
239 return array
->list
+ idx
* array
->elem_size
;
242 static inline unsigned int snd_array_index(struct snd_array
*array
, void *ptr
)
244 return (unsigned long)(ptr
- array
->list
) / array
->elem_size
;
247 #endif /* __SOUND_HDAUDIO_H */