diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-03-16 07:14:46 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-03-16 07:14:46 -0400 |
| commit | e58a8947b0264ec1f43ce5deef563b72acf1284f (patch) | |
| tree | 48e7bc479a11332478974c4390203c3144beedc3 | |
| parent | 27380fb83079bc7bd644e1115bb001dfdcec307f (diff) | |
| parent | fa4d1f595a89234647b34a7f507436be873091bc (diff) | |
Merge branch 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/asoc-2.6 into topic/asoc
| -rw-r--r-- | sound/soc/omap/rx51.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 2d7d4115cb71..d0986220eff9 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | 40 | ||
| 41 | #define RX51_TVOUT_SEL_GPIO 40 | 41 | #define RX51_TVOUT_SEL_GPIO 40 |
| 42 | #define RX51_JACK_DETECT_GPIO 177 | 42 | #define RX51_JACK_DETECT_GPIO 177 |
| 43 | #define RX51_ECI_SW_GPIO 182 | ||
| 43 | /* | 44 | /* |
| 44 | * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This | 45 | * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This |
| 45 | * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c | 46 | * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c |
| @@ -50,6 +51,7 @@ enum { | |||
| 50 | RX51_JACK_DISABLED, | 51 | RX51_JACK_DISABLED, |
| 51 | RX51_JACK_TVOUT, /* tv-out with stereo output */ | 52 | RX51_JACK_TVOUT, /* tv-out with stereo output */ |
| 52 | RX51_JACK_HP, /* headphone: stereo output, no mic */ | 53 | RX51_JACK_HP, /* headphone: stereo output, no mic */ |
| 54 | RX51_JACK_HS, /* headset: stereo output with mic */ | ||
| 53 | }; | 55 | }; |
| 54 | 56 | ||
| 55 | static int rx51_spk_func; | 57 | static int rx51_spk_func; |
| @@ -59,11 +61,15 @@ static int rx51_jack_func; | |||
| 59 | static void rx51_ext_control(struct snd_soc_codec *codec) | 61 | static void rx51_ext_control(struct snd_soc_codec *codec) |
| 60 | { | 62 | { |
| 61 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 63 | struct snd_soc_dapm_context *dapm = &codec->dapm; |
| 62 | int hp = 0, tvout = 0; | 64 | int hp = 0, hs = 0, tvout = 0; |
| 63 | 65 | ||
| 64 | switch (rx51_jack_func) { | 66 | switch (rx51_jack_func) { |
| 65 | case RX51_JACK_TVOUT: | 67 | case RX51_JACK_TVOUT: |
| 66 | tvout = 1; | 68 | tvout = 1; |
| 69 | hp = 1; | ||
| 70 | break; | ||
| 71 | case RX51_JACK_HS: | ||
| 72 | hs = 1; | ||
| 67 | case RX51_JACK_HP: | 73 | case RX51_JACK_HP: |
| 68 | hp = 1; | 74 | hp = 1; |
| 69 | break; | 75 | break; |
| @@ -81,6 +87,10 @@ static void rx51_ext_control(struct snd_soc_codec *codec) | |||
| 81 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); | 87 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); |
| 82 | else | 88 | else |
| 83 | snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); | 89 | snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); |
| 90 | if (hs) | ||
| 91 | snd_soc_dapm_enable_pin(dapm, "HS Mic"); | ||
| 92 | else | ||
| 93 | snd_soc_dapm_disable_pin(dapm, "HS Mic"); | ||
| 84 | 94 | ||
| 85 | gpio_set_value(RX51_TVOUT_SEL_GPIO, tvout); | 95 | gpio_set_value(RX51_TVOUT_SEL_GPIO, tvout); |
| 86 | 96 | ||
| @@ -230,7 +240,7 @@ static struct snd_soc_jack_gpio rx51_av_jack_gpios[] = { | |||
| 230 | { | 240 | { |
| 231 | .gpio = RX51_JACK_DETECT_GPIO, | 241 | .gpio = RX51_JACK_DETECT_GPIO, |
| 232 | .name = "avdet-gpio", | 242 | .name = "avdet-gpio", |
| 233 | .report = SND_JACK_VIDEOOUT, | 243 | .report = SND_JACK_HEADSET, |
| 234 | .invert = 1, | 244 | .invert = 1, |
| 235 | .debounce_time = 200, | 245 | .debounce_time = 200, |
| 236 | }, | 246 | }, |
| @@ -240,6 +250,8 @@ static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { | |||
| 240 | SND_SOC_DAPM_SPK("Ext Spk", rx51_spk_event), | 250 | SND_SOC_DAPM_SPK("Ext Spk", rx51_spk_event), |
| 241 | SND_SOC_DAPM_MIC("DMic", NULL), | 251 | SND_SOC_DAPM_MIC("DMic", NULL), |
| 242 | SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), | 252 | SND_SOC_DAPM_HP("Headphone Jack", rx51_hp_event), |
| 253 | SND_SOC_DAPM_MIC("HS Mic", NULL), | ||
| 254 | SND_SOC_DAPM_LINE("FM Transmitter", NULL), | ||
| 243 | }; | 255 | }; |
| 244 | 256 | ||
| 245 | static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = { | 257 | static const struct snd_soc_dapm_widget aic34_dapm_widgetsb[] = { |
| @@ -251,6 +263,8 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
| 251 | {"Ext Spk", NULL, "HPROUT"}, | 263 | {"Ext Spk", NULL, "HPROUT"}, |
| 252 | {"Headphone Jack", NULL, "LLOUT"}, | 264 | {"Headphone Jack", NULL, "LLOUT"}, |
| 253 | {"Headphone Jack", NULL, "RLOUT"}, | 265 | {"Headphone Jack", NULL, "RLOUT"}, |
| 266 | {"FM Transmitter", NULL, "LLOUT"}, | ||
| 267 | {"FM Transmitter", NULL, "RLOUT"}, | ||
| 254 | 268 | ||
| 255 | {"DMic Rate 64", NULL, "Mic Bias 2V"}, | 269 | {"DMic Rate 64", NULL, "Mic Bias 2V"}, |
| 256 | {"Mic Bias 2V", NULL, "DMic"}, | 270 | {"Mic Bias 2V", NULL, "DMic"}, |
| @@ -259,11 +273,14 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
| 259 | static const struct snd_soc_dapm_route audio_mapb[] = { | 273 | static const struct snd_soc_dapm_route audio_mapb[] = { |
| 260 | {"b LINE2R", NULL, "MONO_LOUT"}, | 274 | {"b LINE2R", NULL, "MONO_LOUT"}, |
| 261 | {"Earphone", NULL, "b HPLOUT"}, | 275 | {"Earphone", NULL, "b HPLOUT"}, |
| 276 | |||
| 277 | {"LINE1L", NULL, "b Mic Bias 2.5V"}, | ||
| 278 | {"b Mic Bias 2.5V", NULL, "HS Mic"} | ||
| 262 | }; | 279 | }; |
| 263 | 280 | ||
| 264 | static const char *spk_function[] = {"Off", "On"}; | 281 | static const char *spk_function[] = {"Off", "On"}; |
| 265 | static const char *input_function[] = {"ADC", "Digital Mic"}; | 282 | static const char *input_function[] = {"ADC", "Digital Mic"}; |
| 266 | static const char *jack_function[] = {"Off", "TV-OUT", "Headphone"}; | 283 | static const char *jack_function[] = {"Off", "TV-OUT", "Headphone", "Headset"}; |
| 267 | 284 | ||
| 268 | static const struct soc_enum rx51_enum[] = { | 285 | static const struct soc_enum rx51_enum[] = { |
| 269 | SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), | 286 | SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), |
| @@ -278,6 +295,7 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { | |||
| 278 | rx51_get_input, rx51_set_input), | 295 | rx51_get_input, rx51_set_input), |
| 279 | SOC_ENUM_EXT("Jack Function", rx51_enum[2], | 296 | SOC_ENUM_EXT("Jack Function", rx51_enum[2], |
| 280 | rx51_get_jack, rx51_set_jack), | 297 | rx51_get_jack, rx51_set_jack), |
| 298 | SOC_DAPM_PIN_SWITCH("FM Transmitter"), | ||
| 281 | }; | 299 | }; |
| 282 | 300 | ||
| 283 | static const struct snd_kcontrol_new aic34_rx51_controlsb[] = { | 301 | static const struct snd_kcontrol_new aic34_rx51_controlsb[] = { |
| @@ -313,11 +331,16 @@ static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) | |||
| 313 | return err; | 331 | return err; |
| 314 | snd_soc_limit_volume(codec, "TPA6130A2 Headphone Playback Volume", 42); | 332 | snd_soc_limit_volume(codec, "TPA6130A2 Headphone Playback Volume", 42); |
| 315 | 333 | ||
| 334 | err = omap_mcbsp_st_add_controls(codec, 1); | ||
| 335 | if (err < 0) | ||
| 336 | return err; | ||
| 337 | |||
| 316 | snd_soc_dapm_sync(dapm); | 338 | snd_soc_dapm_sync(dapm); |
| 317 | 339 | ||
| 318 | /* AV jack detection */ | 340 | /* AV jack detection */ |
| 319 | err = snd_soc_jack_new(codec, "AV Jack", | 341 | err = snd_soc_jack_new(codec, "AV Jack", |
| 320 | SND_JACK_VIDEOOUT, &rx51_av_jack); | 342 | SND_JACK_HEADSET | SND_JACK_VIDEOOUT, |
| 343 | &rx51_av_jack); | ||
| 321 | if (err) | 344 | if (err) |
| 322 | return err; | 345 | return err; |
| 323 | err = snd_soc_jack_add_gpios(&rx51_av_jack, | 346 | err = snd_soc_jack_add_gpios(&rx51_av_jack, |
| @@ -394,10 +417,14 @@ static int __init rx51_soc_init(void) | |||
| 394 | if (!machine_is_nokia_rx51()) | 417 | if (!machine_is_nokia_rx51()) |
| 395 | return -ENODEV; | 418 | return -ENODEV; |
| 396 | 419 | ||
| 397 | err = gpio_request(RX51_TVOUT_SEL_GPIO, "tvout_sel"); | 420 | err = gpio_request_one(RX51_TVOUT_SEL_GPIO, |
| 421 | GPIOF_DIR_OUT | GPIOF_INIT_LOW, "tvout_sel"); | ||
| 398 | if (err) | 422 | if (err) |
| 399 | goto err_gpio_tvout_sel; | 423 | goto err_gpio_tvout_sel; |
| 400 | gpio_direction_output(RX51_TVOUT_SEL_GPIO, 0); | 424 | err = gpio_request_one(RX51_ECI_SW_GPIO, |
| 425 | GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "eci_sw"); | ||
| 426 | if (err) | ||
| 427 | goto err_gpio_eci_sw; | ||
| 401 | 428 | ||
| 402 | rx51_snd_device = platform_device_alloc("soc-audio", -1); | 429 | rx51_snd_device = platform_device_alloc("soc-audio", -1); |
| 403 | if (!rx51_snd_device) { | 430 | if (!rx51_snd_device) { |
| @@ -415,6 +442,8 @@ static int __init rx51_soc_init(void) | |||
| 415 | err2: | 442 | err2: |
| 416 | platform_device_put(rx51_snd_device); | 443 | platform_device_put(rx51_snd_device); |
| 417 | err1: | 444 | err1: |
| 445 | gpio_free(RX51_ECI_SW_GPIO); | ||
| 446 | err_gpio_eci_sw: | ||
| 418 | gpio_free(RX51_TVOUT_SEL_GPIO); | 447 | gpio_free(RX51_TVOUT_SEL_GPIO); |
| 419 | err_gpio_tvout_sel: | 448 | err_gpio_tvout_sel: |
| 420 | 449 | ||
| @@ -427,6 +456,7 @@ static void __exit rx51_soc_exit(void) | |||
| 427 | rx51_av_jack_gpios); | 456 | rx51_av_jack_gpios); |
| 428 | 457 | ||
| 429 | platform_device_unregister(rx51_snd_device); | 458 | platform_device_unregister(rx51_snd_device); |
| 459 | gpio_free(RX51_ECI_SW_GPIO); | ||
| 430 | gpio_free(RX51_TVOUT_SEL_GPIO); | 460 | gpio_free(RX51_TVOUT_SEL_GPIO); |
| 431 | } | 461 | } |
| 432 | 462 | ||
