xref: /kernel/linux/linux-6.6/sound/parisc/harmony.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Hewlett-Packard Harmony audio driver
362306a36Sopenharmony_ci * Copyright (C) 2004, Kyle McMartin <kyle@parisc-linux.org>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __HARMONY_H__
762306a36Sopenharmony_ci#define __HARMONY_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistruct harmony_buffer {
1062306a36Sopenharmony_ci        unsigned long addr;
1162306a36Sopenharmony_ci        int buf;
1262306a36Sopenharmony_ci        int count;
1362306a36Sopenharmony_ci        int size;
1462306a36Sopenharmony_ci        int coherent;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct snd_harmony {
1862306a36Sopenharmony_ci        int irq;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci        unsigned long hpa; /* hard physical address */
2162306a36Sopenharmony_ci        void __iomem *iobase; /* remapped io address */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci        struct parisc_device *dev;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci        struct {
2662306a36Sopenharmony_ci                u32 gain;
2762306a36Sopenharmony_ci                u32 rate;
2862306a36Sopenharmony_ci                u32 format;
2962306a36Sopenharmony_ci                u32 stereo;
3062306a36Sopenharmony_ci		int playing;
3162306a36Sopenharmony_ci		int capturing;
3262306a36Sopenharmony_ci        } st;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci        struct snd_dma_device dma; /* playback/capture */
3562306a36Sopenharmony_ci        struct harmony_buffer pbuf;
3662306a36Sopenharmony_ci	struct harmony_buffer cbuf;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci        struct snd_dma_buffer gdma; /* graveyard */
3962306a36Sopenharmony_ci        struct snd_dma_buffer sdma; /* silence */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci        struct {
4262306a36Sopenharmony_ci                unsigned long play_intr;
4362306a36Sopenharmony_ci	        unsigned long rec_intr;
4462306a36Sopenharmony_ci                unsigned long graveyard_intr;
4562306a36Sopenharmony_ci                unsigned long silence_intr;
4662306a36Sopenharmony_ci        } stats;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci        struct snd_pcm *pcm;
4962306a36Sopenharmony_ci        struct snd_card *card;
5062306a36Sopenharmony_ci        struct snd_pcm_substream *psubs;
5162306a36Sopenharmony_ci	struct snd_pcm_substream *csubs;
5262306a36Sopenharmony_ci        struct snd_info_entry *proc;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci        spinlock_t lock;
5562306a36Sopenharmony_ci        spinlock_t mixer_lock;
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define MAX_PCM_DEVICES     1
5962306a36Sopenharmony_ci#define MAX_PCM_SUBSTREAMS  4
6062306a36Sopenharmony_ci#define MAX_MIDI_DEVICES    0
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define HARMONY_SIZE       64
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define BUF_SIZE     PAGE_SIZE
6562306a36Sopenharmony_ci#define MAX_BUFS     16
6662306a36Sopenharmony_ci#define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE)
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define PLAYBACK_BUFS    MAX_BUFS
6962306a36Sopenharmony_ci#define RECORD_BUFS      MAX_BUFS
7062306a36Sopenharmony_ci#define GRAVEYARD_BUFS   1
7162306a36Sopenharmony_ci#define GRAVEYARD_BUFSZ  (GRAVEYARD_BUFS*BUF_SIZE)
7262306a36Sopenharmony_ci#define SILENCE_BUFS     1
7362306a36Sopenharmony_ci#define SILENCE_BUFSZ    (SILENCE_BUFS*BUF_SIZE)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define HARMONY_ID       0x000
7662306a36Sopenharmony_ci#define HARMONY_RESET    0x004
7762306a36Sopenharmony_ci#define HARMONY_CNTL     0x008
7862306a36Sopenharmony_ci#define HARMONY_GAINCTL  0x00c
7962306a36Sopenharmony_ci#define HARMONY_PNXTADD  0x010
8062306a36Sopenharmony_ci#define HARMONY_PCURADD  0x014
8162306a36Sopenharmony_ci#define HARMONY_RNXTADD  0x018
8262306a36Sopenharmony_ci#define HARMONY_RCURADD  0x01c
8362306a36Sopenharmony_ci#define HARMONY_DSTATUS  0x020
8462306a36Sopenharmony_ci#define HARMONY_OV       0x024
8562306a36Sopenharmony_ci#define HARMONY_PIO      0x028
8662306a36Sopenharmony_ci#define HARMONY_DIAG     0x03c
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define HARMONY_CNTL_C          0x80000000
8962306a36Sopenharmony_ci#define HARMONY_CNTL_ST         0x00000020
9062306a36Sopenharmony_ci#define HARMONY_CNTL_44100      0x00000015      /* HARMONY_SR_44KHZ */
9162306a36Sopenharmony_ci#define HARMONY_CNTL_8000       0x00000008      /* HARMONY_SR_8KHZ */
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#define HARMONY_DSTATUS_ID      0x00000000 /* interrupts off */
9462306a36Sopenharmony_ci#define HARMONY_DSTATUS_PN      0x00000200 /* playback fill */
9562306a36Sopenharmony_ci#define HARMONY_DSTATUS_RN      0x00000002 /* record fill */
9662306a36Sopenharmony_ci#define HARMONY_DSTATUS_IE      0x80000000 /* interrupts on */
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#define HARMONY_DF_16BIT_LINEAR 0x00000000
9962306a36Sopenharmony_ci#define HARMONY_DF_8BIT_ULAW    0x00000001
10062306a36Sopenharmony_ci#define HARMONY_DF_8BIT_ALAW    0x00000002
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define HARMONY_SS_MONO         0x00000000
10362306a36Sopenharmony_ci#define HARMONY_SS_STEREO       0x00000001
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define HARMONY_GAIN_SILENCE    0x01F00FFF
10662306a36Sopenharmony_ci#define HARMONY_GAIN_DEFAULT    0x01F00FFF
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define HARMONY_GAIN_HE_SHIFT   27 /* headphones enabled */
10962306a36Sopenharmony_ci#define HARMONY_GAIN_HE_MASK    (1 << HARMONY_GAIN_HE_SHIFT)
11062306a36Sopenharmony_ci#define HARMONY_GAIN_LE_SHIFT   26 /* line-out enabled */
11162306a36Sopenharmony_ci#define HARMONY_GAIN_LE_MASK    (1 << HARMONY_GAIN_LE_SHIFT)
11262306a36Sopenharmony_ci#define HARMONY_GAIN_SE_SHIFT   25 /* internal-speaker enabled */
11362306a36Sopenharmony_ci#define HARMONY_GAIN_SE_MASK    (1 << HARMONY_GAIN_SE_SHIFT)
11462306a36Sopenharmony_ci#define HARMONY_GAIN_IS_SHIFT   24 /* input select - 0 for line, 1 for mic */
11562306a36Sopenharmony_ci#define HARMONY_GAIN_IS_MASK    (1 << HARMONY_GAIN_IS_SHIFT)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci/* monitor attenuation */
11862306a36Sopenharmony_ci#define HARMONY_GAIN_MA         0x0f
11962306a36Sopenharmony_ci#define HARMONY_GAIN_MA_SHIFT   20
12062306a36Sopenharmony_ci#define HARMONY_GAIN_MA_MASK    (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT)
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/* input gain */
12362306a36Sopenharmony_ci#define HARMONY_GAIN_IN         0x0f
12462306a36Sopenharmony_ci#define HARMONY_GAIN_LI_SHIFT   16
12562306a36Sopenharmony_ci#define HARMONY_GAIN_LI_MASK    (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT)
12662306a36Sopenharmony_ci#define HARMONY_GAIN_RI_SHIFT   12
12762306a36Sopenharmony_ci#define HARMONY_GAIN_RI_MASK    (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT)
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/* output gain (master volume) */
13062306a36Sopenharmony_ci#define HARMONY_GAIN_OUT        0x3f
13162306a36Sopenharmony_ci#define HARMONY_GAIN_LO_SHIFT   6
13262306a36Sopenharmony_ci#define HARMONY_GAIN_LO_MASK    (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT)
13362306a36Sopenharmony_ci#define HARMONY_GAIN_RO_SHIFT   0
13462306a36Sopenharmony_ci#define HARMONY_GAIN_RO_MASK    (HARMONY_GAIN_OUT << HARMONY_GAIN_RO_SHIFT)
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci#define HARMONY_MAX_OUT (HARMONY_GAIN_RO_MASK >> HARMONY_GAIN_RO_SHIFT)
13762306a36Sopenharmony_ci#define HARMONY_MAX_IN  (HARMONY_GAIN_RI_MASK >> HARMONY_GAIN_RI_SHIFT)
13862306a36Sopenharmony_ci#define HARMONY_MAX_MON (HARMONY_GAIN_MA_MASK >> HARMONY_GAIN_MA_SHIFT)
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci#define HARMONY_SR_8KHZ         0x08
14162306a36Sopenharmony_ci#define HARMONY_SR_16KHZ        0x09
14262306a36Sopenharmony_ci#define HARMONY_SR_27KHZ        0x0A
14362306a36Sopenharmony_ci#define HARMONY_SR_32KHZ        0x0B
14462306a36Sopenharmony_ci#define HARMONY_SR_48KHZ        0x0E
14562306a36Sopenharmony_ci#define HARMONY_SR_9KHZ         0x0F
14662306a36Sopenharmony_ci#define HARMONY_SR_5KHZ         0x10
14762306a36Sopenharmony_ci#define HARMONY_SR_11KHZ        0x11
14862306a36Sopenharmony_ci#define HARMONY_SR_18KHZ        0x12
14962306a36Sopenharmony_ci#define HARMONY_SR_22KHZ        0x13
15062306a36Sopenharmony_ci#define HARMONY_SR_37KHZ        0x14
15162306a36Sopenharmony_ci#define HARMONY_SR_44KHZ        0x15
15262306a36Sopenharmony_ci#define HARMONY_SR_33KHZ        0x16
15362306a36Sopenharmony_ci#define HARMONY_SR_6KHZ         0x17
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci#endif /* __HARMONY_H__ */
156