Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (348 commits) ALSA: hda - Fix NULL-derefence with a single mic in STAC auto-mic detection ALSA: hda - Add missing NID 0x19 fixup for Sony VAIO ALSA: hda - Fix ALC275 enable hardware EQ for SONY VAIO ALSA: oxygen: fix Xonar DG input ALSA: hda - Fix EAPD on Lenovo NB ALC269 to low ALSA: hda - Fix missing EAPD for Acer 4930G ALSA: hda: Disable 4/6 channels on some NVIDIA GPUs. ALSA: hda - Add static_hdmi_pcm option to HDMI codec parser ALSA: hda - Don't refer ELD when unplugged ASoC: tpa6130a2: Fix compiler warning ASoC: tlv320dac33: Add DAPM selection for LOM invert ASoC: DMIC codec: Adding a generic DMIC codec ALSA: snd-usb-us122l: Fix missing NULL checks ALSA: snd-usb-us122l: Fix MIDI output ASoC: soc-cache: Fix invalid memory access during snd_soc_lzo_cache_sync() ASoC: Fix section mismatch in wm8995.c ALSA: oxygen: add S/PDIF source selection for Claro cards ALSA: oxygen: fix CD/MIDI for X-Meridian (2G) ASoC: fix migor audio build ALSA: include delay.h for msleep in Xonar DG support ...
This commit is contained in:
@@ -17,6 +17,11 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
enum wm8994_type {
|
||||
WM8994 = 0,
|
||||
WM8958 = 1,
|
||||
};
|
||||
|
||||
struct regulator_dev;
|
||||
struct regulator_bulk_data;
|
||||
|
||||
@@ -48,6 +53,8 @@ struct wm8994 {
|
||||
struct mutex io_lock;
|
||||
struct mutex irq_lock;
|
||||
|
||||
enum wm8994_type type;
|
||||
|
||||
struct device *dev;
|
||||
int (*read_dev)(struct wm8994 *wm8994, unsigned short reg,
|
||||
int bytes, void *dest);
|
||||
@@ -68,6 +75,7 @@ struct wm8994 {
|
||||
u16 gpio_regs[WM8994_NUM_GPIO_REGS];
|
||||
|
||||
struct regulator_dev *dbvdd;
|
||||
int num_supplies;
|
||||
struct regulator_bulk_data *supplies;
|
||||
};
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ struct wm8994_ldo_pdata {
|
||||
|
||||
#define WM8994_DRC_REGS 5
|
||||
#define WM8994_EQ_REGS 20
|
||||
#define WM8958_MBC_CUTOFF_REGS 20
|
||||
#define WM8958_MBC_COEFF_REGS 48
|
||||
|
||||
/**
|
||||
* DRC configurations are specified with a label and a set of register
|
||||
@@ -59,6 +61,18 @@ struct wm8994_retune_mobile_cfg {
|
||||
u16 regs[WM8994_EQ_REGS];
|
||||
};
|
||||
|
||||
/**
|
||||
* Multiband compressor configurations are specified with a label and
|
||||
* two sets of values to write. Configurations are expected to be
|
||||
* generated using the multiband compressor configuration panel in
|
||||
* WISCE - see http://www.wolfsonmicro.com/wisce/
|
||||
*/
|
||||
struct wm8958_mbc_cfg {
|
||||
const char *name;
|
||||
u16 cutoff_regs[WM8958_MBC_CUTOFF_REGS];
|
||||
u16 coeff_regs[WM8958_MBC_COEFF_REGS];
|
||||
};
|
||||
|
||||
struct wm8994_pdata {
|
||||
int gpio_base;
|
||||
|
||||
@@ -78,6 +92,9 @@ struct wm8994_pdata {
|
||||
int num_retune_mobile_cfgs;
|
||||
struct wm8994_retune_mobile_cfg *retune_mobile_cfgs;
|
||||
|
||||
int num_mbc_cfgs;
|
||||
struct wm8958_mbc_cfg *mbc_cfgs;
|
||||
|
||||
/* LINEOUT can be differential or single ended */
|
||||
unsigned int lineout1_diff:1;
|
||||
unsigned int lineout2_diff:1;
|
||||
|
||||
@@ -64,12 +64,16 @@
|
||||
#define WM8994_LDO_1 0x3B
|
||||
#define WM8994_LDO_2 0x3C
|
||||
#define WM8994_CHARGE_PUMP_1 0x4C
|
||||
#define WM8958_CHARGE_PUMP_2 0x4D
|
||||
#define WM8994_CLASS_W_1 0x51
|
||||
#define WM8994_DC_SERVO_1 0x54
|
||||
#define WM8994_DC_SERVO_2 0x55
|
||||
#define WM8994_DC_SERVO_4 0x57
|
||||
#define WM8994_DC_SERVO_READBACK 0x58
|
||||
#define WM8994_ANALOGUE_HP_1 0x60
|
||||
#define WM8958_MIC_DETECT_1 0xD0
|
||||
#define WM8958_MIC_DETECT_2 0xD1
|
||||
#define WM8958_MIC_DETECT_3 0xD2
|
||||
#define WM8994_CHIP_REVISION 0x100
|
||||
#define WM8994_CONTROL_INTERFACE 0x101
|
||||
#define WM8994_WRITE_SEQUENCER_CTRL_1 0x110
|
||||
@@ -109,6 +113,10 @@
|
||||
#define WM8994_AIF2DAC_LRCLK 0x315
|
||||
#define WM8994_AIF2DAC_DATA 0x316
|
||||
#define WM8994_AIF2ADC_DATA 0x317
|
||||
#define WM8958_AIF3_CONTROL_1 0x320
|
||||
#define WM8958_AIF3_CONTROL_2 0x321
|
||||
#define WM8958_AIF3DAC_DATA 0x322
|
||||
#define WM8958_AIF3ADC_DATA 0x323
|
||||
#define WM8994_AIF1_ADC1_LEFT_VOLUME 0x400
|
||||
#define WM8994_AIF1_ADC1_RIGHT_VOLUME 0x401
|
||||
#define WM8994_AIF1_DAC1_LEFT_VOLUME 0x402
|
||||
@@ -242,6 +250,83 @@
|
||||
#define WM8994_INTERRUPT_STATUS_2_MASK 0x739
|
||||
#define WM8994_INTERRUPT_CONTROL 0x740
|
||||
#define WM8994_IRQ_DEBOUNCE 0x748
|
||||
#define WM8958_DSP2_PROGRAM 0x900
|
||||
#define WM8958_DSP2_CONFIG 0x901
|
||||
#define WM8958_DSP2_MAGICNUM 0xA00
|
||||
#define WM8958_DSP2_RELEASEYEAR 0xA01
|
||||
#define WM8958_DSP2_RELEASEMONTHDAY 0xA02
|
||||
#define WM8958_DSP2_RELEASETIME 0xA03
|
||||
#define WM8958_DSP2_VERMAJMIN 0xA04
|
||||
#define WM8958_DSP2_VERBUILD 0xA05
|
||||
#define WM8958_DSP2_EXECCONTROL 0xA0D
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C1_1 0x2200
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C1_2 0x2201
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C2_1 0x2202
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C2_2 0x2203
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C3_1 0x2204
|
||||
#define WM8958_MBC_BAND_2_LOWER_CUTOFF_C3_2 0x2205
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C2_1 0x2206
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C2_2 0x2207
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C3_1 0x2208
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C3_2 0x2209
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C1_1 0x220A
|
||||
#define WM8958_MBC_BAND_2_UPPER_CUTOFF_C1_2 0x220B
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C1_1 0x220C
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C1_2 0x220D
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C2_1 0x220E
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C2_2 0x220F
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C3_1 0x2210
|
||||
#define WM8958_MBC_BAND_1_UPPER_CUTOFF_C3_2 0x2211
|
||||
#define WM8958_MBC_BAND_1_LOWER_CUTOFF_1 0x2212
|
||||
#define WM8958_MBC_BAND_1_LOWER_CUTOFF_2 0x2213
|
||||
#define WM8958_MBC_BAND_1_K_1 0x2400
|
||||
#define WM8958_MBC_BAND_1_K_2 0x2401
|
||||
#define WM8958_MBC_BAND_1_N1_1 0x2402
|
||||
#define WM8958_MBC_BAND_1_N1_2 0x2403
|
||||
#define WM8958_MBC_BAND_1_N2_1 0x2404
|
||||
#define WM8958_MBC_BAND_1_N2_2 0x2405
|
||||
#define WM8958_MBC_BAND_1_N3_1 0x2406
|
||||
#define WM8958_MBC_BAND_1_N3_2 0x2407
|
||||
#define WM8958_MBC_BAND_1_N4_1 0x2408
|
||||
#define WM8958_MBC_BAND_1_N4_2 0x2409
|
||||
#define WM8958_MBC_BAND_1_N5_1 0x240A
|
||||
#define WM8958_MBC_BAND_1_N5_2 0x240B
|
||||
#define WM8958_MBC_BAND_1_X1_1 0x240C
|
||||
#define WM8958_MBC_BAND_1_X1_2 0x240D
|
||||
#define WM8958_MBC_BAND_1_X2_1 0x240E
|
||||
#define WM8958_MBC_BAND_1_X2_2 0x240F
|
||||
#define WM8958_MBC_BAND_1_X3_1 0x2410
|
||||
#define WM8958_MBC_BAND_1_X3_2 0x2411
|
||||
#define WM8958_MBC_BAND_1_ATTACK_1 0x2412
|
||||
#define WM8958_MBC_BAND_1_ATTACK_2 0x2413
|
||||
#define WM8958_MBC_BAND_1_DECAY_1 0x2414
|
||||
#define WM8958_MBC_BAND_1_DECAY_2 0x2415
|
||||
#define WM8958_MBC_BAND_2_K_1 0x2416
|
||||
#define WM8958_MBC_BAND_2_K_2 0x2417
|
||||
#define WM8958_MBC_BAND_2_N1_1 0x2418
|
||||
#define WM8958_MBC_BAND_2_N1_2 0x2419
|
||||
#define WM8958_MBC_BAND_2_N2_1 0x241A
|
||||
#define WM8958_MBC_BAND_2_N2_2 0x241B
|
||||
#define WM8958_MBC_BAND_2_N3_1 0x241C
|
||||
#define WM8958_MBC_BAND_2_N3_2 0x241D
|
||||
#define WM8958_MBC_BAND_2_N4_1 0x241E
|
||||
#define WM8958_MBC_BAND_2_N4_2 0x241F
|
||||
#define WM8958_MBC_BAND_2_N5_1 0x2420
|
||||
#define WM8958_MBC_BAND_2_N5_2 0x2421
|
||||
#define WM8958_MBC_BAND_2_X1_1 0x2422
|
||||
#define WM8958_MBC_BAND_2_X1_2 0x2423
|
||||
#define WM8958_MBC_BAND_2_X2_1 0x2424
|
||||
#define WM8958_MBC_BAND_2_X2_2 0x2425
|
||||
#define WM8958_MBC_BAND_2_X3_1 0x2426
|
||||
#define WM8958_MBC_BAND_2_X3_2 0x2427
|
||||
#define WM8958_MBC_BAND_2_ATTACK_1 0x2428
|
||||
#define WM8958_MBC_BAND_2_ATTACK_2 0x2429
|
||||
#define WM8958_MBC_BAND_2_DECAY_1 0x242A
|
||||
#define WM8958_MBC_BAND_2_DECAY_2 0x242B
|
||||
#define WM8958_MBC_B2_PG2_1 0x242C
|
||||
#define WM8958_MBC_B2_PG2_2 0x242D
|
||||
#define WM8958_MBC_B1_PG2_1 0x242E
|
||||
#define WM8958_MBC_B1_PG2_2 0x242F
|
||||
#define WM8994_WRITE_SEQUENCER_0 0x3000
|
||||
#define WM8994_WRITE_SEQUENCER_1 0x3001
|
||||
#define WM8994_WRITE_SEQUENCER_2 0x3002
|
||||
@@ -992,6 +1077,12 @@
|
||||
/*
|
||||
* R6 (0x06) - Power Management (6)
|
||||
*/
|
||||
#define WM8958_AIF3ADC_SRC_MASK 0x0600 /* AIF3ADC_SRC - [10:9] */
|
||||
#define WM8958_AIF3ADC_SRC_SHIFT 9 /* AIF3ADC_SRC - [10:9] */
|
||||
#define WM8958_AIF3ADC_SRC_WIDTH 2 /* AIF3ADC_SRC - [10:9] */
|
||||
#define WM8958_AIF2DAC_SRC_MASK 0x0180 /* AIF2DAC_SRC - [8:7] */
|
||||
#define WM8958_AIF2DAC_SRC_SHIFT 7 /* AIF2DAC_SRC - [8:7] */
|
||||
#define WM8958_AIF2DAC_SRC_WIDTH 2 /* AIF2DAC_SRC - [8:7] */
|
||||
#define WM8994_AIF3_TRI 0x0020 /* AIF3_TRI */
|
||||
#define WM8994_AIF3_TRI_MASK 0x0020 /* AIF3_TRI */
|
||||
#define WM8994_AIF3_TRI_SHIFT 5 /* AIF3_TRI */
|
||||
@@ -1835,6 +1926,14 @@
|
||||
#define WM8994_CP_ENA_SHIFT 15 /* CP_ENA */
|
||||
#define WM8994_CP_ENA_WIDTH 1 /* CP_ENA */
|
||||
|
||||
/*
|
||||
* R77 (0x4D) - Charge Pump (2)
|
||||
*/
|
||||
#define WM8958_CP_DISCH 0x8000 /* CP_DISCH */
|
||||
#define WM8958_CP_DISCH_MASK 0x8000 /* CP_DISCH */
|
||||
#define WM8958_CP_DISCH_SHIFT 15 /* CP_DISCH */
|
||||
#define WM8958_CP_DISCH_WIDTH 1 /* CP_DISCH */
|
||||
|
||||
/*
|
||||
* R81 (0x51) - Class W (1)
|
||||
*/
|
||||
@@ -1951,6 +2050,46 @@
|
||||
#define WM8994_HPOUT1R_DLY_SHIFT 1 /* HPOUT1R_DLY */
|
||||
#define WM8994_HPOUT1R_DLY_WIDTH 1 /* HPOUT1R_DLY */
|
||||
|
||||
/*
|
||||
* R208 (0xD0) - Mic Detect 1
|
||||
*/
|
||||
#define WM8958_MICD_BIAS_STARTTIME_MASK 0xF000 /* MICD_BIAS_STARTTIME - [15:12] */
|
||||
#define WM8958_MICD_BIAS_STARTTIME_SHIFT 12 /* MICD_BIAS_STARTTIME - [15:12] */
|
||||
#define WM8958_MICD_BIAS_STARTTIME_WIDTH 4 /* MICD_BIAS_STARTTIME - [15:12] */
|
||||
#define WM8958_MICD_RATE_MASK 0x0F00 /* MICD_RATE - [11:8] */
|
||||
#define WM8958_MICD_RATE_SHIFT 8 /* MICD_RATE - [11:8] */
|
||||
#define WM8958_MICD_RATE_WIDTH 4 /* MICD_RATE - [11:8] */
|
||||
#define WM8958_MICD_DBTIME 0x0002 /* MICD_DBTIME */
|
||||
#define WM8958_MICD_DBTIME_MASK 0x0002 /* MICD_DBTIME */
|
||||
#define WM8958_MICD_DBTIME_SHIFT 1 /* MICD_DBTIME */
|
||||
#define WM8958_MICD_DBTIME_WIDTH 1 /* MICD_DBTIME */
|
||||
#define WM8958_MICD_ENA 0x0001 /* MICD_ENA */
|
||||
#define WM8958_MICD_ENA_MASK 0x0001 /* MICD_ENA */
|
||||
#define WM8958_MICD_ENA_SHIFT 0 /* MICD_ENA */
|
||||
#define WM8958_MICD_ENA_WIDTH 1 /* MICD_ENA */
|
||||
|
||||
/*
|
||||
* R209 (0xD1) - Mic Detect 2
|
||||
*/
|
||||
#define WM8958_MICD_LVL_SEL_MASK 0x00FF /* MICD_LVL_SEL - [7:0] */
|
||||
#define WM8958_MICD_LVL_SEL_SHIFT 0 /* MICD_LVL_SEL - [7:0] */
|
||||
#define WM8958_MICD_LVL_SEL_WIDTH 8 /* MICD_LVL_SEL - [7:0] */
|
||||
|
||||
/*
|
||||
* R210 (0xD2) - Mic Detect 3
|
||||
*/
|
||||
#define WM8958_MICD_LVL_MASK 0x07FC /* MICD_LVL - [10:2] */
|
||||
#define WM8958_MICD_LVL_SHIFT 2 /* MICD_LVL - [10:2] */
|
||||
#define WM8958_MICD_LVL_WIDTH 9 /* MICD_LVL - [10:2] */
|
||||
#define WM8958_MICD_VALID 0x0002 /* MICD_VALID */
|
||||
#define WM8958_MICD_VALID_MASK 0x0002 /* MICD_VALID */
|
||||
#define WM8958_MICD_VALID_SHIFT 1 /* MICD_VALID */
|
||||
#define WM8958_MICD_VALID_WIDTH 1 /* MICD_VALID */
|
||||
#define WM8958_MICD_STS 0x0001 /* MICD_STS */
|
||||
#define WM8958_MICD_STS_MASK 0x0001 /* MICD_STS */
|
||||
#define WM8958_MICD_STS_SHIFT 0 /* MICD_STS */
|
||||
#define WM8958_MICD_STS_WIDTH 1 /* MICD_STS */
|
||||
|
||||
/*
|
||||
* R256 (0x100) - Chip Revision
|
||||
*/
|
||||
@@ -2069,6 +2208,14 @@
|
||||
/*
|
||||
* R520 (0x208) - Clocking (1)
|
||||
*/
|
||||
#define WM8958_DSP2CLK_ENA 0x4000 /* DSP2CLK_ENA */
|
||||
#define WM8958_DSP2CLK_ENA_MASK 0x4000 /* DSP2CLK_ENA */
|
||||
#define WM8958_DSP2CLK_ENA_SHIFT 14 /* DSP2CLK_ENA */
|
||||
#define WM8958_DSP2CLK_ENA_WIDTH 1 /* DSP2CLK_ENA */
|
||||
#define WM8958_DSP2CLK_SRC 0x1000 /* DSP2CLK_SRC */
|
||||
#define WM8958_DSP2CLK_SRC_MASK 0x1000 /* DSP2CLK_SRC */
|
||||
#define WM8958_DSP2CLK_SRC_SHIFT 12 /* DSP2CLK_SRC */
|
||||
#define WM8958_DSP2CLK_SRC_WIDTH 1 /* DSP2CLK_SRC */
|
||||
#define WM8994_TOCLK_ENA 0x0010 /* TOCLK_ENA */
|
||||
#define WM8994_TOCLK_ENA_MASK 0x0010 /* TOCLK_ENA */
|
||||
#define WM8994_TOCLK_ENA_SHIFT 4 /* TOCLK_ENA */
|
||||
@@ -2552,6 +2699,63 @@
|
||||
#define WM8994_AIF2ADCR_DAT_INV_SHIFT 0 /* AIF2ADCR_DAT_INV */
|
||||
#define WM8994_AIF2ADCR_DAT_INV_WIDTH 1 /* AIF2ADCR_DAT_INV */
|
||||
|
||||
/*
|
||||
* R800 (0x320) - AIF3 Control (1)
|
||||
*/
|
||||
#define WM8958_AIF3_LRCLK_INV 0x0080 /* AIF3_LRCLK_INV */
|
||||
#define WM8958_AIF3_LRCLK_INV_MASK 0x0080 /* AIF3_LRCLK_INV */
|
||||
#define WM8958_AIF3_LRCLK_INV_SHIFT 7 /* AIF3_LRCLK_INV */
|
||||
#define WM8958_AIF3_LRCLK_INV_WIDTH 1 /* AIF3_LRCLK_INV */
|
||||
#define WM8958_AIF3_WL_MASK 0x0060 /* AIF3_WL - [6:5] */
|
||||
#define WM8958_AIF3_WL_SHIFT 5 /* AIF3_WL - [6:5] */
|
||||
#define WM8958_AIF3_WL_WIDTH 2 /* AIF3_WL - [6:5] */
|
||||
#define WM8958_AIF3_FMT_MASK 0x0018 /* AIF3_FMT - [4:3] */
|
||||
#define WM8958_AIF3_FMT_SHIFT 3 /* AIF3_FMT - [4:3] */
|
||||
#define WM8958_AIF3_FMT_WIDTH 2 /* AIF3_FMT - [4:3] */
|
||||
|
||||
/*
|
||||
* R801 (0x321) - AIF3 Control (2)
|
||||
*/
|
||||
#define WM8958_AIF3DAC_BOOST_MASK 0x0C00 /* AIF3DAC_BOOST - [11:10] */
|
||||
#define WM8958_AIF3DAC_BOOST_SHIFT 10 /* AIF3DAC_BOOST - [11:10] */
|
||||
#define WM8958_AIF3DAC_BOOST_WIDTH 2 /* AIF3DAC_BOOST - [11:10] */
|
||||
#define WM8958_AIF3DAC_COMP 0x0010 /* AIF3DAC_COMP */
|
||||
#define WM8958_AIF3DAC_COMP_MASK 0x0010 /* AIF3DAC_COMP */
|
||||
#define WM8958_AIF3DAC_COMP_SHIFT 4 /* AIF3DAC_COMP */
|
||||
#define WM8958_AIF3DAC_COMP_WIDTH 1 /* AIF3DAC_COMP */
|
||||
#define WM8958_AIF3DAC_COMPMODE 0x0008 /* AIF3DAC_COMPMODE */
|
||||
#define WM8958_AIF3DAC_COMPMODE_MASK 0x0008 /* AIF3DAC_COMPMODE */
|
||||
#define WM8958_AIF3DAC_COMPMODE_SHIFT 3 /* AIF3DAC_COMPMODE */
|
||||
#define WM8958_AIF3DAC_COMPMODE_WIDTH 1 /* AIF3DAC_COMPMODE */
|
||||
#define WM8958_AIF3ADC_COMP 0x0004 /* AIF3ADC_COMP */
|
||||
#define WM8958_AIF3ADC_COMP_MASK 0x0004 /* AIF3ADC_COMP */
|
||||
#define WM8958_AIF3ADC_COMP_SHIFT 2 /* AIF3ADC_COMP */
|
||||
#define WM8958_AIF3ADC_COMP_WIDTH 1 /* AIF3ADC_COMP */
|
||||
#define WM8958_AIF3ADC_COMPMODE 0x0002 /* AIF3ADC_COMPMODE */
|
||||
#define WM8958_AIF3ADC_COMPMODE_MASK 0x0002 /* AIF3ADC_COMPMODE */
|
||||
#define WM8958_AIF3ADC_COMPMODE_SHIFT 1 /* AIF3ADC_COMPMODE */
|
||||
#define WM8958_AIF3ADC_COMPMODE_WIDTH 1 /* AIF3ADC_COMPMODE */
|
||||
#define WM8958_AIF3_LOOPBACK 0x0001 /* AIF3_LOOPBACK */
|
||||
#define WM8958_AIF3_LOOPBACK_MASK 0x0001 /* AIF3_LOOPBACK */
|
||||
#define WM8958_AIF3_LOOPBACK_SHIFT 0 /* AIF3_LOOPBACK */
|
||||
#define WM8958_AIF3_LOOPBACK_WIDTH 1 /* AIF3_LOOPBACK */
|
||||
|
||||
/*
|
||||
* R802 (0x322) - AIF3DAC Data
|
||||
*/
|
||||
#define WM8958_AIF3DAC_DAT_INV 0x0001 /* AIF3DAC_DAT_INV */
|
||||
#define WM8958_AIF3DAC_DAT_INV_MASK 0x0001 /* AIF3DAC_DAT_INV */
|
||||
#define WM8958_AIF3DAC_DAT_INV_SHIFT 0 /* AIF3DAC_DAT_INV */
|
||||
#define WM8958_AIF3DAC_DAT_INV_WIDTH 1 /* AIF3DAC_DAT_INV */
|
||||
|
||||
/*
|
||||
* R803 (0x323) - AIF3ADC Data
|
||||
*/
|
||||
#define WM8958_AIF3ADC_DAT_INV 0x0001 /* AIF3ADC_DAT_INV */
|
||||
#define WM8958_AIF3ADC_DAT_INV_MASK 0x0001 /* AIF3ADC_DAT_INV */
|
||||
#define WM8958_AIF3ADC_DAT_INV_SHIFT 0 /* AIF3ADC_DAT_INV */
|
||||
#define WM8958_AIF3ADC_DAT_INV_WIDTH 1 /* AIF3ADC_DAT_INV */
|
||||
|
||||
/*
|
||||
* R1024 (0x400) - AIF1 ADC1 Left Volume
|
||||
*/
|
||||
@@ -4289,4 +4493,102 @@
|
||||
#define WM8994_TEMP_SHUT_DB_SHIFT 0 /* TEMP_SHUT_DB */
|
||||
#define WM8994_TEMP_SHUT_DB_WIDTH 1 /* TEMP_SHUT_DB */
|
||||
|
||||
/*
|
||||
* R2304 (0x900) - DSP2_Program
|
||||
*/
|
||||
#define WM8958_DSP2_ENA 0x0001 /* DSP2_ENA */
|
||||
#define WM8958_DSP2_ENA_MASK 0x0001 /* DSP2_ENA */
|
||||
#define WM8958_DSP2_ENA_SHIFT 0 /* DSP2_ENA */
|
||||
#define WM8958_DSP2_ENA_WIDTH 1 /* DSP2_ENA */
|
||||
|
||||
/*
|
||||
* R2305 (0x901) - DSP2_Config
|
||||
*/
|
||||
#define WM8958_MBC_SEL_MASK 0x0030 /* MBC_SEL - [5:4] */
|
||||
#define WM8958_MBC_SEL_SHIFT 4 /* MBC_SEL - [5:4] */
|
||||
#define WM8958_MBC_SEL_WIDTH 2 /* MBC_SEL - [5:4] */
|
||||
#define WM8958_MBC_ENA 0x0001 /* MBC_ENA */
|
||||
#define WM8958_MBC_ENA_MASK 0x0001 /* MBC_ENA */
|
||||
#define WM8958_MBC_ENA_SHIFT 0 /* MBC_ENA */
|
||||
#define WM8958_MBC_ENA_WIDTH 1 /* MBC_ENA */
|
||||
|
||||
/*
|
||||
* R2560 (0xA00) - DSP2_MagicNum
|
||||
*/
|
||||
#define WM8958_DSP2_MAGIC_NUM_MASK 0xFFFF /* DSP2_MAGIC_NUM - [15:0] */
|
||||
#define WM8958_DSP2_MAGIC_NUM_SHIFT 0 /* DSP2_MAGIC_NUM - [15:0] */
|
||||
#define WM8958_DSP2_MAGIC_NUM_WIDTH 16 /* DSP2_MAGIC_NUM - [15:0] */
|
||||
|
||||
/*
|
||||
* R2561 (0xA01) - DSP2_ReleaseYear
|
||||
*/
|
||||
#define WM8958_DSP2_RELEASE_YEAR_MASK 0xFFFF /* DSP2_RELEASE_YEAR - [15:0] */
|
||||
#define WM8958_DSP2_RELEASE_YEAR_SHIFT 0 /* DSP2_RELEASE_YEAR - [15:0] */
|
||||
#define WM8958_DSP2_RELEASE_YEAR_WIDTH 16 /* DSP2_RELEASE_YEAR - [15:0] */
|
||||
|
||||
/*
|
||||
* R2562 (0xA02) - DSP2_ReleaseMonthDay
|
||||
*/
|
||||
#define WM8958_DSP2_RELEASE_MONTH_MASK 0xFF00 /* DSP2_RELEASE_MONTH - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_MONTH_SHIFT 8 /* DSP2_RELEASE_MONTH - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_MONTH_WIDTH 8 /* DSP2_RELEASE_MONTH - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_DAY_MASK 0x00FF /* DSP2_RELEASE_DAY - [7:0] */
|
||||
#define WM8958_DSP2_RELEASE_DAY_SHIFT 0 /* DSP2_RELEASE_DAY - [7:0] */
|
||||
#define WM8958_DSP2_RELEASE_DAY_WIDTH 8 /* DSP2_RELEASE_DAY - [7:0] */
|
||||
|
||||
/*
|
||||
* R2563 (0xA03) - DSP2_ReleaseTime
|
||||
*/
|
||||
#define WM8958_DSP2_RELEASE_HOURS_MASK 0xFF00 /* DSP2_RELEASE_HOURS - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_HOURS_SHIFT 8 /* DSP2_RELEASE_HOURS - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_HOURS_WIDTH 8 /* DSP2_RELEASE_HOURS - [15:8] */
|
||||
#define WM8958_DSP2_RELEASE_MINS_MASK 0x00FF /* DSP2_RELEASE_MINS - [7:0] */
|
||||
#define WM8958_DSP2_RELEASE_MINS_SHIFT 0 /* DSP2_RELEASE_MINS - [7:0] */
|
||||
#define WM8958_DSP2_RELEASE_MINS_WIDTH 8 /* DSP2_RELEASE_MINS - [7:0] */
|
||||
|
||||
/*
|
||||
* R2564 (0xA04) - DSP2_VerMajMin
|
||||
*/
|
||||
#define WM8958_DSP2_MAJOR_VER_MASK 0xFF00 /* DSP2_MAJOR_VER - [15:8] */
|
||||
#define WM8958_DSP2_MAJOR_VER_SHIFT 8 /* DSP2_MAJOR_VER - [15:8] */
|
||||
#define WM8958_DSP2_MAJOR_VER_WIDTH 8 /* DSP2_MAJOR_VER - [15:8] */
|
||||
#define WM8958_DSP2_MINOR_VER_MASK 0x00FF /* DSP2_MINOR_VER - [7:0] */
|
||||
#define WM8958_DSP2_MINOR_VER_SHIFT 0 /* DSP2_MINOR_VER - [7:0] */
|
||||
#define WM8958_DSP2_MINOR_VER_WIDTH 8 /* DSP2_MINOR_VER - [7:0] */
|
||||
|
||||
/*
|
||||
* R2565 (0xA05) - DSP2_VerBuild
|
||||
*/
|
||||
#define WM8958_DSP2_BUILD_VER_MASK 0xFFFF /* DSP2_BUILD_VER - [15:0] */
|
||||
#define WM8958_DSP2_BUILD_VER_SHIFT 0 /* DSP2_BUILD_VER - [15:0] */
|
||||
#define WM8958_DSP2_BUILD_VER_WIDTH 16 /* DSP2_BUILD_VER - [15:0] */
|
||||
|
||||
/*
|
||||
* R2573 (0xA0D) - DSP2_ExecControl
|
||||
*/
|
||||
#define WM8958_DSP2_STOPC 0x0020 /* DSP2_STOPC */
|
||||
#define WM8958_DSP2_STOPC_MASK 0x0020 /* DSP2_STOPC */
|
||||
#define WM8958_DSP2_STOPC_SHIFT 5 /* DSP2_STOPC */
|
||||
#define WM8958_DSP2_STOPC_WIDTH 1 /* DSP2_STOPC */
|
||||
#define WM8958_DSP2_STOPS 0x0010 /* DSP2_STOPS */
|
||||
#define WM8958_DSP2_STOPS_MASK 0x0010 /* DSP2_STOPS */
|
||||
#define WM8958_DSP2_STOPS_SHIFT 4 /* DSP2_STOPS */
|
||||
#define WM8958_DSP2_STOPS_WIDTH 1 /* DSP2_STOPS */
|
||||
#define WM8958_DSP2_STOPI 0x0008 /* DSP2_STOPI */
|
||||
#define WM8958_DSP2_STOPI_MASK 0x0008 /* DSP2_STOPI */
|
||||
#define WM8958_DSP2_STOPI_SHIFT 3 /* DSP2_STOPI */
|
||||
#define WM8958_DSP2_STOPI_WIDTH 1 /* DSP2_STOPI */
|
||||
#define WM8958_DSP2_STOP 0x0004 /* DSP2_STOP */
|
||||
#define WM8958_DSP2_STOP_MASK 0x0004 /* DSP2_STOP */
|
||||
#define WM8958_DSP2_STOP_SHIFT 2 /* DSP2_STOP */
|
||||
#define WM8958_DSP2_STOP_WIDTH 1 /* DSP2_STOP */
|
||||
#define WM8958_DSP2_RUNR 0x0002 /* DSP2_RUNR */
|
||||
#define WM8958_DSP2_RUNR_MASK 0x0002 /* DSP2_RUNR */
|
||||
#define WM8958_DSP2_RUNR_SHIFT 1 /* DSP2_RUNR */
|
||||
#define WM8958_DSP2_RUNR_WIDTH 1 /* DSP2_RUNR */
|
||||
#define WM8958_DSP2_RUN 0x0001 /* DSP2_RUN */
|
||||
#define WM8958_DSP2_RUN_MASK 0x0001 /* DSP2_RUN */
|
||||
#define WM8958_DSP2_RUN_SHIFT 0 /* DSP2_RUN */
|
||||
#define WM8958_DSP2_RUN_WIDTH 1 /* DSP2_RUN */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef _INCLUDE_SOUND_ALC5623_H
|
||||
#define _INCLUDE_SOUND_ALC5623_H
|
||||
struct alc5623_platform_data {
|
||||
/* configure : */
|
||||
/* Lineout/Speaker Amps Vmid ratio control */
|
||||
/* enable/disable adc/dac high pass filters */
|
||||
unsigned int add_ctrl;
|
||||
/* configure : */
|
||||
/* output to enable when jack is low */
|
||||
/* output to enable when jack is high */
|
||||
/* jack detect (gpio/nc/jack detect [12] */
|
||||
unsigned int jack_det_ctrl;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -259,6 +259,7 @@ typedef int __bitwise snd_pcm_subformat_t;
|
||||
#define SNDRV_PCM_INFO_HALF_DUPLEX 0x00100000 /* only half duplex */
|
||||
#define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */
|
||||
#define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */
|
||||
#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000 /* period wakeup can be disabled */
|
||||
#define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */
|
||||
|
||||
typedef int __bitwise snd_pcm_state_t;
|
||||
@@ -334,6 +335,8 @@ typedef int snd_pcm_hw_param_t;
|
||||
#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME
|
||||
|
||||
#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
|
||||
#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */
|
||||
#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */
|
||||
|
||||
struct snd_interval {
|
||||
unsigned int min, max;
|
||||
|
||||
@@ -160,12 +160,14 @@ static inline struct snd_ctl_elem_id *snd_ctl_build_ioff(struct snd_ctl_elem_id
|
||||
}
|
||||
|
||||
/*
|
||||
* Frequently used control callbacks
|
||||
* Frequently used control callbacks/helpers
|
||||
*/
|
||||
int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo);
|
||||
int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
|
||||
unsigned int items, const char *const names[]);
|
||||
|
||||
/*
|
||||
* virtual master control
|
||||
|
||||
@@ -28,6 +28,7 @@ enum HDSP_IO_Type {
|
||||
Multiface,
|
||||
H9652,
|
||||
H9632,
|
||||
RPM,
|
||||
Undefined,
|
||||
};
|
||||
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
/* these minors can still be used for autoloading devices (/dev/aload*) */
|
||||
#define SNDRV_MINOR_CONTROL 0 /* 0 */
|
||||
#define SNDRV_MINOR_GLOBAL 1 /* 1 */
|
||||
#define SNDRV_MINOR_SEQUENCER (SNDRV_MINOR_GLOBAL + 0 * 32)
|
||||
#define SNDRV_MINOR_TIMER (SNDRV_MINOR_GLOBAL + 1 * 32)
|
||||
#define SNDRV_MINOR_SEQUENCER 1 /* SNDRV_MINOR_GLOBAL + 0 * 32 */
|
||||
#define SNDRV_MINOR_TIMER 33 /* SNDRV_MINOR_GLOBAL + 1 * 32 */
|
||||
|
||||
#ifndef CONFIG_SND_DYNAMIC_MINORS
|
||||
/* 2 - 3 (reserved) */
|
||||
|
||||
@@ -297,6 +297,7 @@ struct snd_pcm_runtime {
|
||||
unsigned int info;
|
||||
unsigned int rate_num;
|
||||
unsigned int rate_den;
|
||||
unsigned int no_period_wakeup: 1;
|
||||
|
||||
/* -- SW params -- */
|
||||
int tstamp_mode; /* mmap timestamp is updated */
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
#include <linux/list.h>
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
||||
struct snd_pcm_substream;
|
||||
|
||||
/*
|
||||
@@ -205,7 +203,7 @@ struct snd_soc_dai_driver {
|
||||
int (*resume)(struct snd_soc_dai *dai);
|
||||
|
||||
/* ops */
|
||||
struct snd_soc_dai_ops *ops;
|
||||
const struct snd_soc_dai_ops *ops;
|
||||
|
||||
/* DAI capabilities */
|
||||
struct snd_soc_pcm_stream capture;
|
||||
|
||||
+69
-30
@@ -16,7 +16,6 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
#include <sound/control.h>
|
||||
#include <sound/soc.h>
|
||||
|
||||
/* widget has no PM register bit */
|
||||
#define SND_SOC_NOPM -1
|
||||
@@ -72,6 +71,10 @@
|
||||
wcontrols, wncontrols) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\
|
||||
wcontrols, wncontrols) \
|
||||
{ .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wncontrols)\
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
@@ -90,6 +93,9 @@
|
||||
#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
|
||||
@@ -116,6 +122,11 @@
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_OUT_DRV_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
@@ -140,6 +151,11 @@
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_VIRT_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
|
||||
/* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */
|
||||
#define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \
|
||||
@@ -219,13 +235,6 @@
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert) }
|
||||
#define SOC_DAPM_DOUBLE(xname, reg, shift_left, shift_right, max, invert, \
|
||||
power) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
|
||||
((max) << 16) | ((invert) << 24) }
|
||||
#define SOC_DAPM_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_volsw, \
|
||||
@@ -233,15 +242,6 @@
|
||||
.tlv.p = (tlv_array), \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert) }
|
||||
#define SOC_DAPM_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, \
|
||||
power, tlv_array) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||
.tlv.p = (tlv_array), \
|
||||
.info = snd_soc_info_volsw, \
|
||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||
.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
|
||||
((max) << 16) | ((invert) << 24) }
|
||||
#define SOC_DAPM_ENUM(xname, xenum) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = snd_soc_info_enum_double, \
|
||||
@@ -297,6 +297,7 @@ enum snd_soc_dapm_type;
|
||||
struct snd_soc_dapm_path;
|
||||
struct snd_soc_dapm_pin;
|
||||
struct snd_soc_dapm_route;
|
||||
struct snd_soc_dapm_context;
|
||||
|
||||
int dapm_reg_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
@@ -324,16 +325,16 @@ int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *uncontrol);
|
||||
int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *uncontrol);
|
||||
int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
|
||||
int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_widget *widget);
|
||||
int snd_soc_dapm_new_controls(struct snd_soc_codec *codec,
|
||||
int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_widget *widget,
|
||||
int num);
|
||||
|
||||
/* dapm path setup */
|
||||
int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec);
|
||||
void snd_soc_dapm_free(struct snd_soc_codec *codec);
|
||||
int snd_soc_dapm_add_routes(struct snd_soc_codec *codec,
|
||||
int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm);
|
||||
void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm);
|
||||
int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_route *route, int num);
|
||||
|
||||
/* dapm events */
|
||||
@@ -343,27 +344,33 @@ void snd_soc_dapm_shutdown(struct snd_soc_card *card);
|
||||
|
||||
/* dapm sys fs - used by the core */
|
||||
int snd_soc_dapm_sys_add(struct device *dev);
|
||||
void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec);
|
||||
void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm);
|
||||
|
||||
/* dapm audio pin control and status */
|
||||
int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin);
|
||||
int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin);
|
||||
int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin);
|
||||
int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin);
|
||||
int snd_soc_dapm_sync(struct snd_soc_codec *codec);
|
||||
int snd_soc_dapm_force_enable_pin(struct snd_soc_codec *codec,
|
||||
int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin);
|
||||
int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm);
|
||||
int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
int snd_soc_dapm_ignore_suspend(struct snd_soc_codec *codec, const char *pin);
|
||||
int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
|
||||
/* dapm widget types */
|
||||
enum snd_soc_dapm_type {
|
||||
snd_soc_dapm_input = 0, /* input pin */
|
||||
snd_soc_dapm_output, /* output pin */
|
||||
snd_soc_dapm_mux, /* selects 1 analog signal from many inputs */
|
||||
snd_soc_dapm_virt_mux, /* virtual version of snd_soc_dapm_mux */
|
||||
snd_soc_dapm_value_mux, /* selects 1 analog signal from many inputs */
|
||||
snd_soc_dapm_mixer, /* mixes several analog signals together */
|
||||
snd_soc_dapm_mixer_named_ctl, /* mixer with named controls */
|
||||
snd_soc_dapm_pga, /* programmable gain/attenuation (volume) */
|
||||
snd_soc_dapm_out_drv, /* output driver */
|
||||
snd_soc_dapm_adc, /* analog to digital converter */
|
||||
snd_soc_dapm_dac, /* digital to analog converter */
|
||||
snd_soc_dapm_micbias, /* microphone bias (power) */
|
||||
@@ -425,6 +432,7 @@ struct snd_soc_dapm_widget {
|
||||
char *sname; /* stream name */
|
||||
struct snd_soc_codec *codec;
|
||||
struct list_head list;
|
||||
struct snd_soc_dapm_context *dapm;
|
||||
|
||||
/* dapm control */
|
||||
short reg; /* negative reg = no direct dapm */
|
||||
@@ -461,4 +469,35 @@ struct snd_soc_dapm_widget {
|
||||
struct list_head power_list;
|
||||
};
|
||||
|
||||
struct snd_soc_dapm_update {
|
||||
struct snd_soc_dapm_widget *widget;
|
||||
struct snd_kcontrol *kcontrol;
|
||||
int reg;
|
||||
int mask;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* DAPM context */
|
||||
struct snd_soc_dapm_context {
|
||||
int n_widgets; /* number of widgets in this context */
|
||||
enum snd_soc_bias_level bias_level;
|
||||
enum snd_soc_bias_level suspend_bias_level;
|
||||
struct delayed_work delayed_work;
|
||||
unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
|
||||
|
||||
struct snd_soc_dapm_update *update;
|
||||
|
||||
struct device *dev; /* from parent - for debug */
|
||||
struct snd_soc_codec *codec; /* parent codec */
|
||||
struct snd_soc_card *card; /* parent card */
|
||||
|
||||
/* used during DAPM updates */
|
||||
int dev_power;
|
||||
struct list_head list;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_dapm;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+92
-24
@@ -222,10 +222,8 @@ enum snd_soc_bias_level {
|
||||
|
||||
struct snd_jack;
|
||||
struct snd_soc_card;
|
||||
struct snd_soc_device;
|
||||
struct snd_soc_pcm_stream;
|
||||
struct snd_soc_ops;
|
||||
struct snd_soc_dai_mode;
|
||||
struct snd_soc_pcm_runtime;
|
||||
struct snd_soc_dai;
|
||||
struct snd_soc_dai_driver;
|
||||
@@ -235,9 +233,10 @@ struct snd_soc_platform_driver;
|
||||
struct snd_soc_codec;
|
||||
struct snd_soc_codec_driver;
|
||||
struct soc_enum;
|
||||
struct snd_soc_ac97_ops;
|
||||
struct snd_soc_jack;
|
||||
struct snd_soc_jack_pin;
|
||||
struct snd_soc_cache_ops;
|
||||
#include <sound/soc-dapm.h>
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
struct snd_soc_jack_gpio;
|
||||
@@ -253,17 +252,30 @@ enum snd_soc_control_type {
|
||||
SND_SOC_SPI,
|
||||
};
|
||||
|
||||
enum snd_soc_compress_type {
|
||||
SND_SOC_FLAT_COMPRESSION = 1,
|
||||
SND_SOC_LZO_COMPRESSION,
|
||||
SND_SOC_RBTREE_COMPRESSION
|
||||
};
|
||||
|
||||
int snd_soc_register_platform(struct device *dev,
|
||||
struct snd_soc_platform_driver *platform_drv);
|
||||
void snd_soc_unregister_platform(struct device *dev);
|
||||
int snd_soc_register_codec(struct device *dev,
|
||||
struct snd_soc_codec_driver *codec_drv,
|
||||
const struct snd_soc_codec_driver *codec_drv,
|
||||
struct snd_soc_dai_driver *dai_drv, int num_dai);
|
||||
void snd_soc_unregister_codec(struct device *dev);
|
||||
int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg);
|
||||
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
|
||||
int addr_bits, int data_bits,
|
||||
enum snd_soc_control_type control);
|
||||
int snd_soc_cache_sync(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_init(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_exit(struct snd_soc_codec *codec);
|
||||
int snd_soc_cache_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int value);
|
||||
int snd_soc_cache_read(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int *value);
|
||||
|
||||
/* Utility functions to get clock rates from various things */
|
||||
int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
|
||||
@@ -420,23 +432,37 @@ struct snd_soc_ops {
|
||||
int (*trigger)(struct snd_pcm_substream *, int);
|
||||
};
|
||||
|
||||
/* SoC cache ops */
|
||||
struct snd_soc_cache_ops {
|
||||
const char *name;
|
||||
enum snd_soc_compress_type id;
|
||||
int (*init)(struct snd_soc_codec *codec);
|
||||
int (*exit)(struct snd_soc_codec *codec);
|
||||
int (*read)(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int *value);
|
||||
int (*write)(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int value);
|
||||
int (*sync)(struct snd_soc_codec *codec);
|
||||
};
|
||||
|
||||
/* SoC Audio Codec device */
|
||||
struct snd_soc_codec {
|
||||
const char *name;
|
||||
const char *name_prefix;
|
||||
int id;
|
||||
struct device *dev;
|
||||
struct snd_soc_codec_driver *driver;
|
||||
const struct snd_soc_codec_driver *driver;
|
||||
|
||||
struct mutex mutex;
|
||||
struct snd_soc_card *card;
|
||||
struct list_head list;
|
||||
struct list_head card_list;
|
||||
int num_dai;
|
||||
enum snd_soc_compress_type compress_type;
|
||||
|
||||
/* runtime */
|
||||
struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
|
||||
unsigned int active;
|
||||
unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
|
||||
unsigned int cache_only:1; /* Suppress writes to hardware */
|
||||
unsigned int cache_sync:1; /* Cache needs to be synced to hardware */
|
||||
unsigned int suspended:1; /* Codec is in suspend PM state */
|
||||
@@ -444,25 +470,25 @@ struct snd_soc_codec {
|
||||
unsigned int ac97_registered:1; /* Codec has been AC97 registered */
|
||||
unsigned int ac97_created:1; /* Codec has been created by SoC */
|
||||
unsigned int sysfs_registered:1; /* codec has been sysfs registered */
|
||||
unsigned int cache_init:1; /* codec cache has been initialized */
|
||||
|
||||
/* codec IO */
|
||||
void *control_data; /* codec control (i2c/3wire) data */
|
||||
hw_write_t hw_write;
|
||||
unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
|
||||
unsigned int (*read)(struct snd_soc_codec *, unsigned int);
|
||||
int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
|
||||
void *reg_cache;
|
||||
const void *reg_def_copy;
|
||||
const struct snd_soc_cache_ops *cache_ops;
|
||||
struct mutex cache_rw_mutex;
|
||||
|
||||
/* dapm */
|
||||
u32 pop_time;
|
||||
struct list_head dapm_widgets;
|
||||
struct list_head dapm_paths;
|
||||
enum snd_soc_bias_level bias_level;
|
||||
enum snd_soc_bias_level suspend_bias_level;
|
||||
struct delayed_work delayed_work;
|
||||
struct snd_soc_dapm_context dapm;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_codec_root;
|
||||
struct dentry *debugfs_reg;
|
||||
struct dentry *debugfs_pop_time;
|
||||
struct dentry *debugfs_dapm;
|
||||
#endif
|
||||
};
|
||||
@@ -488,6 +514,7 @@ struct snd_soc_codec_driver {
|
||||
short reg_cache_step;
|
||||
short reg_word_size;
|
||||
const void *reg_cache_default;
|
||||
enum snd_soc_compress_type compress_type;
|
||||
|
||||
/* codec bias level */
|
||||
int (*set_bias_level)(struct snd_soc_codec *,
|
||||
@@ -554,6 +581,30 @@ struct snd_soc_dai_link {
|
||||
struct snd_soc_ops *ops;
|
||||
};
|
||||
|
||||
struct snd_soc_codec_conf {
|
||||
const char *dev_name;
|
||||
|
||||
/*
|
||||
* optional map of kcontrol, widget and path name prefixes that are
|
||||
* associated per device
|
||||
*/
|
||||
const char *name_prefix;
|
||||
|
||||
/*
|
||||
* set this to the desired compression type if you want to
|
||||
* override the one supplied in codec->driver->compress_type
|
||||
*/
|
||||
enum snd_soc_compress_type compress_type;
|
||||
};
|
||||
|
||||
struct snd_soc_aux_dev {
|
||||
const char *name; /* Codec name */
|
||||
const char *codec_name; /* for multi-codec */
|
||||
|
||||
/* codec/machine specific init - e.g. add machine controls */
|
||||
int (*init)(struct snd_soc_dapm_context *dapm);
|
||||
};
|
||||
|
||||
/* SoC card */
|
||||
struct snd_soc_card {
|
||||
const char *name;
|
||||
@@ -579,6 +630,8 @@ struct snd_soc_card {
|
||||
/* callbacks */
|
||||
int (*set_bias_level)(struct snd_soc_card *,
|
||||
enum snd_soc_bias_level level);
|
||||
int (*set_bias_level_post)(struct snd_soc_card *,
|
||||
enum snd_soc_bias_level level);
|
||||
|
||||
long pmdown_time;
|
||||
|
||||
@@ -588,12 +641,35 @@ struct snd_soc_card {
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
int num_rtd;
|
||||
|
||||
/* optional codec specific configuration */
|
||||
struct snd_soc_codec_conf *codec_conf;
|
||||
int num_configs;
|
||||
|
||||
/*
|
||||
* optional auxiliary devices such as amplifiers or codecs with DAI
|
||||
* link unused
|
||||
*/
|
||||
struct snd_soc_aux_dev *aux_dev;
|
||||
int num_aux_devs;
|
||||
struct snd_soc_pcm_runtime *rtd_aux;
|
||||
int num_aux_rtd;
|
||||
|
||||
struct work_struct deferred_resume_work;
|
||||
|
||||
/* lists of probed devices belonging to this card */
|
||||
struct list_head codec_dev_list;
|
||||
struct list_head platform_dev_list;
|
||||
struct list_head dai_dev_list;
|
||||
|
||||
struct list_head widgets;
|
||||
struct list_head paths;
|
||||
struct list_head dapm_list;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_card_root;
|
||||
struct dentry *debugfs_pop_time;
|
||||
#endif
|
||||
u32 pop_time;
|
||||
};
|
||||
|
||||
/* SoC machine DAI configuration, glues a codec and cpu DAI together */
|
||||
@@ -639,17 +715,9 @@ struct soc_enum {
|
||||
};
|
||||
|
||||
/* codec IO */
|
||||
static inline unsigned int snd_soc_read(struct snd_soc_codec *codec,
|
||||
unsigned int reg)
|
||||
{
|
||||
return codec->driver->read(codec, reg);
|
||||
}
|
||||
|
||||
static inline unsigned int snd_soc_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int val)
|
||||
{
|
||||
return codec->driver->write(codec, reg, val);
|
||||
}
|
||||
unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
|
||||
unsigned int snd_soc_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int val);
|
||||
|
||||
/* device driver data */
|
||||
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM asoc
|
||||
|
||||
#if !defined(_TRACE_ASOC_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_ASOC_H
|
||||
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
struct snd_soc_jack;
|
||||
struct snd_soc_codec;
|
||||
struct snd_soc_card;
|
||||
struct snd_soc_dapm_widget;
|
||||
|
||||
/*
|
||||
* Log register events
|
||||
*/
|
||||
DECLARE_EVENT_CLASS(snd_soc_reg,
|
||||
|
||||
TP_PROTO(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int val),
|
||||
|
||||
TP_ARGS(codec, reg, val),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, codec->name )
|
||||
__field( int, id )
|
||||
__field( unsigned int, reg )
|
||||
__field( unsigned int, val )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, codec->name);
|
||||
__entry->id = codec->id;
|
||||
__entry->reg = reg;
|
||||
__entry->val = val;
|
||||
),
|
||||
|
||||
TP_printk("codec=%s.%d reg=%x val=%x", __get_str(name),
|
||||
(int)__entry->id, (unsigned int)__entry->reg,
|
||||
(unsigned int)__entry->val)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_reg, snd_soc_reg_write,
|
||||
|
||||
TP_PROTO(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int val),
|
||||
|
||||
TP_ARGS(codec, reg, val)
|
||||
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_reg, snd_soc_reg_read,
|
||||
|
||||
TP_PROTO(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int val),
|
||||
|
||||
TP_ARGS(codec, reg, val)
|
||||
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(snd_soc_card,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card, int val),
|
||||
|
||||
TP_ARGS(card, val),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, card->name )
|
||||
__field( int, val )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, card->name);
|
||||
__entry->val = val;
|
||||
),
|
||||
|
||||
TP_printk("card=%s val=%d", __get_str(name), (int)__entry->val)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_card, snd_soc_bias_level_start,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card, int val),
|
||||
|
||||
TP_ARGS(card, val)
|
||||
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_card, snd_soc_bias_level_done,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card, int val),
|
||||
|
||||
TP_ARGS(card, val)
|
||||
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(snd_soc_dapm_basic,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card),
|
||||
|
||||
TP_ARGS(card),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, card->name )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, card->name);
|
||||
),
|
||||
|
||||
TP_printk("card=%s", __get_str(name))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_dapm_basic, snd_soc_dapm_start,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card),
|
||||
|
||||
TP_ARGS(card)
|
||||
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_dapm_basic, snd_soc_dapm_done,
|
||||
|
||||
TP_PROTO(struct snd_soc_card *card),
|
||||
|
||||
TP_ARGS(card)
|
||||
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(snd_soc_dapm_widget,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *w, int val),
|
||||
|
||||
TP_ARGS(w, val),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, w->name )
|
||||
__field( int, val )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, w->name);
|
||||
__entry->val = val;
|
||||
),
|
||||
|
||||
TP_printk("widget=%s val=%d", __get_str(name),
|
||||
(int)__entry->val)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_dapm_widget, snd_soc_dapm_widget_power,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *w, int val),
|
||||
|
||||
TP_ARGS(w, val)
|
||||
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_dapm_widget, snd_soc_dapm_widget_event_start,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *w, int val),
|
||||
|
||||
TP_ARGS(w, val)
|
||||
|
||||
);
|
||||
|
||||
DEFINE_EVENT(snd_soc_dapm_widget, snd_soc_dapm_widget_event_done,
|
||||
|
||||
TP_PROTO(struct snd_soc_dapm_widget *w, int val),
|
||||
|
||||
TP_ARGS(w, val)
|
||||
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_jack_irq,
|
||||
|
||||
TP_PROTO(const char *name),
|
||||
|
||||
TP_ARGS(name),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, name )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, name);
|
||||
),
|
||||
|
||||
TP_printk("%s", __get_str(name))
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_jack_report,
|
||||
|
||||
TP_PROTO(struct snd_soc_jack *jack, int mask, int val),
|
||||
|
||||
TP_ARGS(jack, mask, val),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, jack->jack->name )
|
||||
__field( int, mask )
|
||||
__field( int, val )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, jack->jack->name);
|
||||
__entry->mask = mask;
|
||||
__entry->val = val;
|
||||
),
|
||||
|
||||
TP_printk("jack=%s %x/%x", __get_str(name), (int)__entry->val,
|
||||
(int)__entry->mask)
|
||||
);
|
||||
|
||||
TRACE_EVENT(snd_soc_jack_notify,
|
||||
|
||||
TP_PROTO(struct snd_soc_jack *jack, int val),
|
||||
|
||||
TP_ARGS(jack, val),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( name, jack->jack->name )
|
||||
__field( int, val )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name, jack->jack->name);
|
||||
__entry->val = val;
|
||||
),
|
||||
|
||||
TP_printk("jack=%s %x", __get_str(name), (int)__entry->val)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_ASOC_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
Reference in New Issue
Block a user