/* * Send and receive a verb */ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, unsigned int *res) { struct hda_bus *bus = codec->bus; int err; if (cmd == ~0) return -1; if (res) *res = -1; again: snd_hda_power_up(codec); mutex_lock(&bus->cmd_mutex); err = bus->ops.command(bus, cmd); if (!err && res) *res = bus->ops.get_response(bus, codec->addr); mutex_unlock(&bus->cmd_mutex); snd_hda_power_down(codec); if (res && *res == -1 && bus->rirb_error) { if (bus->response_reset) { snd_printd("hda_codec: resetting BUS due to " "fatal communication error\n"); bus->ops.bus_reset(bus); } goto again; } /* clear reset-flag when the communication gets recovered */ if (!err) bus->response_reset = 0; return err; }
static void turn_off_beep(struct hda_beep *beep) { cancel_work_sync(&beep->beep_work); if (beep->playing) { /* turn off beep */ snd_hda_codec_write(beep->codec, beep->nid, 0, AC_VERB_SET_BEEP_CONTROL, 0); beep->playing = 0; snd_hda_power_down(beep->codec); } }
/* generate or stop tone */ static void generate_tone(struct hda_beep *beep, int tone) { struct hda_codec *codec = beep->codec; if (tone && !beep->playing) { snd_hda_power_up(codec); if (beep->power_hook) beep->power_hook(beep, true); beep->playing = 1; } snd_hda_codec_write(codec, beep->nid, 0, AC_VERB_SET_BEEP_CONTROL, tone); if (!tone && beep->playing) { beep->playing = 0; if (beep->power_hook) beep->power_hook(beep, false); snd_hda_power_down(codec); } }
static void snd_hda_generate_beep(struct work_struct *work) { struct hda_beep *beep = container_of(work, struct hda_beep, beep_work); struct hda_codec *codec = beep->codec; int tone; if (!beep->enabled) return; tone = beep->tone; if (tone && !beep->playing) { snd_hda_power_up(codec); beep->playing = 1; } /* generate tone */ snd_hda_codec_write(codec, beep->nid, 0, AC_VERB_SET_BEEP_CONTROL, tone); if (!tone && beep->playing) { beep->playing = 0; snd_hda_power_down(codec); } }
/* * The codecs were powered up in snd_hda_codec_new(). * Now all initialization done, so turn them down if possible */ static void power_down_all_codecs(struct azx *chip) { struct hda_codec *codec; list_for_each_entry(codec, &chip->bus->codec_list, list) snd_hda_power_down(codec); }