f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * CDDL HEADER START
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * The contents of this file are subject to the terms of the
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Common Development and Distribution License (the "License").
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * You may not use this file except in compliance with the License.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * or http://www.opensolaris.org/os/licensing.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * See the License for the specific language governing permissions
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * and limitations under the License.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * If applicable, add the following below this CDDL HEADER, with the
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner]
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * CDDL HEADER END
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Use is subject to license terms.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Purpose: Definitions for the CMedia 8788 driver.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * This file is part of Open Sound System
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Copyright (C) 4Front Technologies 1996-2011.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore *
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * This software is released under CDDL 1.0 source license.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * See the COPYING file included in the main directory of this source
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * distribution for the license terms and conditions.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#ifndef CMEDIAHD_H
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_H
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_NAME "audiocmihd"
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_NUM_PORTC 2
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_PLAY 0
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_REC 1
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * Number of fragments must be multiple of 2 because the
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * hardware supports only full and half buffer interrupts. In
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * addition it looks like 8 fragments is the minimum.
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_BUF_LEN (65536)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PCI_VENDOR_ID_CMEDIA 0x13F6
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PCI_DEVICE_ID_CMEDIAHD 0x8788
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_MAX_INTRS 512
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_MIN_INTRS 48
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CMEDIAHD_INTRS 100
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/*
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore * PCI registers
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECA_ADDR (devc->base+0x00)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECA_SIZE (devc->base+0x04)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECA_FRAG (devc->base+0x06)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECB_ADDR (devc->base+0x08)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECB_SIZE (devc->base+0x0C)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECB_FRAG (devc->base+0x0E)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECC_ADDR (devc->base+0x10)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECC_SIZE (devc->base+0x14)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define RECC_FRAG (devc->base+0x16)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIF_ADDR (devc->base+0x18)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIF_SIZE (devc->base+0x1C)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIF_FRAG (devc->base+0x1E)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MULTICH_ADDR (devc->base+0x20)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MULTICH_SIZE (devc->base+0x24)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MULTICH_FRAG (devc->base+0x28)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define FPOUT_ADDR (devc->base+0x30)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define FPOUT_SIZE (devc->base+0x34)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define FPOUT_FRAG (devc->base+0x36)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define DMA_START (devc->base+0x40)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CHAN_RESET (devc->base+0x42)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MULTICH_MODE (devc->base+0x43)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define IRQ_MASK (devc->base+0x44)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define IRQ_STAT (devc->base+0x46)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MISC_REG (devc->base+0x48)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_FORMAT (devc->base+0x4A)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PLAY_FORMAT (devc->base+0x4B)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_MODE (devc->base+0x4C)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define FUNCTION (devc->base+0x50)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define I2S_MULTICH_DAC (devc->base+0x60)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define I2S_ADC1 (devc->base+0x62)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define I2S_ADC2 (devc->base+0x64)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define I2S_ADC3 (devc->base+0x66)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIF_FUNC (devc->base+0x70)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIFOUT_CHAN_STAT (devc->base+0x74)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPDIFIN_CHAN_STAT (devc->base+0x78)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define TWO_WIRE_ADDR (devc->base+0x90)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define TWO_WIRE_MAP (devc->base+0x91)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define TWO_WIRE_DATA (devc->base+0x92)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define TWO_WIRE_CTRL (devc->base+0x94)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPI_CONTROL (devc->base+0x98)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SPI_DATA (devc->base+0x99)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MPU401_DATA (devc->base+0xA0)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MPU401_COMMAND (devc->base+0xA1)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MPU401_CONTROL (devc->base+0xA2)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define GPI_DATA (devc->base+0xA4)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define GPI_IRQ_MASK (devc->base+0xA5)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define GPIO_DATA (devc->base+0xA6)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define GPIO_CONTROL (devc->base+0xA8)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define GPIO_IRQ_MASK (devc->base+0xAA)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define DEVICE_SENSE (devc->base+0xAC)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PLAY_ROUTING (devc->base+0xC0)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_ROUTING (devc->base+0xC2)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_MONITOR (devc->base+0xC3)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define MONITOR_ROUTING (devc->base+0xC4)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_CTRL (devc->base+0xD0)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_INTR_MASK (devc->base+0xD2)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_INTR_STAT (devc->base+0xD3)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_OUT_CHAN_CONFIG (devc->base+0xD4)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_IN_CHAN_CONFIG (devc->base+0xD8)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AC97_CMD_DATA (devc->base+0xDC)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CODEC_VERSION (devc->base+0xE4)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CTRL_VERSION (devc->base+0xE6)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* Device IDs */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define ASUS_VENDOR_ID 0x1043
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_D2 0x8269
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_D2X 0x82b7
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_D1 0x834f
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_DX 0x8275
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_STX 0x835c
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_XONAR_DS 0x838e
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define SUBID_GENERIC 0x0000
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* Xonar specific */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define XONAR_DX_FRONTDAC 0x9e
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define XONAR_DX_SURRDAC 0x30
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define XONAR_STX_FRONTDAC 0x98
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define XONAR_DS_FRONTDAC 0x1
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define XONAR_DS_SURRDAC 0x0
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* defs for AKM 4396 DAC */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AK4396_CTL1 0x00
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AK4396_CTL2 0x01
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AK4396_CTL3 0x02
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AK4396_LchATTCtl 0x03
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define AK4396_RchATTCtl 0x04
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* defs for CS4398 DAC */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_CHIP_ID 0x01
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MODE_CTRL 0x02
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MIXING 0x03
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MUTE_CTRL 0x04
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_VOLA 0x05
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_VOLB 0x06
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_RAMP_CTRL 0x07
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MISC_CTRL 0x08
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MISC2_CTRL 0x09
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_POWER_DOWN (1<<7) /* Obvious */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_CPEN (1<<6) /* Control Port Enable */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_FREEZE (1<<5) /* Freezes registers, unfreeze to */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore /* accept changed registers */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MCLKDIV2 (1<<4) /* Divide MCLK by 2 */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_MCLKDIV3 (1<<3) /* Divive MCLK by 3 */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_I2S (1<<4) /* Set I2S mode */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* defs for CS4362A DAC */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MODE1_CTRL 0x01
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MODE2_CTRL 0x02
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MODE3_CTRL 0x03
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_FILTER_CTRL 0x04
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INVERT_CTRL 0x05
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MIX1_CTRL 0x06
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLA_1 0x07
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLB_1 0x08
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MIX2_CTRL 0x09
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLA_2 0x0A
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLB_2 0x0B
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MIX3_CTRL 0x0C
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLA_3 0x0D
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOLB_3 0x0E
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_CHIP_REV 0x12
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 01h */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_CPEN (1<<7)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_FREEZE (1<<6)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MCLKDIV (1<<5)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DAC3_ENABLE (1<<3)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DAC2_ENABLE (1<<2)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DAC1_ENABLE (1<<1)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_POWER_DOWN (1)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 02h */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_LJUST 0x00
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_I2S 0x10
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_RJUST16 0x20
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_RJUST24 0x30
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_RJUST20 0x40
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DIF_RJUST18 0x50
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 03h */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMP_IMMEDIATE 0x00
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMP_ZEROCROSS 0x40
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMP_SOFT 0x80
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMP_SOFTZERO 0xC0
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_SINGLE_VOL 0x20
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMP_ERROR 0x10
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_MUTEC_POL 0x08
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_AUTOMUTE 0x04
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_SIX_MUTE 0x00
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_ONE_MUTE 0x01
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_THREE_MUTE 0x03
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 04h */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_FILT_SEL 0x10
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DEM_NONE 0x00
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DEM_44KHZ 0x02
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DEM_48KHZ 0x04
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_DEM_32KHZ 0x06
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_RAMPDOWN 0x01
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 05h */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_A3 (1<<4)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_B3 (1<<5)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_A2 (1<<2)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_B2 (1<<3)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_A1 (1)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_INV_B1 (1<<1)
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 06h, 09h, 0Ch */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* ATAPI crap, does anyone still use analog CD playback? */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* CS4362A Reg 07h, 08h, 0Ah, 0Bh, 0Dh, 0Eh */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* Volume registers */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOL_MUTE 0x80
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* 0-100. Start at -96dB. */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4398_VOL(x) \
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ((x) == 0 ? 0xFF : (0xC0 - ((x)*192/100)))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* 0-100. Start at -96dB. Bit 7 is mute. */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define CS4362A_VOL(x) \
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore (char)((x) == 0 ? 0xFF : (0x60 - ((x)*96/100)))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore/* Xonar D2/D2X codec remap */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amorestatic const char xd2_codec_map[4] = {
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore 0, 1, 2, 4
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore};
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amoretypedef struct _cmediahd_devc_t cmediahd_devc_t;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amoretypedef struct _cmediahd_portc_t cmediahd_portc_t;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amoretypedef enum {
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_VOLUME = 0,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_FRONT,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_REAR,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_CENTER,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_LFE,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_SURROUND,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_MONITOR,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_RECSRC,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_RECGAIN,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_MICVOL,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_AUXVOL,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_CDVOL,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_LOOP,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_SPREAD,
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore CTL_NUM /* must be last */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore} cmediahd_ctrl_num_t;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amoretypedef struct cmediahd_ctrl
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore{
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_devc_t *devc;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore audio_ctrl_t *ctrl;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_ctrl_num_t num;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore uint64_t val;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore} cmediahd_ctrl_t;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amoretypedef struct cmediahd_regs
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore{
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t addr; /* base address */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t size; /* current count */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t frag; /* terminal count */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t i2s; /* i2s reg */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int chan; /* rec a/b/c, play spdif/multi/front */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_A 0
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_B 1
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define REC_C 2
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PLAY_SPDIF 3
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PLAY_MULTI 4
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define PLAY_FRONT 5
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore} cmediahd_regs_t;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amorestruct _cmediahd_portc_t
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore{
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_devc_t *devc;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore audio_engine_t *engine;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int chans;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int direction;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ddi_dma_handle_t buf_dmah; /* dma for buffers */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ddi_acc_handle_t buf_acch;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore uint32_t paddr;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t kaddr;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore size_t buf_size;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore size_t buf_frames; /* Buffer size in frames */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore unsigned fragfr;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore unsigned nfrags;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore unsigned nframes;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore unsigned bufsz;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore size_t offset;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore uint64_t count;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int syncdir;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore};
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amorestruct _cmediahd_devc_t
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore{
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore dev_info_t *dip;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore audio_dev_t *adev;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore boolean_t has_ac97, has_fp_ac97;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int model;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ac97_t *ac97, *fp_ac97;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore boolean_t suspended;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ddi_acc_handle_t pcih;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore ddi_acc_handle_t regsh;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore caddr_t base;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore kmutex_t mutex; /* For normal locking */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore kmutex_t low_mutex; /* For low level routines */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_regs_t rec_eng; /* which rec engine to use */
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_portc_t *portc[CMEDIAHD_NUM_PORTC];
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore int gpio_mic, gpio_out, gpio_codec, gpio_alt;
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore cmediahd_ctrl_t controls[CTL_NUM];
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore};
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define INB(devc, reg) ddi_get8(devc->regsh, (void *)(reg))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define OUTB(devc, val, reg) ddi_put8(devc->regsh, (void *)(reg), (val))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define INW(devc, reg) ddi_get16(devc->regsh, (void *)(reg))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define OUTW(devc, val, reg) ddi_put16(devc->regsh, (void *)(reg), (val))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define INL(devc, reg) ddi_get32(devc->regsh, (void *)(reg))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#define OUTL(devc, val, reg) ddi_put32(devc->regsh, (void *)(reg), (val))
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore
f6929ecef713a1395a17d75418eb6d6f8f2c68fdGarrett D'Amore#endif /* CMEDIAHD_H */