OMAP4: omap4panda: Enable audio support
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 8 Dec 2011 09:15:45 +0000 (11:15 +0200)
committerPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 26 Jan 2012 13:40:55 +0000 (15:40 +0200)
PandaBoard has twl6040 codec for audio.
Register the omap4-abe-twl6040 platform device.
Add platform data to enable the twl6040 codec.
Since there is a difference in audio between  PandaBoard 4430
and PandaBoard ES (4460):
Use different name for the sound card:
"PandaBoard" for PandaBoard 4430
"PandaBoardES" for PandaBoard ES

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
CC: David Anders <x0132446@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
arch/arm/mach-omap2/board-omap4panda.c

index 30ad40db2cf39558bdefc6bf40169114919ed6e7..eada955014af6f258c5b697710821e3af8ddc32d 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/regulator/machine.h>
 #include <linux/regulator/fixed.h>
 #include <linux/wl12xx.h>
+#include <linux/platform_data/omap-abe-twl6040.h>
 
 #include <mach/hardware.h>
 #include <asm/hardware/gic.h>
@@ -90,9 +91,34 @@ static struct platform_device leds_gpio = {
        },
 };
 
+static struct omap_abe_twl6040_data panda_abe_audio_data = {
+       /* Audio out */
+       .has_hs         = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+       /* HandsFree through expasion connector */
+       .has_hf         = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+       /* PandaBoard: FM TX, PandaBoardES: can be connected to audio out */
+       .has_aux        = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+       /* PandaBoard: FM RX, PandaBoardES: audio in */
+       .has_afm        = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+       /* No jack detection. */
+       .jack_detection = 0,
+       /* MCLK input is 38.4MHz */
+       .mclk_freq      = 38400000,
+
+};
+
+static struct platform_device panda_abe_audio = {
+       .name           = "omap-abe-twl6040",
+       .id             = -1,
+       .dev = {
+               .platform_data = &panda_abe_audio_data,
+       },
+};
+
 static struct platform_device *panda_devices[] __initdata = {
        &leds_gpio,
        &wl1271_device,
+       &panda_abe_audio,
 };
 
 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
@@ -251,8 +277,25 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
        return 0;
 }
 
+static struct twl4030_codec_data twl6040_codec = {
+       /* single-step ramp for headset and handsfree */
+       .hs_left_step   = 0x0f,
+       .hs_right_step  = 0x0f,
+       .hf_left_step   = 0x1d,
+       .hf_right_step  = 0x1d,
+};
+
+static struct twl4030_audio_data twl6040_audio = {
+       .codec          = &twl6040_codec,
+       .audpwron_gpio  = 127,
+       .naudint_irq    = OMAP44XX_IRQ_SYS_2N,
+       .irq_base       = TWL6040_CODEC_IRQ_BASE,
+};
+
 /* Panda board uses the common PMIC configuration */
-static struct twl4030_platform_data omap4_panda_twldata;
+static struct twl4030_platform_data omap4_panda_twldata = {
+       .audio          = &twl6040_audio,
+};
 
 /*
  * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
@@ -475,6 +518,20 @@ void omap4_panda_display_init(void)
                omap_hdmi_init(0);
 }
 
+static void omap4_panda_init_rev(void)
+{
+       if (cpu_is_omap4430()) {
+               /* PandaBoard 4430 */
+               /* ASoC audio configuration */
+               panda_abe_audio_data.card_name = "PandaBoard";
+               panda_abe_audio_data.has_hsmic = 1;
+       } else {
+               /* PandaBoard ES */
+               /* ASoC audio configuration */
+               panda_abe_audio_data.card_name = "PandaBoardES";
+       }
+}
+
 static void __init omap4_panda_init(void)
 {
        int package = OMAP_PACKAGE_CBS;
@@ -486,6 +543,7 @@ static void __init omap4_panda_init(void)
        if (wl12xx_set_platform_data(&omap_panda_wlan_data))
                pr_err("error setting wl12xx data\n");
 
+       omap4_panda_init_rev();
        omap4_panda_i2c_init();
        platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));
        platform_device_register(&omap_vwlan_device);