08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * CDDL HEADER START
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * The contents of this file are subject to the terms of the
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * Common Development and Distribution License (the "License").
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * You may not use this file except in compliance with the License.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * or http://www.opensolaris.org/os/licensing.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * See the License for the specific language governing permissions
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * and limitations under the License.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * If applicable, add the following below this CDDL HEADER, with the
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner]
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * CDDL HEADER END
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * Use is subject to license terms.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * Purpose: Driver for CMEDIA CM8738 PCI audio controller.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * This file is part of Open Sound System
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * Copyright (C) 4Front Technologies 1996-2008.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore *
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * This software is released under CDDL 1.0 source license.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * See the COPYING file included in the main directory of this source
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * distribution for the license terms and conditions.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#ifndef _AUDIOCMI_H
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define _AUDIOCMI_H
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CMEDIA_VENDOR_ID 0x13F6
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CMEDIA_CM8738 0x0111
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CMEDIA_CM8338A 0x0100
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CMEDIA_CM8338B 0x0101
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * CM8338 registers definition
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_FUNCTRL0 0x00
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_FUNCTRL1 0x04
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CHFORMAT 0x08
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_INTCTRL 0x0C
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_INTSTAT 0x10
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_LEGACY 0x14
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_MISC 0x18
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_TDMAPOS 0x1C
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_SBVER 0x20 /* 8 bit access only */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_IDXDATA 0x22 /* 8 bit access only */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_IDXADDR 0x23 /* 8 bit access only */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_MIX2 0x24
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_MIX3 0x25
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_VAUX 0x26
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH0_PADDR 0x80 /* buffer address (32b) */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH0_BUFSZ 0x84 /* buffer size in samples (16b) */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH0_FRAGSZ 0x86 /* fragment size in samples (16b) */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH1_PADDR 0x88
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH1_BUFSZ 0x8C
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define REG_CH1_FRAGSZ 0x8E
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define REG_SPDIF_STAT 0x90
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define REG_MISC2 0x92
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH1_RST BIT(19)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH0_RST BIT(18)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH1_EN BIT(17)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH0_EN BIT(16)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH1_PAUSE BIT(3)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH0_PAUSE BIT(2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH1_REC BIT(1)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL0_CH0_REC BIT(0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_MASK (0x7 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_48K (0x7 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_32K (0x6 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_16K (0x5 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_8K (0x4 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_44K (0x3 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_22K (0x2 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_11K (0x1 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_DAC_RATE_5K (0x0 << 13)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_MASK (0x7 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_48K (0x7 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_32K (0x6 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_16K (0x5 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_8K (0x4 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_44K (0x3 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_22K (0x2 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_11K (0x1 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_ADC_RATE_5K (0x0 << 10)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_INTRM BIT(5) /* enable MCB intr */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_BREQ BIT(4) /* bus master enable */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_VOICE_EN BIT(3)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_UART_EN BIT(2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define FUNCTRL1_JYSTK_EN BIT(1)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define CHFORMAT_CHB3D5C BIT(31) /* 5 channel surround */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define CHFORMAT_CHB3D BIT(29) /* 4 channel surround */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define CHFORMAT_VER_MASK (0x1f << 24)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define CHFORMAT_VER_033 0
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define CHFORMAT_VER_037 1
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH1_MASK (0x3 << 2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH1_16ST (0x3 << 2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH1_16MO (0x2 << 2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH1_8ST (0x1 << 2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH1_8MO (0x0 << 2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH0_MASK (0x3 << 0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH0_16ST (0x3 << 0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH0_16MO (0x2 << 0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH0_8ST (0x1 << 0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CHFORMAT_CH0_8MO (0x0 << 0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define INTCTRL_MDL_MASK (0xffU << 24)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define INTCTRL_MDL_068 (0x28 << 24)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define INTCTRL_MDL_055 (0x8 << 24)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define INTCTRL_MDL_039 (0x4 << 24)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTCTRL_TDMA_EN BIT(18)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTCTRL_CH1_EN BIT(17)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTCTRL_CH0_EN BIT(16)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_INTR BIT(31)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_MCB_INT BIT(26)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_UART_INT BIT(16)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_LTDMA_INT BIT(15)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_HTDMA_INT BIT(14)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_LHBTOG BIT(7)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_LEGDMA BIT(6)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_LEGHIGH BIT(5)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_LEGSTEREO BIT(4)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_CH1_BUSY BIT(3)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_CH0_BUSY BIT(2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_CH1_INT BIT(1)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INTSTAT_CH0_INT BIT(0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define LEGACY_NXCHG BIT(31)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define LEGACY_CHB3D6C BIT(15) /* 6 channel surround */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define LEGACY_CENTR2LN BIT(14) /* line in as center out */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define LEGACY_BASS2LN BIT(13) /* line in as lfe */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define LEGACY_EXBASSEN BIT(12) /* external bass input enable */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MISC_PWD BIT(31) /* power down */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MISC_RESET BIT(30)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC_N4SPK3D BIT(26) /* 4 channel emulation */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MISC_ENDBDAC BIT(23) /* dual dac */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MISC_XCHGDAC BIT(22) /* swap front/rear dacs */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC_SPD32SEL BIT(21) /* 32-bit SPDIF (default 16-bit) */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MISC_FM_EN BIT(19) /* enable legacy FM */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC_SPDF_AC97 BIT(15) /* spdif out 44.1k (0), 48 k (1) */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC_ENCENTER BIT(7) /* enable center */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC_REAR2LN BIT(6) /* send rear to line in */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX2_FMMUTE BIT(7)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX2_WSMUTE BIT(6)
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MIX2_SPK4 BIT(5) /* line-in is rear out */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MIX2_REAR2FRONT BIT(4) /* swap front and rear */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX2_WAVEIN_L BIT(3) /* for recording wave out */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX2_WAVEIN_R BIT(2) /* for recording wave out */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MIX2_X3DEN BIT(1) /* 3D surround enable */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MIX2_CDPLAY BIT(0) /* spdif-in PCM to DAC */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_RAUXREN BIT(7)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_RAUXLEN BIT(6)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_VAUXRM BIT(5) /* r-aux mute */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_VAUXLM BIT(4) /* l-aux mute */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_VADCMIC_MASK (0x7 << 1) /* rec mic volume */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MIX3_CEN2MIC BIT(2)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define MIX3_MICGAINZ BIT(0) /* mic gain */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define VAUX_L_MASK 0xf0
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define VAUX_R_MASK 0x0f
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC2_CHB3D8C BIT(5) /* 8 channel surround */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC2_SPD32FMT BIT(4) /* spdif at 32 kHz */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC2_ADC2SPDIF BIT(3) /* send adc to spdif out */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore#define MISC2_SHAREADC BIT(2) /* use adc for cen/lfe */
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/* Indexes via SBINDEX */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_MASTER_LEFT 0x30
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_MASTER_RIGHT 0x31
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_VOICE_LEFT 0x32 /* PCM volume */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_VOICE_RIGHT 0x33
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_CDDA_LEFT 0x36
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_CDDA_RIGHT 0x37
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_LINEIN_LEFT 0x38
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_LINEIN_RIGHT 0x39
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_MIC 0x3A
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_SPEAKER 0x3B
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_OUTMIX 0x3C
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define OUTMIX_MIC 0x01
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define OUTMIX_CD_R 0x02
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define OUTMIX_CD_L 0x04
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define OUTMIX_LINE_R 0x08
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define OUTMIX_LINE_L 0x10
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_INMIX_L 0x3D
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_INMIX_R 0x3E
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INMIX_LINE_R 0x08
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INMIX_LINE_L 0x10
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INMIX_CD_R 0x20
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INMIX_CD_L 0x40
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define INMIX_MIC 0x01
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_IGAIN_L 0x3F
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_IGAIN_R 0x40
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_OGAIN_L 0x41
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_OGAIN_R 0x42
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_AGC 0x43
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_TREBLE_L 0x44
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_TREBLE_R 0x45
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_BASS_L 0x46
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_BASS_R 0x47
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define IDX_EXTENSION 0xf0
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define EXTENSION_VPHONE_MASK (0x7 << 5)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define EXTENSION_VPHONE_MUTE BIT(4)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define EXTENSION_BEEPER_MUTE BIT(3)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define EXTENSION_VADCMIC3 BIT(0)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amoreenum {
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore SRC_MIC = 0,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore SRC_LINE,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore SRC_CD,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore SRC_AUX,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore SRC_MIX,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore};
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amoreenum {
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_VOLUME = 0,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_LINEOUT,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_SPEAKER,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_MIC,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_LINEIN,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_CD,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_AUX,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_RECSRCS,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_MONSRCS,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_MICBOOST,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore CTL_NUM
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore};
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amoretypedef struct cmpci_port cmpci_port_t;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amoretypedef struct cmpci_dev cmpci_dev_t;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amoretypedef struct cmpci_ctrl cmpci_ctrl_t;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amorestruct cmpci_ctrl {
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore cmpci_dev_t *dev;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore audio_ctrl_t *ctrl;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint64_t value;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore};
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amorestruct cmpci_port {
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore cmpci_dev_t *dev;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore audio_engine_t *engine;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore int num;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_acc_handle_t acch;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_dma_handle_t dmah;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore caddr_t kaddr;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t paddr;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore unsigned nframes;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore unsigned bufsz;
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore unsigned nchan;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore boolean_t capture;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore boolean_t open;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore /* registers & bit masks */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint8_t reg_paddr;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint8_t reg_bufsz;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint8_t reg_fragsz;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t fc0_rst_bit;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t fc0_rec_bit;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t fc0_en_bit;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t int_en_bit;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t fc1_rate_mask;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t chformat_mask;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore int sync_dir;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint32_t offset; /* in bytes */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore uint64_t count; /* in bytes */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore void (*callb)(audio_engine_t *);
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore cmpci_ctrl_t controls[CTL_NUM];
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore};
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define PORT_MAX 2
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amorestruct cmpci_dev {
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore audio_dev_t *adev;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore dev_info_t *dip;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_acc_handle_t acch;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore caddr_t regs;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
2be7def9bac9cc5b894988030377b62ee6be9c39Garrett D'Amore boolean_t softvol;
2be7def9bac9cc5b894988030377b62ee6be9c39Garrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore int pintrs;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore int rintrs;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_intr_handle_t ihandle;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore kstat_t *ksp;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
af145792def4317aeeb9d20f7772b32a35a0161fGarrett D'Amore int maxch;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore kmutex_t mutex;
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore cmpci_port_t port[PORT_MAX];
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore cmpci_ctrl_t controls[CTL_NUM];
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore};
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore/*
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * The hardware appears to be able to address up to 16-bits worth of samples,
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * giving a total address space of 256K. Note, however, that we will restrict
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore * this further when we do fragment and memory allocation.
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore */
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define DEFINTS 175
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define GET8(dev, offset) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define GET16(dev, offset) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define GET32(dev, offset) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define PUT8(dev, offset, v) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define PUT16(dev, offset, v) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define PUT32(dev, offset, v) \
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CLR8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) & ~(v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define SET8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) | (v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CLR16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) & ~(v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define SET16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) | (v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define CLR32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) & ~(v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define SET32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) | (v))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#define BIT(n) (1U << (n))
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore
08045defdf65ee890fef6e20510a093a17feb8feGarrett D'Amore#endif /* _AUDIOCMI_H */