162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef __SOUND_WM8766_H 362306a36Sopenharmony_ci#define __SOUND_WM8766_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * ALSA driver for ICEnsemble VT17xx 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Lowlevel functions for WM8766 codec 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Copyright (c) 2012 Ondrej Zary <linux@rainbow-software.org> 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define WM8766_REG_DACL1 0x00 1462306a36Sopenharmony_ci#define WM8766_REG_DACR1 0x01 1562306a36Sopenharmony_ci#define WM8766_VOL_MASK 0x1ff /* incl. update bit */ 1662306a36Sopenharmony_ci#define WM8766_VOL_UPDATE (1 << 8) /* update volume */ 1762306a36Sopenharmony_ci#define WM8766_REG_DACCTRL1 0x02 1862306a36Sopenharmony_ci#define WM8766_DAC_MUTEALL (1 << 0) 1962306a36Sopenharmony_ci#define WM8766_DAC_DEEMPALL (1 << 1) 2062306a36Sopenharmony_ci#define WM8766_DAC_PDWN (1 << 2) 2162306a36Sopenharmony_ci#define WM8766_DAC_ATC (1 << 3) 2262306a36Sopenharmony_ci#define WM8766_DAC_IZD (1 << 4) 2362306a36Sopenharmony_ci#define WM8766_DAC_PL_MASK 0x1e0 2462306a36Sopenharmony_ci#define WM8766_DAC_PL_LL (1 << 5) /* L chan: L signal */ 2562306a36Sopenharmony_ci#define WM8766_DAC_PL_LR (2 << 5) /* L chan: R signal */ 2662306a36Sopenharmony_ci#define WM8766_DAC_PL_LB (3 << 5) /* L chan: both */ 2762306a36Sopenharmony_ci#define WM8766_DAC_PL_RL (1 << 7) /* R chan: L signal */ 2862306a36Sopenharmony_ci#define WM8766_DAC_PL_RR (2 << 7) /* R chan: R signal */ 2962306a36Sopenharmony_ci#define WM8766_DAC_PL_RB (3 << 7) /* R chan: both */ 3062306a36Sopenharmony_ci#define WM8766_REG_IFCTRL 0x03 3162306a36Sopenharmony_ci#define WM8766_IF_FMT_RIGHTJ (0 << 0) 3262306a36Sopenharmony_ci#define WM8766_IF_FMT_LEFTJ (1 << 0) 3362306a36Sopenharmony_ci#define WM8766_IF_FMT_I2S (2 << 0) 3462306a36Sopenharmony_ci#define WM8766_IF_FMT_DSP (3 << 0) 3562306a36Sopenharmony_ci#define WM8766_IF_DSP_LATE (1 << 2) /* in DSP mode */ 3662306a36Sopenharmony_ci#define WM8766_IF_LRC_INVERTED (1 << 2) /* in other modes */ 3762306a36Sopenharmony_ci#define WM8766_IF_BCLK_INVERTED (1 << 3) 3862306a36Sopenharmony_ci#define WM8766_IF_IWL_16BIT (0 << 4) 3962306a36Sopenharmony_ci#define WM8766_IF_IWL_20BIT (1 << 4) 4062306a36Sopenharmony_ci#define WM8766_IF_IWL_24BIT (2 << 4) 4162306a36Sopenharmony_ci#define WM8766_IF_IWL_32BIT (3 << 4) 4262306a36Sopenharmony_ci#define WM8766_IF_MASK 0x3f 4362306a36Sopenharmony_ci#define WM8766_PHASE_INVERT1 (1 << 6) 4462306a36Sopenharmony_ci#define WM8766_PHASE_INVERT2 (1 << 7) 4562306a36Sopenharmony_ci#define WM8766_PHASE_INVERT3 (1 << 8) 4662306a36Sopenharmony_ci#define WM8766_REG_DACL2 0x04 4762306a36Sopenharmony_ci#define WM8766_REG_DACR2 0x05 4862306a36Sopenharmony_ci#define WM8766_REG_DACL3 0x06 4962306a36Sopenharmony_ci#define WM8766_REG_DACR3 0x07 5062306a36Sopenharmony_ci#define WM8766_REG_MASTDA 0x08 5162306a36Sopenharmony_ci#define WM8766_REG_DACCTRL2 0x09 5262306a36Sopenharmony_ci#define WM8766_DAC2_ZCD (1 << 0) 5362306a36Sopenharmony_ci#define WM8766_DAC2_ZFLAG_ALL (0 << 1) 5462306a36Sopenharmony_ci#define WM8766_DAC2_ZFLAG_1 (1 << 1) 5562306a36Sopenharmony_ci#define WM8766_DAC2_ZFLAG_2 (2 << 1) 5662306a36Sopenharmony_ci#define WM8766_DAC2_ZFLAG_3 (3 << 1) 5762306a36Sopenharmony_ci#define WM8766_DAC2_MUTE1 (1 << 3) 5862306a36Sopenharmony_ci#define WM8766_DAC2_MUTE2 (1 << 4) 5962306a36Sopenharmony_ci#define WM8766_DAC2_MUTE3 (1 << 5) 6062306a36Sopenharmony_ci#define WM8766_DAC2_DEEMP1 (1 << 6) 6162306a36Sopenharmony_ci#define WM8766_DAC2_DEEMP2 (1 << 7) 6262306a36Sopenharmony_ci#define WM8766_DAC2_DEEMP3 (1 << 8) 6362306a36Sopenharmony_ci#define WM8766_REG_DACCTRL3 0x0a 6462306a36Sopenharmony_ci#define WM8766_DAC3_DACPD1 (1 << 1) 6562306a36Sopenharmony_ci#define WM8766_DAC3_DACPD2 (1 << 2) 6662306a36Sopenharmony_ci#define WM8766_DAC3_DACPD3 (1 << 3) 6762306a36Sopenharmony_ci#define WM8766_DAC3_PWRDNALL (1 << 4) 6862306a36Sopenharmony_ci#define WM8766_DAC3_POWER_MASK 0x1e 6962306a36Sopenharmony_ci#define WM8766_DAC3_MASTER (1 << 5) 7062306a36Sopenharmony_ci#define WM8766_DAC3_DAC128FS (0 << 6) 7162306a36Sopenharmony_ci#define WM8766_DAC3_DAC192FS (1 << 6) 7262306a36Sopenharmony_ci#define WM8766_DAC3_DAC256FS (2 << 6) 7362306a36Sopenharmony_ci#define WM8766_DAC3_DAC384FS (3 << 6) 7462306a36Sopenharmony_ci#define WM8766_DAC3_DAC512FS (4 << 6) 7562306a36Sopenharmony_ci#define WM8766_DAC3_DAC768FS (5 << 6) 7662306a36Sopenharmony_ci#define WM8766_DAC3_MSTR_MASK 0x1e0 7762306a36Sopenharmony_ci#define WM8766_REG_MUTE1 0x0c 7862306a36Sopenharmony_ci#define WM8766_MUTE1_MPD (1 << 6) 7962306a36Sopenharmony_ci#define WM8766_REG_MUTE2 0x0f 8062306a36Sopenharmony_ci#define WM8766_MUTE2_MPD (1 << 5) 8162306a36Sopenharmony_ci#define WM8766_REG_RESET 0x1f 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define WM8766_REG_COUNT 0x10 /* don't cache the RESET register */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistruct snd_wm8766; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistruct snd_wm8766_ops { 8862306a36Sopenharmony_ci void (*write)(struct snd_wm8766 *wm, u16 addr, u16 data); 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cienum snd_wm8766_ctl_id { 9262306a36Sopenharmony_ci WM8766_CTL_CH1_VOL, 9362306a36Sopenharmony_ci WM8766_CTL_CH2_VOL, 9462306a36Sopenharmony_ci WM8766_CTL_CH3_VOL, 9562306a36Sopenharmony_ci WM8766_CTL_CH1_SW, 9662306a36Sopenharmony_ci WM8766_CTL_CH2_SW, 9762306a36Sopenharmony_ci WM8766_CTL_CH3_SW, 9862306a36Sopenharmony_ci WM8766_CTL_PHASE1_SW, 9962306a36Sopenharmony_ci WM8766_CTL_PHASE2_SW, 10062306a36Sopenharmony_ci WM8766_CTL_PHASE3_SW, 10162306a36Sopenharmony_ci WM8766_CTL_DEEMPH1_SW, 10262306a36Sopenharmony_ci WM8766_CTL_DEEMPH2_SW, 10362306a36Sopenharmony_ci WM8766_CTL_DEEMPH3_SW, 10462306a36Sopenharmony_ci WM8766_CTL_IZD_SW, 10562306a36Sopenharmony_ci WM8766_CTL_ZC_SW, 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci WM8766_CTL_COUNT, 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define WM8766_ENUM_MAX 16 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#define WM8766_FLAG_STEREO (1 << 0) 11362306a36Sopenharmony_ci#define WM8766_FLAG_VOL_UPDATE (1 << 1) 11462306a36Sopenharmony_ci#define WM8766_FLAG_INVERT (1 << 2) 11562306a36Sopenharmony_ci#define WM8766_FLAG_LIM (1 << 3) 11662306a36Sopenharmony_ci#define WM8766_FLAG_ALC (1 << 4) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistruct snd_wm8766_ctl { 11962306a36Sopenharmony_ci struct snd_kcontrol *kctl; 12062306a36Sopenharmony_ci const char *name; 12162306a36Sopenharmony_ci snd_ctl_elem_type_t type; 12262306a36Sopenharmony_ci const char *const enum_names[WM8766_ENUM_MAX]; 12362306a36Sopenharmony_ci const unsigned int *tlv; 12462306a36Sopenharmony_ci u16 reg1, reg2, mask1, mask2, min, max, flags; 12562306a36Sopenharmony_ci void (*set)(struct snd_wm8766 *wm, u16 ch1, u16 ch2); 12662306a36Sopenharmony_ci void (*get)(struct snd_wm8766 *wm, u16 *ch1, u16 *ch2); 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cienum snd_wm8766_agc_mode { WM8766_AGC_OFF, WM8766_AGC_LIM, WM8766_AGC_ALC }; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistruct snd_wm8766 { 13262306a36Sopenharmony_ci struct snd_card *card; 13362306a36Sopenharmony_ci struct snd_wm8766_ctl ctl[WM8766_CTL_COUNT]; 13462306a36Sopenharmony_ci enum snd_wm8766_agc_mode agc_mode; 13562306a36Sopenharmony_ci struct snd_wm8766_ops ops; 13662306a36Sopenharmony_ci u16 regs[WM8766_REG_COUNT]; /* 9-bit registers */ 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_civoid snd_wm8766_init(struct snd_wm8766 *wm); 14262306a36Sopenharmony_civoid snd_wm8766_resume(struct snd_wm8766 *wm); 14362306a36Sopenharmony_civoid snd_wm8766_set_if(struct snd_wm8766 *wm, u16 dac); 14462306a36Sopenharmony_civoid snd_wm8766_volume_restore(struct snd_wm8766 *wm); 14562306a36Sopenharmony_ciint snd_wm8766_build_controls(struct snd_wm8766 *wm); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#endif /* __SOUND_WM8766_H */ 148