package main

import (
	"fmt"
	"sort"
)

type azalia struct {
}

func (i azalia) Scan(ctx Context, addr PCIDevData) {
	az := Create(ctx, "hda_verb.c")
	defer az.Close()

	Add_gpl(az)
	az.WriteString(
		`#include <device/azalia_device.h>

const u32 cim_verb_data[] = {
`)

	for _, codec := range ctx.InfoSource.GetAzaliaCodecs() {
		fmt.Fprintf(az, "\t0x%08x, /* Codec Vendor / Device ID: %s */\n",
			codec.VendorID, codec.Name)
		fmt.Fprintf(az, "\t0x%08x, /* Subsystem ID */\n",
			codec.SubsystemID)
		fmt.Fprintf(az, "\n\t0x%08x, /* Number of 4 dword sets */\n",
			len(codec.PinConfig)+1)
		fmt.Fprintf(az, "\t/* NID 0x01: Subsystem ID.  */\n")
		fmt.Fprintf(az, "\tAZALIA_SUBVENDOR(0x%x, 0x%08x),\n",
			codec.CodecNo, codec.SubsystemID)

		keys := []int{}
		for nid, _ := range codec.PinConfig {
			keys = append(keys, nid)
		}

		sort.Ints(keys)

		for _, nid := range keys {
			fmt.Fprintf(az, "\n\t/* NID 0x%02x.  */\n", nid)
			fmt.Fprintf(az, "\tAZALIA_PIN_CFG(0x%x, 0x%02x, 0x%08x),\n",
				codec.CodecNo, nid, codec.PinConfig[nid])
		}
	}

	az.WriteString(
		`};

const u32 pc_beep_verbs[0] = {};

AZALIA_ARRAY_SIZES;
`)

	PutPCIDev(addr, "Audio controller")
}

func init() {
	/* I82801GX/I945 */
	RegisterPCI(0x8086, 0x27d8, azalia{})
	/* BD82X6X/sandybridge */
	RegisterPCI(0x8086, 0x1c20, azalia{})
	/* C216/ivybridge */
	RegisterPCI(0x8086, 0x1e20, azalia{})
}
