Commit 3578be57 authored by Eduardo Valentin's avatar Eduardo Valentin Committed by Tony Lindgren

Code clean-up for sound/arm/omap/omap-alsa-tsc2101-mixer.c

Removed lots of whitespaces and a few errors and
warnings reported by checkpatch.pl.
Signed-off-by: default avatarEduardo Valentin <eduardo.valentin@indt.org.br>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 1a4ff9ad
/* /*
* sound/arm/omap/omap-alsa-tsc2101-mixer.c * sound/arm/omap/omap-alsa-tsc2101-mixer.c
* *
* Alsa Driver for TSC2101 codec for OMAP platform boards. * Alsa Driver for TSC2101 codec for OMAP platform boards.
* *
* Copyright (C) 2005 Mika Laitio <lamikr@cc.jyu.fi> and * Copyright (C) 2005 Mika Laitio <lamikr@cc.jyu.fi> and
* Everett Coleman II <gcc80x86@fuzzyneural.net> * Everett Coleman II <gcc80x86@fuzzyneural.net>
* *
* Board initialization code is based on the code in TSC2101 OSS driver. * Board initialization code is based on the code in TSC2101 OSS driver.
* Copyright (C) 2004 Texas Instruments, Inc. * Copyright (C) 2004 Texas Instruments, Inc.
* Written by Nishanth Menon and Sriram Kannan * Written by Nishanth Menon and Sriram Kannan
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your * Free Software Foundation; either version 2 of the License, or (at your
...@@ -33,13 +33,13 @@ ...@@ -33,13 +33,13 @@
* History: * History:
* *
* 2006-03-01 Mika Laitio - Mixer for the tsc2101 driver used in omap boards. * 2006-03-01 Mika Laitio - Mixer for the tsc2101 driver used in omap boards.
* Can switch between headset and loudspeaker playback, * Can switch between headset and loudspeaker playback,
* mute and unmute dgc, set dgc volume. Record source switch, * mute and unmute dgc, set dgc volume. Record source switch,
* keyclick, buzzer and headset volume and handset volume control * keyclick, buzzer and headset volume and handset volume control
* are still missing. * are still missing.
* *
*/ */
#include "omap-alsa-tsc2101.h" #include "omap-alsa-tsc2101.h"
#include "omap-alsa-tsc2101-mixer.h" #include "omap-alsa-tsc2101-mixer.h"
...@@ -48,8 +48,15 @@ ...@@ -48,8 +48,15 @@
#include <sound/initval.h> #include <sound/initval.h>
#include <sound/control.h> #include <sound/control.h>
//#define M_DPRINTK(ARGS...) printk(KERN_INFO "<%s>: ",__FUNCTION__);printk(ARGS) #ifdef DEBUG
#define M_DPRINTK(ARGS...) \
do { \
printk(KERN_INFO "<%s>: ", __func__); \
printk(ARGS); \
} while (0)
#else
#define M_DPRINTK(ARGS...) /* nop */ #define M_DPRINTK(ARGS...) /* nop */
#endif
#define CHECK_BIT(INDX, ARG) (((ARG) & TSC2101_BIT(INDX)) >> INDX) #define CHECK_BIT(INDX, ARG) (((ARG) & TSC2101_BIT(INDX)) >> INDX)
#define IS_UNMUTED(INDX, ARG) (((CHECK_BIT(INDX, ARG)) == 0)) #define IS_UNMUTED(INDX, ARG) (((CHECK_BIT(INDX, ARG)) == 0))
...@@ -64,7 +71,7 @@ ...@@ -64,7 +71,7 @@
static int current_playback_target = PLAYBACK_TARGET_LOUDSPEAKER; static int current_playback_target = PLAYBACK_TARGET_LOUDSPEAKER;
static int current_rec_src = REC_SRC_SINGLE_ENDED_MICIN_HED; static int current_rec_src = REC_SRC_SINGLE_ENDED_MICIN_HED;
/* /*
* Simplified write for the tsc2101 audio registers. * Simplified write for the tsc2101 audio registers.
*/ */
inline void omap_tsc2101_audio_write(u8 address, u16 data) inline void omap_tsc2101_audio_write(u8 address, u16 data)
...@@ -73,7 +80,7 @@ inline void omap_tsc2101_audio_write(u8 address, u16 data) ...@@ -73,7 +80,7 @@ inline void omap_tsc2101_audio_write(u8 address, u16 data)
address, data); address, data);
} }
/* /*
* Simplified read for the tsc2101 audio registers. * Simplified read for the tsc2101 audio registers.
*/ */
inline u16 omap_tsc2101_audio_read(u8 address) inline u16 omap_tsc2101_audio_read(u8 address)
...@@ -88,8 +95,9 @@ inline u16 omap_tsc2101_audio_read(u8 address) ...@@ -88,8 +95,9 @@ inline u16 omap_tsc2101_audio_read(u8 address)
static void set_record_source(int val) static void set_record_source(int val)
{ {
u16 data; u16 data;
/* Mute Analog Sidetone /*
* Mute Analog Sidetone
* Analog sidetone gain db? * Analog sidetone gain db?
* Input selected by MICSEL connected to ADC * Input selected by MICSEL connected to ADC
*/ */
...@@ -98,77 +106,84 @@ static void set_record_source(int val) ...@@ -98,77 +106,84 @@ static void set_record_source(int val)
data |= MPC_MICSEL(val); data |= MPC_MICSEL(val);
data |= MPC_MICADC; data |= MPC_MICADC;
omap_tsc2101_audio_write(TSC2101_MIXER_PGA_CTRL, data); omap_tsc2101_audio_write(TSC2101_MIXER_PGA_CTRL, data);
current_rec_src = val; current_rec_src = val;
} }
/* /*
* Converts the Alsa mixer volume (0 - 100) to real * Converts the Alsa mixer volume (0 - 100) to real
* Digital Gain Control (DGC) value that can be written * Digital Gain Control (DGC) value that can be written
* or read from the TSC2101 registry. * or read from the TSC2101 registry.
* *
* Note that the number "OUTPUT_VOLUME_MAX" is smaller than OUTPUT_VOLUME_MIN * Note that the number "OUTPUT_VOLUME_MAX" is smaller than OUTPUT_VOLUME_MIN
* because DGC works as a volume decreaser. (The more bigger value is put * because DGC works as a volume decreaser. (The more bigger value is put
* to DGC, the more the volume of controlled channel is decreased) * to DGC, the more the volume of controlled channel is decreased)
* *
* In addition the TCS2101 chip would allow the maximum volume reduction be 63.5 DB * In addition the TCS2101 chip would allow the maximum
* volume reduction be 63.5 DB
* but according to some tests user can not hear anything with this chip * but according to some tests user can not hear anything with this chip
* when the volume is set to be less than 25 db. * when the volume is set to be less than 25 db.
* Therefore this function will return a value that means 38.5 db (63.5 db - 25 db) * Therefore this function will return a value
* that means 38.5 db (63.5 db - 25 db)
* reduction in the channel volume, when mixer is set to 0. * reduction in the channel volume, when mixer is set to 0.
* For mixer value 100, this will return a value that means 0 db volume reduction. * For mixer value 100, this will return a value that means
* 0 db volume reduction.
* ([mute_left_bit]0000000[mute_right_bit]0000000) * ([mute_left_bit]0000000[mute_right_bit]0000000)
*/ */
int get_mixer_volume_as_dac_gain_control_volume(int vol) int get_mixer_volume_as_dac_gain_control_volume(int vol)
{ {
u16 retVal; u16 retVal;
/* Convert 0 -> 100 volume to 0x7F(min) -> y(max) volume range */ /* Convert 0 -> 100 volume to 0x7F(min) -> y(max) volume range */
retVal = ((vol * OUTPUT_VOLUME_RANGE) / 100) + OUTPUT_VOLUME_MAX; retVal = ((vol * OUTPUT_VOLUME_RANGE) / 100) + OUTPUT_VOLUME_MAX;
/* invert the value for getting the proper range 0 min and 100 max */ /* invert the value for getting the proper range 0 min and 100 max */
retVal = OUTPUT_VOLUME_MIN - retVal; retVal = OUTPUT_VOLUME_MIN - retVal;
return retVal; return retVal;
} }
/* /*
* Converts the Alsa mixer volume (0 - 100) to TSC2101 * Converts the Alsa mixer volume (0 - 100) to TSC2101
* Digital Gain Control (DGC) volume. Alsa mixer volume 0 * Digital Gain Control (DGC) volume. Alsa mixer volume 0
* is converted to value meaning the volume reduction of -38.5 db * is converted to value meaning the volume reduction of -38.5 db
* and Alsa mixer volume 100 is converted to value meaning the * and Alsa mixer volume 100 is converted to value meaning the
* reduction of 0 db. * reduction of 0 db.
*/ */
int set_mixer_volume_as_dac_gain_control_volume(int mixerVolL, int mixerVolR) int set_mixer_volume_as_dac_gain_control_volume(int mixerVolL, int mixerVolR)
{ {
u16 val; u16 val;
int retVal; int retVal;
int volL; int volL;
int volR; int volR;
if ((mixerVolL < 0) || if ((mixerVolL < 0) ||
(mixerVolL > 100) || (mixerVolL > 100) ||
(mixerVolR < 0) || (mixerVolR < 0) ||
(mixerVolR > 100)) { (mixerVolR > 100)) {
printk(KERN_ERR "Trying a bad mixer volume as dac gain control volume value, left (%d), right (%d)!\n", mixerVolL, mixerVolR); printk(KERN_ERR "Trying a bad mixer volume as dac gain control"
" volume value, left (%d), right (%d)!\n", mixerVolL,
mixerVolR);
return -EPERM; return -EPERM;
} }
M_DPRINTK("mixer volume left = %d, right = %d\n", mixerVolL, mixerVolR); M_DPRINTK("mixer volume left = %d, right = %d\n", mixerVolL, mixerVolR);
volL = get_mixer_volume_as_dac_gain_control_volume(mixerVolL); volL = get_mixer_volume_as_dac_gain_control_volume(mixerVolL);
volR = get_mixer_volume_as_dac_gain_control_volume(mixerVolR); volR = get_mixer_volume_as_dac_gain_control_volume(mixerVolR);
val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL);
/* keep the old mute bit settings */ /* keep the old mute bit settings */
val &= ~(DGC_DALVL(OUTPUT_VOLUME_MIN) | DGC_DARVL(OUTPUT_VOLUME_MIN)); val &= ~(DGC_DALVL(OUTPUT_VOLUME_MIN) |
DGC_DARVL(OUTPUT_VOLUME_MIN));
val |= DGC_DALVL(volL) | DGC_DARVL(volR); val |= DGC_DALVL(volL) | DGC_DARVL(volR);
retVal = 2; retVal = 2;
if (retVal) { if (retVal)
omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val);
}
M_DPRINTK("to registry: left = %d, right = %d, total = %d\n", DGC_DALVL_EXTRACT(val), DGC_DARVL_EXTRACT(val), val); M_DPRINTK("to registry: left = %d, right = %d, total = %d\n",
DGC_DALVL_EXTRACT(val), DGC_DARVL_EXTRACT(val), val);
return retVal; return retVal;
} }
/** /*
* If unmuteLeft/unmuteRight == 0 --> mute * If unmuteLeft/unmuteRight == 0 --> mute
* If unmuteLeft/unmuteRight == 1 --> unmute * If unmuteLeft/unmuteRight == 1 --> unmute
*/ */
...@@ -179,15 +194,16 @@ int dac_gain_control_unmute(int unmuteLeft, int unmuteRight) ...@@ -179,15 +194,16 @@ int dac_gain_control_unmute(int unmuteLeft, int unmuteRight)
count = 0; count = 0;
val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL);
/* in alsa mixer 1 --> on, 0 == off. In tsc2101 registry 1 --> off, 0 --> on /*
* so if values are same, it's time to change the registry value. * in alsa mixer 1 --> on, 0 == off. In tsc2101 registry 1 --> off,
* 0 --> on so if values are same, it's time to change the registry
* value.
*/ */
if (unmuteLeft != IS_UNMUTED(15, val)) { if (unmuteLeft != IS_UNMUTED(15, val)) {
if (unmuteLeft == 0) { if (unmuteLeft == 0) {
/* mute --> turn bit on */ /* mute --> turn bit on */
val = val | DGC_DALMU; val = val | DGC_DALMU;
} } else {
else {
/* unmute --> turn bit off */ /* unmute --> turn bit off */
val = val & ~DGC_DALMU; val = val & ~DGC_DALMU;
} }
...@@ -197,69 +213,71 @@ int dac_gain_control_unmute(int unmuteLeft, int unmuteRight) ...@@ -197,69 +213,71 @@ int dac_gain_control_unmute(int unmuteLeft, int unmuteRight)
if (unmuteRight == 0) { if (unmuteRight == 0) {
/* mute --> turn bit on */ /* mute --> turn bit on */
val = val | DGC_DARMU; val = val | DGC_DARMU;
} } else {
else {
/* unmute --> turn bit off */ /* unmute --> turn bit off */
val = val & ~DGC_DARMU; val = val & ~DGC_DARMU;
} }
count++; count++;
} /* R */ } /* R */
if (count) { if (count) {
omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val);
M_DPRINTK("changed value, is_unmuted left = %d, right = %d\n", M_DPRINTK("changed value, is_unmuted left = %d, right = %d\n",
IS_UNMUTED(15, val), IS_UNMUTED(15, val),
IS_UNMUTED(7, val)); IS_UNMUTED(7, val));
} }
return count; return count;
} }
/** /*
* unmute: 0 --> mute, 1 --> unmute * unmute: 0 --> mute, 1 --> unmute
* page2RegIndx: Registry index in tsc2101 page2. * page2RegIndx: Registry index in tsc2101 page2.
* muteBitIndx: Index number for the bit in registry that indicates whether muted or unmuted. * muteBitIndx: Index number for the bit in registry that indicates whether
* muted or unmuted.
*/ */
int adc_pga_unmute_control(int unmute, int page2regIndx, int muteBitIndx) int adc_pga_unmute_control(int unmute, int page2regIndx, int muteBitIndx)
{ {
int count; int count;
u16 val; u16 val;
count = 0; count = 0;
val = omap_tsc2101_audio_read(page2regIndx); val = omap_tsc2101_audio_read(page2regIndx);
/* in alsa mixer 1 --> on, 0 == off. In tsc2101 registry 1 --> off, 0 --> on /*
* so if the values are same, it's time to change the registry value... * in alsa mixer 1 --> on, 0 == off. In tsc2101 registry 1 --> off,
* 0 --> on so if the values are same, it's time to change the
* registry value...
*/ */
if (unmute != IS_UNMUTED(muteBitIndx, val)) { if (unmute != IS_UNMUTED(muteBitIndx, val)) {
if (unmute == 0) { if (unmute == 0) {
/* mute --> turn bit on */ /* mute --> turn bit on */
val = val | TSC2101_BIT(muteBitIndx); val = val | TSC2101_BIT(muteBitIndx);
} } else {
else {
/* unmute --> turn bit off */ /* unmute --> turn bit off */
val = val & ~TSC2101_BIT(muteBitIndx); val = val & ~TSC2101_BIT(muteBitIndx);
} }
M_DPRINTK("changed value, is_unmuted = %d\n", IS_UNMUTED(muteBitIndx, val)); M_DPRINTK("changed value, is_unmuted = %d\n",
IS_UNMUTED(muteBitIndx, val));
count++; count++;
} }
if (count) { if (count)
omap_tsc2101_audio_write(page2regIndx, val); omap_tsc2101_audio_write(page2regIndx, val);
}
return count; return count;
} }
/* /*
* Converts the DGC registry value read from the TSC2101 registry to * Converts the DGC registry value read from the TSC2101 registry to
* Alsa mixer volume format (0 - 100). * Alsa mixer volume format (0 - 100).
*/ */
int get_dac_gain_control_volume_as_mixer_volume(u16 vol) int get_dac_gain_control_volume_as_mixer_volume(u16 vol)
{ {
u16 retVal; u16 retVal;
retVal = OUTPUT_VOLUME_MIN - vol; retVal = OUTPUT_VOLUME_MIN - vol;
retVal = ((retVal - OUTPUT_VOLUME_MAX) * 100) / OUTPUT_VOLUME_RANGE; retVal = ((retVal - OUTPUT_VOLUME_MAX) * 100) / OUTPUT_VOLUME_RANGE;
/* fix scaling error */ /* fix scaling error */
if ((retVal > 0) && (retVal < 100)) { if ((retVal > 0) && (retVal < 100))
retVal++; retVal++;
}
return retVal; return retVal;
} }
...@@ -267,10 +285,10 @@ int get_dac_gain_control_volume_as_mixer_volume(u16 vol) ...@@ -267,10 +285,10 @@ int get_dac_gain_control_volume_as_mixer_volume(u16 vol)
* Converts the headset gain control volume (0 - 63.5 db) * Converts the headset gain control volume (0 - 63.5 db)
* to Alsa mixer volume (0 - 100) * to Alsa mixer volume (0 - 100)
*/ */
int get_headset_gain_control_volume_as_mixer_volume(u16 registerVal) int get_headset_gain_control_volume_as_mixer_volume(u16 registerVal)
{ {
u16 retVal; u16 retVal;
retVal = ((registerVal * 100) / INPUT_VOLUME_RANGE); retVal = ((registerVal * 100) / INPUT_VOLUME_RANGE);
return retVal; return retVal;
} }
...@@ -279,71 +297,78 @@ int get_headset_gain_control_volume_as_mixer_volume(u16 registerVal) ...@@ -279,71 +297,78 @@ int get_headset_gain_control_volume_as_mixer_volume(u16 registerVal)
* Converts the handset gain control volume (0 - 63.5 db) * Converts the handset gain control volume (0 - 63.5 db)
* to Alsa mixer volume (0 - 100) * to Alsa mixer volume (0 - 100)
*/ */
int get_handset_gain_control_volume_as_mixer_volume(u16 registerVal) int get_handset_gain_control_volume_as_mixer_volume(u16 registerVal)
{ {
return get_headset_gain_control_volume_as_mixer_volume(registerVal); return get_headset_gain_control_volume_as_mixer_volume(registerVal);
} }
/* /*
* Converts the Alsa mixer volume (0 - 100) to * Converts the Alsa mixer volume (0 - 100) to
* headset gain control volume (0 - 63.5 db) * headset gain control volume (0 - 63.5 db)
*/ */
int get_mixer_volume_as_headset_gain_control_volume(u16 mixerVal) int get_mixer_volume_as_headset_gain_control_volume(u16 mixerVal)
{ {
u16 retVal; u16 retVal;
retVal = ((mixerVal * INPUT_VOLUME_RANGE) / 100) + INPUT_VOLUME_MIN; retVal = ((mixerVal * INPUT_VOLUME_RANGE) / 100) + INPUT_VOLUME_MIN;
return retVal; return retVal;
} }
/* /*
* Writes Alsa mixer volume (0 - 100) to TSC2101 headset volume registry in * Writes Alsa mixer volume (0 - 100) to TSC2101 headset volume registry in
* a TSC2101 format. (0 - 63.5 db) * a TSC2101 format. (0 - 63.5 db)
* In TSC2101 OSS driver this functionality was controlled with "SET_LINE" parameter. * In TSC2101 OSS driver this functionality was controlled with "SET_LINE"
* parameter.
*/ */
int set_mixer_volume_as_headset_gain_control_volume(int mixerVol) int set_mixer_volume_as_headset_gain_control_volume(int mixerVol)
{ {
int volume; int volume;
int retVal; int retVal;
u16 val; u16 val;
if (mixerVol < 0 || mixerVol > 100) { if (mixerVol < 0 || mixerVol > 100) {
M_DPRINTK("Trying a bad headset mixer volume value(%d)!\n", mixerVol); M_DPRINTK("Trying a bad headset mixer volume value(%d)!\n",
mixerVol);
return -EPERM; return -EPERM;
} }
M_DPRINTK("mixer volume = %d\n", mixerVol); M_DPRINTK("mixer volume = %d\n", mixerVol);
/* Convert 0 -> 100 volume to 0x0(min) -> 0x7D(max) volume range */ /*
/* NOTE: 0 is minimum volume and not mute */ * Convert 0 -> 100 volume to 0x0(min) -> 0x7D(max) volume range
volume = get_mixer_volume_as_headset_gain_control_volume(mixerVol); * NOTE: 0 is minimum volume and not mute
*/
volume = get_mixer_volume_as_headset_gain_control_volume(mixerVol);
val = omap_tsc2101_audio_read(TSC2101_HEADSET_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_HEADSET_GAIN_CTRL);
/* preserve the old mute settings */ /* preserve the old mute settings */
val &= ~(HGC_ADPGA_HED(INPUT_VOLUME_MAX)); val &= ~(HGC_ADPGA_HED(INPUT_VOLUME_MAX));
val |= HGC_ADPGA_HED(volume); val |= HGC_ADPGA_HED(volume);
omap_tsc2101_audio_write(TSC2101_HEADSET_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_HEADSET_GAIN_CTRL, val);
retVal = 1; retVal = 1;
M_DPRINTK("to registry = %d\n", val); M_DPRINTK("to registry = %d\n", val);
return retVal; return retVal;
} }
/* /*
* Writes Alsa mixer volume (0 - 100) to TSC2101 handset volume registry in * Writes Alsa mixer volume (0 - 100) to TSC2101 handset volume registry in
* a TSC2101 format. (0 - 63.5 db) * a TSC2101 format. (0 - 63.5 db)
* In TSC2101 OSS driver this functionality was controlled with "SET_MIC" parameter. * In TSC2101 OSS driver this functionality was controlled with
* "SET_MIC" parameter.
*/ */
int set_mixer_volume_as_handset_gain_control_volume(int mixerVol) int set_mixer_volume_as_handset_gain_control_volume(int mixerVol)
{ {
int volume; int volume;
int retVal; int retVal;
u16 val; u16 val;
if (mixerVol < 0 || mixerVol > 100) { if (mixerVol < 0 || mixerVol > 100) {
M_DPRINTK("Trying a bad mic mixer volume value(%d)!\n", mixerVol); M_DPRINTK("Trying a bad mic mixer volume value(%d)!\n",
mixerVol);
return -EPERM; return -EPERM;
} }
M_DPRINTK("mixer volume = %d\n", mixerVol); M_DPRINTK("mixer volume = %d\n", mixerVol);
/* Convert 0 -> 100 volume to 0x0(min) -> 0x7D(max) volume range /*
* NOTE: 0 is minimum volume and not mute * Convert 0 -> 100 volume to 0x0(min) -> 0x7D(max) volume range
* NOTE: 0 is minimum volume and not mute
*/ */
volume = get_mixer_volume_as_headset_gain_control_volume(mixerVol); volume = get_mixer_volume_as_headset_gain_control_volume(mixerVol);
val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL);
...@@ -352,8 +377,8 @@ int set_mixer_volume_as_handset_gain_control_volume(int mixerVol) ...@@ -352,8 +377,8 @@ int set_mixer_volume_as_handset_gain_control_volume(int mixerVol)
val |= HNGC_ADPGA_HND(volume); val |= HNGC_ADPGA_HND(volume);
omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val);
retVal = 1; retVal = 1;
M_DPRINTK("to registry = %d\n", val); M_DPRINTK("to registry = %d\n", val);
return retVal; return retVal;
} }
...@@ -361,27 +386,31 @@ void set_loudspeaker_to_playback_target(void) ...@@ -361,27 +386,31 @@ void set_loudspeaker_to_playback_target(void)
{ {
/* power down SPK1, SPK2 and loudspeaker */ /* power down SPK1, SPK2 and loudspeaker */
omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL, omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL,
CPC_SP1PWDN | CPC_SP2PWDN | CPC_LDAPWDF); CPC_SP1PWDN | CPC_SP2PWDN | CPC_LDAPWDF);
/* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled /*
* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled
* 1dB AGC hysteresis * 1dB AGC hysteresis
* MICes bias 2V * MICes bias 2V
*/ */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0)); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0));
/* DAC left and right routed to SPK1/SPK2 /*
* DAC left and right routed to SPK1/SPK2
* SPK1/SPK2 unmuted * SPK1/SPK2 unmuted
* Keyclicks routed to SPK1/SPK2 */ * Keyclicks routed to SPK1/SPK2 */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5,
AC5_DIFFIN | AC5_DIFFIN |
AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 | AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 |
AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2); AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2);
/* routing selected to SPK1 goes also to OUT8P/OUT8N. (loudspeaker) /*
* routing selected to SPK1 goes also to OUT8P/OUT8N. (loudspeaker)
* analog sidetone routed to loudspeaker * analog sidetone routed to loudspeaker
* buzzer pga routed to loudspeaker * buzzer pga routed to loudspeaker
* keyclick routing to loudspeaker * keyclick routing to loudspeaker
* cellphone input routed to loudspeaker * cellphone input routed to loudspeaker
* mic selection (control register 04h/page2) routed to cell phone output (CP_OUT) * mic selection (control register 04h/page2) routed to cell phone
* output (CP_OUT)
* routing selected for SPK1 goes also to cellphone output (CP_OUT) * routing selected for SPK1 goes also to cellphone output (CP_OUT)
* OUT8P/OUT8N (loudspeakers) unmuted (0 = unmuted) * OUT8P/OUT8N (loudspeakers) unmuted (0 = unmuted)
* Cellphone output is not muted (0 = unmuted) * Cellphone output is not muted (0 = unmuted)
...@@ -399,19 +428,23 @@ void set_headphone_to_playback_target(void) ...@@ -399,19 +428,23 @@ void set_headphone_to_playback_target(void)
/* power down SPK1, SPK2 and loudspeaker */ /* power down SPK1, SPK2 and loudspeaker */
omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL, omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL,
CPC_SP1PWDN | CPC_SP2PWDN | CPC_LDAPWDF); CPC_SP1PWDN | CPC_SP2PWDN | CPC_LDAPWDF);
/* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled */ /*
/* 1dB AGC hysteresis */ * ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled
/* MICes bias 2V */  * 1dB AGC hysteresis
* MICes bias 2V
*/
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0)); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, AC4_MB_HED(0));
/* DAC left and right routed to SPK1/SPK2 /*
* DAC left and right routed to SPK1/SPK2
* SPK1/SPK2 unmuted * SPK1/SPK2 unmuted
* Keyclicks routed to SPK1/SPK2 */ * Keyclicks routed to SPK1/SPK2
*/
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5,
AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 | AC5_DAC2SPK1(3) | AC5_AST2SPK1 | AC5_KCL2SPK1 |
AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2 | AC5_DAC2SPK2(3) | AC5_AST2SPK2 | AC5_KCL2SPK2 |
AC5_HDSCPTC); AC5_HDSCPTC);
/* OUT8P/OUT8N muted, CPOUT muted */ /* OUT8P/OUT8N muted, CPOUT muted */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_6, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_6,
AC6_MUTLSPK | AC6_MUTSPK2 | AC6_LDSCPTC | AC6_MUTLSPK | AC6_MUTSPK2 | AC6_LDSCPTC |
...@@ -421,45 +454,47 @@ void set_headphone_to_playback_target(void) ...@@ -421,45 +454,47 @@ void set_headphone_to_playback_target(void)
void set_telephone_to_playback_target(void) void set_telephone_to_playback_target(void)
{ {
/* /*
* 0110 1101 0101 1100 * 0110 1101 0101 1100
* power down MICBIAS_HED, Analog sidetone, SPK2, DAC, * power down MICBIAS_HED, Analog sidetone, SPK2, DAC,
* Driver virtual ground, loudspeaker. Values D2-d5 are flags. * Driver virtual ground, loudspeaker. Values D2-d5 are flags.
*/ */
omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL, omap_tsc2101_audio_write(TSC2101_CODEC_POWER_CTRL,
CPC_MBIAS_HED | CPC_ASTPWD | CPC_SP2PWDN | CPC_DAPWDN | CPC_MBIAS_HED | CPC_ASTPWD | CPC_SP2PWDN | CPC_DAPWDN |
CPC_VGPWDN | CPC_LSPWDN); CPC_VGPWDN | CPC_LSPWDN);
/* /*
* 0010 1010 0100 0000 * 0010 1010 0100 0000
* ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled * ADC, DAC, Analog Sidetone, cellphone, buzzer softstepping enabled
* 1dB AGC hysteresis * 1dB AGC hysteresis
* MICes bias 2V * MICes bias 2V
*/ */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4,
AC4_MB_HND | AC4_MB_HED(0) | AC4_AGCHYS(1) | AC4_MB_HND | AC4_MB_HED(0) | AC4_AGCHYS(1) |
AC4_BISTPD | AC4_ASSTPD | AC4_DASTPD); AC4_BISTPD | AC4_ASSTPD | AC4_DASTPD);
printk("set_telephone_to_playback_target(), TSC2101_AUDIO_CTRL_4 = %d\n", omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4)); printk(KERN_INFO "set_telephone_to_playback_target(), "
"TSC2101_AUDIO_CTRL_4 = %d\n",
/* omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4));
/*
* 1110 0010 0000 0010 * 1110 0010 0000 0010
* DAC left and right routed to SPK1/SPK2 * DAC left and right routed to SPK1/SPK2
* SPK1/SPK2 unmuted * SPK1/SPK2 unmuted
* keyclicks routed to SPK1/SPK2 * keyclicks routed to SPK1/SPK2
*/ */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_5,
AC5_DIFFIN | AC5_DAC2SPK1(3) | AC5_DIFFIN | AC5_DAC2SPK1(3) |
AC5_CPI2SPK1 | AC5_MUTSPK2); AC5_CPI2SPK1 | AC5_MUTSPK2);
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_6, omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_6,
AC6_MIC2CPO | AC6_MUTLSPK | AC6_MIC2CPO | AC6_MUTLSPK |
AC6_LDSCPTC | AC6_VGNDSCPTC | AC6_CAPINTF); AC6_LDSCPTC | AC6_VGNDSCPTC | AC6_CAPINTF);
current_playback_target = PLAYBACK_TARGET_CELLPHONE; current_playback_target = PLAYBACK_TARGET_CELLPHONE;
} }
/* /*
* 1100 0101 1101 0000 * 1100 0101 1101 0000
* *
* #define MPC_ASTMU TSC2101_BIT(15) * #define MPC_ASTMU TSC2101_BIT(15)
* #define MPC_ASTG(ARG) (((ARG) & 0x7F) << 8) * #define MPC_ASTG(ARG) (((ARG) & 0x7F) << 8)
* #define MPC_MICSEL(ARG) (((ARG) & 0x07) << 5) * #define MPC_MICSEL(ARG) (((ARG) & 0x07) << 5)
...@@ -470,14 +505,14 @@ void set_telephone_to_playback_target(void) ...@@ -470,14 +505,14 @@ void set_telephone_to_playback_target(void)
static void set_telephone_to_record_source(void) static void set_telephone_to_record_source(void)
{ {
u16 val; u16 val;
/* /*
* D0 = 0: * D0 = 0:
* --> AGC is off for handset input. * --> AGC is off for handset input.
* --> ADC PGA is controlled by the ADMUT_HDN + ADPGA_HND * --> ADC PGA is controlled by the ADMUT_HDN + ADPGA_HND
* (D15, D14-D8) * (D15, D14-D8)
* D4 - D1 = 0000 * D4 - D1 = 0000
* --> AGC time constant for handset input, * --> AGC time constant for handset input,
* attack time = 8 mc, decay time = 100 ms * attack time = 8 mc, decay time = 100 ms
* D7 - D5 = 000 * D7 - D5 = 000
* --> AGC Target gain for handset input = -5.5 db * --> AGC Target gain for handset input = -5.5 db
...@@ -486,33 +521,36 @@ static void set_telephone_to_record_source(void) ...@@ -486,33 +521,36 @@ static void set_telephone_to_record_source(void)
* D15 = 0 * D15 = 0
* --> Handset input ON (unmuted) * --> Handset input ON (unmuted)
*/ */
val = 0x3c00; // 0011 1100 0000 0000 = 60 = 30 val = 0x3c00; /* 0011 1100 0000 0000 = 60 = 30 */
omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val);
/* /*
* D0 = 0 * D0 = 0
* --> AGC is off for headset/Aux input * --> AGC is off for headset/Aux input
* --> ADC headset/Aux PGA is contoller by ADMUT_HED + ADPGA_HED * --> ADC headset/Aux PGA is contoller by
* ADMUT_HED + ADPGA_HED
* (D15, D14-D8) * (D15, D14-D8)
* D4 - D1 = 0000 * D4 - D1 = 0000
* --> Agc constant for headset/Aux input, * --> Agc constant for headset/Aux input,
* attack time = 8 mc, decay time = 100 ms * attack time = 8 mc, decay time = 100 ms
* D7 - D5 = 000 * D7 - D5 = 000
* --> AGC target gain for headset input = -5.5 db * --> AGC target gain for headset input = -5.5 db
* D14 - D8 = 000 0000 * D14 - D8 = 000 0000
* --> Adc headset/AUX pga settings = 0 db * --> Adc headset/AUX pga settings = 0 db
* D15 = 1 * D15 = 1
* --> Headset/AUX input muted * --> Headset/AUX input muted
* *
* Mute headset aux input * Mute headset aux input
*/ */
val = 0x8000; // 1000 0000 0000 0000 val = 0x8000; /* 1000 0000 0000 0000 */
omap_tsc2101_audio_write(TSC2101_HEADSET_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_HEADSET_GAIN_CTRL, val);
set_record_source(REC_SRC_MICIN_HND_AND_AUX1); set_record_source(REC_SRC_MICIN_HND_AND_AUX1);
// hacks start /*
/* D0 = flag, Headset/Aux or handset PGA flag * hacks start
* --> & with 1 (= 1 -->gain applied == pga register settings) * D0 = flag, Headset/Aux or handset PGA flag
* --> & with 1 (= 1 -->gain applied == pga
* register settings)
* D1 = 0, DAC channel PGA soft stepping control * D1 = 0, DAC channel PGA soft stepping control
* --> 0.5 db change every WCLK * --> 0.5 db change every WCLK
* D2 = flag, DAC right channel PGA flag * D2 = flag, DAC right channel PGA flag
...@@ -521,8 +559,8 @@ static void set_telephone_to_record_source(void) ...@@ -521,8 +559,8 @@ static void set_telephone_to_record_source(void)
* -- > & with 1 * -- > & with 1
* D7 - D4 = 0001, keyclick length * D7 - D4 = 0001, keyclick length
* --> 4 periods key clicks * --> 4 periods key clicks
* D10 - D8 = 100, keyclick frequenzy * D10 - D8 = 100, keyclick frequency
* --> 1 kHz, * --> 1 kHz,
* D11 = 0, Headset/Aux or handset soft stepping control * D11 = 0, Headset/Aux or handset soft stepping control
* --> 0,5 db change every WCLK or ADWS * --> 0,5 db change every WCLK or ADWS
* D14 -D12 = 100, Keyclick applitude control * D14 -D12 = 100, Keyclick applitude control
...@@ -531,7 +569,7 @@ static void set_telephone_to_record_source(void) ...@@ -531,7 +569,7 @@ static void set_telephone_to_record_source(void)
*/ */
val = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_2); val = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_2);
val = val & 0x441d; val = val & 0x441d;
val = val | 0x4410; // D14, D10, D4 bits == 1 val = val | 0x4410; /* D14, D10, D4 bits == 1 */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_2, val); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_2, val);
/* /*
...@@ -543,24 +581,28 @@ static void set_telephone_to_record_source(void) ...@@ -543,24 +581,28 @@ static void set_telephone_to_record_source(void)
* --> MICBIAS_HND = 2.0 v * --> MICBIAS_HND = 2.0 v
* D8 - D7 = 00 * D8 - D7 = 00
* --> MICBIAS_HED = 3.3 v * --> MICBIAS_HED = 3.3 v
* D10 - D9 = 01, * D10 - D9 = 01,
* --> Mic AGC hysteric selection = 2 db * --> Mic AGC hysteric selection = 2 db
* D11 = 1, * D11 = 1,
* --> Disable buzzer PGA soft stepping * --> Disable buzzer PGA soft stepping
* D12 = 0, * D12 = 0,
* --> Enable CELL phone PGA soft stepping control * --> Enable CELL phone PGA soft stepping control
* D13 = 1 * D13 = 1
* --> Disable analog sidetone soft stepping control * --> Disable analog sidetone soft
* stepping control
* D14 = 0 * D14 = 0
* --> Enable DAC PGA soft stepping control * --> Enable DAC PGA soft stepping control
* D15 = 0, * D15 = 0,
* --> Enable headset/Aux or Handset soft stepping control * --> Enable headset/Aux or Handset soft
* stepping control
*/ */
val = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4); val = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4);
val = val & 0x2a42; // 0010 1010 0100 0010 val = val & 0x2a42; /* 0010 1010 0100 0010 */
val = val | 0x2a40; // bits D13, D11, D9, D6 == 1 val = val | 0x2a40; /* bits D13, D11, D9, D6 == 1 */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, val); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_4, val);
printk("set_telephone_to_record_source(), TSC2101_AUDIO_CTRL_4 = %d\n", omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4)); printk(KERN_INFO "set_telephone_to_record_source(), "
"TSC2101_AUDIO_CTRL_4 = %d\n",
omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_4));
/* /*
* D0 = 0 * D0 = 0
* --> reserved, write always = 0 * --> reserved, write always = 0
...@@ -579,10 +621,12 @@ static void set_telephone_to_record_source(void) ...@@ -579,10 +621,12 @@ static void set_telephone_to_record_source(void)
*/ */
val = omap_tsc2101_audio_read(TSC2101_BUZZER_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_BUZZER_GAIN_CTRL);
val = val & 0x5dfe; val = val & 0x5dfe;
val = val | 0x5dfe; // bits, D14, D12, D11, D10, D8, D6, D5,D4,D3,D2 /* bits, D14, D12, D11, D10, D8, D6, D5,D4,D3,D2 */
val = val | 0x5dfe;
omap_tsc2101_audio_write(TSC2101_BUZZER_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_BUZZER_GAIN_CTRL, val);
/* D6 - D0 = 000 1001 /*
* D6 - D0 = 000 1001
* --> -4.5 db for DAC right channel volume control * --> -4.5 db for DAC right channel volume control
* D7 = 1 * D7 = 1
* --> DAC right channel muted * --> DAC right channel muted
...@@ -591,12 +635,13 @@ static void set_telephone_to_record_source(void) ...@@ -591,12 +635,13 @@ static void set_telephone_to_record_source(void)
* D15 = 1 * D15 = 1
* --> DAC left channel muted * --> DAC left channel muted
*/ */
//val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); /* val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); */
val = 0x8989; val = 0x8989;
omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_DAC_GAIN_CTRL, val);
/* 0000 0000 0100 0000 /*
* * 0000 0000 0100 0000
*
* D1 - D0 = 0 * D1 - D0 = 0
* --> GPIO 1 pin output is three stated * --> GPIO 1 pin output is three stated
* D2 = 0 * D2 = 0
...@@ -610,18 +655,18 @@ static void set_telephone_to_record_source(void) ...@@ -610,18 +655,18 @@ static void set_telephone_to_record_source(void)
* --> 8 ms clitch detection * --> 8 ms clitch detection
* D8 = reserved, write only 0 * D8 = reserved, write only 0
* D10 -D9 = 00 * D10 -D9 = 00
* --> 16 ms de bouncing programmatitily * --> 16 ms de-bouncing
* for glitch detection during headset detection * for glitch detection during headset detection
* D11 = flag for button press * D11 = flag for button press
* D12 = flag for headset detection * D12 = flag for headset detection
* D14-D13 = 00 * D14-D13 = 00
* --> type of headset detected = 00 == no stereo headset deected * --> type of headset detected = 00 == no stereo
* headset deected
* D15 = 0 * D15 = 0
* --> Disable headset detection * --> Disable headset detection
* */
* */
val = 0x40; val = 0x40;
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_7, val); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_7, val);
} }
/* /*
...@@ -637,17 +682,17 @@ u16 get_headset_detected(void) ...@@ -637,17 +682,17 @@ u16 get_headset_detected(void)
u16 curDetected; u16 curDetected;
u16 curType; u16 curType;
u16 curVal; u16 curVal;
curType = 0; /* not detected */ curType = 0; /* not detected */
curVal = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_7); curVal = omap_tsc2101_audio_read(TSC2101_AUDIO_CTRL_7);
curDetected = curVal & AC7_HDDETFL; curDetected = curVal & AC7_HDDETFL;
if (curDetected) { if (curDetected) {
printk("headset detected, checking type from %d \n", curVal); printk(KERN_INFO "headset detected, checking type from %d \n",
curVal);
curType = ((curVal & 0x6000) >> 13); curType = ((curVal & 0x6000) >> 13);
printk("headset type detected = %d \n", curType); printk(KERN_INFO "headset type detected = %d \n", curType);
} } else {
else { printk(KERN_INFO "headset not detected\n");
printk("headset not detected\n");
} }
return curType; return curType;
} }
...@@ -657,40 +702,46 @@ void init_playback_targets(void) ...@@ -657,40 +702,46 @@ void init_playback_targets(void)
u16 val; u16 val;
set_loudspeaker_to_playback_target(); set_loudspeaker_to_playback_target();
/* Left line input volume control /*
* Left line input volume control
* = SET_LINE in the OSS driver * = SET_LINE in the OSS driver
*/ */
set_mixer_volume_as_headset_gain_control_volume(DEFAULT_INPUT_VOLUME); set_mixer_volume_as_headset_gain_control_volume(DEFAULT_INPUT_VOLUME);
/* Set headset to be controllable by handset mixer /*
* Set headset to be controllable by handset mixer
* AGC enable for handset input * AGC enable for handset input
* Handset input not muted * Handset input not muted
*/ */
val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL);
val = val | HNGC_AGCEN_HND; val = val | HNGC_AGCEN_HND;
val = val & ~HNGC_ADMUT_HND; val = val & ~HNGC_ADMUT_HND;
omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val); omap_tsc2101_audio_write(TSC2101_HANDSET_GAIN_CTRL, val);
/* mic input volume control /*
* SET_MIC in the OSS driver * mic input volume control
* SET_MIC in the OSS driver
*/ */
set_mixer_volume_as_handset_gain_control_volume(DEFAULT_INPUT_VOLUME); set_mixer_volume_as_handset_gain_control_volume(DEFAULT_INPUT_VOLUME);
/* Left/Right headphone channel volume control /*
* Left/Right headphone channel volume control
* Zero-cross detect on * Zero-cross detect on
*/ */
set_mixer_volume_as_dac_gain_control_volume(DEFAULT_OUTPUT_VOLUME, DEFAULT_OUTPUT_VOLUME); set_mixer_volume_as_dac_gain_control_volume(DEFAULT_OUTPUT_VOLUME,
DEFAULT_OUTPUT_VOLUME);
/* unmute */ /* unmute */
dac_gain_control_unmute(1, 1); dac_gain_control_unmute(1, 1);
} }
/* /*
* Initializes tsc2101 recourd source (to line) and playback target (to loudspeaker) * Initializes tsc2101 recourd source (to line) and playback target
* (to loudspeaker)
*/ */
void snd_omap_init_mixer(void) void snd_omap_init_mixer(void)
{ {
FN_IN; FN_IN;
/* Headset/Hook switch detect enabled */ /* Headset/Hook switch detect enabled */
omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_7, AC7_DETECT); omap_tsc2101_audio_write(TSC2101_AUDIO_CTRL_7, AC7_DETECT);
...@@ -706,17 +757,17 @@ static int __pcm_playback_target_info(struct snd_kcontrol *kcontrol, ...@@ -706,17 +757,17 @@ static int __pcm_playback_target_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo) struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[PLAYBACK_TARGET_COUNT] = { static char *texts[PLAYBACK_TARGET_COUNT] = {
"Loudspeaker", "Headphone", "Cellphone" "Loudspeaker", "Headphone", "Cellphone"
}; };
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = PLAYBACK_TARGET_COUNT; uinfo->value.enumerated.items = PLAYBACK_TARGET_COUNT;
if (uinfo->value.enumerated.item > PLAYBACK_TARGET_COUNT - 1) { if (uinfo->value.enumerated.item > PLAYBACK_TARGET_COUNT - 1)
uinfo->value.enumerated.item = PLAYBACK_TARGET_COUNT - 1; uinfo->value.enumerated.item = PLAYBACK_TARGET_COUNT - 1;
}
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
texts[uinfo->value.enumerated.item]); texts[uinfo->value.enumerated.item]);
return 0; return 0;
} }
...@@ -732,28 +783,26 @@ static int __pcm_playback_target_put(struct snd_kcontrol *kcontrol, ...@@ -732,28 +783,26 @@ static int __pcm_playback_target_put(struct snd_kcontrol *kcontrol,
{ {
int retVal; int retVal;
int curVal; int curVal;
retVal = 0; retVal = 0;
curVal = ucontrol->value.integer.value[0]; curVal = ucontrol->value.integer.value[0];
if ((curVal >= 0) && if ((curVal >= 0) &&
(curVal < PLAYBACK_TARGET_COUNT) && (curVal < PLAYBACK_TARGET_COUNT) &&
(curVal != current_playback_target)) { (curVal != current_playback_target)) {
if (curVal == PLAYBACK_TARGET_LOUDSPEAKER) { if (curVal == PLAYBACK_TARGET_LOUDSPEAKER) {
set_record_source(REC_SRC_SINGLE_ENDED_MICIN_HED); set_record_source(REC_SRC_SINGLE_ENDED_MICIN_HED);
set_loudspeaker_to_playback_target(); set_loudspeaker_to_playback_target();
} } else if (curVal == PLAYBACK_TARGET_HEADPHONE) {
else if (curVal == PLAYBACK_TARGET_HEADPHONE) {
set_record_source(REC_SRC_SINGLE_ENDED_MICIN_HND); set_record_source(REC_SRC_SINGLE_ENDED_MICIN_HND);
set_headphone_to_playback_target(); set_headphone_to_playback_target();
} } else if (curVal == PLAYBACK_TARGET_CELLPHONE) {
else if (curVal == PLAYBACK_TARGET_CELLPHONE) {
set_telephone_to_record_source(); set_telephone_to_record_source();
set_telephone_to_playback_target(); set_telephone_to_playback_target();
} }
retVal = 1; retVal = 1;
} }
return retVal; return retVal;
} }
static int __pcm_playback_volume_info(struct snd_kcontrol *kcontrol, static int __pcm_playback_volume_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo) struct snd_ctl_elem_info *uinfo)
...@@ -766,16 +815,16 @@ static int __pcm_playback_volume_info(struct snd_kcontrol *kcontrol, ...@@ -766,16 +815,16 @@ static int __pcm_playback_volume_info(struct snd_kcontrol *kcontrol,
} }
/* /*
* Alsa mixer interface function for getting the volume read from the DGC in a * Alsa mixer interface function for getting the volume read from the DGC in a
* 0 -100 alsa mixer format. * 0 -100 alsa mixer format.
*/ */
static int __pcm_playback_volume_get(struct snd_kcontrol *kcontrol, static int __pcm_playback_volume_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
u16 volL; u16 volL;
u16 volR; u16 volR;
u16 val; u16 val;
val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL);
M_DPRINTK("registry value = %d!\n", val); M_DPRINTK("registry value = %d!\n", val);
volL = DGC_DALVL_EXTRACT(val); volL = DGC_DALVL_EXTRACT(val);
...@@ -786,19 +835,22 @@ static int __pcm_playback_volume_get(struct snd_kcontrol *kcontrol, ...@@ -786,19 +835,22 @@ static int __pcm_playback_volume_get(struct snd_kcontrol *kcontrol,
volL = get_dac_gain_control_volume_as_mixer_volume(volL); volL = get_dac_gain_control_volume_as_mixer_volume(volL);
volR = get_dac_gain_control_volume_as_mixer_volume(volR); volR = get_dac_gain_control_volume_as_mixer_volume(volR);
ucontrol->value.integer.value[0] = volL; /* L */ ucontrol->value.integer.value[0] = volL; /* L */
ucontrol->value.integer.value[1] = volR; /* R */ ucontrol->value.integer.value[1] = volR; /* R */
M_DPRINTK("mixer volume left = %ld, right = %ld\n", ucontrol->value.integer.value[0], ucontrol->value.integer.value[1]); M_DPRINTK("mixer volume left = %ld, right = %ld\n",
ucontrol->value.integer.value[0],
ucontrol->value.integer.value[1]);
return 0; return 0;
} }
static int __pcm_playback_volume_put(struct snd_kcontrol *kcontrol, static int __pcm_playback_volume_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return set_mixer_volume_as_dac_gain_control_volume(ucontrol->value.integer.value[0], return set_mixer_volume_as_dac_gain_control_volume(
ucontrol->value.integer.value[1]); ucontrol->value.integer.value[0],
ucontrol->value.integer.value[1]);
} }
static int __pcm_playback_switch_info(struct snd_kcontrol *kcontrol, static int __pcm_playback_switch_info(struct snd_kcontrol *kcontrol,
...@@ -811,7 +863,7 @@ static int __pcm_playback_switch_info(struct snd_kcontrol *kcontrol, ...@@ -811,7 +863,7 @@ static int __pcm_playback_switch_info(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
/* /*
* When DGC_DALMU (bit 15) is 1, the left channel is muted. * When DGC_DALMU (bit 15) is 1, the left channel is muted.
* When DGC_DALMU is 0, left channel is not muted. * When DGC_DALMU is 0, left channel is not muted.
* Same logic apply also for the right channel. * Same logic apply also for the right channel.
...@@ -820,16 +872,16 @@ static int __pcm_playback_switch_get(struct snd_kcontrol *kcontrol, ...@@ -820,16 +872,16 @@ static int __pcm_playback_switch_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
u16 val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL); u16 val = omap_tsc2101_audio_read(TSC2101_DAC_GAIN_CTRL);
ucontrol->value.integer.value[0] = IS_UNMUTED(15, val); // left ucontrol->value.integer.value[0] = IS_UNMUTED(15, val); /* left */
ucontrol->value.integer.value[1] = IS_UNMUTED(7, val); // right ucontrol->value.integer.value[1] = IS_UNMUTED(7, val); /* right */
return 0; return 0;
} }
static int __pcm_playback_switch_put(struct snd_kcontrol *kcontrol, static int __pcm_playback_switch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return dac_gain_control_unmute(ucontrol->value.integer.value[0], return dac_gain_control_unmute(ucontrol->value.integer.value[0],
ucontrol->value.integer.value[1]); ucontrol->value.integer.value[1]);
} }
...@@ -848,7 +900,7 @@ static int __headset_playback_volume_get(struct snd_kcontrol *kcontrol, ...@@ -848,7 +900,7 @@ static int __headset_playback_volume_get(struct snd_kcontrol *kcontrol,
{ {
u16 val; u16 val;
u16 vol; u16 vol;
val = omap_tsc2101_audio_read(TSC2101_HEADSET_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_HEADSET_GAIN_CTRL);
M_DPRINTK("registry value = %d\n", val); M_DPRINTK("registry value = %d\n", val);
vol = HGC_ADPGA_HED_EXTRACT(val); vol = HGC_ADPGA_HED_EXTRACT(val);
...@@ -856,15 +908,17 @@ static int __headset_playback_volume_get(struct snd_kcontrol *kcontrol, ...@@ -856,15 +908,17 @@ static int __headset_playback_volume_get(struct snd_kcontrol *kcontrol,
vol = get_headset_gain_control_volume_as_mixer_volume(vol); vol = get_headset_gain_control_volume_as_mixer_volume(vol);
ucontrol->value.integer.value[0] = vol; ucontrol->value.integer.value[0] = vol;
M_DPRINTK("mixer volume returned = %ld\n", ucontrol->value.integer.value[0]); M_DPRINTK("mixer volume returned = %ld\n",
ucontrol->value.integer.value[0]);
return 0; return 0;
} }
static int __headset_playback_volume_put(struct snd_kcontrol *kcontrol, static int __headset_playback_volume_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return set_mixer_volume_as_headset_gain_control_volume(ucontrol->value.integer.value[0]); return set_mixer_volume_as_headset_gain_control_volume(
ucontrol->value.integer.value[0]);
} }
static int __headset_playback_switch_info(struct snd_kcontrol *kcontrol, static int __headset_playback_switch_info(struct snd_kcontrol *kcontrol,
...@@ -877,7 +931,8 @@ static int __headset_playback_switch_info(struct snd_kcontrol *kcontrol, ...@@ -877,7 +931,8 @@ static int __headset_playback_switch_info(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
/* When HGC_ADMUT_HED (bit 15) is 1, the headset is muted. /*
* When HGC_ADMUT_HED (bit 15) is 1, the headset is muted.
* When HGC_ADMUT_HED is 0, headset is not muted. * When HGC_ADMUT_HED is 0, headset is not muted.
*/ */
static int __headset_playback_switch_get(struct snd_kcontrol *kcontrol, static int __headset_playback_switch_get(struct snd_kcontrol *kcontrol,
...@@ -891,7 +946,7 @@ static int __headset_playback_switch_get(struct snd_kcontrol *kcontrol, ...@@ -891,7 +946,7 @@ static int __headset_playback_switch_get(struct snd_kcontrol *kcontrol,
static int __headset_playback_switch_put(struct snd_kcontrol *kcontrol, static int __headset_playback_switch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
// mute/unmute headset /* mute/unmute headset */
return adc_pga_unmute_control(ucontrol->value.integer.value[0], return adc_pga_unmute_control(ucontrol->value.integer.value[0],
TSC2101_HEADSET_GAIN_CTRL, TSC2101_HEADSET_GAIN_CTRL,
15); 15);
...@@ -912,22 +967,24 @@ static int __handset_playback_volume_get(struct snd_kcontrol *kcontrol, ...@@ -912,22 +967,24 @@ static int __handset_playback_volume_get(struct snd_kcontrol *kcontrol,
{ {
u16 val; u16 val;
u16 vol; u16 vol;
val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL); val = omap_tsc2101_audio_read(TSC2101_HANDSET_GAIN_CTRL);
M_DPRINTK("registry value = %d\n", val); M_DPRINTK("registry value = %d\n", val);
vol = HNGC_ADPGA_HND_EXTRACT(val); vol = HNGC_ADPGA_HND_EXTRACT(val);
vol = vol & ~HNGC_ADMUT_HND; vol = vol & ~HNGC_ADMUT_HND;
vol = get_handset_gain_control_volume_as_mixer_volume(vol); vol = get_handset_gain_control_volume_as_mixer_volume(vol);
ucontrol->value.integer.value[0] = vol; ucontrol->value.integer.value[0] = vol;
M_DPRINTK("mixer volume returned = %ld\n", ucontrol->value.integer.value[0]); M_DPRINTK("mixer volume returned = %ld\n",
ucontrol->value.integer.value[0]);
return 0; return 0;
} }
static int __handset_playback_volume_put(struct snd_kcontrol *kcontrol, static int __handset_playback_volume_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
return set_mixer_volume_as_handset_gain_control_volume(ucontrol->value.integer.value[0]); return set_mixer_volume_as_handset_gain_control_volume(
ucontrol->value.integer.value[0]);
} }
static int __handset_playback_switch_info(struct snd_kcontrol *kcontrol, static int __handset_playback_switch_info(struct snd_kcontrol *kcontrol,
...@@ -940,7 +997,8 @@ static int __handset_playback_switch_info(struct snd_kcontrol *kcontrol, ...@@ -940,7 +997,8 @@ static int __handset_playback_switch_info(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
/* When HNGC_ADMUT_HND (bit 15) is 1, the handset is muted. /*
* When HNGC_ADMUT_HND (bit 15) is 1, the handset is muted.
* When HNGC_ADMUT_HND is 0, handset is not muted. * When HNGC_ADMUT_HND is 0, handset is not muted.
*/ */
static int __handset_playback_switch_get(struct snd_kcontrol *kcontrol, static int __handset_playback_switch_get(struct snd_kcontrol *kcontrol,
...@@ -954,7 +1012,7 @@ static int __handset_playback_switch_get(struct snd_kcontrol *kcontrol, ...@@ -954,7 +1012,7 @@ static int __handset_playback_switch_get(struct snd_kcontrol *kcontrol,
static int __handset_playback_switch_put(struct snd_kcontrol *kcontrol, static int __handset_playback_switch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
// handset mute/unmute /* handset mute/unmute */
return adc_pga_unmute_control(ucontrol->value.integer.value[0], return adc_pga_unmute_control(ucontrol->value.integer.value[0],
TSC2101_HANDSET_GAIN_CTRL, TSC2101_HANDSET_GAIN_CTRL,
15); 15);
...@@ -970,7 +1028,8 @@ static int __cellphone_input_switch_info(struct snd_kcontrol *kcontrol, ...@@ -970,7 +1028,8 @@ static int __cellphone_input_switch_info(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
/* When BGC_MUT_CP (bit 15) = 1, power down cellphone input pga. /*
* When BGC_MUT_CP (bit 15) = 1, power down cellphone input pga.
* When BGC_MUT_CP = 0, power up cellphone input pga. * When BGC_MUT_CP = 0, power up cellphone input pga.
*/ */
static int __cellphone_input_switch_get(struct snd_kcontrol *kcontrol, static int __cellphone_input_switch_get(struct snd_kcontrol *kcontrol,
...@@ -986,7 +1045,7 @@ static int __cellphone_input_switch_put(struct snd_kcontrol *kcontrol, ...@@ -986,7 +1045,7 @@ static int __cellphone_input_switch_put(struct snd_kcontrol *kcontrol,
{ {
return adc_pga_unmute_control(ucontrol->value.integer.value[0], return adc_pga_unmute_control(ucontrol->value.integer.value[0],
TSC2101_BUZZER_GAIN_CTRL, TSC2101_BUZZER_GAIN_CTRL,
15); 15);
} }
static int __buzzer_input_switch_info(struct snd_kcontrol *kcontrol, static int __buzzer_input_switch_info(struct snd_kcontrol *kcontrol,
...@@ -999,7 +1058,8 @@ static int __buzzer_input_switch_info(struct snd_kcontrol *kcontrol, ...@@ -999,7 +1058,8 @@ static int __buzzer_input_switch_info(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
/* When BGC_MUT_BU (bit 6) = 1, power down cellphone input pga. /*
* When BGC_MUT_BU (bit 6) = 1, power down cellphone input pga.
* When BGC_MUT_BU = 0, power up cellphone input pga. * When BGC_MUT_BU = 0, power up cellphone input pga.
*/ */
static int __buzzer_input_switch_get(struct snd_kcontrol *kcontrol, static int __buzzer_input_switch_get(struct snd_kcontrol *kcontrol,
...@@ -1015,82 +1075,82 @@ static int __buzzer_input_switch_put(struct snd_kcontrol *kcontrol, ...@@ -1015,82 +1075,82 @@ static int __buzzer_input_switch_put(struct snd_kcontrol *kcontrol,
{ {
return adc_pga_unmute_control(ucontrol->value.integer.value[0], return adc_pga_unmute_control(ucontrol->value.integer.value[0],
TSC2101_BUZZER_GAIN_CTRL, TSC2101_BUZZER_GAIN_CTRL,
6); 6);
} }
static struct snd_kcontrol_new tsc2101_control[] __devinitdata = { static struct snd_kcontrol_new tsc2101_control[] __devinitdata = {
{ {
.name = "Target Playback Route", .name = "Target Playback Route",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __pcm_playback_target_info, .info = __pcm_playback_target_info,
.get = __pcm_playback_target_get, .get = __pcm_playback_target_get,
.put = __pcm_playback_target_put, .put = __pcm_playback_target_put,
}, { }, {
.name = "Master Playback Volume", .name = "Master Playback Volume",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __pcm_playback_volume_info, .info = __pcm_playback_volume_info,
.get = __pcm_playback_volume_get, .get = __pcm_playback_volume_get,
.put = __pcm_playback_volume_put, .put = __pcm_playback_volume_put,
}, { }, {
.name = "Master Playback Switch", .name = "Master Playback Switch",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __pcm_playback_switch_info, .info = __pcm_playback_switch_info,
.get = __pcm_playback_switch_get, .get = __pcm_playback_switch_get,
.put = __pcm_playback_switch_put, .put = __pcm_playback_switch_put,
}, { }, {
.name = "Headset Playback Volume", .name = "Headset Playback Volume",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __headset_playback_volume_info, .info = __headset_playback_volume_info,
.get = __headset_playback_volume_get, .get = __headset_playback_volume_get,
.put = __headset_playback_volume_put, .put = __headset_playback_volume_put,
}, { }, {
.name = "Headset Playback Switch", .name = "Headset Playback Switch",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __headset_playback_switch_info, .info = __headset_playback_switch_info,
.get = __headset_playback_switch_get, .get = __headset_playback_switch_get,
.put = __headset_playback_switch_put, .put = __headset_playback_switch_put,
}, { }, {
.name = "Handset Playback Volume", .name = "Handset Playback Volume",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __handset_playback_volume_info, .info = __handset_playback_volume_info,
.get = __handset_playback_volume_get, .get = __handset_playback_volume_get,
.put = __handset_playback_volume_put, .put = __handset_playback_volume_put,
}, { }, {
.name = "Handset Playback Switch", .name = "Handset Playback Switch",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __handset_playback_switch_info, .info = __handset_playback_switch_info,
.get = __handset_playback_switch_get, .get = __handset_playback_switch_get,
.put = __handset_playback_switch_put, .put = __handset_playback_switch_put,
}, { }, {
.name = "Cellphone Input Switch", .name = "Cellphone Input Switch",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __cellphone_input_switch_info, .info = __cellphone_input_switch_info,
.get = __cellphone_input_switch_get, .get = __cellphone_input_switch_get,
.put = __cellphone_input_switch_put, .put = __cellphone_input_switch_put,
}, { }, {
.name = "Buzzer Input Switch", .name = "Buzzer Input Switch",
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.index = 0, .index = 0,
.access= SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.info = __buzzer_input_switch_info, .info = __buzzer_input_switch_info,
.get = __buzzer_input_switch_get, .get = __buzzer_input_switch_get,
.put = __buzzer_input_switch_put, .put = __buzzer_input_switch_put,
} }
}; };
...@@ -1106,20 +1166,20 @@ void snd_omap_resume_mixer(void) ...@@ -1106,20 +1166,20 @@ void snd_omap_resume_mixer(void)
} }
#endif #endif
int snd_omap_mixer(struct snd_card_omap_codec *tsc2101) int snd_omap_mixer(struct snd_card_omap_codec *tsc2101)
{ {
int i=0; int i = 0;
int err=0; int err = 0;
if (!tsc2101) { if (!tsc2101)
return -EINVAL; return -EINVAL;
}
for (i=0; i < ARRAY_SIZE(tsc2101_control); i++) { for (i = 0; i < ARRAY_SIZE(tsc2101_control); i++) {
if ((err = snd_ctl_add(tsc2101->card, err = snd_ctl_add(tsc2101->card,
snd_ctl_new1(&tsc2101_control[i], snd_ctl_new1(&tsc2101_control[i],
tsc2101->card))) < 0) { tsc2101->card));
if (err < 0)
return err; return err;
}
} }
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment