1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Hewlett-Packard Harmony audio driver 3*4882a593Smuzhiyun * Copyright (C) 2004, Kyle McMartin <kyle@parisc-linux.org> 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __HARMONY_H__ 7*4882a593Smuzhiyun #define __HARMONY_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct harmony_buffer { 10*4882a593Smuzhiyun unsigned long addr; 11*4882a593Smuzhiyun int buf; 12*4882a593Smuzhiyun int count; 13*4882a593Smuzhiyun int size; 14*4882a593Smuzhiyun int coherent; 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct snd_harmony { 18*4882a593Smuzhiyun int irq; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun unsigned long hpa; /* hard physical address */ 21*4882a593Smuzhiyun void __iomem *iobase; /* remapped io address */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct parisc_device *dev; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct { 26*4882a593Smuzhiyun u32 gain; 27*4882a593Smuzhiyun u32 rate; 28*4882a593Smuzhiyun u32 format; 29*4882a593Smuzhiyun u32 stereo; 30*4882a593Smuzhiyun int playing; 31*4882a593Smuzhiyun int capturing; 32*4882a593Smuzhiyun } st; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct snd_dma_device dma; /* playback/capture */ 35*4882a593Smuzhiyun struct harmony_buffer pbuf; 36*4882a593Smuzhiyun struct harmony_buffer cbuf; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct snd_dma_buffer gdma; /* graveyard */ 39*4882a593Smuzhiyun struct snd_dma_buffer sdma; /* silence */ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct { 42*4882a593Smuzhiyun unsigned long play_intr; 43*4882a593Smuzhiyun unsigned long rec_intr; 44*4882a593Smuzhiyun unsigned long graveyard_intr; 45*4882a593Smuzhiyun unsigned long silence_intr; 46*4882a593Smuzhiyun } stats; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct snd_pcm *pcm; 49*4882a593Smuzhiyun struct snd_card *card; 50*4882a593Smuzhiyun struct snd_pcm_substream *psubs; 51*4882a593Smuzhiyun struct snd_pcm_substream *csubs; 52*4882a593Smuzhiyun struct snd_info_entry *proc; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun spinlock_t lock; 55*4882a593Smuzhiyun spinlock_t mixer_lock; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define MAX_PCM_DEVICES 1 59*4882a593Smuzhiyun #define MAX_PCM_SUBSTREAMS 4 60*4882a593Smuzhiyun #define MAX_MIDI_DEVICES 0 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define HARMONY_SIZE 64 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define BUF_SIZE PAGE_SIZE 65*4882a593Smuzhiyun #define MAX_BUFS 16 66*4882a593Smuzhiyun #define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define PLAYBACK_BUFS MAX_BUFS 69*4882a593Smuzhiyun #define RECORD_BUFS MAX_BUFS 70*4882a593Smuzhiyun #define GRAVEYARD_BUFS 1 71*4882a593Smuzhiyun #define GRAVEYARD_BUFSZ (GRAVEYARD_BUFS*BUF_SIZE) 72*4882a593Smuzhiyun #define SILENCE_BUFS 1 73*4882a593Smuzhiyun #define SILENCE_BUFSZ (SILENCE_BUFS*BUF_SIZE) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define HARMONY_ID 0x000 76*4882a593Smuzhiyun #define HARMONY_RESET 0x004 77*4882a593Smuzhiyun #define HARMONY_CNTL 0x008 78*4882a593Smuzhiyun #define HARMONY_GAINCTL 0x00c 79*4882a593Smuzhiyun #define HARMONY_PNXTADD 0x010 80*4882a593Smuzhiyun #define HARMONY_PCURADD 0x014 81*4882a593Smuzhiyun #define HARMONY_RNXTADD 0x018 82*4882a593Smuzhiyun #define HARMONY_RCURADD 0x01c 83*4882a593Smuzhiyun #define HARMONY_DSTATUS 0x020 84*4882a593Smuzhiyun #define HARMONY_OV 0x024 85*4882a593Smuzhiyun #define HARMONY_PIO 0x028 86*4882a593Smuzhiyun #define HARMONY_DIAG 0x03c 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define HARMONY_CNTL_C 0x80000000 89*4882a593Smuzhiyun #define HARMONY_CNTL_ST 0x00000020 90*4882a593Smuzhiyun #define HARMONY_CNTL_44100 0x00000015 /* HARMONY_SR_44KHZ */ 91*4882a593Smuzhiyun #define HARMONY_CNTL_8000 0x00000008 /* HARMONY_SR_8KHZ */ 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define HARMONY_DSTATUS_ID 0x00000000 /* interrupts off */ 94*4882a593Smuzhiyun #define HARMONY_DSTATUS_PN 0x00000200 /* playback fill */ 95*4882a593Smuzhiyun #define HARMONY_DSTATUS_RN 0x00000002 /* record fill */ 96*4882a593Smuzhiyun #define HARMONY_DSTATUS_IE 0x80000000 /* interrupts on */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define HARMONY_DF_16BIT_LINEAR 0x00000000 99*4882a593Smuzhiyun #define HARMONY_DF_8BIT_ULAW 0x00000001 100*4882a593Smuzhiyun #define HARMONY_DF_8BIT_ALAW 0x00000002 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define HARMONY_SS_MONO 0x00000000 103*4882a593Smuzhiyun #define HARMONY_SS_STEREO 0x00000001 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define HARMONY_GAIN_SILENCE 0x01F00FFF 106*4882a593Smuzhiyun #define HARMONY_GAIN_DEFAULT 0x01F00FFF 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define HARMONY_GAIN_HE_SHIFT 27 /* headphones enabled */ 109*4882a593Smuzhiyun #define HARMONY_GAIN_HE_MASK (1 << HARMONY_GAIN_HE_SHIFT) 110*4882a593Smuzhiyun #define HARMONY_GAIN_LE_SHIFT 26 /* line-out enabled */ 111*4882a593Smuzhiyun #define HARMONY_GAIN_LE_MASK (1 << HARMONY_GAIN_LE_SHIFT) 112*4882a593Smuzhiyun #define HARMONY_GAIN_SE_SHIFT 25 /* internal-speaker enabled */ 113*4882a593Smuzhiyun #define HARMONY_GAIN_SE_MASK (1 << HARMONY_GAIN_SE_SHIFT) 114*4882a593Smuzhiyun #define HARMONY_GAIN_IS_SHIFT 24 /* input select - 0 for line, 1 for mic */ 115*4882a593Smuzhiyun #define HARMONY_GAIN_IS_MASK (1 << HARMONY_GAIN_IS_SHIFT) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* monitor attenuation */ 118*4882a593Smuzhiyun #define HARMONY_GAIN_MA 0x0f 119*4882a593Smuzhiyun #define HARMONY_GAIN_MA_SHIFT 20 120*4882a593Smuzhiyun #define HARMONY_GAIN_MA_MASK (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* input gain */ 123*4882a593Smuzhiyun #define HARMONY_GAIN_IN 0x0f 124*4882a593Smuzhiyun #define HARMONY_GAIN_LI_SHIFT 16 125*4882a593Smuzhiyun #define HARMONY_GAIN_LI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT) 126*4882a593Smuzhiyun #define HARMONY_GAIN_RI_SHIFT 12 127*4882a593Smuzhiyun #define HARMONY_GAIN_RI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT) 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* output gain (master volume) */ 130*4882a593Smuzhiyun #define HARMONY_GAIN_OUT 0x3f 131*4882a593Smuzhiyun #define HARMONY_GAIN_LO_SHIFT 6 132*4882a593Smuzhiyun #define HARMONY_GAIN_LO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT) 133*4882a593Smuzhiyun #define HARMONY_GAIN_RO_SHIFT 0 134*4882a593Smuzhiyun #define HARMONY_GAIN_RO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_RO_SHIFT) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define HARMONY_MAX_OUT (HARMONY_GAIN_RO_MASK >> HARMONY_GAIN_RO_SHIFT) 137*4882a593Smuzhiyun #define HARMONY_MAX_IN (HARMONY_GAIN_RI_MASK >> HARMONY_GAIN_RI_SHIFT) 138*4882a593Smuzhiyun #define HARMONY_MAX_MON (HARMONY_GAIN_MA_MASK >> HARMONY_GAIN_MA_SHIFT) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define HARMONY_SR_8KHZ 0x08 141*4882a593Smuzhiyun #define HARMONY_SR_16KHZ 0x09 142*4882a593Smuzhiyun #define HARMONY_SR_27KHZ 0x0A 143*4882a593Smuzhiyun #define HARMONY_SR_32KHZ 0x0B 144*4882a593Smuzhiyun #define HARMONY_SR_48KHZ 0x0E 145*4882a593Smuzhiyun #define HARMONY_SR_9KHZ 0x0F 146*4882a593Smuzhiyun #define HARMONY_SR_5KHZ 0x10 147*4882a593Smuzhiyun #define HARMONY_SR_11KHZ 0x11 148*4882a593Smuzhiyun #define HARMONY_SR_18KHZ 0x12 149*4882a593Smuzhiyun #define HARMONY_SR_22KHZ 0x13 150*4882a593Smuzhiyun #define HARMONY_SR_37KHZ 0x14 151*4882a593Smuzhiyun #define HARMONY_SR_44KHZ 0x15 152*4882a593Smuzhiyun #define HARMONY_SR_33KHZ 0x16 153*4882a593Smuzhiyun #define HARMONY_SR_6KHZ 0x17 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #endif /* __HARMONY_H__ */ 156