Re: [PATCH 1/4 v2] MFD: twl4030: add twl4030_codec MFD as a newchild to the core

From: Samuel Ortiz
Date: Fri Oct 23 2009 - 10:05:25 EST


Hi Peter,

On Thu, Oct 22, 2009 at 01:26:45PM +0300, Peter Ujfalusi wrote:
> New MFD child to twl4030 MFD device.
>
> Reason for the twl4030_codec MFD: the vibra control is actually in the codec
> part of the twl4030. If both the vibra and the audio functionality is needed
> from the twl4030 at the same time, than they need to control the codec power
> and APLL at the same time without breaking the other driver.
> Also these two has to be able to work without the need for the other driver.
>
> This MFD device will be used by the drivers, which needs resources
> from the twl4030 codec like audio and vibra.
>
> The platform specific configuration data is passed along to the
> child drivers (audio, vibra).
>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@xxxxxxxxx>
As agreed, Mark is taking this one. So:
Acked-by: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx>

Cheers,
Samuel.

> ---
> drivers/mfd/Kconfig | 6 +
> drivers/mfd/Makefile | 1 +
> drivers/mfd/twl4030-codec.c | 241 +++++++++++++++++++++++++++++++++
> drivers/mfd/twl4030-core.c | 14 ++
> include/linux/i2c/twl4030.h | 18 +++
> include/linux/mfd/twl4030-codec.h | 271 +++++++++++++++++++++++++++++++++++++
> 6 files changed, 551 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mfd/twl4030-codec.c
> create mode 100644 include/linux/mfd/twl4030-codec.h
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 570be13..08f2d07 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -121,6 +121,12 @@ config TWL4030_POWER
> and load scripts controling which resources are switched off/on
> or reset when a sleep, wakeup or warm reset event occurs.
>
> +config TWL4030_CODEC
> + bool
> + depends on TWL4030_CORE
> + select MFD_CORE
> + default n
> +
> config MFD_TMIO
> bool
> default n
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index f3b277b..af0fc90 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -26,6 +26,7 @@ obj-$(CONFIG_MENELAUS) += menelaus.o
>
> obj-$(CONFIG_TWL4030_CORE) += twl4030-core.o twl4030-irq.o
> obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o
> +obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o
>
> obj-$(CONFIG_MFD_MC13783) += mc13783-core.o
>
> diff --git a/drivers/mfd/twl4030-codec.c b/drivers/mfd/twl4030-codec.c
> new file mode 100644
> index 0000000..9710307
> --- /dev/null
> +++ b/drivers/mfd/twl4030-codec.c
> @@ -0,0 +1,241 @@
> +/*
> + * MFD driver for twl4030 codec submodule
> + *
> + * Author: Peter Ujfalusi <peter.ujfalusi@xxxxxxxxx>
> + *
> + * Copyright: (C) 2009 Nokia Corporation
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
> + * 02110-1301 USA
> + *
> + */
> +
> +#include <linux/module.h>
> +#include <linux/types.h>
> +#include <linux/kernel.h>
> +#include <linux/fs.h>
> +#include <linux/platform_device.h>
> +#include <linux/i2c/twl4030.h>
> +#include <linux/mfd/core.h>
> +#include <linux/mfd/twl4030-codec.h>
> +
> +#define TWL4030_CODEC_CELLS 2
> +
> +static struct platform_device *twl4030_codec_dev;
> +
> +struct twl4030_codec_resource {
> + int request_count;
> + u8 reg;
> + u8 mask;
> +};
> +
> +struct twl4030_codec {
> + struct mutex mutex;
> + struct twl4030_codec_resource resource[TWL4030_CODEC_RES_MAX];
> + struct mfd_cell cells[TWL4030_CODEC_CELLS];
> +};
> +
> +/*
> + * Modify the resource, the function returns the content of the register
> + * after the modification.
> + */
> +static int twl4030_codec_set_resource(enum twl4030_codec_res id, int enable)
> +{
> + struct twl4030_codec *codec = platform_get_drvdata(twl4030_codec_dev);
> + u8 val;
> +
> + twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &val,
> + codec->resource[id].reg);
> +
> + if (enable)
> + val |= codec->resource[id].mask;
> + else
> + val &= ~codec->resource[id].mask;
> +
> + twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
> + val, codec->resource[id].reg);
> +
> + return val;
> +}
> +
> +static inline int twl4030_codec_get_resource(enum twl4030_codec_res id)
> +{
> + struct twl4030_codec *codec = platform_get_drvdata(twl4030_codec_dev);
> + u8 val;
> +
> + twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &val,
> + codec->resource[id].reg);
> +
> + return val;
> +}
> +
> +/*
> + * Enable the resource.
> + * The function returns with error or the content of the register
> + */
> +int twl4030_codec_enable_resource(enum twl4030_codec_res id)
> +{
> + struct twl4030_codec *codec = platform_get_drvdata(twl4030_codec_dev);
> + int val;
> +
> + if (id >= TWL4030_CODEC_RES_MAX) {
> + dev_err(&twl4030_codec_dev->dev,
> + "Invalid resource ID (%u)\n", id);
> + return -EINVAL;
> + }
> +
> + mutex_lock(&codec->mutex);
> + if (!codec->resource[id].request_count)
> + /* Resource was disabled, enable it */
> + val = twl4030_codec_set_resource(id, 1);
> + else
> + val = twl4030_codec_get_resource(id);
> +
> + codec->resource[id].request_count++;
> + mutex_unlock(&codec->mutex);
> +
> + return val;
> +}
> +EXPORT_SYMBOL_GPL(twl4030_codec_enable_resource);
> +
> +/*
> + * Disable the resource.
> + * The function returns with error or the content of the register
> + */
> +int twl4030_codec_disable_resource(unsigned id)
> +{
> + struct twl4030_codec *codec = platform_get_drvdata(twl4030_codec_dev);
> + int val;
> +
> + if (id >= TWL4030_CODEC_RES_MAX) {
> + dev_err(&twl4030_codec_dev->dev,
> + "Invalid resource ID (%u)\n", id);
> + return -EINVAL;
> + }
> +
> + mutex_lock(&codec->mutex);
> + if (!codec->resource[id].request_count) {
> + dev_err(&twl4030_codec_dev->dev,
> + "Resource has been disabled already (%u)\n", id);
> + mutex_unlock(&codec->mutex);
> + return -EPERM;
> + }
> + codec->resource[id].request_count--;
> +
> + if (!codec->resource[id].request_count)
> + /* Resource can be disabled now */
> + val = twl4030_codec_set_resource(id, 0);
> + else
> + val = twl4030_codec_get_resource(id);
> +
> + mutex_unlock(&codec->mutex);
> +
> + return val;
> +}
> +EXPORT_SYMBOL_GPL(twl4030_codec_disable_resource);
> +
> +static int __devinit twl4030_codec_probe(struct platform_device *pdev)
> +{
> + struct twl4030_codec *codec;
> + struct twl4030_codec_data *pdata = pdev->dev.platform_data;
> + struct mfd_cell *cell = NULL;
> + int ret, childs = 0;
> +
> + codec = kzalloc(sizeof(struct twl4030_codec), GFP_KERNEL);
> + if (!codec)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, codec);
> +
> + twl4030_codec_dev = pdev;
> + mutex_init(&codec->mutex);
> +
> + /* Codec power */
> + codec->resource[TWL4030_CODEC_RES_POWER].reg = TWL4030_REG_CODEC_MODE;
> + codec->resource[TWL4030_CODEC_RES_POWER].mask = TWL4030_CODECPDZ;
> +
> + /* PLL */
> + codec->resource[TWL4030_CODEC_RES_APLL].reg = TWL4030_REG_APLL_CTL;
> + codec->resource[TWL4030_CODEC_RES_APLL].mask = TWL4030_APLL_EN;
> +
> + if (pdata->audio) {
> + cell = &codec->cells[childs];
> + cell->name = "twl4030_codec_audio";
> + cell->platform_data = pdata->audio;
> + cell->data_size = sizeof(*pdata->audio);
> + childs++;
> + }
> + if (pdata->vibra) {
> + cell = &codec->cells[childs];
> + cell->name = "twl4030_codec_vibra";
> + cell->platform_data = pdata->vibra;
> + cell->data_size = sizeof(*pdata->vibra);
> + childs++;
> + }
> +
> + if (childs)
> + ret = mfd_add_devices(&pdev->dev, pdev->id, codec->cells,
> + childs, NULL, 0);
> + else {
> + dev_err(&pdev->dev, "No platform data found for childs\n");
> + ret = -ENODEV;
> + }
> +
> + if (!ret)
> + return 0;
> +
> + platform_set_drvdata(pdev, NULL);
> + kfree(codec);
> + twl4030_codec_dev = NULL;
> + return ret;
> +}
> +
> +static int __devexit twl4030_codec_remove(struct platform_device *pdev)
> +{
> + struct twl4030_codec *codec = platform_get_drvdata(pdev);
> +
> + mfd_remove_devices(&pdev->dev);
> + platform_set_drvdata(pdev, NULL);
> + kfree(codec);
> + twl4030_codec_dev = NULL;
> +
> + return 0;
> +}
> +
> +MODULE_ALIAS("platform:twl4030_codec");
> +
> +static struct platform_driver twl4030_codec_driver = {
> + .probe = twl4030_codec_probe,
> + .remove = __devexit_p(twl4030_codec_remove),
> + .driver = {
> + .owner = THIS_MODULE,
> + .name = "twl4030_codec",
> + },
> +};
> +
> +static int __devinit twl4030_codec_init(void)
> +{
> + return platform_driver_register(&twl4030_codec_driver);
> +}
> +module_init(twl4030_codec_init);
> +
> +static void __devexit twl4030_codec_exit(void)
> +{
> + platform_driver_unregister(&twl4030_codec_driver);
> +}
> +module_exit(twl4030_codec_exit);
> +
> +MODULE_AUTHOR("Peter Ujfalusi <peter.ujfalusi@xxxxxxxxx>");
> +MODULE_LICENSE("GPL");
> +
> diff --git a/drivers/mfd/twl4030-core.c b/drivers/mfd/twl4030-core.c
> index e424cf6..0ee81e4 100644
> --- a/drivers/mfd/twl4030-core.c
> +++ b/drivers/mfd/twl4030-core.c
> @@ -114,6 +114,12 @@
> #define twl_has_watchdog() false
> #endif
>
> +#if defined(CONFIG_TWL4030_CODEC) || defined(CONFIG_TWL4030_CODEC_MODULE)
> +#define twl_has_codec() true
> +#else
> +#define twl_has_codec() false
> +#endif
> +
> /* Triton Core internal information (BEGIN) */
>
> /* Last - for index max*/
> @@ -557,6 +563,14 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
> return PTR_ERR(child);
> }
>
> + if (twl_has_codec() && pdata->codec) {
> + child = add_child(1, "twl4030_codec",
> + pdata->codec, sizeof(*pdata->codec),
> + false, 0, 0);
> + if (IS_ERR(child))
> + return PTR_ERR(child);
> + }
> +
> if (twl_has_regulator()) {
> /*
> child = add_regulator(TWL4030_REG_VPLL1, pdata->vpll1);
> diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h
> index 2d02dfd..42d6c72 100644
> --- a/include/linux/i2c/twl4030.h
> +++ b/include/linux/i2c/twl4030.h
> @@ -401,6 +401,23 @@ struct twl4030_power_data {
>
> extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts);
>
> +struct twl4030_codec_audio_data {
> + unsigned int audio_mclk;
> + unsigned int ramp_delay_value;
> + unsigned int hs_extmute:1;
> + void (*set_hs_extmute)(int mute);
> +};
> +
> +struct twl4030_codec_vibra_data {
> + unsigned int audio_mclk;
> + unsigned int coexist;
> +};
> +
> +struct twl4030_codec_data {
> + struct twl4030_codec_audio_data *audio;
> + struct twl4030_codec_vibra_data *vibra;
> +};
> +
> struct twl4030_platform_data {
> unsigned irq_base, irq_end;
> struct twl4030_bci_platform_data *bci;
> @@ -409,6 +426,7 @@ struct twl4030_platform_data {
> struct twl4030_keypad_data *keypad;
> struct twl4030_usb_data *usb;
> struct twl4030_power_data *power;
> + struct twl4030_codec_data *codec;
>
> /* LDO regulators */
> struct regulator_init_data *vdac;
> diff --git a/include/linux/mfd/twl4030-codec.h b/include/linux/mfd/twl4030-codec.h
> new file mode 100644
> index 0000000..ef0a304
> --- /dev/null
> +++ b/include/linux/mfd/twl4030-codec.h
> @@ -0,0 +1,271 @@
> +/*
> + * MFD driver for twl4030 codec submodule
> + *
> + * Author: Peter Ujfalusi <peter.ujfalusi@xxxxxxxxx>
> + *
> + * Copyright: (C) 2009 Nokia Corporation
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
> + * 02110-1301 USA
> + *
> + */
> +
> +#ifndef __TWL4030_CODEC_H__
> +#define __TWL4030_CODEC_H__
> +
> +/* Codec registers */
> +#define TWL4030_REG_CODEC_MODE 0x01
> +#define TWL4030_REG_OPTION 0x02
> +#define TWL4030_REG_UNKNOWN 0x03
> +#define TWL4030_REG_MICBIAS_CTL 0x04
> +#define TWL4030_REG_ANAMICL 0x05
> +#define TWL4030_REG_ANAMICR 0x06
> +#define TWL4030_REG_AVADC_CTL 0x07
> +#define TWL4030_REG_ADCMICSEL 0x08
> +#define TWL4030_REG_DIGMIXING 0x09
> +#define TWL4030_REG_ATXL1PGA 0x0A
> +#define TWL4030_REG_ATXR1PGA 0x0B
> +#define TWL4030_REG_AVTXL2PGA 0x0C
> +#define TWL4030_REG_AVTXR2PGA 0x0D
> +#define TWL4030_REG_AUDIO_IF 0x0E
> +#define TWL4030_REG_VOICE_IF 0x0F
> +#define TWL4030_REG_ARXR1PGA 0x10
> +#define TWL4030_REG_ARXL1PGA 0x11
> +#define TWL4030_REG_ARXR2PGA 0x12
> +#define TWL4030_REG_ARXL2PGA 0x13
> +#define TWL4030_REG_VRXPGA 0x14
> +#define TWL4030_REG_VSTPGA 0x15
> +#define TWL4030_REG_VRX2ARXPGA 0x16
> +#define TWL4030_REG_AVDAC_CTL 0x17
> +#define TWL4030_REG_ARX2VTXPGA 0x18
> +#define TWL4030_REG_ARXL1_APGA_CTL 0x19
> +#define TWL4030_REG_ARXR1_APGA_CTL 0x1A
> +#define TWL4030_REG_ARXL2_APGA_CTL 0x1B
> +#define TWL4030_REG_ARXR2_APGA_CTL 0x1C
> +#define TWL4030_REG_ATX2ARXPGA 0x1D
> +#define TWL4030_REG_BT_IF 0x1E
> +#define TWL4030_REG_BTPGA 0x1F
> +#define TWL4030_REG_BTSTPGA 0x20
> +#define TWL4030_REG_EAR_CTL 0x21
> +#define TWL4030_REG_HS_SEL 0x22
> +#define TWL4030_REG_HS_GAIN_SET 0x23
> +#define TWL4030_REG_HS_POPN_SET 0x24
> +#define TWL4030_REG_PREDL_CTL 0x25
> +#define TWL4030_REG_PREDR_CTL 0x26
> +#define TWL4030_REG_PRECKL_CTL 0x27
> +#define TWL4030_REG_PRECKR_CTL 0x28
> +#define TWL4030_REG_HFL_CTL 0x29
> +#define TWL4030_REG_HFR_CTL 0x2A
> +#define TWL4030_REG_ALC_CTL 0x2B
> +#define TWL4030_REG_ALC_SET1 0x2C
> +#define TWL4030_REG_ALC_SET2 0x2D
> +#define TWL4030_REG_BOOST_CTL 0x2E
> +#define TWL4030_REG_SOFTVOL_CTL 0x2F
> +#define TWL4030_REG_DTMF_FREQSEL 0x30
> +#define TWL4030_REG_DTMF_TONEXT1H 0x31
> +#define TWL4030_REG_DTMF_TONEXT1L 0x32
> +#define TWL4030_REG_DTMF_TONEXT2H 0x33
> +#define TWL4030_REG_DTMF_TONEXT2L 0x34
> +#define TWL4030_REG_DTMF_TONOFF 0x35
> +#define TWL4030_REG_DTMF_WANONOFF 0x36
> +#define TWL4030_REG_I2S_RX_SCRAMBLE_H 0x37
> +#define TWL4030_REG_I2S_RX_SCRAMBLE_M 0x38
> +#define TWL4030_REG_I2S_RX_SCRAMBLE_L 0x39
> +#define TWL4030_REG_APLL_CTL 0x3A
> +#define TWL4030_REG_DTMF_CTL 0x3B
> +#define TWL4030_REG_DTMF_PGA_CTL2 0x3C
> +#define TWL4030_REG_DTMF_PGA_CTL1 0x3D
> +#define TWL4030_REG_MISC_SET_1 0x3E
> +#define TWL4030_REG_PCMBTMUX 0x3F
> +#define TWL4030_REG_RX_PATH_SEL 0x43
> +#define TWL4030_REG_VDL_APGA_CTL 0x44
> +#define TWL4030_REG_VIBRA_CTL 0x45
> +#define TWL4030_REG_VIBRA_SET 0x46
> +#define TWL4030_REG_VIBRA_PWM_SET 0x47
> +#define TWL4030_REG_ANAMIC_GAIN 0x48
> +#define TWL4030_REG_MISC_SET_2 0x49
> +
> +/* Bitfield Definitions */
> +
> +/* TWL4030_CODEC_MODE (0x01) Fields */
> +#define TWL4030_APLL_RATE 0xF0
> +#define TWL4030_APLL_RATE_8000 0x00
> +#define TWL4030_APLL_RATE_11025 0x10
> +#define TWL4030_APLL_RATE_12000 0x20
> +#define TWL4030_APLL_RATE_16000 0x40
> +#define TWL4030_APLL_RATE_22050 0x50
> +#define TWL4030_APLL_RATE_24000 0x60
> +#define TWL4030_APLL_RATE_32000 0x80
> +#define TWL4030_APLL_RATE_44100 0x90
> +#define TWL4030_APLL_RATE_48000 0xA0
> +#define TWL4030_APLL_RATE_96000 0xE0
> +#define TWL4030_SEL_16K 0x08
> +#define TWL4030_CODECPDZ 0x02
> +#define TWL4030_OPT_MODE 0x01
> +#define TWL4030_OPTION_1 (1 << 0)
> +#define TWL4030_OPTION_2 (0 << 0)
> +
> +/* TWL4030_OPTION (0x02) Fields */
> +#define TWL4030_ATXL1_EN (1 << 0)
> +#define TWL4030_ATXR1_EN (1 << 1)
> +#define TWL4030_ATXL2_VTXL_EN (1 << 2)
> +#define TWL4030_ATXR2_VTXR_EN (1 << 3)
> +#define TWL4030_ARXL1_VRX_EN (1 << 4)
> +#define TWL4030_ARXR1_EN (1 << 5)
> +#define TWL4030_ARXL2_EN (1 << 6)
> +#define TWL4030_ARXR2_EN (1 << 7)
> +
> +/* TWL4030_REG_MICBIAS_CTL (0x04) Fields */
> +#define TWL4030_MICBIAS2_CTL 0x40
> +#define TWL4030_MICBIAS1_CTL 0x20
> +#define TWL4030_HSMICBIAS_EN 0x04
> +#define TWL4030_MICBIAS2_EN 0x02
> +#define TWL4030_MICBIAS1_EN 0x01
> +
> +/* ANAMICL (0x05) Fields */
> +#define TWL4030_CNCL_OFFSET_START 0x80
> +#define TWL4030_OFFSET_CNCL_SEL 0x60
> +#define TWL4030_OFFSET_CNCL_SEL_ARX1 0x00
> +#define TWL4030_OFFSET_CNCL_SEL_ARX2 0x20
> +#define TWL4030_OFFSET_CNCL_SEL_VRX 0x40
> +#define TWL4030_OFFSET_CNCL_SEL_ALL 0x60
> +#define TWL4030_MICAMPL_EN 0x10
> +#define TWL4030_CKMIC_EN 0x08
> +#define TWL4030_AUXL_EN 0x04
> +#define TWL4030_HSMIC_EN 0x02
> +#define TWL4030_MAINMIC_EN 0x01
> +
> +/* ANAMICR (0x06) Fields */
> +#define TWL4030_MICAMPR_EN 0x10
> +#define TWL4030_AUXR_EN 0x04
> +#define TWL4030_SUBMIC_EN 0x01
> +
> +/* AVADC_CTL (0x07) Fields */
> +#define TWL4030_ADCL_EN 0x08
> +#define TWL4030_AVADC_CLK_PRIORITY 0x04
> +#define TWL4030_ADCR_EN 0x02
> +
> +/* TWL4030_REG_ADCMICSEL (0x08) Fields */
> +#define TWL4030_DIGMIC1_EN 0x08
> +#define TWL4030_TX2IN_SEL 0x04
> +#define TWL4030_DIGMIC0_EN 0x02
> +#define TWL4030_TX1IN_SEL 0x01
> +
> +/* AUDIO_IF (0x0E) Fields */
> +#define TWL4030_AIF_SLAVE_EN 0x80
> +#define TWL4030_DATA_WIDTH 0x60
> +#define TWL4030_DATA_WIDTH_16S_16W 0x00
> +#define TWL4030_DATA_WIDTH_32S_16W 0x40
> +#define TWL4030_DATA_WIDTH_32S_24W 0x60
> +#define TWL4030_AIF_FORMAT 0x18
> +#define TWL4030_AIF_FORMAT_CODEC 0x00
> +#define TWL4030_AIF_FORMAT_LEFT 0x08
> +#define TWL4030_AIF_FORMAT_RIGHT 0x10
> +#define TWL4030_AIF_FORMAT_TDM 0x18
> +#define TWL4030_AIF_TRI_EN 0x04
> +#define TWL4030_CLK256FS_EN 0x02
> +#define TWL4030_AIF_EN 0x01
> +
> +/* VOICE_IF (0x0F) Fields */
> +#define TWL4030_VIF_SLAVE_EN 0x80
> +#define TWL4030_VIF_DIN_EN 0x40
> +#define TWL4030_VIF_DOUT_EN 0x20
> +#define TWL4030_VIF_SWAP 0x10
> +#define TWL4030_VIF_FORMAT 0x08
> +#define TWL4030_VIF_TRI_EN 0x04
> +#define TWL4030_VIF_SUB_EN 0x02
> +#define TWL4030_VIF_EN 0x01
> +
> +/* EAR_CTL (0x21) */
> +#define TWL4030_EAR_GAIN 0x30
> +
> +/* HS_GAIN_SET (0x23) Fields */
> +#define TWL4030_HSR_GAIN 0x0C
> +#define TWL4030_HSR_GAIN_PWR_DOWN 0x00
> +#define TWL4030_HSR_GAIN_PLUS_6DB 0x04
> +#define TWL4030_HSR_GAIN_0DB 0x08
> +#define TWL4030_HSR_GAIN_MINUS_6DB 0x0C
> +#define TWL4030_HSL_GAIN 0x03
> +#define TWL4030_HSL_GAIN_PWR_DOWN 0x00
> +#define TWL4030_HSL_GAIN_PLUS_6DB 0x01
> +#define TWL4030_HSL_GAIN_0DB 0x02
> +#define TWL4030_HSL_GAIN_MINUS_6DB 0x03
> +
> +/* HS_POPN_SET (0x24) Fields */
> +#define TWL4030_VMID_EN 0x40
> +#define TWL4030_EXTMUTE 0x20
> +#define TWL4030_RAMP_DELAY 0x1C
> +#define TWL4030_RAMP_DELAY_20MS 0x00
> +#define TWL4030_RAMP_DELAY_40MS 0x04
> +#define TWL4030_RAMP_DELAY_81MS 0x08
> +#define TWL4030_RAMP_DELAY_161MS 0x0C
> +#define TWL4030_RAMP_DELAY_323MS 0x10
> +#define TWL4030_RAMP_DELAY_645MS 0x14
> +#define TWL4030_RAMP_DELAY_1291MS 0x18
> +#define TWL4030_RAMP_DELAY_2581MS 0x1C
> +#define TWL4030_RAMP_EN 0x02
> +
> +/* PREDL_CTL (0x25) */
> +#define TWL4030_PREDL_GAIN 0x30
> +
> +/* PREDR_CTL (0x26) */
> +#define TWL4030_PREDR_GAIN 0x30
> +
> +/* PRECKL_CTL (0x27) */
> +#define TWL4030_PRECKL_GAIN 0x30
> +
> +/* PRECKR_CTL (0x28) */
> +#define TWL4030_PRECKR_GAIN 0x30
> +
> +/* HFL_CTL (0x29, 0x2A) Fields */
> +#define TWL4030_HF_CTL_HB_EN 0x04
> +#define TWL4030_HF_CTL_LOOP_EN 0x08
> +#define TWL4030_HF_CTL_RAMP_EN 0x10
> +#define TWL4030_HF_CTL_REF_EN 0x20
> +
> +/* APLL_CTL (0x3A) Fields */
> +#define TWL4030_APLL_EN 0x10
> +#define TWL4030_APLL_INFREQ 0x0F
> +#define TWL4030_APLL_INFREQ_19200KHZ 0x05
> +#define TWL4030_APLL_INFREQ_26000KHZ 0x06
> +#define TWL4030_APLL_INFREQ_38400KHZ 0x0F
> +
> +/* REG_MISC_SET_1 (0x3E) Fields */
> +#define TWL4030_CLK64_EN 0x80
> +#define TWL4030_SCRAMBLE_EN 0x40
> +#define TWL4030_FMLOOP_EN 0x20
> +#define TWL4030_SMOOTH_ANAVOL_EN 0x02
> +#define TWL4030_DIGMIC_LR_SWAP_EN 0x01
> +
> +/* VIBRA_CTL (0x45) */
> +#define TWL4030_VIBRA_EN 0x01
> +#define TWL4030_VIBRA_DIR 0x02
> +#define TWL4030_VIBRA_AUDIO_SEL_L1 (0x00 << 2)
> +#define TWL4030_VIBRA_AUDIO_SEL_R1 (0x01 << 2)
> +#define TWL4030_VIBRA_AUDIO_SEL_L2 (0x02 << 2)
> +#define TWL4030_VIBRA_AUDIO_SEL_R2 (0x03 << 2)
> +#define TWL4030_VIBRA_SEL 0x10
> +#define TWL4030_VIBRA_DIR_SEL 0x20
> +
> +/* TWL4030 codec resource IDs */
> +enum twl4030_codec_res {
> + TWL4030_CODEC_RES_POWER = 0,
> + TWL4030_CODEC_RES_APLL,
> + TWL4030_CODEC_RES_MAX,
> +};
> +
> +int twl4030_codec_disable_resource(enum twl4030_codec_res id);
> +int twl4030_codec_enable_resource(enum twl4030_codec_res id);
> +
> +#endif /* End of __TWL4030_CODEC_H__ */
> --
> 1.6.5.1
>

--
Intel Open Source Technology Centre
http://oss.intel.com/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/