Lines Matching refs:bus
3 * HD-audio core bus driver
24 * snd_hdac_bus_init - initialize a HD-audio bas bus
25 * @bus: the pointer to bus object
27 * @ops: bus verb operators
31 int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
34 memset(bus, 0, sizeof(*bus));
35 bus->dev = dev;
37 bus->ops = ops;
39 bus->ops = &default_ops;
40 bus->dma_type = SNDRV_DMA_TYPE_DEV;
41 INIT_LIST_HEAD(&bus->stream_list);
42 INIT_LIST_HEAD(&bus->codec_list);
43 INIT_WORK(&bus->unsol_work, snd_hdac_bus_process_unsol_events);
44 spin_lock_init(&bus->reg_lock);
45 mutex_init(&bus->cmd_mutex);
46 mutex_init(&bus->lock);
47 INIT_LIST_HEAD(&bus->hlink_list);
48 init_waitqueue_head(&bus->rirb_wq);
49 bus->irq = -1;
60 bus->sdo_limit = 8;
67 * snd_hdac_bus_exit - clean up a HD-audio bas bus
68 * @bus: the pointer to bus object
70 void snd_hdac_bus_exit(struct hdac_bus *bus)
72 WARN_ON(!list_empty(&bus->stream_list));
73 WARN_ON(!list_empty(&bus->codec_list));
74 cancel_work_sync(&bus->unsol_work);
79 * snd_hdac_bus_exec_verb - execute a HD-audio verb on the given bus
80 * @bus: bus object
87 int snd_hdac_bus_exec_verb(struct hdac_bus *bus, unsigned int addr,
92 mutex_lock(&bus->cmd_mutex);
93 err = snd_hdac_bus_exec_verb_unlocked(bus, addr, cmd, res);
94 mutex_unlock(&bus->cmd_mutex);
100 * @bus: bus object
107 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
112 struct azx *chip = bus_to_azx(bus);
119 else if (bus->sync_write)
122 err = bus->ops->command(bus, cmd);
124 trace_hda_send_cmd(bus, cmd);
125 err = bus->ops->command(bus, cmd);
129 err = bus->ops->get_response(bus, addr, &tmp);
134 err = bus->ops->get_response(bus, addr, res);
135 trace_hda_get_response(bus, addr, *res);
143 * @bus: the BUS
151 void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex)
155 if (!bus)
158 trace_hda_unsol_event(bus, res, res_ex);
159 wp = (bus->unsol_wp + 1) % HDA_UNSOL_QUEUE_SIZE;
160 bus->unsol_wp = wp;
163 bus->unsol_queue[wp] = res;
164 bus->unsol_queue[wp + 1] = res_ex;
166 schedule_work(&bus->unsol_work);
174 struct hdac_bus *bus = container_of(work, struct hdac_bus, unsol_work);
179 spin_lock_irq(&bus->reg_lock);
180 while (bus->unsol_rp != bus->unsol_wp) {
181 rp = (bus->unsol_rp + 1) % HDA_UNSOL_QUEUE_SIZE;
182 bus->unsol_rp = rp;
184 res = bus->unsol_queue[rp];
185 caddr = bus->unsol_queue[rp + 1];
188 codec = bus->caddr_tbl[caddr & 0x0f];
191 spin_unlock_irq(&bus->reg_lock);
195 spin_lock_irq(&bus->reg_lock);
197 spin_unlock_irq(&bus->reg_lock);
201 * snd_hdac_bus_add_device - Add a codec to bus
202 * @bus: HDA core bus
205 * Adds the given codec to the list in the bus. The caddr_tbl array
209 int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec)
211 if (bus->caddr_tbl[codec->addr]) {
212 dev_err(bus->dev, "address 0x%x is already occupied\n",
217 list_add_tail(&codec->list, &bus->codec_list);
218 bus->caddr_tbl[codec->addr] = codec;
219 set_bit(codec->addr, &bus->codec_powered);
220 bus->num_codecs++;
225 * snd_hdac_bus_remove_device - Remove a codec from bus
226 * @bus: HDA core bus
229 void snd_hdac_bus_remove_device(struct hdac_bus *bus,
232 WARN_ON(bus != codec->bus);
236 bus->caddr_tbl[codec->addr] = NULL;
237 clear_bit(codec->addr, &bus->codec_powered);
238 bus->num_codecs--;
239 flush_work(&bus->unsol_work);