blob: 675614dc2b8803ec0a2f76b3099bbdc2afa19f8d [file] [log] [blame]
Takashi Iwaie3d280f2015-02-17 21:46:37 +01001/*
2 * HD-audio core stuff
3 */
4
5#ifndef __SOUND_HDAUDIO_H
6#define __SOUND_HDAUDIO_H
7
8#include <linux/device.h>
Takashi Iwaid068ebc2015-03-02 23:22:59 +01009#include <sound/hda_verbs.h>
10
Takashi Iwai7639a062015-03-03 10:07:24 +010011/* codec node id */
12typedef u16 hda_nid_t;
13
Takashi Iwaid068ebc2015-03-02 23:22:59 +010014struct hdac_bus;
15struct hdac_device;
16struct hdac_driver;
Takashi Iwai3256be62015-02-24 14:59:42 +010017struct hdac_widget_tree;
Takashi Iwaie3d280f2015-02-17 21:46:37 +010018
19/*
20 * exported bus type
21 */
22extern struct bus_type snd_hda_bus_type;
23
24/*
25 * HD-audio codec base device
26 */
27struct hdac_device {
28 struct device dev;
29 int type;
Takashi Iwaid068ebc2015-03-02 23:22:59 +010030 struct hdac_bus *bus;
31 unsigned int addr; /* codec address */
32 struct list_head list; /* list point for bus codec_list */
Takashi Iwai7639a062015-03-03 10:07:24 +010033
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
Takashi Iwai058524482015-03-03 15:40:08 +010051 /* verb exec op override */
52 int (*exec_verb)(struct hdac_device *dev, unsigned int cmd,
53 unsigned int flags, unsigned int *res);
54
Takashi Iwai7639a062015-03-03 10:07:24 +010055 /* 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 */
Takashi Iwai3256be62015-02-24 14:59:42 +010061
62 /* sysfs */
63 struct hdac_widget_tree *widgets;
Takashi Iwaie3d280f2015-02-17 21:46:37 +010064};
65
66/* device/driver type used for matching */
67enum {
68 HDA_DEV_CORE,
69 HDA_DEV_LEGACY,
70};
71
Takashi Iwai7639a062015-03-03 10:07:24 +010072/* direction */
73enum {
74 HDA_INPUT, HDA_OUTPUT
75};
76
Takashi Iwaie3d280f2015-02-17 21:46:37 +010077#define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev)
78
Takashi Iwai7639a062015-03-03 10:07:24 +010079int snd_hdac_device_init(struct hdac_device *dev, struct hdac_bus *bus,
80 const char *name, unsigned int addr);
81void snd_hdac_device_exit(struct hdac_device *dev);
Takashi Iwai3256be62015-02-24 14:59:42 +010082int snd_hdac_device_register(struct hdac_device *codec);
83void snd_hdac_device_unregister(struct hdac_device *codec);
Takashi Iwai7639a062015-03-03 10:07:24 +010084
85int snd_hdac_refresh_widgets(struct hdac_device *codec);
86
87unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
88 unsigned int verb, unsigned int parm);
Takashi Iwai058524482015-03-03 15:40:08 +010089int snd_hdac_exec_verb(struct hdac_device *codec, unsigned int cmd,
90 unsigned int flags, unsigned int *res);
Takashi Iwai7639a062015-03-03 10:07:24 +010091int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid,
92 unsigned int verb, unsigned int parm, unsigned int *res);
93int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm);
94int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid,
95 hda_nid_t *conn_list, int max_conns);
96int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
97 hda_nid_t *start_id);
98
99#ifdef CONFIG_PM
100void snd_hdac_power_up(struct hdac_device *codec);
101void snd_hdac_power_down(struct hdac_device *codec);
102#else
103static inline void snd_hdac_power_up(struct hdac_device *codec) {}
104static inline void snd_hdac_power_down(struct hdac_device *codec) {}
105#endif
106
Takashi Iwaie3d280f2015-02-17 21:46:37 +0100107/*
108 * HD-audio codec base driver
109 */
110struct hdac_driver {
111 struct device_driver driver;
112 int type;
113 int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
Takashi Iwaid068ebc2015-03-02 23:22:59 +0100114 void (*unsol_event)(struct hdac_device *dev, unsigned int event);
Takashi Iwaie3d280f2015-02-17 21:46:37 +0100115};
116
117#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
118
Takashi Iwaid068ebc2015-03-02 23:22:59 +0100119/*
120 * HD-audio bus base driver
121 */
122struct 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
132struct 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
158int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
159 const struct hdac_bus_ops *ops);
160void snd_hdac_bus_exit(struct hdac_bus *bus);
161int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
162 unsigned int cmd, unsigned int *res);
163int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
164 unsigned int cmd, unsigned int *res);
165void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex);
166
167int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec);
168void snd_hdac_bus_remove_device(struct hdac_bus *bus,
169 struct hdac_device *codec);
170
Takashi Iwai7639a062015-03-03 10:07:24 +0100171static inline void snd_hdac_codec_link_up(struct hdac_device *codec)
172{
173 set_bit(codec->addr, &codec->bus->codec_powered);
174}
175
176static inline void snd_hdac_codec_link_down(struct hdac_device *codec)
177{
178 clear_bit(codec->addr, &codec->bus->codec_powered);
179}
180
Takashi Iwaie3d280f2015-02-17 21:46:37 +0100181#endif /* __SOUND_HDAUDIO_H */