xref: /openbmc/linux/include/sound/hdaudio.h (revision 034f90b3)
1 /*
2  * HD-audio core stuff
3  */
4 
5 #ifndef __SOUND_HDAUDIO_H
6 #define __SOUND_HDAUDIO_H
7 
8 #include <linux/device.h>
9 #include <sound/hda_verbs.h>
10 
11 /* codec node id */
12 typedef u16 hda_nid_t;
13 
14 struct hdac_bus;
15 struct hdac_device;
16 struct hdac_driver;
17 struct hdac_widget_tree;
18 
19 /*
20  * exported bus type
21  */
22 extern struct bus_type snd_hda_bus_type;
23 
24 /*
25  * HD-audio codec base device
26  */
27 struct hdac_device {
28 	struct device dev;
29 	int type;
30 	struct hdac_bus *bus;
31 	unsigned int addr;		/* codec address */
32 	struct list_head list;		/* list point for bus codec_list */
33 
34 	hda_nid_t afg;			/* AFG node id */
35 	hda_nid_t mfg;			/* MFG node id */
36 
37 	/* ids */
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;
45 
46 	unsigned int power_caps;	/* FG power caps */
47 
48 	const char *vendor_name;	/* codec vendor name */
49 	const char *chip_name;		/* codec chip name */
50 
51 	/* verb exec op override */
52 	int (*exec_verb)(struct hdac_device *dev, unsigned int cmd,
53 			 unsigned int flags, unsigned int *res);
54 
55 	/* widgets */
56 	unsigned int num_nodes;
57 	hda_nid_t start_nid, end_nid;
58 
59 	/* misc flags */
60 	atomic_t in_pm;		/* suspend/resume being performed */
61 
62 	/* sysfs */
63 	struct hdac_widget_tree *widgets;
64 };
65 
66 /* device/driver type used for matching */
67 enum {
68 	HDA_DEV_CORE,
69 	HDA_DEV_LEGACY,
70 };
71 
72 /* direction */
73 enum {
74 	HDA_INPUT, HDA_OUTPUT
75 };
76 
77 #define dev_to_hdac_dev(_dev)	container_of(_dev, struct hdac_device, dev)
78 
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);
84 
85 int snd_hdac_refresh_widgets(struct hdac_device *codec);
86 
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,
97 			   hda_nid_t *start_id);
98 
99 #ifdef CONFIG_PM
100 void snd_hdac_power_up(struct hdac_device *codec);
101 void snd_hdac_power_down(struct hdac_device *codec);
102 #else
103 static inline void snd_hdac_power_up(struct hdac_device *codec) {}
104 static inline void snd_hdac_power_down(struct hdac_device *codec) {}
105 #endif
106 
107 /*
108  * HD-audio codec base driver
109  */
110 struct hdac_driver {
111 	struct device_driver driver;
112 	int type;
113 	int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
114 	void (*unsol_event)(struct hdac_device *dev, unsigned int event);
115 };
116 
117 #define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
118 
119 /*
120  * HD-audio bus base driver
121  */
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,
127 			    unsigned int *res);
128 };
129 
130 #define HDA_UNSOL_QUEUE_SIZE	64
131 
132 struct hdac_bus {
133 	struct device *dev;
134 	const struct hdac_bus_ops *ops;
135 
136 	/* codec linked list */
137 	struct list_head codec_list;
138 	unsigned int num_codecs;
139 
140 	/* link caddr -> codec */
141 	struct hdac_device *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1];
142 
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;
147 
148 	/* bit flags of powered codecs */
149 	unsigned long codec_powered;
150 
151 	/* flags */
152 	bool sync_write:1;		/* sync after verb write */
153 
154 	/* locks */
155 	struct mutex cmd_mutex;
156 };
157 
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);
166 
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);
170 
171 static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
172 {
173 	set_bit(codec->addr, &codec->bus->codec_powered);
174 }
175 
176 static inline void snd_hdac_codec_link_down(struct hdac_device *codec)
177 {
178 	clear_bit(codec->addr, &codec->bus->codec_powered);
179 }
180 
181 #endif /* __SOUND_HDAUDIO_H */
182