f0fba2ad1b
This patch extends the ASoC API to allow sound cards to have more than one CODEC and more than one platform DMA controller. This is achieved by dividing some current ASoC structures that contain both driver data and device data into structures that only either contain device data or driver data. i.e. struct snd_soc_codec ---> struct snd_soc_codec (device data) +-> struct snd_soc_codec_driver (driver data) struct snd_soc_platform ---> struct snd_soc_platform (device data) +-> struct snd_soc_platform_driver (driver data) struct snd_soc_dai ---> struct snd_soc_dai (device data) +-> struct snd_soc_dai_driver (driver data) struct snd_soc_device ---> deleted This now allows ASoC to be more tightly aligned with the Linux driver model and also means that every ASoC codec, platform and (platform) DAI is a kernel device. ASoC component private data is now stored as device private data. The ASoC sound card struct snd_soc_card has also been updated to store lists of it's components rather than a pointer to a codec and platform. The PCM runtime struct soc_pcm_runtime now has pointers to all its components. This patch adds DAPM support for ASoC multi-component and removes struct snd_soc_socdev from DAPM core. All DAPM calls are now made on a card, codec or runtime PCM level basis rather than using snd_soc_socdev. Other notable multi-component changes:- * Stream operations now de-reference less structures. * close_delayed work() now runs on a DAI basis rather than looping all DAIs in a card. * PM suspend()/resume() operations can now handle N CODECs and Platforms per sound card. * Added soc_bind_dai_link() to bind the component devices to the sound card. * Added soc_dai_link_probe() and soc_dai_link_remove() to probe and remove DAI link components. * sysfs entries can now be registered per component per card. * snd_soc_new_pcms() functionailty rolled into dai_link_probe(). * snd_soc_register_codec() now does all the codec list and mutex init. This patch changes the probe() and remove() of the CODEC drivers as follows:- o Make CODEC driver a platform driver o Moved all struct snd_soc_codec list, mutex, etc initialiasation to core. o Removed all static codec pointers (drivers now support > 1 codec dev) o snd_soc_register_pcms() now done by core. o snd_soc_register_dai() folded into snd_soc_register_codec(). CS4270 portions: Acked-by: Timur Tabi <timur@freescale.com> Some TLV320aic23 and Cirrus platform fixes. Signed-off-by: Ryan Mallon <ryan@bluewatersys.com> TI CODEC and OMAP fixes Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> Signed-off-by: Jarkko Nikula <jhnikula@gmail.com> Samsung platform and misc fixes :- Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Reviewed-by: Jassi Brar <jassi.brar@samsung.com> Signed-off-by: Seungwhan Youn <sw.youn@samsung.com> MPC8610 and PPC fixes. Signed-off-by: Timur Tabi <timur@freescale.com> i.MX fixes and some core fixes. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> J4740 platform fixes:- Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> CC: Tony Lindgren <tony@atomide.com> CC: Nicolas Ferre <nicolas.ferre@atmel.com> CC: Kevin Hilman <khilman@deeprootsystems.com> CC: Sascha Hauer <s.hauer@pengutronix.de> CC: Atsushi Nemoto <anemo@mba.ocn.ne.jp> CC: Kuninori Morimoto <morimoto.kuninori@renesas.com> CC: Daniel Gloeckner <dg@emlix.com> CC: Manuel Lauss <mano@roarinelk.homelinux.net> CC: Mike Frysinger <vapier.adi@gmail.com> CC: Arnaud Patard <apatard@mandriva.com> CC: Wan ZongShun <mcuos.com@gmail.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
248 lines
7.2 KiB
C
248 lines
7.2 KiB
C
/*
|
|
* ALSA SoC TLV320AIC3X codec driver
|
|
*
|
|
* Author: Vladimir Barinov, <vbarinov@embeddedalley.com>
|
|
* Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef _AIC3X_H
|
|
#define _AIC3X_H
|
|
|
|
/* AIC3X register space */
|
|
#define AIC3X_CACHEREGNUM 103
|
|
|
|
/* Page select register */
|
|
#define AIC3X_PAGE_SELECT 0
|
|
/* Software reset register */
|
|
#define AIC3X_RESET 1
|
|
/* Codec Sample rate select register */
|
|
#define AIC3X_SAMPLE_RATE_SEL_REG 2
|
|
/* PLL progrramming register A */
|
|
#define AIC3X_PLL_PROGA_REG 3
|
|
/* PLL progrramming register B */
|
|
#define AIC3X_PLL_PROGB_REG 4
|
|
/* PLL progrramming register C */
|
|
#define AIC3X_PLL_PROGC_REG 5
|
|
/* PLL progrramming register D */
|
|
#define AIC3X_PLL_PROGD_REG 6
|
|
/* Codec datapath setup register */
|
|
#define AIC3X_CODEC_DATAPATH_REG 7
|
|
/* Audio serial data interface control register A */
|
|
#define AIC3X_ASD_INTF_CTRLA 8
|
|
/* Audio serial data interface control register B */
|
|
#define AIC3X_ASD_INTF_CTRLB 9
|
|
/* Audio serial data interface control register C */
|
|
#define AIC3X_ASD_INTF_CTRLC 10
|
|
/* Audio overflow status and PLL R value programming register */
|
|
#define AIC3X_OVRF_STATUS_AND_PLLR_REG 11
|
|
/* Audio codec digital filter control register */
|
|
#define AIC3X_CODEC_DFILT_CTRL 12
|
|
/* Headset/button press detection register */
|
|
#define AIC3X_HEADSET_DETECT_CTRL_A 13
|
|
#define AIC3X_HEADSET_DETECT_CTRL_B 14
|
|
/* ADC PGA Gain control registers */
|
|
#define LADC_VOL 15
|
|
#define RADC_VOL 16
|
|
/* MIC3 control registers */
|
|
#define MIC3LR_2_LADC_CTRL 17
|
|
#define MIC3LR_2_RADC_CTRL 18
|
|
/* Line1 Input control registers */
|
|
#define LINE1L_2_LADC_CTRL 19
|
|
#define LINE1R_2_LADC_CTRL 21
|
|
#define LINE1R_2_RADC_CTRL 22
|
|
#define LINE1L_2_RADC_CTRL 24
|
|
/* Line2 Input control registers */
|
|
#define LINE2L_2_LADC_CTRL 20
|
|
#define LINE2R_2_RADC_CTRL 23
|
|
/* MICBIAS Control Register */
|
|
#define MICBIAS_CTRL 25
|
|
|
|
/* AGC Control Registers A, B, C */
|
|
#define LAGC_CTRL_A 26
|
|
#define LAGC_CTRL_B 27
|
|
#define LAGC_CTRL_C 28
|
|
#define RAGC_CTRL_A 29
|
|
#define RAGC_CTRL_B 30
|
|
#define RAGC_CTRL_C 31
|
|
|
|
/* DAC Power and Left High Power Output control registers */
|
|
#define DAC_PWR 37
|
|
#define HPLCOM_CFG 37
|
|
/* Right High Power Output control registers */
|
|
#define HPRCOM_CFG 38
|
|
/* DAC Output Switching control registers */
|
|
#define DAC_LINE_MUX 41
|
|
/* High Power Output Driver Pop Reduction registers */
|
|
#define HPOUT_POP_REDUCTION 42
|
|
/* DAC Digital control registers */
|
|
#define LDAC_VOL 43
|
|
#define RDAC_VOL 44
|
|
/* High Power Output control registers */
|
|
#define LINE2L_2_HPLOUT_VOL 45
|
|
#define LINE2R_2_HPROUT_VOL 62
|
|
#define PGAL_2_HPLOUT_VOL 46
|
|
#define PGAL_2_HPROUT_VOL 60
|
|
#define PGAR_2_HPLOUT_VOL 49
|
|
#define PGAR_2_HPROUT_VOL 63
|
|
#define DACL1_2_HPLOUT_VOL 47
|
|
#define DACR1_2_HPROUT_VOL 64
|
|
#define HPLOUT_CTRL 51
|
|
#define HPROUT_CTRL 65
|
|
/* High Power COM control registers */
|
|
#define LINE2L_2_HPLCOM_VOL 52
|
|
#define LINE2R_2_HPRCOM_VOL 69
|
|
#define PGAL_2_HPLCOM_VOL 53
|
|
#define PGAR_2_HPLCOM_VOL 56
|
|
#define PGAL_2_HPRCOM_VOL 67
|
|
#define PGAR_2_HPRCOM_VOL 70
|
|
#define DACL1_2_HPLCOM_VOL 54
|
|
#define DACR1_2_HPRCOM_VOL 71
|
|
#define HPLCOM_CTRL 58
|
|
#define HPRCOM_CTRL 72
|
|
/* Mono Line Output Plus/Minus control registers */
|
|
#define LINE2L_2_MONOLOPM_VOL 73
|
|
#define LINE2R_2_MONOLOPM_VOL 76
|
|
#define PGAL_2_MONOLOPM_VOL 74
|
|
#define PGAR_2_MONOLOPM_VOL 77
|
|
#define DACL1_2_MONOLOPM_VOL 75
|
|
#define DACR1_2_MONOLOPM_VOL 78
|
|
#define MONOLOPM_CTRL 79
|
|
/* Line Output Plus/Minus control registers */
|
|
#define LINE2L_2_LLOPM_VOL 80
|
|
#define LINE2L_2_RLOPM_VOL 87
|
|
#define LINE2R_2_LLOPM_VOL 83
|
|
#define LINE2R_2_RLOPM_VOL 90
|
|
#define PGAL_2_LLOPM_VOL 81
|
|
#define PGAL_2_RLOPM_VOL 88
|
|
#define PGAR_2_LLOPM_VOL 84
|
|
#define PGAR_2_RLOPM_VOL 91
|
|
#define DACL1_2_LLOPM_VOL 82
|
|
#define DACL1_2_RLOPM_VOL 89
|
|
#define DACR1_2_RLOPM_VOL 92
|
|
#define DACR1_2_LLOPM_VOL 85
|
|
#define LLOPM_CTRL 86
|
|
#define RLOPM_CTRL 93
|
|
/* GPIO/IRQ registers */
|
|
#define AIC3X_STICKY_IRQ_FLAGS_REG 96
|
|
#define AIC3X_RT_IRQ_FLAGS_REG 97
|
|
#define AIC3X_GPIO1_REG 98
|
|
#define AIC3X_GPIO2_REG 99
|
|
#define AIC3X_GPIOA_REG 100
|
|
#define AIC3X_GPIOB_REG 101
|
|
/* Clock generation control register */
|
|
#define AIC3X_CLKGEN_CTRL_REG 102
|
|
|
|
/* Page select register bits */
|
|
#define PAGE0_SELECT 0
|
|
#define PAGE1_SELECT 1
|
|
|
|
/* Audio serial data interface control register A bits */
|
|
#define BIT_CLK_MASTER 0x80
|
|
#define WORD_CLK_MASTER 0x40
|
|
|
|
/* Codec Datapath setup register 7 */
|
|
#define FSREF_44100 (1 << 7)
|
|
#define FSREF_48000 (0 << 7)
|
|
#define DUAL_RATE_MODE ((1 << 5) | (1 << 6))
|
|
#define LDAC2LCH (0x1 << 3)
|
|
#define RDAC2RCH (0x1 << 1)
|
|
|
|
/* PLL registers bitfields */
|
|
#define PLLP_SHIFT 0
|
|
#define PLLQ_SHIFT 3
|
|
#define PLLR_SHIFT 0
|
|
#define PLLJ_SHIFT 2
|
|
#define PLLD_MSB_SHIFT 0
|
|
#define PLLD_LSB_SHIFT 2
|
|
|
|
/* Clock generation register bits */
|
|
#define CODEC_CLKIN_PLLDIV 0
|
|
#define CODEC_CLKIN_CLKDIV 1
|
|
#define PLL_CLKIN_SHIFT 4
|
|
#define MCLK_SOURCE 0x0
|
|
#define PLL_CLKDIV_SHIFT 0
|
|
|
|
/* Software reset register bits */
|
|
#define SOFT_RESET 0x80
|
|
|
|
/* PLL progrramming register A bits */
|
|
#define PLL_ENABLE 0x80
|
|
|
|
/* Route bits */
|
|
#define ROUTE_ON 0x80
|
|
|
|
/* Mute bits */
|
|
#define UNMUTE 0x08
|
|
#define MUTE_ON 0x80
|
|
|
|
/* Power bits */
|
|
#define LADC_PWR_ON 0x04
|
|
#define RADC_PWR_ON 0x04
|
|
#define LDAC_PWR_ON 0x80
|
|
#define RDAC_PWR_ON 0x40
|
|
#define HPLOUT_PWR_ON 0x01
|
|
#define HPROUT_PWR_ON 0x01
|
|
#define HPLCOM_PWR_ON 0x01
|
|
#define HPRCOM_PWR_ON 0x01
|
|
#define MONOLOPM_PWR_ON 0x01
|
|
#define LLOPM_PWR_ON 0x01
|
|
#define RLOPM_PWR_ON 0x01
|
|
|
|
#define INVERT_VOL(val) (0x7f - val)
|
|
|
|
/* Default output volume (inverted) */
|
|
#define DEFAULT_VOL INVERT_VOL(0x50)
|
|
/* Default input volume */
|
|
#define DEFAULT_GAIN 0x20
|
|
|
|
void aic3x_set_gpio(struct snd_soc_codec *codec, int gpio, int state);
|
|
int aic3x_get_gpio(struct snd_soc_codec *codec, int gpio);
|
|
|
|
/* headset detection / button API */
|
|
|
|
/* The AIC3x supports detection of stereo headsets (GND + left + right signal)
|
|
* and cellular headsets (GND + speaker output + microphone input).
|
|
* It is recommended to enable MIC bias for this function to work properly.
|
|
* For more information, please refer to the datasheet. */
|
|
enum {
|
|
AIC3X_HEADSET_DETECT_OFF = 0,
|
|
AIC3X_HEADSET_DETECT_STEREO = 1,
|
|
AIC3X_HEADSET_DETECT_CELLULAR = 2,
|
|
AIC3X_HEADSET_DETECT_BOTH = 3
|
|
};
|
|
|
|
enum {
|
|
AIC3X_HEADSET_DEBOUNCE_16MS = 0,
|
|
AIC3X_HEADSET_DEBOUNCE_32MS = 1,
|
|
AIC3X_HEADSET_DEBOUNCE_64MS = 2,
|
|
AIC3X_HEADSET_DEBOUNCE_128MS = 3,
|
|
AIC3X_HEADSET_DEBOUNCE_256MS = 4,
|
|
AIC3X_HEADSET_DEBOUNCE_512MS = 5
|
|
};
|
|
|
|
enum {
|
|
AIC3X_BUTTON_DEBOUNCE_0MS = 0,
|
|
AIC3X_BUTTON_DEBOUNCE_8MS = 1,
|
|
AIC3X_BUTTON_DEBOUNCE_16MS = 2,
|
|
AIC3X_BUTTON_DEBOUNCE_32MS = 3
|
|
};
|
|
|
|
#define AIC3X_HEADSET_DETECT_ENABLED 0x80
|
|
#define AIC3X_HEADSET_DETECT_SHIFT 5
|
|
#define AIC3X_HEADSET_DETECT_MASK 3
|
|
#define AIC3X_HEADSET_DEBOUNCE_SHIFT 2
|
|
#define AIC3X_HEADSET_DEBOUNCE_MASK 7
|
|
#define AIC3X_BUTTON_DEBOUNCE_SHIFT 0
|
|
#define AIC3X_BUTTON_DEBOUNCE_MASK 3
|
|
|
|
/* see the enums above for valid parameters to this function */
|
|
void aic3x_set_headset_detection(struct snd_soc_codec *codec, int detect,
|
|
int headset_debounce, int button_debounce);
|
|
int aic3x_headset_detected(struct snd_soc_codec *codec);
|
|
int aic3x_button_pressed(struct snd_soc_codec *codec);
|
|
|
|
#endif /* _AIC3X_H */
|