Lines Matching defs: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,
90 guard(mutex)(&bus->cmd_mutex);
91 return snd_hdac_bus_exec_verb_unlocked(bus, addr, cmd, res);
96 * @bus: bus object
103 int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
114 else if (bus->sync_write)
117 trace_hda_send_cmd(bus, cmd);
118 err = bus->ops->command(bus, cmd);
122 err = bus->ops->get_response(bus, addr, &tmp);
127 err = bus->ops->get_response(bus, addr, res);
128 trace_hda_get_response(bus, addr, *res);
136 * @bus: the BUS
144 void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex)
148 if (!bus)
151 trace_hda_unsol_event(bus, res, res_ex);
152 wp = (bus->unsol_wp + 1) % HDA_UNSOL_QUEUE_SIZE;
153 bus->unsol_wp = wp;
156 bus->unsol_queue[wp] = res;
157 bus->unsol_queue[wp + 1] = res_ex;
159 schedule_work(&bus->unsol_work);
167 struct hdac_bus *bus = container_of(work, struct hdac_bus, unsol_work);
172 spin_lock_irq(&bus->reg_lock);
173 while (bus->unsol_rp != bus->unsol_wp) {
174 rp = (bus->unsol_rp + 1) % HDA_UNSOL_QUEUE_SIZE;
175 bus->unsol_rp = rp;
177 res = bus->unsol_queue[rp];
178 caddr = bus->unsol_queue[rp + 1];
181 codec = bus->caddr_tbl[caddr & 0x0f];
184 spin_unlock_irq(&bus->reg_lock);
188 spin_lock_irq(&bus->reg_lock);
190 spin_unlock_irq(&bus->reg_lock);
194 * snd_hdac_bus_add_device - Add a codec to bus
195 * @bus: HDA core bus
198 * Adds the given codec to the list in the bus. The caddr_tbl array
202 int snd_hdac_bus_add_device(struct hdac_bus *bus, struct hdac_device *codec)
204 if (bus->caddr_tbl[codec->addr]) {
205 dev_err(bus->dev, "address 0x%x is already occupied\n",
210 list_add_tail(&codec->list, &bus->codec_list);
211 bus->caddr_tbl[codec->addr] = codec;
212 set_bit(codec->addr, &bus->codec_powered);
213 bus->num_codecs++;
218 * snd_hdac_bus_remove_device - Remove a codec from bus
219 * @bus: HDA core bus
222 void snd_hdac_bus_remove_device(struct hdac_bus *bus,
225 WARN_ON(bus != codec->bus);
229 bus->caddr_tbl[codec->addr] = NULL;
230 clear_bit(codec->addr, &bus->codec_powered);
231 bus->num_codecs--;
232 flush_work(&bus->unsol_work);
267 struct hdac_bus *bus = codec->bus;
269 if (bus->ops->link_power)
270 bus->ops->link_power(codec, true);
278 struct hdac_bus *bus = codec->bus;
280 if (bus->ops->link_power)
281 bus->ops->link_power(codec, false);