# SPDX-License-Identifier: MIT

from m1n1.utils import RegMap
from m1n1.trace.i2c import I2CTracer, I2CRegMapTracer
from m1n1.hw.codecs import *

hv.p.hv_set_time_stealing(0, 1)

class SN012776Tracer(I2CRegMapTracer):
    REGMAP = SN012776Regs
    ADDRESSING = (1, 1)

class TAS5770Tracer(I2CRegMapTracer):
    REGMAP = TAS5770Regs
    ADDRESSING = (1, 1)

class CS42L84Tracer(I2CRegMapTracer):
    REGMAP = CS42L84Regs
    ADDRESSING = (0, 2)

class SSM3515Tracer(I2CRegMapTracer):
    REGMAP = SSM3515Regs
    ADDRESSING = (0, 1)

i2c_tracers = {}

for node in hv.adt["/arm-io"]:
    if not node.name.startswith("i2c"):
        continue

    n = int(node.name[3:])
    i2c_tracers[n] = bus = I2CTracer(hv, f"/arm-io/{node.name}")

    for devnode in node:
        if "compatible" not in devnode._properties: # thanks Apple
            continue

        dcls = {
            "audio-control,tas5770": TAS5770Tracer,
            "audio-control,sn012776": SN012776Tracer,
            "audio-control,cs42l84": CS42L84Tracer,
            "audio-control,ssm3515": SSM3515Tracer,
        }.get(devnode.compatible[0], None)
        if dcls:
            bus.add_device(
                devnode.reg[0] & 0xff,
                dcls(name=devnode.name)
            )

    bus.start()