audiols.h revision 11936:54dc8a89ba0d
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27/* 28 * Purpose: Definitions for the Creative Audigy LS driver 29 */ 30/* 31 * This file is part of Open Sound System 32 * 33 * Copyright (C) 4Front Technologies 1996-2009. 34 * 35 * This software is released under CDDL 1.0 source license. 36 * See the COPYING file included in the main directory of this source 37 * distribution for the license terms and conditions. 38 */ 39#ifndef AUDIGYLS_H 40#define AUDIGYLS_H 41 42#define AUDIGYLS_NAME "audiols" 43 44#define AUDIGYLS_NUM_PORT 2 45#define AUDIGYLS_PLAY_PORT 0 46#define AUDIGYLS_REC_PORT 1 47 48#define PCI_VENDOR_ID_CREATIVE 0x1102 49#define PCI_DEVICE_ID_CREATIVE_AUDIGYLS 0x0007 50 51/* 52 * PCI registers 53 */ 54 55#define PR 0x00 56#define DR 0x04 57#define IPR 0x08 58#define IER 0x0C 59#define INTR_PCI (1 << 0) 60#define INTR_TXA (1 << 1) /* midi-a tx */ 61#define INTR_RXA (1 << 2) /* midi-a rx */ 62#define INTR_IT2 (1 << 3) /* timer 2, 44.1 kHz */ 63#define INTR_IT1 (1 << 4) /* timer 1, 192 kHz */ 64#define INTR_SS_ (1 << 5) /* spdif status */ 65#define INTR_SRT (1 << 6) /* sample rate status */ 66#define INTR_GP (1 << 7) 67#define INTR_AI (1 << 8) /* audio pending interrupt */ 68#define INTR_I2CDAC (1 << 9) 69#define INTR_I2CEE (1 << 10) 70#define INTR_SPI (1 << 11) 71#define INTR_SPF (1 << 12) 72#define INTR_SUO (1 << 13) 73#define INTR_SUI (1 << 14) 74#define INTR_TXB (1 << 16) /* midi-b tx */ 75#define INTR_RXB (1 << 17) /* midi-b rx */ 76 77#define HC 0x14 78#define HC_PF (1 << 11) /* play fmt 1 = 32b, 0 = 16b */ 79#define HC_RF (1 << 10) /* rec fmt 1 = 32b, 0 = 16b */ 80#define HC_AC97 (1 << 3) 81#define HC_AEN (1 << 0) /* audio enable */ 82 83#define GPIO 0x18 84#define AC97D 0x1C 85#define AC97A 0x1E 86/* 87 * Indirect registers 88 */ 89 90#define PTBA 0x000 /* gather play table base address */ 91#define PTBS 0x001 /* gather play table buffer size */ 92#define PTCA 0x002 /* gather play table current addr ptr */ 93#define PFBA 0x004 /* play fifo base address */ 94#define PFBS 0x005 /* play fifo buffer size */ 95#define CPFA 0x006 /* current play fifo address */ 96#define PFEA 0x007 /* play fifo end address */ 97#define CPCAV 0x008 /* current play fifo offset/cache sz valid */ 98#define RFBA 0x010 /* record fifo base address */ 99#define RFBS 0x011 /* record fifo buffer size */ 100#define CRFA 0x012 /* current record fifo address */ 101#define CRCAV 0x013 /* current record fifo offset/cache sz valid */ 102#define CDL 0x020 /* play fifo cache data, 0x20-0x2f */ 103#define SA 0x040 /* start audio */ 104#define SCS3 0x041 105#define SCS0 0x042 106#define SCS1 0x043 107#define SCS2 0x044 108#define SPC 0x045 /* spdif output control */ 109#define WMARK 0x046 /* test purposes only */ 110#define SPSC 0x049 /* spdif input control */ 111#define RCD 0x050 /* record cache data, 0x50-0x5f */ 112#define P17RECSEL 0x060 /* record fifo map address */ 113#define P17RECVOLL 0x061 /* record fifo volume control (lo) */ 114#define P17RECVOLH 0x062 /* record fifo volume control (hi) */ 115 116#define HMIXMAP_SPDIF 0x063 /* spdif router map address */ 117#define SMIXMAP_SPDIF 0x064 /* spdif router map address */ 118#define MIXCTL_SPDIF 0x065 /* spdif mixer control */ 119#define MIXVOL_SPDIF 0x066 /* spdif mixer input volume control */ 120#define HMIXMAP_I2S 0x067 /* i2s router map address */ 121#define SMIXMAP_I2S 0x068 /* i2s router map address */ 122#define MIXCTL_I2S 0x069 /* i2s mixer control */ 123#define MIXVOL_I2S 0x06a /* i2s mixer input volume control */ 124 125/* MIDI UART */ 126#define MUDATA 0x06c /* midi uart a data */ 127#define MUCMDA 0x06d /* midi uart a command/status */ 128#define MUDATB 0x06e /* midi uart b data */ 129#define MUCMDB 0x06f /* midi uart b command/status */ 130 131#define SRT 0x070 /* sample rate tracker status */ 132#define SRCTL 0x071 /* sample rate control */ 133#define AUDCTL 0x072 /* audio output control */ 134#define CHIP_ID 0x074 /* chip id */ 135#define AIE 0x075 /* audio interrupt enable */ 136#define AIP 0x076 /* audio interrupt */ 137#define WALL192 0x077 /* wall clock @ 192 kHz */ 138#define WALL441 0x078 /* wall clock @ 44.1 kHz */ 139#define IT 0x079 /* interval timer */ 140#define SPI 0x07a /* spi interface */ 141#define I2C_A 0x07b /* i2c address */ 142#define I2C_0 0x07c /* i2c data */ 143#define I2C_1 0x07d /* i2c data */ 144 145/* 146 * Audio interrupt bits 147 */ 148 149#define AI_PFH 0x00000001 /* playback fifo half loop */ 150#define AI_PFF 0x00000010 /* playback fifo loop */ 151#define AI_TFH 0x00000100 /* playback table half loop */ 152#define AI_TFF 0x00001000 /* playback table loop */ 153#define AI_RFH 0x00010000 /* capture table half loop */ 154#define AI_RFF 0x00100000 /* capture fifo loop */ 155#define AI_EAI 0x01000000 /* enables audio end interrupt */ 156 157#define SA_48K 0 158#define SA_44K 1 159#define SA_96K 2 160#define SA_192K 3 161 162#define SA_MIX_OUT_EN(ch) (1 << ((ch) + 28)) 163#define SA_MIX_IN_EN(ch) (1 << ((ch) + 24)) 164#define SA_PLAY_RATE(ch, rate) ((rate) << (((ch) * 2) + 16)) 165#define SA_PLAY_START(ch) (1 << (ch)) 166#define SA_RECORD_START(ch) (1 << ((ch) + 8)) 167 168#define SA_SPA(ch) (1U << (ch)) 169#define SA_SRA(ch) (1U << ((ch) + 8)) 170 171#define RECSEL_SPDIFOUT 0 172#define RECSEL_I2SOUT 1 173#define RECSEL_SPDIFIN 2 174#define RECSEL_I2SIN 3 175#define RECSEL_AC97 4 176#define RECSEL_SRC 5 177 178typedef struct _audigyls_dev_t audigyls_dev_t; 179typedef struct _audigyls_port_t audigyls_port_t; 180 181typedef enum { 182 CTL_FRONT = 0, 183 CTL_SURROUND, 184 CTL_CENTER, 185 CTL_LFE, 186 CTL_RECORDVOL, 187 CTL_MONGAIN, 188 CTL_RECSRC, 189 CTL_SPREAD, 190 CTL_LOOP, 191 CTL_NUM /* must be last */ 192} audigyls_ctrl_num_t; 193 194typedef struct audigyls_ctrl 195{ 196 audigyls_dev_t *dev; 197 audio_ctrl_t *ctrl; 198 audigyls_ctrl_num_t num; 199 uint64_t val; 200} audigyls_ctrl_t; 201 202struct _audigyls_port_t 203{ 204 audigyls_dev_t *dev; 205 audio_engine_t *engine; 206 207 int direction; 208 209 unsigned nchan; 210 211 ddi_dma_handle_t buf_dmah; /* dma for buffers */ 212 ddi_acc_handle_t buf_acch; 213 uint32_t buf_paddr; 214 caddr_t buf_kaddr; 215 uint32_t buf_size; 216 uint32_t buf_frames; /* Buffer size in frames */ 217 uint32_t offset; 218 int syncdir; 219 uint64_t count; 220}; 221 222struct _audigyls_dev_t 223{ 224 dev_info_t *dip; 225 audio_dev_t *adev; 226 ac97_t *ac97; 227 228 int nactive; /* Num active ports */ 229 char digital_enable; /* Orange combo-jack mode */ 230 231 ddi_acc_handle_t pcih; 232 ddi_acc_handle_t regsh; 233 caddr_t base; 234 kmutex_t mutex; /* For normal locking */ 235 kmutex_t low_mutex; /* For low level routines */ 236 237 audigyls_port_t *port[AUDIGYLS_NUM_PORT]; 238 audigyls_ctrl_t controls[CTL_NUM]; 239 240 ac97_ctrl_t *ac97_recgain; 241 ac97_ctrl_t *ac97_recsrc; 242 uint64_t recmask; 243}; 244 245#define INB(dev, reg) \ 246 ddi_get8(dev->regsh, (void *)(dev->base + reg)) 247#define OUTB(dev, reg, val) \ 248 ddi_put8(dev->regsh, (void *)(dev->base + reg), (val)) 249 250#define INW(dev, reg) \ 251 ddi_get16(dev->regsh, (void *)(dev->base + reg)) 252#define OUTW(dev, reg, val) \ 253 ddi_put16(dev->regsh, (void *)(dev->base + reg), (val)) 254 255#define INL(dev, reg) \ 256 ddi_get32(dev->regsh, (void *)(dev->base + reg)) 257#define OUTL(dev, reg, val) \ 258 ddi_put32(dev->regsh, (void *)(dev->base + reg), (val)) 259 260#endif /* AUDIGYLS_H */ 261