1*f6929eceSGarrett D'Amore /* 2*f6929eceSGarrett D'Amore * CDDL HEADER START 3*f6929eceSGarrett D'Amore * 4*f6929eceSGarrett D'Amore * The contents of this file are subject to the terms of the 5*f6929eceSGarrett D'Amore * Common Development and Distribution License (the "License"). 6*f6929eceSGarrett D'Amore * You may not use this file except in compliance with the License. 7*f6929eceSGarrett D'Amore * 8*f6929eceSGarrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*f6929eceSGarrett D'Amore * or http://www.opensolaris.org/os/licensing. 10*f6929eceSGarrett D'Amore * See the License for the specific language governing permissions 11*f6929eceSGarrett D'Amore * and limitations under the License. 12*f6929eceSGarrett D'Amore * 13*f6929eceSGarrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each 14*f6929eceSGarrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*f6929eceSGarrett D'Amore * If applicable, add the following below this CDDL HEADER, with the 16*f6929eceSGarrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying 17*f6929eceSGarrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner] 18*f6929eceSGarrett D'Amore * 19*f6929eceSGarrett D'Amore * CDDL HEADER END 20*f6929eceSGarrett D'Amore */ 21*f6929eceSGarrett D'Amore 22*f6929eceSGarrett D'Amore /* 23*f6929eceSGarrett D'Amore * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*f6929eceSGarrett D'Amore * Use is subject to license terms. 25*f6929eceSGarrett D'Amore */ 26*f6929eceSGarrett D'Amore 27*f6929eceSGarrett D'Amore /* 28*f6929eceSGarrett D'Amore * Purpose: Definitions for the CMedia 8788 driver. 29*f6929eceSGarrett D'Amore */ 30*f6929eceSGarrett D'Amore /* 31*f6929eceSGarrett D'Amore * This file is part of Open Sound System 32*f6929eceSGarrett D'Amore * 33*f6929eceSGarrett D'Amore * Copyright (C) 4Front Technologies 1996-2011. 34*f6929eceSGarrett D'Amore * 35*f6929eceSGarrett D'Amore * This software is released under CDDL 1.0 source license. 36*f6929eceSGarrett D'Amore * See the COPYING file included in the main directory of this source 37*f6929eceSGarrett D'Amore * distribution for the license terms and conditions. 38*f6929eceSGarrett D'Amore */ 39*f6929eceSGarrett D'Amore #ifndef CMEDIAHD_H 40*f6929eceSGarrett D'Amore #define CMEDIAHD_H 41*f6929eceSGarrett D'Amore 42*f6929eceSGarrett D'Amore #define CMEDIAHD_NAME "audiocmihd" 43*f6929eceSGarrett D'Amore 44*f6929eceSGarrett D'Amore #define CMEDIAHD_NUM_PORTC 2 45*f6929eceSGarrett D'Amore #define CMEDIAHD_PLAY 0 46*f6929eceSGarrett D'Amore #define CMEDIAHD_REC 1 47*f6929eceSGarrett D'Amore 48*f6929eceSGarrett D'Amore /* 49*f6929eceSGarrett D'Amore * Number of fragments must be multiple of 2 because the 50*f6929eceSGarrett D'Amore * hardware supports only full and half buffer interrupts. In 51*f6929eceSGarrett D'Amore * addition it looks like 8 fragments is the minimum. 52*f6929eceSGarrett D'Amore */ 53*f6929eceSGarrett D'Amore #define CMEDIAHD_BUF_LEN (65536) 54*f6929eceSGarrett D'Amore 55*f6929eceSGarrett D'Amore #define PCI_VENDOR_ID_CMEDIA 0x13F6 56*f6929eceSGarrett D'Amore #define PCI_DEVICE_ID_CMEDIAHD 0x8788 57*f6929eceSGarrett D'Amore 58*f6929eceSGarrett D'Amore #define CMEDIAHD_MAX_INTRS 512 59*f6929eceSGarrett D'Amore #define CMEDIAHD_MIN_INTRS 48 60*f6929eceSGarrett D'Amore #define CMEDIAHD_INTRS 100 61*f6929eceSGarrett D'Amore 62*f6929eceSGarrett D'Amore /* 63*f6929eceSGarrett D'Amore * PCI registers 64*f6929eceSGarrett D'Amore */ 65*f6929eceSGarrett D'Amore 66*f6929eceSGarrett D'Amore #define RECA_ADDR (devc->base+0x00) 67*f6929eceSGarrett D'Amore #define RECA_SIZE (devc->base+0x04) 68*f6929eceSGarrett D'Amore #define RECA_FRAG (devc->base+0x06) 69*f6929eceSGarrett D'Amore #define RECB_ADDR (devc->base+0x08) 70*f6929eceSGarrett D'Amore #define RECB_SIZE (devc->base+0x0C) 71*f6929eceSGarrett D'Amore #define RECB_FRAG (devc->base+0x0E) 72*f6929eceSGarrett D'Amore #define RECC_ADDR (devc->base+0x10) 73*f6929eceSGarrett D'Amore #define RECC_SIZE (devc->base+0x14) 74*f6929eceSGarrett D'Amore #define RECC_FRAG (devc->base+0x16) 75*f6929eceSGarrett D'Amore #define SPDIF_ADDR (devc->base+0x18) 76*f6929eceSGarrett D'Amore #define SPDIF_SIZE (devc->base+0x1C) 77*f6929eceSGarrett D'Amore #define SPDIF_FRAG (devc->base+0x1E) 78*f6929eceSGarrett D'Amore #define MULTICH_ADDR (devc->base+0x20) 79*f6929eceSGarrett D'Amore #define MULTICH_SIZE (devc->base+0x24) 80*f6929eceSGarrett D'Amore #define MULTICH_FRAG (devc->base+0x28) 81*f6929eceSGarrett D'Amore #define FPOUT_ADDR (devc->base+0x30) 82*f6929eceSGarrett D'Amore #define FPOUT_SIZE (devc->base+0x34) 83*f6929eceSGarrett D'Amore #define FPOUT_FRAG (devc->base+0x36) 84*f6929eceSGarrett D'Amore 85*f6929eceSGarrett D'Amore #define DMA_START (devc->base+0x40) 86*f6929eceSGarrett D'Amore #define CHAN_RESET (devc->base+0x42) 87*f6929eceSGarrett D'Amore #define MULTICH_MODE (devc->base+0x43) 88*f6929eceSGarrett D'Amore #define IRQ_MASK (devc->base+0x44) 89*f6929eceSGarrett D'Amore #define IRQ_STAT (devc->base+0x46) 90*f6929eceSGarrett D'Amore #define MISC_REG (devc->base+0x48) 91*f6929eceSGarrett D'Amore #define REC_FORMAT (devc->base+0x4A) 92*f6929eceSGarrett D'Amore #define PLAY_FORMAT (devc->base+0x4B) 93*f6929eceSGarrett D'Amore #define REC_MODE (devc->base+0x4C) 94*f6929eceSGarrett D'Amore #define FUNCTION (devc->base+0x50) 95*f6929eceSGarrett D'Amore 96*f6929eceSGarrett D'Amore #define I2S_MULTICH_DAC (devc->base+0x60) 97*f6929eceSGarrett D'Amore #define I2S_ADC1 (devc->base+0x62) 98*f6929eceSGarrett D'Amore #define I2S_ADC2 (devc->base+0x64) 99*f6929eceSGarrett D'Amore #define I2S_ADC3 (devc->base+0x66) 100*f6929eceSGarrett D'Amore 101*f6929eceSGarrett D'Amore #define SPDIF_FUNC (devc->base+0x70) 102*f6929eceSGarrett D'Amore #define SPDIFOUT_CHAN_STAT (devc->base+0x74) 103*f6929eceSGarrett D'Amore #define SPDIFIN_CHAN_STAT (devc->base+0x78) 104*f6929eceSGarrett D'Amore 105*f6929eceSGarrett D'Amore #define TWO_WIRE_ADDR (devc->base+0x90) 106*f6929eceSGarrett D'Amore #define TWO_WIRE_MAP (devc->base+0x91) 107*f6929eceSGarrett D'Amore #define TWO_WIRE_DATA (devc->base+0x92) 108*f6929eceSGarrett D'Amore #define TWO_WIRE_CTRL (devc->base+0x94) 109*f6929eceSGarrett D'Amore 110*f6929eceSGarrett D'Amore #define SPI_CONTROL (devc->base+0x98) 111*f6929eceSGarrett D'Amore #define SPI_DATA (devc->base+0x99) 112*f6929eceSGarrett D'Amore 113*f6929eceSGarrett D'Amore #define MPU401_DATA (devc->base+0xA0) 114*f6929eceSGarrett D'Amore #define MPU401_COMMAND (devc->base+0xA1) 115*f6929eceSGarrett D'Amore #define MPU401_CONTROL (devc->base+0xA2) 116*f6929eceSGarrett D'Amore 117*f6929eceSGarrett D'Amore #define GPI_DATA (devc->base+0xA4) 118*f6929eceSGarrett D'Amore #define GPI_IRQ_MASK (devc->base+0xA5) 119*f6929eceSGarrett D'Amore #define GPIO_DATA (devc->base+0xA6) 120*f6929eceSGarrett D'Amore #define GPIO_CONTROL (devc->base+0xA8) 121*f6929eceSGarrett D'Amore #define GPIO_IRQ_MASK (devc->base+0xAA) 122*f6929eceSGarrett D'Amore #define DEVICE_SENSE (devc->base+0xAC) 123*f6929eceSGarrett D'Amore 124*f6929eceSGarrett D'Amore #define PLAY_ROUTING (devc->base+0xC0) 125*f6929eceSGarrett D'Amore #define REC_ROUTING (devc->base+0xC2) 126*f6929eceSGarrett D'Amore #define REC_MONITOR (devc->base+0xC3) 127*f6929eceSGarrett D'Amore #define MONITOR_ROUTING (devc->base+0xC4) 128*f6929eceSGarrett D'Amore 129*f6929eceSGarrett D'Amore #define AC97_CTRL (devc->base+0xD0) 130*f6929eceSGarrett D'Amore #define AC97_INTR_MASK (devc->base+0xD2) 131*f6929eceSGarrett D'Amore #define AC97_INTR_STAT (devc->base+0xD3) 132*f6929eceSGarrett D'Amore #define AC97_OUT_CHAN_CONFIG (devc->base+0xD4) 133*f6929eceSGarrett D'Amore #define AC97_IN_CHAN_CONFIG (devc->base+0xD8) 134*f6929eceSGarrett D'Amore #define AC97_CMD_DATA (devc->base+0xDC) 135*f6929eceSGarrett D'Amore 136*f6929eceSGarrett D'Amore #define CODEC_VERSION (devc->base+0xE4) 137*f6929eceSGarrett D'Amore #define CTRL_VERSION (devc->base+0xE6) 138*f6929eceSGarrett D'Amore 139*f6929eceSGarrett D'Amore /* Device IDs */ 140*f6929eceSGarrett D'Amore #define ASUS_VENDOR_ID 0x1043 141*f6929eceSGarrett D'Amore #define SUBID_XONAR_D2 0x8269 142*f6929eceSGarrett D'Amore #define SUBID_XONAR_D2X 0x82b7 143*f6929eceSGarrett D'Amore #define SUBID_XONAR_D1 0x834f 144*f6929eceSGarrett D'Amore #define SUBID_XONAR_DX 0x8275 145*f6929eceSGarrett D'Amore #define SUBID_XONAR_STX 0x835c 146*f6929eceSGarrett D'Amore #define SUBID_XONAR_DS 0x838e 147*f6929eceSGarrett D'Amore 148*f6929eceSGarrett D'Amore 149*f6929eceSGarrett D'Amore #define SUBID_GENERIC 0x0000 150*f6929eceSGarrett D'Amore 151*f6929eceSGarrett D'Amore /* Xonar specific */ 152*f6929eceSGarrett D'Amore #define XONAR_DX_FRONTDAC 0x9e 153*f6929eceSGarrett D'Amore #define XONAR_DX_SURRDAC 0x30 154*f6929eceSGarrett D'Amore #define XONAR_STX_FRONTDAC 0x98 155*f6929eceSGarrett D'Amore #define XONAR_DS_FRONTDAC 0x1 156*f6929eceSGarrett D'Amore #define XONAR_DS_SURRDAC 0x0 157*f6929eceSGarrett D'Amore 158*f6929eceSGarrett D'Amore /* defs for AKM 4396 DAC */ 159*f6929eceSGarrett D'Amore #define AK4396_CTL1 0x00 160*f6929eceSGarrett D'Amore #define AK4396_CTL2 0x01 161*f6929eceSGarrett D'Amore #define AK4396_CTL3 0x02 162*f6929eceSGarrett D'Amore #define AK4396_LchATTCtl 0x03 163*f6929eceSGarrett D'Amore #define AK4396_RchATTCtl 0x04 164*f6929eceSGarrett D'Amore 165*f6929eceSGarrett D'Amore /* defs for CS4398 DAC */ 166*f6929eceSGarrett D'Amore #define CS4398_CHIP_ID 0x01 167*f6929eceSGarrett D'Amore #define CS4398_MODE_CTRL 0x02 168*f6929eceSGarrett D'Amore #define CS4398_MIXING 0x03 169*f6929eceSGarrett D'Amore #define CS4398_MUTE_CTRL 0x04 170*f6929eceSGarrett D'Amore #define CS4398_VOLA 0x05 171*f6929eceSGarrett D'Amore #define CS4398_VOLB 0x06 172*f6929eceSGarrett D'Amore #define CS4398_RAMP_CTRL 0x07 173*f6929eceSGarrett D'Amore #define CS4398_MISC_CTRL 0x08 174*f6929eceSGarrett D'Amore #define CS4398_MISC2_CTRL 0x09 175*f6929eceSGarrett D'Amore #define CS4398_POWER_DOWN (1<<7) /* Obvious */ 176*f6929eceSGarrett D'Amore #define CS4398_CPEN (1<<6) /* Control Port Enable */ 177*f6929eceSGarrett D'Amore #define CS4398_FREEZE (1<<5) /* Freezes registers, unfreeze to */ 178*f6929eceSGarrett D'Amore /* accept changed registers */ 179*f6929eceSGarrett D'Amore #define CS4398_MCLKDIV2 (1<<4) /* Divide MCLK by 2 */ 180*f6929eceSGarrett D'Amore #define CS4398_MCLKDIV3 (1<<3) /* Divive MCLK by 3 */ 181*f6929eceSGarrett D'Amore #define CS4398_I2S (1<<4) /* Set I2S mode */ 182*f6929eceSGarrett D'Amore 183*f6929eceSGarrett D'Amore /* defs for CS4362A DAC */ 184*f6929eceSGarrett D'Amore #define CS4362A_MODE1_CTRL 0x01 185*f6929eceSGarrett D'Amore #define CS4362A_MODE2_CTRL 0x02 186*f6929eceSGarrett D'Amore #define CS4362A_MODE3_CTRL 0x03 187*f6929eceSGarrett D'Amore #define CS4362A_FILTER_CTRL 0x04 188*f6929eceSGarrett D'Amore #define CS4362A_INVERT_CTRL 0x05 189*f6929eceSGarrett D'Amore #define CS4362A_MIX1_CTRL 0x06 190*f6929eceSGarrett D'Amore #define CS4362A_VOLA_1 0x07 191*f6929eceSGarrett D'Amore #define CS4362A_VOLB_1 0x08 192*f6929eceSGarrett D'Amore #define CS4362A_MIX2_CTRL 0x09 193*f6929eceSGarrett D'Amore #define CS4362A_VOLA_2 0x0A 194*f6929eceSGarrett D'Amore #define CS4362A_VOLB_2 0x0B 195*f6929eceSGarrett D'Amore #define CS4362A_MIX3_CTRL 0x0C 196*f6929eceSGarrett D'Amore #define CS4362A_VOLA_3 0x0D 197*f6929eceSGarrett D'Amore #define CS4362A_VOLB_3 0x0E 198*f6929eceSGarrett D'Amore #define CS4362A_CHIP_REV 0x12 199*f6929eceSGarrett D'Amore 200*f6929eceSGarrett D'Amore /* CS4362A Reg 01h */ 201*f6929eceSGarrett D'Amore #define CS4362A_CPEN (1<<7) 202*f6929eceSGarrett D'Amore #define CS4362A_FREEZE (1<<6) 203*f6929eceSGarrett D'Amore #define CS4362A_MCLKDIV (1<<5) 204*f6929eceSGarrett D'Amore #define CS4362A_DAC3_ENABLE (1<<3) 205*f6929eceSGarrett D'Amore #define CS4362A_DAC2_ENABLE (1<<2) 206*f6929eceSGarrett D'Amore #define CS4362A_DAC1_ENABLE (1<<1) 207*f6929eceSGarrett D'Amore #define CS4362A_POWER_DOWN (1) 208*f6929eceSGarrett D'Amore 209*f6929eceSGarrett D'Amore /* CS4362A Reg 02h */ 210*f6929eceSGarrett D'Amore #define CS4362A_DIF_LJUST 0x00 211*f6929eceSGarrett D'Amore #define CS4362A_DIF_I2S 0x10 212*f6929eceSGarrett D'Amore #define CS4362A_DIF_RJUST16 0x20 213*f6929eceSGarrett D'Amore #define CS4362A_DIF_RJUST24 0x30 214*f6929eceSGarrett D'Amore #define CS4362A_DIF_RJUST20 0x40 215*f6929eceSGarrett D'Amore #define CS4362A_DIF_RJUST18 0x50 216*f6929eceSGarrett D'Amore 217*f6929eceSGarrett D'Amore /* CS4362A Reg 03h */ 218*f6929eceSGarrett D'Amore #define CS4362A_RAMP_IMMEDIATE 0x00 219*f6929eceSGarrett D'Amore #define CS4362A_RAMP_ZEROCROSS 0x40 220*f6929eceSGarrett D'Amore #define CS4362A_RAMP_SOFT 0x80 221*f6929eceSGarrett D'Amore #define CS4362A_RAMP_SOFTZERO 0xC0 222*f6929eceSGarrett D'Amore #define CS4362A_SINGLE_VOL 0x20 223*f6929eceSGarrett D'Amore #define CS4362A_RAMP_ERROR 0x10 224*f6929eceSGarrett D'Amore #define CS4362A_MUTEC_POL 0x08 225*f6929eceSGarrett D'Amore #define CS4362A_AUTOMUTE 0x04 226*f6929eceSGarrett D'Amore #define CS4362A_SIX_MUTE 0x00 227*f6929eceSGarrett D'Amore #define CS4362A_ONE_MUTE 0x01 228*f6929eceSGarrett D'Amore #define CS4362A_THREE_MUTE 0x03 229*f6929eceSGarrett D'Amore 230*f6929eceSGarrett D'Amore /* CS4362A Reg 04h */ 231*f6929eceSGarrett D'Amore #define CS4362A_FILT_SEL 0x10 232*f6929eceSGarrett D'Amore #define CS4362A_DEM_NONE 0x00 233*f6929eceSGarrett D'Amore #define CS4362A_DEM_44KHZ 0x02 234*f6929eceSGarrett D'Amore #define CS4362A_DEM_48KHZ 0x04 235*f6929eceSGarrett D'Amore #define CS4362A_DEM_32KHZ 0x06 236*f6929eceSGarrett D'Amore #define CS4362A_RAMPDOWN 0x01 237*f6929eceSGarrett D'Amore 238*f6929eceSGarrett D'Amore 239*f6929eceSGarrett D'Amore /* CS4362A Reg 05h */ 240*f6929eceSGarrett D'Amore #define CS4362A_INV_A3 (1<<4) 241*f6929eceSGarrett D'Amore #define CS4362A_INV_B3 (1<<5) 242*f6929eceSGarrett D'Amore #define CS4362A_INV_A2 (1<<2) 243*f6929eceSGarrett D'Amore #define CS4362A_INV_B2 (1<<3) 244*f6929eceSGarrett D'Amore #define CS4362A_INV_A1 (1) 245*f6929eceSGarrett D'Amore #define CS4362A_INV_B1 (1<<1) 246*f6929eceSGarrett D'Amore 247*f6929eceSGarrett D'Amore /* CS4362A Reg 06h, 09h, 0Ch */ 248*f6929eceSGarrett D'Amore /* ATAPI crap, does anyone still use analog CD playback? */ 249*f6929eceSGarrett D'Amore 250*f6929eceSGarrett D'Amore /* CS4362A Reg 07h, 08h, 0Ah, 0Bh, 0Dh, 0Eh */ 251*f6929eceSGarrett D'Amore /* Volume registers */ 252*f6929eceSGarrett D'Amore #define CS4362A_VOL_MUTE 0x80 253*f6929eceSGarrett D'Amore 254*f6929eceSGarrett D'Amore /* 0-100. Start at -96dB. */ 255*f6929eceSGarrett D'Amore #define CS4398_VOL(x) \ 256*f6929eceSGarrett D'Amore ((x) == 0 ? 0xFF : (0xC0 - ((x)*192/100))) 257*f6929eceSGarrett D'Amore /* 0-100. Start at -96dB. Bit 7 is mute. */ 258*f6929eceSGarrett D'Amore #define CS4362A_VOL(x) \ 259*f6929eceSGarrett D'Amore (char)((x) == 0 ? 0xFF : (0x60 - ((x)*96/100))) 260*f6929eceSGarrett D'Amore 261*f6929eceSGarrett D'Amore /* Xonar D2/D2X codec remap */ 262*f6929eceSGarrett D'Amore static const char xd2_codec_map[4] = { 263*f6929eceSGarrett D'Amore 0, 1, 2, 4 264*f6929eceSGarrett D'Amore }; 265*f6929eceSGarrett D'Amore 266*f6929eceSGarrett D'Amore 267*f6929eceSGarrett D'Amore typedef struct _cmediahd_devc_t cmediahd_devc_t; 268*f6929eceSGarrett D'Amore typedef struct _cmediahd_portc_t cmediahd_portc_t; 269*f6929eceSGarrett D'Amore 270*f6929eceSGarrett D'Amore typedef enum { 271*f6929eceSGarrett D'Amore CTL_VOLUME = 0, 272*f6929eceSGarrett D'Amore CTL_FRONT, 273*f6929eceSGarrett D'Amore CTL_REAR, 274*f6929eceSGarrett D'Amore CTL_CENTER, 275*f6929eceSGarrett D'Amore CTL_LFE, 276*f6929eceSGarrett D'Amore CTL_SURROUND, 277*f6929eceSGarrett D'Amore CTL_MONITOR, 278*f6929eceSGarrett D'Amore CTL_RECSRC, 279*f6929eceSGarrett D'Amore CTL_RECGAIN, 280*f6929eceSGarrett D'Amore CTL_MICVOL, 281*f6929eceSGarrett D'Amore CTL_AUXVOL, 282*f6929eceSGarrett D'Amore CTL_CDVOL, 283*f6929eceSGarrett D'Amore CTL_LOOP, 284*f6929eceSGarrett D'Amore CTL_SPREAD, 285*f6929eceSGarrett D'Amore CTL_NUM /* must be last */ 286*f6929eceSGarrett D'Amore } cmediahd_ctrl_num_t; 287*f6929eceSGarrett D'Amore 288*f6929eceSGarrett D'Amore typedef struct cmediahd_ctrl 289*f6929eceSGarrett D'Amore { 290*f6929eceSGarrett D'Amore cmediahd_devc_t *devc; 291*f6929eceSGarrett D'Amore audio_ctrl_t *ctrl; 292*f6929eceSGarrett D'Amore cmediahd_ctrl_num_t num; 293*f6929eceSGarrett D'Amore uint64_t val; 294*f6929eceSGarrett D'Amore } cmediahd_ctrl_t; 295*f6929eceSGarrett D'Amore 296*f6929eceSGarrett D'Amore typedef struct cmediahd_regs 297*f6929eceSGarrett D'Amore { 298*f6929eceSGarrett D'Amore caddr_t addr; /* base address */ 299*f6929eceSGarrett D'Amore caddr_t size; /* current count */ 300*f6929eceSGarrett D'Amore caddr_t frag; /* terminal count */ 301*f6929eceSGarrett D'Amore caddr_t i2s; /* i2s reg */ 302*f6929eceSGarrett D'Amore int chan; /* rec a/b/c, play spdif/multi/front */ 303*f6929eceSGarrett D'Amore #define REC_A 0 304*f6929eceSGarrett D'Amore #define REC_B 1 305*f6929eceSGarrett D'Amore #define REC_C 2 306*f6929eceSGarrett D'Amore #define PLAY_SPDIF 3 307*f6929eceSGarrett D'Amore #define PLAY_MULTI 4 308*f6929eceSGarrett D'Amore #define PLAY_FRONT 5 309*f6929eceSGarrett D'Amore } cmediahd_regs_t; 310*f6929eceSGarrett D'Amore 311*f6929eceSGarrett D'Amore struct _cmediahd_portc_t 312*f6929eceSGarrett D'Amore { 313*f6929eceSGarrett D'Amore cmediahd_devc_t *devc; 314*f6929eceSGarrett D'Amore audio_engine_t *engine; 315*f6929eceSGarrett D'Amore 316*f6929eceSGarrett D'Amore int chans; 317*f6929eceSGarrett D'Amore int direction; 318*f6929eceSGarrett D'Amore 319*f6929eceSGarrett D'Amore ddi_dma_handle_t buf_dmah; /* dma for buffers */ 320*f6929eceSGarrett D'Amore ddi_acc_handle_t buf_acch; 321*f6929eceSGarrett D'Amore uint32_t paddr; 322*f6929eceSGarrett D'Amore caddr_t kaddr; 323*f6929eceSGarrett D'Amore size_t buf_size; 324*f6929eceSGarrett D'Amore size_t buf_frames; /* Buffer size in frames */ 325*f6929eceSGarrett D'Amore unsigned fragfr; 326*f6929eceSGarrett D'Amore unsigned nfrags; 327*f6929eceSGarrett D'Amore unsigned nframes; 328*f6929eceSGarrett D'Amore unsigned bufsz; 329*f6929eceSGarrett D'Amore size_t offset; 330*f6929eceSGarrett D'Amore uint64_t count; 331*f6929eceSGarrett D'Amore int syncdir; 332*f6929eceSGarrett D'Amore }; 333*f6929eceSGarrett D'Amore 334*f6929eceSGarrett D'Amore struct _cmediahd_devc_t 335*f6929eceSGarrett D'Amore { 336*f6929eceSGarrett D'Amore dev_info_t *dip; 337*f6929eceSGarrett D'Amore audio_dev_t *adev; 338*f6929eceSGarrett D'Amore boolean_t has_ac97, has_fp_ac97; 339*f6929eceSGarrett D'Amore int model; 340*f6929eceSGarrett D'Amore ac97_t *ac97, *fp_ac97; 341*f6929eceSGarrett D'Amore 342*f6929eceSGarrett D'Amore boolean_t suspended; 343*f6929eceSGarrett D'Amore ddi_acc_handle_t pcih; 344*f6929eceSGarrett D'Amore ddi_acc_handle_t regsh; 345*f6929eceSGarrett D'Amore caddr_t base; 346*f6929eceSGarrett D'Amore kmutex_t mutex; /* For normal locking */ 347*f6929eceSGarrett D'Amore kmutex_t low_mutex; /* For low level routines */ 348*f6929eceSGarrett D'Amore cmediahd_regs_t rec_eng; /* which rec engine to use */ 349*f6929eceSGarrett D'Amore cmediahd_portc_t *portc[CMEDIAHD_NUM_PORTC]; 350*f6929eceSGarrett D'Amore int gpio_mic, gpio_out, gpio_codec, gpio_alt; 351*f6929eceSGarrett D'Amore cmediahd_ctrl_t controls[CTL_NUM]; 352*f6929eceSGarrett D'Amore }; 353*f6929eceSGarrett D'Amore 354*f6929eceSGarrett D'Amore #define INB(devc, reg) ddi_get8(devc->regsh, (void *)(reg)) 355*f6929eceSGarrett D'Amore #define OUTB(devc, val, reg) ddi_put8(devc->regsh, (void *)(reg), (val)) 356*f6929eceSGarrett D'Amore 357*f6929eceSGarrett D'Amore #define INW(devc, reg) ddi_get16(devc->regsh, (void *)(reg)) 358*f6929eceSGarrett D'Amore #define OUTW(devc, val, reg) ddi_put16(devc->regsh, (void *)(reg), (val)) 359*f6929eceSGarrett D'Amore 360*f6929eceSGarrett D'Amore #define INL(devc, reg) ddi_get32(devc->regsh, (void *)(reg)) 361*f6929eceSGarrett D'Amore #define OUTL(devc, val, reg) ddi_put32(devc->regsh, (void *)(reg), (val)) 362*f6929eceSGarrett D'Amore 363*f6929eceSGarrett D'Amore #endif /* CMEDIAHD_H */ 364