#ifndef AUDIO1575_H
#define AUDIO1575_H
#define M1575_NAME "audio1575"
#define M1575_MOD_NAME "M1575 audio driver"
#define M1575_AUDIO_IO_SPACE (1)
#define M1575_LOOP_CTR (100)
#define M1575_PLAY (0)
#define M1575_REC (1)
#define M1575_BD_NUMS (32)
#define M1575_NUM_PORTS (2)
#define M1575_MOD_SIZE (16)
#define M1575_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
#define M1575_PCIPMR_REG 0x42
#define M1575_PCIPMCSR_REG 0x44
#define M1575_PCISCCR_REG 0x48
#define M1575_PCIAPMUCR1_REG 0x54
#define M1575_PCISCRR_REG 0x57
#define M1575_PCIMISC_REG 0x58
#define M1575_PCIGCC_REG 0x59
#define M1575_PCIACD_REG 0x5C
#define M1575_PCIMISC_REG 0x58
#define M1575_PCIGCLK_REG 0x59
#define M1575_PCIMSICTRL_REG 0x62
#define M1575_PCIMSIADDR_REG 0x64
#define M1575_PCIMSIDATA_REG 0x68
#define M1575_PCIMSIMASK_REG 0x6C
#define M1575_PCIMSIPEND_REG 0x70
#define M1575_PCIACD_CLKDET 0x01
#define M1575_PCIMISC_INTENB 0x40
#define M1575_PCIINT_LINE 0x05
#define M1575_SCR_REG 0x00
#define M1575_SSR_REG 0x04
#define M1575_DMACR_REG 0x08
#define M1575_FIFOCR1_REG 0x0C
#define M1575_INTFCR_REG 0x10
#define M1575_INTRCR_REG 0x14
#define M1575_INTRSR_REG 0x18
#define M1575_FIFOCR2_REG 0x1C
#define M1575_CPR_REG 0x20
#define M1575_SPR_REG 0x24
#define M1575_FIFOCR3_REG 0x2C
#define M1575_TTSR_REG 0x30
#define M1575_RTSR_REG 0x34
#define M1575_CSPSR_REG 0x38
#define M1575_CASR_REG 0x3C
#define M1575_PCMIBDBAR_REG 0x40
#define M1575_PCMICIV_REG 0x44
#define M1575_PCMILVIV_REG 0x45
#define M1575_PCMISR_REG 0x46
#define M1575_PCMIPICB_REG 0x48
#define M1575_PCMICR_REG 0x4B
#define M1575_PCMOBDBAR_REG 0x50
#define M1575_PCMOCIV_REG 0x54
#define M1575_PCMOLVIV_REG 0x55
#define M1575_PCMOSR_REG 0x56
#define M1575_PCMOPICB_REG 0x58
#define M1575_PCMOCR_REG 0x5B
#define M1575_MICIBDBAR_REG 0x60
#define M1575_MICICIV_REG 0x64
#define M1575_MICILVIV_REG 0x65
#define M1575_MICISR_REG 0x66
#define M1575_MICIPICB_REG 0x68
#define M1575_MICICR_REG 0x6B
#define M1575_CSPOBDBAR_REG 0x70
#define M1575_CSPOCIV_REG 0x74
#define M1575_CSPOLVIV_REG 0x75
#define M1575_CSPOSR_REG 0x76
#define M1575_CSPOPICB_REG 0x78
#define M1575_CSPOCR_REG 0x7B
#define M1575_PCMI2BDBAR_REG 0xd0
#define M1575_PCMI2CIV_REG 0xd4
#define M1575_PCMI2LVIV_REG 0xd5
#define M1575_PCMI2SR_REG 0xd6
#define M1575_PCMI2PICB_REG 0xd8
#define M1575_PCMI2CR_REG 0xdB
#define M1575_MICI2BDBAR_REG 0xe0
#define M1575_MICI2CIV_REG 0xe4
#define M1575_MICI2LVIV_REG 0xe5
#define M1575_MICI2SR_REG 0xe6
#define M1575_MICI2PICB_REG 0xe8
#define M1575_MICI2CR_REG 0xeB
#define M1575_FIFOCR1_CSPORST 0x80000000
#define M1575_FIFOCR1_MICIRST 0x00800000
#define M1575_FIFOCR1_PCMORST 0x00008000
#define M1575_FIFOCR1_PCMIRST 0x00000080
#define M1575_FIFOCR2_SPORST 0x80000000
#define M1575_FIFOCR2_SPIRST 0x00800000
#define M1575_FIFOCR2_LFEORST 0x00008000
#define M1575_FIFOCR2_CENORST 0x00000080
#define M1575_FIFOCR3_PCMI2RST 0x00800000
#define M1575_FIFOCR3_MICI2RST 0x00008000
#define M1575_FIFOCR3_I2SIRST 0x00000080
#define M1575_DMACR_PCMISTART 0x00000001
#define M1575_DMACR_PCMOSTART 0x00000002
#define M1575_DMACR_MICISTART 0x00000004
#define M1575_DMACR_CSPOSTART 0x00000008
#define M1575_DMACR_CENOSTART 0x00000010
#define M1575_DMACR_LFEOSTART 0x00000020
#define M1575_DMACR_SPISTART 0x00000040
#define M1575_DMACR_SPOSTART 0x00000080
#define M1575_DMACR_I2SISTART 0x00000100
#define M1575_DMACR_PCMI2START 0x00000200
#define M1575_DMACR_MICI2START 0x00000400
#define M1575_DMACR_PCMIPAUSE 0x00010000
#define M1575_DMACR_PCMOPAUSE 0x00020000
#define M1575_DMACR_MICIPAUSE 0x00040000
#define M1575_DMACR_CSPOPAUSE 0x00080000
#define M1575_DMACR_CENOPAUSE 0x00100000
#define M1575_DMACR_LFEOPAUSE 0x00200000
#define M1575_DMACR_SPIPAUSE 0x00400000
#define M1575_DMACR_SPOPAUSE 0x00800000
#define M1575_DMACR_I2SIPAUSE 0x01000000
#define M1575_DMACR_PCMI2PAUSE 0x02000000
#define M1575_DMACR_MICI2PAUSE 0x04000000
#define M1575_DMACR_PAUSE_ALL 0x07ff0000
#define M1575_INTRSR_GPIOINTR 0x0000002
#define M1575_INTRSR_SPRINTR 0x0000020
#define M1575_INTRSR_CPRINTR 0x0000080
#define M1575_INTRSR_PCMIINTR 0x0010000
#define M1575_INTRSR_PCMOINTR 0x0020000
#define M1575_INTRSR_MICIINTR 0x0040000
#define M1575_INTRSR_CSPOINTR 0x0080000
#define M1575_INTRSR_CENOINTR 0x0100000
#define M1575_INTRSR_LFEOINTR 0x0200000
#define M1575_INTRSR_SPIINTR 0x0400000
#define M1575_INTRSR_SPOINTR 0x0800000
#define M1575_INTRSR_I2SIINTR 0x1000000
#define M1575_INTRSR_PCMI2INTR 0x2000000
#define M1575_INTRSR_MICI2INTR 0x4000000
#define M1575_INTR_MASK (M1575_INTRSR_GPIOINTR |\
M1575_INTRSR_SPRINTR |\
M1575_INTRSR_CPRINTR |\
M1575_INTRSR_PCMIINTR |\
M1575_INTRSR_PCMOINTR |\
M1575_INTRSR_MICIINTR |\
M1575_INTRSR_CSPOINTR |\
M1575_INTRSR_CENOINTR |\
M1575_INTRSR_LFEOINTR |\
M1575_INTRSR_SPIINTR |\
M1575_INTRSR_SPOINTR |\
M1575_INTRSR_I2SIINTR |\
M1575_INTRSR_PCMI2INTR|\
M1575_INTRSR_MICI2INTR)
#define M1575_UNUSED_INTR_MASK (M1575_INTRSR_GPIOINTR |\
M1575_INTRSR_SPRINTR |\
M1575_INTRSR_CPRINTR |\
M1575_INTRSR_MICIINTR |\
M1575_INTRSR_CSPOINTR |\
M1575_INTRSR_CENOINTR |\
M1575_INTRSR_LFEOINTR |\
M1575_INTRSR_SPIINTR |\
M1575_INTRSR_SPOINTR |\
M1575_INTRSR_I2SIINTR |\
M1575_INTRSR_PCMI2INTR|\
M1575_INTRSR_MICI2INTR)
#define M1575_SR_CLR 0x001e
#define M1575_SR_DMACS 0x0001
#define M1575_CR_IOCE 0x10
#define M1575_CR_RR 0x02
#define M1575_PCMISR_DMACS 0x01
#define M1575_PCMISR_CELV 0x02
#define M1575_PCMISR_LVBCI 0x04
#define M1575_PCMISR_BCIS 0x08
#define M1575_PCMISR_FIFOE 0x10
#define M1575_PCMICR_RR 0x02
#define M1575_PCMICR_LVBIE 0x04
#define M1575_PCMICR_IOCE 0x10
#define M1575_PCMOSR_DMACS 0x01
#define M1575_PCMOSR_CELV 0x02
#define M1575_PCMOSR_LVBCI 0x04
#define M1575_PCMOSR_BCIS 0x08
#define M1575_PCMOSR_FIFOE 0x10
#define M1575_PCMOCR_RR 0x02
#define M1575_PCMOCR_LVBIE 0x04
#define M1575_PCMOCR_IOCE 0x10
#define M1575_MICISR_DMACS 0x01
#define M1575_MICISR_CELV 0x02
#define M1575_MICISR_LVBCI 0x04
#define M1575_MICISR_BCIS 0x08
#define M1575_MICISR_FIFOE 0x10
#define M1575_MICICR_RR 0x02
#define M1575_MICICR_LVBIE 0x04
#define M1575_MICICR_IOCE 0x10
#define M1575_SCR_WARMRST 0x00000001
#define M1575_SCR_COLDRST 0x00000002
#define M1575_SCR_SPDIF_SLOT 0x00300000
#define M1575_SCR_RECMOD 0x000c0000
#define M1575_SCR_PCMMOD 0x00030000
#define M1575_SCR_6CHL_MASK 0x0000c000
#define M1575_SCR_6CHL_0 0x00000000
#define M1575_SCR_6CHL_1 0x00004000
#define M1575_SCR_6CHL_2 0x00008000
#define M1575_SCR_6CHL_3 0x0000c000
#define M1575_SCR_CHAMOD_MASK 0x00000300
#define M1575_SCR_CHAMOD_2 0x00000000
#define M1575_SCR_CHAMOD_4 0x00000100
#define M1575_SCR_CHAMOD_6 0x00000200
#define M1575_SCR_DRENT 0x40000000
#define M1575_SCR_MSTRST 0x80000000
#define M1575_SSR_RSTBLK 0x00000002
#define M1575_SSR_FACCS_MSK 0x00000018
#define M1575_SSR_SCID 0x00000040
#define M1575_CPR_ACSCS 0x0100
#define M1575_CPR_READ 0x0080
#define M1575_CSPSR_SUCC 0x08
#define M1575_CSPSR_RDRDY 0x02
#define M1575_CSPSR_WRRDY 0x01
#define M1575_PCMI2CR_RR 0x02
#define M1575_MICI2CR_RR 0x02
#define M1575_CSPOCR_RR 0x02
#define M1575_INTFCR_RSTREL 0x02000000
#define M1575_INTFCR_RSTBLK 0x00200000
#define M1575_INTFCR_MICENB 0x00100000
#define M1575_INTFCR_PCMIENB 0x00080000
#define M1575_INTFCR_MICI2ENB 0x00040000
#define M1575_INTFCR_PCMI2ENB 0x00020000
#define M1575_INTFCR_MICI2SEL 0x00008000
#define M1575_INTFCR_MICISEL 0x00004000
#define M1575_INTFCR_PCMOENB 0x00000002
#define M1575_INTRCR_CPRINTR 0x00000080
#define M1575_INTRCR_SPRINTR 0x00000020
#define M1575_INTRCR_GPIOINTR 0x00000002
#define M1575_RTSR_SACRDY 0x20u
#define M1575_RTSR_FACRDY 0x80u
#define M1575_CASR_SEMBSY 0x80000000
#define IOC 0x8000
#define BUP 0x4000
struct m1575_bd_entry {
uint32_t buf_base;
uint16_t buf_len;
uint16_t buf_cmd;
};
typedef struct m1575_bd_entry m1575_bd_entry_t;
struct audio1575_port {
struct audio1575_state *statep;
ddi_dma_handle_t samp_dmah;
ddi_acc_handle_t samp_acch;
size_t samp_size;
caddr_t samp_kaddr;
uint32_t samp_paddr;
ddi_dma_handle_t bdl_dmah;
ddi_acc_handle_t bdl_acch;
size_t bdl_size;
caddr_t bdl_kaddr;
uint32_t bdl_paddr;
int num;
unsigned nframes;
uint32_t offset;
uint64_t count;
uint8_t nchan;
unsigned sync_dir;
audio_engine_t *engine;
};
typedef struct audio1575_port audio1575_port_t;
struct audio1575_state {
kmutex_t lock;
dev_info_t *dip;
audio_dev_t *adev;
ac97_t *ac97;
audio1575_port_t *ports[2];
ddi_acc_handle_t pcih;
ddi_acc_handle_t regsh;
caddr_t regsp;
uint8_t maxch;
};
typedef struct audio1575_state audio1575_state_t;
#define GET8(reg) \
ddi_get8(statep->regsh, (void *)(statep->regsp + (reg)))
#define GET16(reg) \
ddi_get16(statep->regsh, (void *)(statep->regsp + (reg)))
#define GET32(reg) \
ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
#define PUT8(reg, val) \
ddi_put8(statep->regsh, (void *)(statep->regsp + (reg)), (val))
#define PUT16(reg, val) \
ddi_put16(statep->regsh, (void *)(statep->regsp + (reg)), (val))
#define PUT32(reg, val) \
ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
#define SET8(reg, bit) PUT8(reg, GET8(reg) | (bit))
#define SET16(reg, bit) PUT16(reg, GET16(reg) | (bit))
#define SET32(reg, bit) PUT32(reg, GET32(reg) | (bit))
#define CLR8(reg, bit) PUT8(reg, GET8(reg) & ~(bit))
#define CLR16(reg, bit) PUT16(reg, GET16(reg) & ~(bit))
#define CLR32(reg, bit) PUT32(reg, GET32(reg) & ~(bit))
#endif