* Re: TWL4030 asoc kcontrols and widgets [not found] <ef0d8a250811200202o5852dabct8c5b135b86141f67@mail.gmail.com> @ 2008-11-20 10:55 ` Felipe Balbi 2008-11-20 17:32 ` Tony Lindgren 0 siblings, 1 reply; 5+ messages in thread From: Felipe Balbi @ 2008-11-20 10:55 UTC (permalink / raw) To: naveen krishna ch; +Cc: linux-omap-open-source, linux-omap, Tony Lindgren This list has been moved to linux-omap@vger.kernel.org Please, keep that in Cc, also for ASoC development, send it also to the proper alsa mailing list alsa-devel@alsa-project.org Tony, I think you should apply this patch in mainline tree: diff --git a/MAINTAINERS b/MAINTAINERS index 8dae455..54c8e90 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4010,6 +4010,13 @@ P: Alex Dubov M: oakad@yahoo.com S: Maintained +TI OMAP +P: Tony Lindgren +M: tony@atomide.com +L: linux-omap@vger.kernel.org +T: git kernel.org:/pub/scm/linux/tmlind/linux-omap-2.6.git +S: Maintained + TI OMAP MMC INTERFACE DRIVER P: Carlos Aguiar, Anderson Briglia and Syed Khasim M: linux-omap@vger.kernel.org On Thu, Nov 20, 2008 at 12:02 PM, naveen krishna ch <naveenkrishna.ch@gmail.com> wrote: > Hi All > > I have been working on TWL4030 codec driver for ALSA SOC. > I have taken sound/soc/codec/twl4030.c as reference from main line > > This Patch adds some kcontrols, widgets and interconnection map for some of > the TWL4030 ASOC codec > I was building it for a custom board as it was for OVERO > > > Suggestions on the DAPM part of the driver would be helpful > > Thanks in advance. > > The patch is as follows. > > > --- twl4030.c 2008-11-19 12:04:32.000000000 +0530 > +++ /home/chnaveen/Desktop/twl4030.c 2008-11-21 15:08:06.000000000 +0530 > @@ -16,7 +16,9 @@ > * along with this program; if not, write to the Free Software > * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > * 02110-1301 USA > - * > + * Modified by : Naveen Krishna Ch > + * Added Kcontrols for OMAP3 WaterlooBoard > + * Dated : 28th october 2008 > */ > > #include <linux/module.h> > @@ -29,24 +31,27 @@ > #include <linux/i2c/twl4030.h> > #include <sound/core.h> > #include <sound/pcm.h> > +#include <sound/jack.h> > #include <sound/pcm_params.h> > #include <sound/soc.h> > #include <sound/soc-dapm.h> > #include <sound/initval.h> > - > +#include <asm/arch/twl4030.h> > #include "twl4030.h" > > +static int twl4030_jack_func; > + > /* > * twl4030 register cache & default register settings > */ > static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { > 0x00, /* this register not used */ > - 0x93, /* REG_CODEC_MODE (0x1) */ > + 0x03, /* REG_CODEC_MODE (0x1) */ > 0xc3, /* REG_OPTION (0x2) */ > 0x00, /* REG_UNKNOWN (0x3) */ > 0x00, /* REG_MICBIAS_CTL (0x4) */ > - 0x24, /* REG_ANAMICL (0x5) */ > - 0x04, /* REG_ANAMICR (0x6) */ > + 0xb0, /* REG_ANAMICL (0x5) */ > + 0x10, /* REG_ANAMICR (0x6) */ > 0x0a, /* REG_AVADC_CTL (0x7) */ > 0x00, /* REG_ADCMICSEL (0x8) */ > 0x00, /* REG_DIGMIXING (0x9) */ > @@ -67,22 +72,22 @@ > 0x00, /* REG_ARX2VTXPGA (0x18) */ > 0x00, /* REG_ARXL1_APGA_CTL (0x19) */ > 0x00, /* REG_ARXR1_APGA_CTL (0x1A) */ > - 0x4b, /* REG_ARXL2_APGA_CTL (0x1B) */ > - 0x4b, /* REG_ARXR2_APGA_CTL (0x1C) */ > + 0x2b, /* REG_ARXL2_APGA_CTL (0x1B) */ > + 0x2b, /* REG_ARXR2_APGA_CTL (0x1C) */ > 0x00, /* REG_ATX2ARXPGA (0x1D) */ > 0x00, /* REG_BT_IF (0x1E) */ > 0x00, /* REG_BTPGA (0x1F) */ > 0x00, /* REG_BTSTPGA (0x20) */ > - 0x00, /* REG_EAR_CTL (0x21) */ > - 0x24, /* REG_HS_SEL (0x22) */ > - 0x0a, /* REG_HS_GAIN_SET (0x23) */ > - 0x00, /* REG_HS_POPN_SET (0x24) */ > - 0x00, /* REG_PREDL_CTL (0x25) */ > - 0x00, /* REG_PREDR_CTL (0x26) */ > - 0x00, /* REG_PRECKL_CTL (0x27) */ > - 0x00, /* REG_PRECKR_CTL (0x28) */ > - 0x00, /* REG_HFL_CTL (0x29) */ > - 0x00, /* REG_HFR_CTL (0x2A) */ > + 0x20, /* REG_EAR_CTL (0x21) */ > + 0x00, /* REG_HS_SEL (0x22) */ > + 0x05, /* REG_HS_GAIN_SET (0x23) */ > + 0x42, /* REG_HS_POPN_SET (0x24) */ > + 0x20, /* REG_PREDL_CTL (0x25) */ > + 0x20, /* REG_PREDR_CTL (0x26) */ > + 0x20, /* REG_PRECKL_CTL (0x27) */ > + 0x20, /* REG_PRECKR_CTL (0x28) */ > + 0x1f, /* REG_HFL_CTL (0x29) */ > + 0x1f, /* REG_HFR_CTL (0x2A) */ > 0x00, /* REG_ALC_CTL (0x2B) */ > 0x00, /* REG_ALC_SET1 (0x2C) */ > 0x00, /* REG_ALC_SET2 (0x2D) */ > @@ -112,9 +117,40 @@ > 0x00, /* REG_VIBRA_CTL (0x45) */ > 0x00, /* REG_VIBRA_SET (0x46) */ > 0x00, /* REG_VIBRA_PWM_SET (0x47) */ > - 0x00, /* REG_ANAMIC_GAIN (0x48) */ > + 0x24, /* REG_ANAMIC_GAIN (0x48) */ > 0x00, /* REG_MISC_SET_2 (0x49) */ > }; > +static void twl4030_ext_control(struct snd_soc_codec *codec) > +{ > + if (twl4030_jack_func) > + snd_soc_dapm_enable_pin(codec, "Headphone Jack"); > + else > + snd_soc_dapm_disable_pin(codec, "Headphone Jack"); > + > + snd_soc_dapm_sync(codec); > +} > + > +static int twl4030_get_jack(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + ucontrol->value.integer.value[0] = twl4030_jack_func; > + > + return 0; > +} > + > +static int twl4030_set_jack(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); > + > + if (twl4030_jack_func == ucontrol->value.integer.value[0]) > + return 0; > + > + twl4030_jack_func = ucontrol->value.integer.value[0]; > + twl4030_ext_control(codec); > + > + return 1; > +} > > /* > * read twl4030 register cache > @@ -188,14 +224,83 @@ > twl4030_write(codec, i, twl4030_reg[i]); > > } > +static const char *jack_function[] = {"Off", "Headphone"}; > + > +static const struct soc_enum twl4030_enum[] = { > + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(jack_function), jack_function), > +}; > + > > static const struct snd_kcontrol_new twl4030_snd_controls[] = { > - SOC_DOUBLE_R("Master Playback Volume", > - TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > - 0, 127, 0), > - SOC_DOUBLE_R("Capture Volume", > - TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, > - 0, 127, 0), > + > + /* Master Playback Volume Controls */ > + SOC_DOUBLE_R("Master PLayback Course Gain ctrl", > + TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > + 6, 3, 0), > + SOC_DOUBLE_R("Master Playback Fine Gain ctrl", > + TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > + 0, 63, 0), > + > + /* Playback Speaker volume controls */ > + SOC_DOUBLE_R("Speaker R2+L2 Volume ctrls", > + TWL4030_REG_ARXL2_APGA_CTL, TWL4030_REG_ARXR2_APGA_CTL, > + 3, 17, 0), > + > + /* Capture Gain controls */ > + SOC_DOUBLE_R("Master Capture Gain ctrl", > + TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, > + 0, 31, 0), > + /* Loop gain controls*/ > + SOC_DOUBLE("Loop Gain ctrl", TWL4030_REG_ATX2ARXPGA, > + 3 , 0, 7, 0), > + > + SOC_DOUBLE("Main +Sub mic capture gain ctrl", > + TWL4030_REG_ANAMIC_GAIN, 3 , 0, 5, 0), > + > + SOC_DOUBLE_R("External Speaker Volume control", > + TWL4030_REG_PREDL_CTL, TWL4030_REG_PREDR_CTL, > + 4, 3, 0), > + > + SOC_DOUBLE_R("Pre Car kit Volume control", > + TWL4030_REG_PRECKL_CTL, TWL4030_REG_PRECKR_CTL, > + 4, 3, 0), > + > + SOC_SINGLE("DACL2", TWL4030_REG_AVDAC_CTL, 3, 1, 0), > + SOC_SINGLE("DACR2", TWL4030_REG_AVDAC_CTL, 2, 1, 0), > + > + SOC_ENUM_EXT("Jack Function", twl4030_enum[0], > + twl4030_get_jack, twl4030_set_jack), > +}; > + > +/* Right PGA Mixer control switches */ > +static const struct snd_kcontrol_new twl4030_right_pga_mixer_controls[] = { > + SOC_DAPM_SINGLE("HS Mic switch", TWL4030_REG_ANAMICL, 1, 1, 0), > + SOC_DAPM_SINGLE("Aux/FM right switch", TWL4030_REG_ANAMICR, 2, 1, > 0), > + SOC_DAPM_SINGLE("Sub Mic switch", TWL4030_REG_ANAMICR, 0, 1, 0), > +}; > + > +/* Left PGA Mixer control switches */ > +static const struct snd_kcontrol_new twl4030_left_pga_mixer_controls[] = { > + SOC_DAPM_SINGLE("HS Mic switch", TWL4030_REG_ANAMICL, 1, 1, 0), > + SOC_DAPM_SINGLE("Aux/FM left switch", TWL4030_REG_ANAMICL, 2, 1, > 0), > + SOC_DAPM_SINGLE("Main Mic switch", TWL4030_REG_ANAMICL, 0, 1, 0), > +}; > + > +/* Right DACR2 Mixer */ > +static const struct snd_kcontrol_new twl4030_dacr2_mixer_controls[] = { > + SOC_DAPM_SINGLE("Headset-R switch", TWL4030_REG_HS_SEL, 5, 1, 0), > + SOC_DAPM_SINGLE("Handsfree-R switch", TWL4030_REG_HFR_CTL, 5, 1, > 0), > + SOC_DAPM_SINGLE("PRECK-R switch", TWL4030_REG_PRECKR_CTL, 2, 1, > 0), > + SOC_DAPM_DOUBLE("E class-D amp-R switch", TWL4030_REG_PREDR_CTL, 3, 2, > 1, 0, 0), > +}; > + > +/* Left DACL2 Mixer */ > +static const struct snd_kcontrol_new twl4030_dacl2_mixer_controls[] = { > + SOC_DAPM_SINGLE("Headset-L switch", TWL4030_REG_HS_SEL, 2, 1, 0), > + SOC_DAPM_SINGLE("Handsfree-L switch", TWL4030_REG_HFL_CTL, 5, 1, > 0), > + SOC_DAPM_SINGLE("Ear peice switch", TWL4030_REG_EAR_CTL, 2, 1, > 0), > + SOC_DAPM_SINGLE("PRECK-L switch", TWL4030_REG_PRECKL_CTL, 2, 1, 0), > + SOC_DAPM_DOUBLE("E class-D amp-L switch", TWL4031_REG_PREDL_CTL, 3, > 2, 1, 0, 0), > }; > > /* add non dapm controls */ > @@ -215,27 +320,96 @@ > } > > static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { > - SND_SOC_DAPM_INPUT("INL"), > - SND_SOC_DAPM_INPUT("INR"), > - > - SND_SOC_DAPM_OUTPUT("OUTL"), > - SND_SOC_DAPM_OUTPUT("OUTR"), > - > - SND_SOC_DAPM_DAC("DACL", "Left Playback", SND_SOC_NOPM, 0, 0), > - SND_SOC_DAPM_DAC("DACR", "Right Playback", SND_SOC_NOPM, 0, 0), > - > - SND_SOC_DAPM_ADC("ADCL", "Left Capture", SND_SOC_NOPM, 0, 0), > - SND_SOC_DAPM_ADC("ADCR", "Right Capture", SND_SOC_NOPM, 0, 0), > + > + SND_SOC_DAPM_HP("Headphone Jack", NULL), > + > + /* Left ADC for capture */ > + SND_SOC_DAPM_ADC("ADCL", "Left Capture ADC", TWL4030_REG_AVADC_CTL, > 3, 0), > + > + /* dapm widget (path domain) for left PGA mixer */ > + SND_SOC_DAPM_MIXER("LINEIN-L", SND_SOC_NOPM, 0, 0, > + &twl4030_left_pga_mixer_controls[0], > + ARRAY_SIZE(twl4030_left_pga_mixer_controls)), > + > + /* Right ADC for capture*/ > + SND_SOC_DAPM_ADC("ADCR", "Right Capture ADC", > TWL4030_REG_AVADC_CTL, 1, 0), > + > + /* dapm widget (path domain) for right PGA mixer */ > + SND_SOC_DAPM_MIXER("LINEIN-R", SND_SOC_NOPM, 0, 0, > + &twl4030_right_pga_mixer_controls[0], > + ARRAY_SIZE(twl4030_right_pga_mixer_controls)), > + > + /* dapm widget (path domain) for left DACL2 Mixer */ > + > + SND_SOC_DAPM_MIXER("DACL2 Mixer", SND_SOC_NOPM, 0, 0, > + &twl4030_dacl2_mixer_controls[0], > + ARRAY_SIZE(twl4030_dacl2_mixer_controls)), > + > + /* dapm widget (path domain) for DACR2 Mixer */ > + SND_SOC_DAPM_MIXER("DACR2 Mixer", SND_SOC_NOPM, 0, 0, > + &twl4030_dacr2_mixer_controls[0], > + ARRAY_SIZE(twl4030_dacr2_mixer_controls)), > + > + /* Inputs Left*/ > + SND_SOC_DAPM_INPUT("HSMIC"), > + SND_SOC_DAPM_INPUT("Aux/fm left"), > + SND_SOC_DAPM_INPUT("Main mic"), > + > + /* Inputs Right*/ > + SND_SOC_DAPM_INPUT("HSMIC"), > + SND_SOC_DAPM_INPUT("Aux/fm right"), > + SND_SOC_DAPM_INPUT("Sub mic"), > + > + /* Outputs Left*/ > + SND_SOC_DAPM_OUTPUT("HSOL"), > + SND_SOC_DAPM_OUTPUT("IHF_LEFT"), > + SND_SOC_DAPM_OUTPUT("EAR"), > + SND_SOC_DAPM_OUTPUT("E class-D L"), > + SND_SOC_DAPM_OUTPUT("PRECK-L"); > + > + /* Outputs Right */ > + SND_SOC_DAPM_OUTPUT("HSOR"), > + SND_SOC_DAPM_OUTPUT("IHF_RIGHT"), > + SND_SOC_DAPM_OUTPUT("E class-D R"), > + SND_SOC_DAPM_OUTPUT("PRECK-R"); > }; > > static const struct snd_soc_dapm_route intercon[] = { > - /* outputs */ > - {"OUTL", NULL, "DACL"}, > - {"OUTR", NULL, "DACR"}, > - > - /* inputs */ > - {"ADCL", NULL, "INL"}, > - {"ADCR", NULL, "INR"}, > + > + /* ******** Left input ******** */ > + {"LINEIN-L", "HS Mic switch", "HSMIC"}, > + {"LINEIN-L", "Aux/FM left switch", "Aux/fm left"}, > + {"LINEIN-L", "Main Mic switch", "Main mic"}, > + > + {"ADCL", NULL, "LINEIN-L"}, > + > + > + /* ******** Right Input ******** */ > + {"LINEIN-R", "HS Mic switch", "HSMIC"}, > + {"LINEIN-R", "Aux/FM right switch", "Aux/fm right"}, > + {"LINEIN-R", "Sub Mic switch", "Sub mic"}, > + > + {"ADCR", NULL, "LINEIN-R"}, > + > + /* ******** Left Output ******** */ > + //{"DACL2", NULL, "DACL2 Mixer"}, > + > + {"DACL2 Mixer", "Headset-L switch", "HSOL"}, > + {"DACL2 Mixer", "Handsfree-L switch", "IHF_LEFT"}, > + {"DACL2 Mixer", "Ear peice switch", "EAR"}, > + {"DACL2 Mixer", "PRECK-L switch", "PRECK-L"}, > + {"DACL2 Mixer","E class-D amp-L switch","E class-D L"}, > + > + {"Headphone Jack",NULL, "HSOL"}, > + /* ******** Right Output ******** */ > + //{"DACR2", NULL, "DACR2 Mixer"}, > + > + {"DACR2 Mixer", "Headset-R switch","HSOR"}, > + {"DACR2 Mixer", "Handsfree-R switch","IHF_RIGHT"}, > + {"DACR2 Mixer", "PRECK-R switch", "PRECK-R"}, > + {"DACR2 Mixer","E class-D amp-R switch","E class-D R"}, > + > + {"Headphone Jack",NULL, "HSOR"}, > }; > > static int twl4030_add_widgets(struct snd_soc_codec *codec) > @@ -280,7 +454,7 @@ > /* toggle CODECPDZ as per TRM */ > twl4030_clear_codecpdz(codec); > twl4030_set_codecpdz(codec); > - > + > /* program anti-pop with bias ramp delay */ > popn = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); > popn &= TWL4030_RAMP_DELAY; > @@ -384,6 +558,9 @@ > case 48000: > mode |= TWL4030_APLL_RATE_48000; > break; > + case 96000: > + mode |= TWL4030_APLL_RATE_96000; > + break; > default: > printk(KERN_ERR "TWL4030 hw params: unknown rate %d\n", > params_rate(params)); > @@ -434,6 +611,7 @@ > u8 infreq; > > switch (freq) { > + > case 19200000: > infreq = TWL4030_APLL_INFREQ_19200KHZ; > break; > @@ -504,20 +682,24 @@ > return 0; > } > > -#define TWL4030_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) > +#define TWL4030_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \ > + SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \ > + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ > + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) > + > #define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | > SNDRV_PCM_FORMAT_S24_LE) > > struct snd_soc_dai twl4030_dai = { > .name = "twl4030", > .playback = { > .stream_name = "Playback", > - .channels_min = 2, > + .channels_min = 1, > .channels_max = 2, > .rates = TWL4030_RATES, > .formats = TWL4030_FORMATS,}, > .capture = { > .stream_name = "Capture", > - .channels_min = 2, > + .channels_min = 1, > .channels_max = 2, > .rates = TWL4030_RATES, > .formats = TWL4030_FORMATS,}, > @@ -616,13 +798,14 @@ > > codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); > if (codec == NULL) > - return -ENOMEM; > - > + return -ENOMEM; > + > socdev->codec = codec; > mutex_init(&codec->mutex); > INIT_LIST_HEAD(&codec->dapm_widgets); > INIT_LIST_HEAD(&codec->dapm_paths); > - > + > + > twl4030_socdev = socdev; > twl4030_init(socdev); > > Patch ends.. > > Thanks and Regards, > > (: Naveen Krishna Ch :) > _______________________________________________ > Linux-omap-open-source mailing list > Linux-omap-open-source@linux.omap.com > http://linux.omap.com/mailman/listinfo/linux-omap-open-source > -- Best Regards, Felipe Balbi felipebalbi@users.sourceforge.net ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: TWL4030 asoc kcontrols and widgets 2008-11-20 10:55 ` TWL4030 asoc kcontrols and widgets Felipe Balbi @ 2008-11-20 17:32 ` Tony Lindgren 2008-11-20 17:42 ` Felipe Balbi 0 siblings, 1 reply; 5+ messages in thread From: Tony Lindgren @ 2008-11-20 17:32 UTC (permalink / raw) To: Felipe Balbi; +Cc: naveen krishna ch, linux-omap-open-source, linux-omap * Felipe Balbi <felipebalbi@users.sourceforge.net> [081120 02:55]: > This list has been moved to linux-omap@vger.kernel.org > > Please, keep that in Cc, also for ASoC development, send it also to the > proper alsa mailing list alsa-devel@alsa-project.org > > Tony, I think you should apply this patch in mainline tree: > > diff --git a/MAINTAINERS b/MAINTAINERS > index 8dae455..54c8e90 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -4010,6 +4010,13 @@ P: Alex Dubov > M: oakad@yahoo.com > S: Maintained > > +TI OMAP > +P: Tony Lindgren > +M: tony@atomide.com > +L: linux-omap@vger.kernel.org > +T: git kernel.org:/pub/scm/linux/tmlind/linux-omap-2.6.git > +S: Maintained > + > TI OMAP MMC INTERFACE DRIVER > P: Carlos Aguiar, Anderson Briglia and Syed Khasim > M: linux-omap@vger.kernel.org Yeah sure. Let's also add maintainers for omap subsystems that have maintainers while we're at it. Tony > > > On Thu, Nov 20, 2008 at 12:02 PM, naveen krishna ch > <naveenkrishna.ch@gmail.com> wrote: > > Hi All > > > > I have been working on TWL4030 codec driver for ALSA SOC. > > I have taken sound/soc/codec/twl4030.c as reference from main line > > > > This Patch adds some kcontrols, widgets and interconnection map for some of > > the TWL4030 ASOC codec > > I was building it for a custom board as it was for OVERO > > > > > > Suggestions on the DAPM part of the driver would be helpful > > > > Thanks in advance. > > > > The patch is as follows. > > > > > > --- twl4030.c 2008-11-19 12:04:32.000000000 +0530 > > +++ /home/chnaveen/Desktop/twl4030.c 2008-11-21 15:08:06.000000000 +0530 > > @@ -16,7 +16,9 @@ > > * along with this program; if not, write to the Free Software > > * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > > * 02110-1301 USA > > - * > > + * Modified by : Naveen Krishna Ch > > + * Added Kcontrols for OMAP3 WaterlooBoard > > + * Dated : 28th october 2008 > > */ > > > > #include <linux/module.h> > > @@ -29,24 +31,27 @@ > > #include <linux/i2c/twl4030.h> > > #include <sound/core.h> > > #include <sound/pcm.h> > > +#include <sound/jack.h> > > #include <sound/pcm_params.h> > > #include <sound/soc.h> > > #include <sound/soc-dapm.h> > > #include <sound/initval.h> > > - > > +#include <asm/arch/twl4030.h> > > #include "twl4030.h" > > > > +static int twl4030_jack_func; > > + > > /* > > * twl4030 register cache & default register settings > > */ > > static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { > > 0x00, /* this register not used */ > > - 0x93, /* REG_CODEC_MODE (0x1) */ > > + 0x03, /* REG_CODEC_MODE (0x1) */ > > 0xc3, /* REG_OPTION (0x2) */ > > 0x00, /* REG_UNKNOWN (0x3) */ > > 0x00, /* REG_MICBIAS_CTL (0x4) */ > > - 0x24, /* REG_ANAMICL (0x5) */ > > - 0x04, /* REG_ANAMICR (0x6) */ > > + 0xb0, /* REG_ANAMICL (0x5) */ > > + 0x10, /* REG_ANAMICR (0x6) */ > > 0x0a, /* REG_AVADC_CTL (0x7) */ > > 0x00, /* REG_ADCMICSEL (0x8) */ > > 0x00, /* REG_DIGMIXING (0x9) */ > > @@ -67,22 +72,22 @@ > > 0x00, /* REG_ARX2VTXPGA (0x18) */ > > 0x00, /* REG_ARXL1_APGA_CTL (0x19) */ > > 0x00, /* REG_ARXR1_APGA_CTL (0x1A) */ > > - 0x4b, /* REG_ARXL2_APGA_CTL (0x1B) */ > > - 0x4b, /* REG_ARXR2_APGA_CTL (0x1C) */ > > + 0x2b, /* REG_ARXL2_APGA_CTL (0x1B) */ > > + 0x2b, /* REG_ARXR2_APGA_CTL (0x1C) */ > > 0x00, /* REG_ATX2ARXPGA (0x1D) */ > > 0x00, /* REG_BT_IF (0x1E) */ > > 0x00, /* REG_BTPGA (0x1F) */ > > 0x00, /* REG_BTSTPGA (0x20) */ > > - 0x00, /* REG_EAR_CTL (0x21) */ > > - 0x24, /* REG_HS_SEL (0x22) */ > > - 0x0a, /* REG_HS_GAIN_SET (0x23) */ > > - 0x00, /* REG_HS_POPN_SET (0x24) */ > > - 0x00, /* REG_PREDL_CTL (0x25) */ > > - 0x00, /* REG_PREDR_CTL (0x26) */ > > - 0x00, /* REG_PRECKL_CTL (0x27) */ > > - 0x00, /* REG_PRECKR_CTL (0x28) */ > > - 0x00, /* REG_HFL_CTL (0x29) */ > > - 0x00, /* REG_HFR_CTL (0x2A) */ > > + 0x20, /* REG_EAR_CTL (0x21) */ > > + 0x00, /* REG_HS_SEL (0x22) */ > > + 0x05, /* REG_HS_GAIN_SET (0x23) */ > > + 0x42, /* REG_HS_POPN_SET (0x24) */ > > + 0x20, /* REG_PREDL_CTL (0x25) */ > > + 0x20, /* REG_PREDR_CTL (0x26) */ > > + 0x20, /* REG_PRECKL_CTL (0x27) */ > > + 0x20, /* REG_PRECKR_CTL (0x28) */ > > + 0x1f, /* REG_HFL_CTL (0x29) */ > > + 0x1f, /* REG_HFR_CTL (0x2A) */ > > 0x00, /* REG_ALC_CTL (0x2B) */ > > 0x00, /* REG_ALC_SET1 (0x2C) */ > > 0x00, /* REG_ALC_SET2 (0x2D) */ > > @@ -112,9 +117,40 @@ > > 0x00, /* REG_VIBRA_CTL (0x45) */ > > 0x00, /* REG_VIBRA_SET (0x46) */ > > 0x00, /* REG_VIBRA_PWM_SET (0x47) */ > > - 0x00, /* REG_ANAMIC_GAIN (0x48) */ > > + 0x24, /* REG_ANAMIC_GAIN (0x48) */ > > 0x00, /* REG_MISC_SET_2 (0x49) */ > > }; > > +static void twl4030_ext_control(struct snd_soc_codec *codec) > > +{ > > + if (twl4030_jack_func) > > + snd_soc_dapm_enable_pin(codec, "Headphone Jack"); > > + else > > + snd_soc_dapm_disable_pin(codec, "Headphone Jack"); > > + > > + snd_soc_dapm_sync(codec); > > +} > > + > > +static int twl4030_get_jack(struct snd_kcontrol *kcontrol, > > + struct snd_ctl_elem_value *ucontrol) > > +{ > > + ucontrol->value.integer.value[0] = twl4030_jack_func; > > + > > + return 0; > > +} > > + > > +static int twl4030_set_jack(struct snd_kcontrol *kcontrol, > > + struct snd_ctl_elem_value *ucontrol) > > +{ > > + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); > > + > > + if (twl4030_jack_func == ucontrol->value.integer.value[0]) > > + return 0; > > + > > + twl4030_jack_func = ucontrol->value.integer.value[0]; > > + twl4030_ext_control(codec); > > + > > + return 1; > > +} > > > > /* > > * read twl4030 register cache > > @@ -188,14 +224,83 @@ > > twl4030_write(codec, i, twl4030_reg[i]); > > > > } > > +static const char *jack_function[] = {"Off", "Headphone"}; > > + > > +static const struct soc_enum twl4030_enum[] = { > > + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(jack_function), jack_function), > > +}; > > + > > > > static const struct snd_kcontrol_new twl4030_snd_controls[] = { > > - SOC_DOUBLE_R("Master Playback Volume", > > - TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > > - 0, 127, 0), > > - SOC_DOUBLE_R("Capture Volume", > > - TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, > > - 0, 127, 0), > > + > > + /* Master Playback Volume Controls */ > > + SOC_DOUBLE_R("Master PLayback Course Gain ctrl", > > + TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > > + 6, 3, 0), > > + SOC_DOUBLE_R("Master Playback Fine Gain ctrl", > > + TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA, > > + 0, 63, 0), > > + > > + /* Playback Speaker volume controls */ > > + SOC_DOUBLE_R("Speaker R2+L2 Volume ctrls", > > + TWL4030_REG_ARXL2_APGA_CTL, TWL4030_REG_ARXR2_APGA_CTL, > > + 3, 17, 0), > > + > > + /* Capture Gain controls */ > > + SOC_DOUBLE_R("Master Capture Gain ctrl", > > + TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, > > + 0, 31, 0), > > + /* Loop gain controls*/ > > + SOC_DOUBLE("Loop Gain ctrl", TWL4030_REG_ATX2ARXPGA, > > + 3 , 0, 7, 0), > > + > > + SOC_DOUBLE("Main +Sub mic capture gain ctrl", > > + TWL4030_REG_ANAMIC_GAIN, 3 , 0, 5, 0), > > + > > + SOC_DOUBLE_R("External Speaker Volume control", > > + TWL4030_REG_PREDL_CTL, TWL4030_REG_PREDR_CTL, > > + 4, 3, 0), > > + > > + SOC_DOUBLE_R("Pre Car kit Volume control", > > + TWL4030_REG_PRECKL_CTL, TWL4030_REG_PRECKR_CTL, > > + 4, 3, 0), > > + > > + SOC_SINGLE("DACL2", TWL4030_REG_AVDAC_CTL, 3, 1, 0), > > + SOC_SINGLE("DACR2", TWL4030_REG_AVDAC_CTL, 2, 1, 0), > > + > > + SOC_ENUM_EXT("Jack Function", twl4030_enum[0], > > + twl4030_get_jack, twl4030_set_jack), > > +}; > > + > > +/* Right PGA Mixer control switches */ > > +static const struct snd_kcontrol_new twl4030_right_pga_mixer_controls[] = { > > + SOC_DAPM_SINGLE("HS Mic switch", TWL4030_REG_ANAMICL, 1, 1, 0), > > + SOC_DAPM_SINGLE("Aux/FM right switch", TWL4030_REG_ANAMICR, 2, 1, > > 0), > > + SOC_DAPM_SINGLE("Sub Mic switch", TWL4030_REG_ANAMICR, 0, 1, 0), > > +}; > > + > > +/* Left PGA Mixer control switches */ > > +static const struct snd_kcontrol_new twl4030_left_pga_mixer_controls[] = { > > + SOC_DAPM_SINGLE("HS Mic switch", TWL4030_REG_ANAMICL, 1, 1, 0), > > + SOC_DAPM_SINGLE("Aux/FM left switch", TWL4030_REG_ANAMICL, 2, 1, > > 0), > > + SOC_DAPM_SINGLE("Main Mic switch", TWL4030_REG_ANAMICL, 0, 1, 0), > > +}; > > + > > +/* Right DACR2 Mixer */ > > +static const struct snd_kcontrol_new twl4030_dacr2_mixer_controls[] = { > > + SOC_DAPM_SINGLE("Headset-R switch", TWL4030_REG_HS_SEL, 5, 1, 0), > > + SOC_DAPM_SINGLE("Handsfree-R switch", TWL4030_REG_HFR_CTL, 5, 1, > > 0), > > + SOC_DAPM_SINGLE("PRECK-R switch", TWL4030_REG_PRECKR_CTL, 2, 1, > > 0), > > + SOC_DAPM_DOUBLE("E class-D amp-R switch", TWL4030_REG_PREDR_CTL, 3, 2, > > 1, 0, 0), > > +}; > > + > > +/* Left DACL2 Mixer */ > > +static const struct snd_kcontrol_new twl4030_dacl2_mixer_controls[] = { > > + SOC_DAPM_SINGLE("Headset-L switch", TWL4030_REG_HS_SEL, 2, 1, 0), > > + SOC_DAPM_SINGLE("Handsfree-L switch", TWL4030_REG_HFL_CTL, 5, 1, > > 0), > > + SOC_DAPM_SINGLE("Ear peice switch", TWL4030_REG_EAR_CTL, 2, 1, > > 0), > > + SOC_DAPM_SINGLE("PRECK-L switch", TWL4030_REG_PRECKL_CTL, 2, 1, 0), > > + SOC_DAPM_DOUBLE("E class-D amp-L switch", TWL4031_REG_PREDL_CTL, 3, > > 2, 1, 0, 0), > > }; > > > > /* add non dapm controls */ > > @@ -215,27 +320,96 @@ > > } > > > > static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { > > - SND_SOC_DAPM_INPUT("INL"), > > - SND_SOC_DAPM_INPUT("INR"), > > - > > - SND_SOC_DAPM_OUTPUT("OUTL"), > > - SND_SOC_DAPM_OUTPUT("OUTR"), > > - > > - SND_SOC_DAPM_DAC("DACL", "Left Playback", SND_SOC_NOPM, 0, 0), > > - SND_SOC_DAPM_DAC("DACR", "Right Playback", SND_SOC_NOPM, 0, 0), > > - > > - SND_SOC_DAPM_ADC("ADCL", "Left Capture", SND_SOC_NOPM, 0, 0), > > - SND_SOC_DAPM_ADC("ADCR", "Right Capture", SND_SOC_NOPM, 0, 0), > > + > > + SND_SOC_DAPM_HP("Headphone Jack", NULL), > > + > > + /* Left ADC for capture */ > > + SND_SOC_DAPM_ADC("ADCL", "Left Capture ADC", TWL4030_REG_AVADC_CTL, > > 3, 0), > > + > > + /* dapm widget (path domain) for left PGA mixer */ > > + SND_SOC_DAPM_MIXER("LINEIN-L", SND_SOC_NOPM, 0, 0, > > + &twl4030_left_pga_mixer_controls[0], > > + ARRAY_SIZE(twl4030_left_pga_mixer_controls)), > > + > > + /* Right ADC for capture*/ > > + SND_SOC_DAPM_ADC("ADCR", "Right Capture ADC", > > TWL4030_REG_AVADC_CTL, 1, 0), > > + > > + /* dapm widget (path domain) for right PGA mixer */ > > + SND_SOC_DAPM_MIXER("LINEIN-R", SND_SOC_NOPM, 0, 0, > > + &twl4030_right_pga_mixer_controls[0], > > + ARRAY_SIZE(twl4030_right_pga_mixer_controls)), > > + > > + /* dapm widget (path domain) for left DACL2 Mixer */ > > + > > + SND_SOC_DAPM_MIXER("DACL2 Mixer", SND_SOC_NOPM, 0, 0, > > + &twl4030_dacl2_mixer_controls[0], > > + ARRAY_SIZE(twl4030_dacl2_mixer_controls)), > > + > > + /* dapm widget (path domain) for DACR2 Mixer */ > > + SND_SOC_DAPM_MIXER("DACR2 Mixer", SND_SOC_NOPM, 0, 0, > > + &twl4030_dacr2_mixer_controls[0], > > + ARRAY_SIZE(twl4030_dacr2_mixer_controls)), > > + > > + /* Inputs Left*/ > > + SND_SOC_DAPM_INPUT("HSMIC"), > > + SND_SOC_DAPM_INPUT("Aux/fm left"), > > + SND_SOC_DAPM_INPUT("Main mic"), > > + > > + /* Inputs Right*/ > > + SND_SOC_DAPM_INPUT("HSMIC"), > > + SND_SOC_DAPM_INPUT("Aux/fm right"), > > + SND_SOC_DAPM_INPUT("Sub mic"), > > + > > + /* Outputs Left*/ > > + SND_SOC_DAPM_OUTPUT("HSOL"), > > + SND_SOC_DAPM_OUTPUT("IHF_LEFT"), > > + SND_SOC_DAPM_OUTPUT("EAR"), > > + SND_SOC_DAPM_OUTPUT("E class-D L"), > > + SND_SOC_DAPM_OUTPUT("PRECK-L"); > > + > > + /* Outputs Right */ > > + SND_SOC_DAPM_OUTPUT("HSOR"), > > + SND_SOC_DAPM_OUTPUT("IHF_RIGHT"), > > + SND_SOC_DAPM_OUTPUT("E class-D R"), > > + SND_SOC_DAPM_OUTPUT("PRECK-R"); > > }; > > > > static const struct snd_soc_dapm_route intercon[] = { > > - /* outputs */ > > - {"OUTL", NULL, "DACL"}, > > - {"OUTR", NULL, "DACR"}, > > - > > - /* inputs */ > > - {"ADCL", NULL, "INL"}, > > - {"ADCR", NULL, "INR"}, > > + > > + /* ******** Left input ******** */ > > + {"LINEIN-L", "HS Mic switch", "HSMIC"}, > > + {"LINEIN-L", "Aux/FM left switch", "Aux/fm left"}, > > + {"LINEIN-L", "Main Mic switch", "Main mic"}, > > + > > + {"ADCL", NULL, "LINEIN-L"}, > > + > > + > > + /* ******** Right Input ******** */ > > + {"LINEIN-R", "HS Mic switch", "HSMIC"}, > > + {"LINEIN-R", "Aux/FM right switch", "Aux/fm right"}, > > + {"LINEIN-R", "Sub Mic switch", "Sub mic"}, > > + > > + {"ADCR", NULL, "LINEIN-R"}, > > + > > + /* ******** Left Output ******** */ > > + //{"DACL2", NULL, "DACL2 Mixer"}, > > + > > + {"DACL2 Mixer", "Headset-L switch", "HSOL"}, > > + {"DACL2 Mixer", "Handsfree-L switch", "IHF_LEFT"}, > > + {"DACL2 Mixer", "Ear peice switch", "EAR"}, > > + {"DACL2 Mixer", "PRECK-L switch", "PRECK-L"}, > > + {"DACL2 Mixer","E class-D amp-L switch","E class-D L"}, > > + > > + {"Headphone Jack",NULL, "HSOL"}, > > + /* ******** Right Output ******** */ > > + //{"DACR2", NULL, "DACR2 Mixer"}, > > + > > + {"DACR2 Mixer", "Headset-R switch","HSOR"}, > > + {"DACR2 Mixer", "Handsfree-R switch","IHF_RIGHT"}, > > + {"DACR2 Mixer", "PRECK-R switch", "PRECK-R"}, > > + {"DACR2 Mixer","E class-D amp-R switch","E class-D R"}, > > + > > + {"Headphone Jack",NULL, "HSOR"}, > > }; > > > > static int twl4030_add_widgets(struct snd_soc_codec *codec) > > @@ -280,7 +454,7 @@ > > /* toggle CODECPDZ as per TRM */ > > twl4030_clear_codecpdz(codec); > > twl4030_set_codecpdz(codec); > > - > > + > > /* program anti-pop with bias ramp delay */ > > popn = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); > > popn &= TWL4030_RAMP_DELAY; > > @@ -384,6 +558,9 @@ > > case 48000: > > mode |= TWL4030_APLL_RATE_48000; > > break; > > + case 96000: > > + mode |= TWL4030_APLL_RATE_96000; > > + break; > > default: > > printk(KERN_ERR "TWL4030 hw params: unknown rate %d\n", > > params_rate(params)); > > @@ -434,6 +611,7 @@ > > u8 infreq; > > > > switch (freq) { > > + > > case 19200000: > > infreq = TWL4030_APLL_INFREQ_19200KHZ; > > break; > > @@ -504,20 +682,24 @@ > > return 0; > > } > > > > -#define TWL4030_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) > > +#define TWL4030_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \ > > + SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \ > > + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ > > + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) > > + > > #define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | > > SNDRV_PCM_FORMAT_S24_LE) > > > > struct snd_soc_dai twl4030_dai = { > > .name = "twl4030", > > .playback = { > > .stream_name = "Playback", > > - .channels_min = 2, > > + .channels_min = 1, > > .channels_max = 2, > > .rates = TWL4030_RATES, > > .formats = TWL4030_FORMATS,}, > > .capture = { > > .stream_name = "Capture", > > - .channels_min = 2, > > + .channels_min = 1, > > .channels_max = 2, > > .rates = TWL4030_RATES, > > .formats = TWL4030_FORMATS,}, > > @@ -616,13 +798,14 @@ > > > > codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); > > if (codec == NULL) > > - return -ENOMEM; > > - > > + return -ENOMEM; > > + > > socdev->codec = codec; > > mutex_init(&codec->mutex); > > INIT_LIST_HEAD(&codec->dapm_widgets); > > INIT_LIST_HEAD(&codec->dapm_paths); > > - > > + > > + > > twl4030_socdev = socdev; > > twl4030_init(socdev); > > > > Patch ends.. > > > > Thanks and Regards, > > > > (: Naveen Krishna Ch :) > > _______________________________________________ > > Linux-omap-open-source mailing list > > Linux-omap-open-source@linux.omap.com > > http://linux.omap.com/mailman/listinfo/linux-omap-open-source > > > > > > -- > Best Regards, > > Felipe Balbi > felipebalbi@users.sourceforge.net ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: TWL4030 asoc kcontrols and widgets 2008-11-20 17:32 ` Tony Lindgren @ 2008-11-20 17:42 ` Felipe Balbi 2008-11-20 18:56 ` (non-hs)mmc vs lockdep David Brownell 0 siblings, 1 reply; 5+ messages in thread From: Felipe Balbi @ 2008-11-20 17:42 UTC (permalink / raw) To: ext Tony Lindgren Cc: Felipe Balbi, naveen krishna ch, linux-omap-open-source, linux-omap On Thu, Nov 20, 2008 at 09:32:07AM -0800, Tony Lindgren wrote: > * Felipe Balbi <felipebalbi@users.sourceforge.net> [081120 02:55]: > > This list has been moved to linux-omap@vger.kernel.org > > > > Please, keep that in Cc, also for ASoC development, send it also to the > > proper alsa mailing list alsa-devel@alsa-project.org > > > > Tony, I think you should apply this patch in mainline tree: > > > > diff --git a/MAINTAINERS b/MAINTAINERS > > index 8dae455..54c8e90 100644 > > --- a/MAINTAINERS > > +++ b/MAINTAINERS > > @@ -4010,6 +4010,13 @@ P: Alex Dubov > > M: oakad@yahoo.com > > S: Maintained > > > > +TI OMAP > > +P: Tony Lindgren > > +M: tony@atomide.com > > +L: linux-omap@vger.kernel.org > > +T: git kernel.org:/pub/scm/linux/tmlind/linux-omap-2.6.git > > +S: Maintained > > + > > TI OMAP MMC INTERFACE DRIVER > > P: Carlos Aguiar, Anderson Briglia and Syed Khasim > > M: linux-omap@vger.kernel.org > > > Yeah sure. Let's also add maintainers for omap subsystems that have > maintainers while we're at it. sounds good. At least mmc is already there. -- balbi ^ permalink raw reply [flat|nested] 5+ messages in thread
* (non-hs)mmc vs lockdep 2008-11-20 17:42 ` Felipe Balbi @ 2008-11-20 18:56 ` David Brownell 2008-11-20 19:10 ` Felipe Balbi 0 siblings, 1 reply; 5+ messages in thread From: David Brownell @ 2008-11-20 18:56 UTC (permalink / raw) To: linux-omap On Thursday 20 November 2008, Felipe Balbi wrote: > > > TI OMAP MMC INTERFACE DRIVER > > > P: Carlos Aguiar, Anderson Briglia and Syed Khasim > > > M: linux-omap@vger.kernel.org > > > > > > Yeah sure. Let's also add maintainers for omap subsystems that have > > maintainers while we're at it. > > sounds good. At least mmc is already there. So, who's going to fix the bug with the non-highspeed MMC controller driver whereby it breaks with LOCKDEP enabled? The "BUG_ON(irqs_disabled());" in mmc_omap_start_request() triggers, since something inside the latest ARM MM code assumes it's never called with IRQs blocked ... a regression was introduced at some point. The same failure is seen in some other MMC controller drivers. - Dave -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: (non-hs)mmc vs lockdep 2008-11-20 18:56 ` (non-hs)mmc vs lockdep David Brownell @ 2008-11-20 19:10 ` Felipe Balbi 0 siblings, 0 replies; 5+ messages in thread From: Felipe Balbi @ 2008-11-20 19:10 UTC (permalink / raw) To: David Brownell; +Cc: linux-omap On Thu, Nov 20, 2008 at 10:56:28AM -0800, David Brownell wrote: > On Thursday 20 November 2008, Felipe Balbi wrote: > > > > TI OMAP MMC INTERFACE DRIVER > > > > P: Carlos Aguiar, Anderson Briglia and Syed Khasim > > > > M: linux-omap@vger.kernel.org > > > > > > > > > Yeah sure. Let's also add maintainers for omap subsystems that have > > > maintainers while we're at it. > > > > sounds good. At least mmc is already there. > > So, who's going to fix the bug with the non-highspeed MMC controller > driver whereby it breaks with LOCKDEP enabled? > > The "BUG_ON(irqs_disabled());" in mmc_omap_start_request() triggers, > since something inside the latest ARM MM code assumes it's never called > with IRQs blocked ... a regression was introduced at some point. The > same failure is seen in some other MMC controller drivers. Well, I haven't seen patches from none of the three maintainers for quite a while. Maybe someone at TI could take over the driver(s) ?? -- balbi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-11-20 19:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <ef0d8a250811200202o5852dabct8c5b135b86141f67@mail.gmail.com>
2008-11-20 10:55 ` TWL4030 asoc kcontrols and widgets Felipe Balbi
2008-11-20 17:32 ` Tony Lindgren
2008-11-20 17:42 ` Felipe Balbi
2008-11-20 18:56 ` (non-hs)mmc vs lockdep David Brownell
2008-11-20 19:10 ` Felipe Balbi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox