static void codecs_init(u8 *base, u32 codec_mask) { int i; /* Can support up to 4 codecs */ for (i = 3; i >= 0; i--) { if (codec_mask & (1 << i)) hda_codec_init(base, i, cim_verb_data_size, cim_verb_data); } if (pc_beep_verbs_size) hda_codec_write(base, pc_beep_verbs_size, pc_beep_verbs); }
/** * Initialize codec, then find the verb table and write it */ int hda_codec_init(u32 base, int addr, int verb_size, const u32 *verb_data) { const u32 *verb; u32 reg32, size; int rc; printk(BIOS_DEBUG, "HDA: Initializing codec #%d\n", addr); if (!verb_size || !verb_data) { printk(BIOS_DEBUG, "HDA: No verb list!\n"); return -1; } /* 1 */ if (hda_wait_for_ready(base) < 0) { printk(BIOS_DEBUG, " codec not ready.\n"); return -1; } reg32 = (addr << 28) | 0x000f0000; write32(base + HDA_IC_REG, reg32); if (hda_wait_for_valid(base) < 0) { printk(BIOS_DEBUG, " codec not valid.\n"); return -1; } /* 2 */ reg32 = read32(base + HDA_IR_REG); printk(BIOS_DEBUG, "HDA: codec viddid: %08x\n", reg32); size = hda_find_verb(verb_size, verb_data, reg32, &verb); if (!size) { printk(BIOS_DEBUG, "HDA: No verb table entry found\n"); return -1; } /* 3 */ rc = hda_codec_write(base, size, verb); if (rc < 0) printk(BIOS_DEBUG, "HDA: verb not loaded\n"); else printk(BIOS_DEBUG, "HDA: verb loaded.\n"); return rc; }