diff --git a/[refs] b/[refs] index 9dd2d4341bbc..c1b9134447ba 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 94774b28490daf514a4e62fd746315b5089158ff +refs/heads/master: 2c8e992716b3adff52846e2280731b533db592ff diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index f51409b1527a..b5b8baa1d70e 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -4965,12 +4965,6 @@ F: drivers/media/common/saa7146* F: drivers/media/video/*7146* F: include/media/*7146* -SAMSUNG AUDIO (ASoC) DRIVERS -M: Jassi Brar -L: alsa-devel@alsa-project.org (moderated for non-subscribers) -S: Supported -F: sound/soc/s3c24xx - TLG2300 VIDEO4LINUX-2 DRIVER M: Huang Shijie M: Kang Yong diff --git a/trunk/arch/arm/mach-mx3/clock-imx31.c b/trunk/arch/arm/mach-mx3/clock-imx31.c index 9a9eb6de6127..9b52a67abf2d 100644 --- a/trunk/arch/arm/mach-mx3/clock-imx31.c +++ b/trunk/arch/arm/mach-mx3/clock-imx31.c @@ -558,8 +558,8 @@ static struct clk_lookup lookups[] = { _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk) _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) - _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) - _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) + _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk) + _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk) _REGISTER_CLOCK(NULL, "firi", firi_clk) _REGISTER_CLOCK(NULL, "ata", ata_clk) _REGISTER_CLOCK(NULL, "rtic", rtic_clk) diff --git a/trunk/arch/arm/mach-mx3/clock-imx35.c b/trunk/arch/arm/mach-mx3/clock-imx35.c index d3af0fdf8475..f29c3e91fa3a 100644 --- a/trunk/arch/arm/mach-mx3/clock-imx35.c +++ b/trunk/arch/arm/mach-mx3/clock-imx35.c @@ -464,8 +464,8 @@ static struct clk_lookup lookups[] = { _REGISTER_CLOCK(NULL, "sdma", sdma_clk) _REGISTER_CLOCK(NULL, "spba", spba_clk) _REGISTER_CLOCK(NULL, "spdif", spdif_clk) - _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) - _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) + _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk) + _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk) _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) diff --git a/trunk/arch/arm/mach-mx3/devices.c b/trunk/arch/arm/mach-mx3/devices.c index a4fd1a26fc91..90eccba66d00 100644 --- a/trunk/arch/arm/mach-mx3/devices.c +++ b/trunk/arch/arm/mach-mx3/devices.c @@ -327,14 +327,14 @@ static struct resource imx_ssi_resources1[] = { }; struct platform_device imx_ssi_device0 = { - .name = "imx-ssi", + .name = "imx-ssi-dai", .id = 0, .num_resources = ARRAY_SIZE(imx_ssi_resources0), .resource = imx_ssi_resources0, }; struct platform_device imx_ssi_device1 = { - .name = "imx-ssi", + .name = "imx-ssi-dai", .id = 1, .num_resources = ARRAY_SIZE(imx_ssi_resources1), .resource = imx_ssi_resources1, diff --git a/trunk/arch/arm/mach-omap2/board-zoom2.c b/trunk/arch/arm/mach-omap2/board-zoom2.c index efbcd8fb21ec..86d4515b54b4 100644 --- a/trunk/arch/arm/mach-omap2/board-zoom2.c +++ b/trunk/arch/arm/mach-omap2/board-zoom2.c @@ -41,10 +41,6 @@ void zoom2_set_hs_extmute(int mute) gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute); } -static struct twl4030_madc_platform_data zoom2_madc_data = { - .irq_line = 1, -}; - static struct twl4030_codec_audio_data zoom2_audio_data = { .audio_mclk = 26000000, .ramp_delay_value = 3, /* 161 ms */ @@ -62,15 +58,7 @@ static struct twl4030_platform_data zoom2_twldata = { .irq_end = TWL4030_IRQ_END, /* platform_data for children goes here */ - .bci = &zoom2_bci_data, - .madc = &zoom2_madc_data, - .usb = &zoom2_usb_data, - .gpio = &zoom2_gpio_data, - .keypad = &zoom2_kp_twl4030_data, .codec = &zoom2_codec_data, - .vmmc1 = &zoom2_vmmc1, - .vmmc2 = &zoom2_vmmc2, - .vsim = &zoom2_vsim, }; static struct i2c_board_info __initdata zoom2_i2c_boardinfo[] = { diff --git a/trunk/arch/arm/plat-mxc/audmux-v2.c b/trunk/arch/arm/plat-mxc/audmux-v2.c index f9e7cdbd0005..910374d1d486 100644 --- a/trunk/arch/arm/plat-mxc/audmux-v2.c +++ b/trunk/arch/arm/plat-mxc/audmux-v2.c @@ -45,9 +45,9 @@ static const char *audmux_port_string(int port) { switch (port) { case MX31_AUDMUX_PORT1_SSI0: - return "imx-ssi.0"; + return "imx-ssi-dai.0"; case MX31_AUDMUX_PORT2_SSI1: - return "imx-ssi.1"; + return "imx-ssi-dai.1"; case MX31_AUDMUX_PORT3_SSI_PINS_3: return "SSI3"; case MX31_AUDMUX_PORT4_SSI_PINS_4: diff --git a/trunk/include/sound/wm8962.h b/trunk/include/sound/wm8962.h index 2b5306c503fb..f70258e3471c 100644 --- a/trunk/include/sound/wm8962.h +++ b/trunk/include/sound/wm8962.h @@ -15,17 +15,8 @@ #define WM8962_GPIO_SET 0x10000 struct wm8962_pdata { - int gpio_base; u32 gpio_init[WM8962_MAX_GPIO]; - /* Setup for microphone detection, raw value to be written to - * R48(0x30) - only microphone related bits will be updated. - * Detection may be enabled here for use with signals brought - * out on the GPIOs. */ - u32 mic_cfg; - - bool irq_active_low; - bool spk_mono; /* Speaker outputs tied together as mono */ }; diff --git a/trunk/sound/soc/codecs/Kconfig b/trunk/sound/soc/codecs/Kconfig index ff7b922a0f41..4ccc2b72c3f6 100644 --- a/trunk/sound/soc/codecs/Kconfig +++ b/trunk/sound/soc/codecs/Kconfig @@ -56,7 +56,6 @@ config SND_SOC_ALL_CODECS select SND_SOC_WM8750 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8753 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8776 if SND_SOC_I2C_AND_SPI - select SND_SOC_WM8804 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8900 if I2C select SND_SOC_WM8903 if I2C select SND_SOC_WM8904 if I2C @@ -238,9 +237,6 @@ config SND_SOC_WM8753 config SND_SOC_WM8776 tristate -config SND_SOC_WM8804 - tristate - config SND_SOC_WM8900 tristate diff --git a/trunk/sound/soc/codecs/Makefile b/trunk/sound/soc/codecs/Makefile index 0c5f329240c5..23e7e2c55858 100644 --- a/trunk/sound/soc/codecs/Makefile +++ b/trunk/sound/soc/codecs/Makefile @@ -41,7 +41,6 @@ snd-soc-wm8741-objs := wm8741.o snd-soc-wm8750-objs := wm8750.o snd-soc-wm8753-objs := wm8753.o snd-soc-wm8776-objs := wm8776.o -snd-soc-wm8804-objs := wm8804.o snd-soc-wm8900-objs := wm8900.o snd-soc-wm8903-objs := wm8903.o snd-soc-wm8904-objs := wm8904.o @@ -115,7 +114,6 @@ obj-$(CONFIG_SND_SOC_WM8741) += snd-soc-wm8741.o obj-$(CONFIG_SND_SOC_WM8750) += snd-soc-wm8750.o obj-$(CONFIG_SND_SOC_WM8753) += snd-soc-wm8753.o obj-$(CONFIG_SND_SOC_WM8776) += snd-soc-wm8776.o -obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o diff --git a/trunk/sound/soc/codecs/wm8510.c b/trunk/sound/soc/codecs/wm8510.c index 8f107095760e..02ecf54de020 100644 --- a/trunk/sound/soc/codecs/wm8510.c +++ b/trunk/sound/soc/codecs/wm8510.c @@ -627,6 +627,7 @@ static int __devexit wm8510_spi_remove(struct spi_device *spi) static struct spi_driver wm8510_spi_driver = { .driver = { .name = "wm8510", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8510_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8711.c b/trunk/sound/soc/codecs/wm8711.c index 54fbd76c8bca..52a923a7861e 100644 --- a/trunk/sound/soc/codecs/wm8711.c +++ b/trunk/sound/soc/codecs/wm8711.c @@ -453,6 +453,7 @@ static int __devexit wm8711_spi_remove(struct spi_device *spi) static struct spi_driver wm8711_spi_driver = { .driver = { .name = "wm8711-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8711_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8728.c b/trunk/sound/soc/codecs/wm8728.c index 075f35e4f4cb..32eba85b0a2c 100644 --- a/trunk/sound/soc/codecs/wm8728.c +++ b/trunk/sound/soc/codecs/wm8728.c @@ -307,6 +307,7 @@ static int __devexit wm8728_spi_remove(struct spi_device *spi) static struct spi_driver wm8728_spi_driver = { .driver = { .name = "wm8728-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8728_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8731.c b/trunk/sound/soc/codecs/wm8731.c index 631385802eb4..bdce125bbd81 100644 --- a/trunk/sound/soc/codecs/wm8731.c +++ b/trunk/sound/soc/codecs/wm8731.c @@ -600,6 +600,7 @@ static int __devexit wm8731_spi_remove(struct spi_device *spi) static struct spi_driver wm8731_spi_driver = { .driver = { .name = "wm8731-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8731_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8750.c b/trunk/sound/soc/codecs/wm8750.c index 6c924cd2cfd4..4d1ec9dc86ff 100644 --- a/trunk/sound/soc/codecs/wm8750.c +++ b/trunk/sound/soc/codecs/wm8750.c @@ -782,6 +782,7 @@ static int __devexit wm8750_spi_remove(struct spi_device *spi) static struct spi_driver wm8750_spi_driver = { .driver = { .name = "wm8750-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8750_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8753.c b/trunk/sound/soc/codecs/wm8753.c index 8f679a13f2bc..64ea06610038 100644 --- a/trunk/sound/soc/codecs/wm8753.c +++ b/trunk/sound/soc/codecs/wm8753.c @@ -1651,6 +1651,7 @@ static int __devexit wm8753_spi_remove(struct spi_device *spi) static struct spi_driver wm8753_spi_driver = { .driver = { .name = "wm8753-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8753_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8776.c b/trunk/sound/soc/codecs/wm8776.c index 04182c464e35..c0b69179855a 100644 --- a/trunk/sound/soc/codecs/wm8776.c +++ b/trunk/sound/soc/codecs/wm8776.c @@ -483,6 +483,7 @@ static int __devexit wm8776_spi_remove(struct spi_device *spi) static struct spi_driver wm8776_spi_driver = { .driver = { .name = "wm8776-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8776_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8804.c b/trunk/sound/soc/codecs/wm8804.c deleted file mode 100644 index 2657f5c7ff08..000000000000 --- a/trunk/sound/soc/codecs/wm8804.c +++ /dev/null @@ -1,825 +0,0 @@ -/* - * wm8804.c -- WM8804 S/PDIF transceiver driver - * - * Copyright 2010 Wolfson Microelectronics plc - * - * Author: Dimitris Papastamos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wm8804.h" - -#define WM8804_NUM_SUPPLIES 2 -static const char *wm8804_supply_names[WM8804_NUM_SUPPLIES] = { - "PVDD", - "DVDD" -}; - -static const u8 wm8804_reg_defs[] = { - 0x05, /* R0 - RST/DEVID1 */ - 0x88, /* R1 - DEVID2 */ - 0x04, /* R2 - DEVREV */ - 0x21, /* R3 - PLL1 */ - 0xFD, /* R4 - PLL2 */ - 0x36, /* R5 - PLL3 */ - 0x07, /* R6 - PLL4 */ - 0x16, /* R7 - PLL5 */ - 0x18, /* R8 - PLL6 */ - 0xFF, /* R9 - SPDMODE */ - 0x00, /* R10 - INTMASK */ - 0x00, /* R11 - INTSTAT */ - 0x00, /* R12 - SPDSTAT */ - 0x00, /* R13 - RXCHAN1 */ - 0x00, /* R14 - RXCHAN2 */ - 0x00, /* R15 - RXCHAN3 */ - 0x00, /* R16 - RXCHAN4 */ - 0x00, /* R17 - RXCHAN5 */ - 0x00, /* R18 - SPDTX1 */ - 0x00, /* R19 - SPDTX2 */ - 0x00, /* R20 - SPDTX3 */ - 0x71, /* R21 - SPDTX4 */ - 0x0B, /* R22 - SPDTX5 */ - 0x70, /* R23 - GPO0 */ - 0x57, /* R24 - GPO1 */ - 0x00, /* R25 */ - 0x42, /* R26 - GPO2 */ - 0x06, /* R27 - AIFTX */ - 0x06, /* R28 - AIFRX */ - 0x80, /* R29 - SPDRX1 */ - 0x07, /* R30 - PWRDN */ -}; - -struct wm8804_priv { - enum snd_soc_control_type control_type; - struct regulator_bulk_data supplies[WM8804_NUM_SUPPLIES]; - struct notifier_block disable_nb[WM8804_NUM_SUPPLIES]; - struct snd_soc_codec *codec; -}; - -static int txsrc_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -static int txsrc_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - -/* - * We can't use the same notifier block for more than one supply and - * there's no way I can see to get from a callback to the caller - * except container_of(). - */ -#define WM8804_REGULATOR_EVENT(n) \ -static int wm8804_regulator_event_##n(struct notifier_block *nb, \ - unsigned long event, void *data) \ -{ \ - struct wm8804_priv *wm8804 = container_of(nb, struct wm8804_priv, \ - disable_nb[n]); \ - if (event & REGULATOR_EVENT_DISABLE) { \ - wm8804->codec->cache_sync = 1; \ - } \ - return 0; \ -} - -WM8804_REGULATOR_EVENT(0) -WM8804_REGULATOR_EVENT(1) - -static const char *txsrc_text[] = { "S/PDIF RX", "AIF" }; -static const SOC_ENUM_SINGLE_EXT_DECL(txsrc, txsrc_text); - -static const struct snd_kcontrol_new wm8804_snd_controls[] = { - SOC_ENUM_EXT("Input Source", txsrc, txsrc_get, txsrc_put), - SOC_SINGLE("TX Playback Switch", WM8804_PWRDN, 2, 1, 1), - SOC_SINGLE("AIF Playback Switch", WM8804_PWRDN, 4, 1, 1) -}; - -static int txsrc_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec; - unsigned int src; - - codec = snd_kcontrol_chip(kcontrol); - src = snd_soc_read(codec, WM8804_SPDTX4); - if (src & 0x40) - ucontrol->value.integer.value[0] = 1; - else - ucontrol->value.integer.value[0] = 0; - - return 0; -} - -static int txsrc_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_soc_codec *codec; - unsigned int src, txpwr; - - codec = snd_kcontrol_chip(kcontrol); - - if (ucontrol->value.integer.value[0] != 0 - && ucontrol->value.integer.value[0] != 1) - return -EINVAL; - - src = snd_soc_read(codec, WM8804_SPDTX4); - switch ((src & 0x40) >> 6) { - case 0: - if (!ucontrol->value.integer.value[0]) - return 0; - break; - case 1: - if (ucontrol->value.integer.value[1]) - return 0; - break; - } - - /* save the current power state of the transmitter */ - txpwr = snd_soc_read(codec, WM8804_PWRDN) & 0x4; - /* power down the transmitter */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x4); - /* set the tx source */ - snd_soc_update_bits(codec, WM8804_SPDTX4, 0x40, - ucontrol->value.integer.value[0] << 6); - - if (ucontrol->value.integer.value[0]) { - /* power down the receiver */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x2, 0x2); - /* power up the AIF */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x10, 0); - } else { - /* don't power down the AIF -- may be used as an output */ - /* power up the receiver */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x2, 0); - } - - /* restore the transmitter's configuration */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, txpwr); - - return 0; -} - -static int wm8804_volatile(unsigned int reg) -{ - switch (reg) { - case WM8804_RST_DEVID1: - case WM8804_DEVID2: - case WM8804_DEVREV: - case WM8804_INTSTAT: - case WM8804_SPDSTAT: - case WM8804_RXCHAN1: - case WM8804_RXCHAN2: - case WM8804_RXCHAN3: - case WM8804_RXCHAN4: - case WM8804_RXCHAN5: - return 1; - default: - break; - } - - return 0; -} - -static int wm8804_reset(struct snd_soc_codec *codec) -{ - return snd_soc_write(codec, WM8804_RST_DEVID1, 0x0); -} - -static int wm8804_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) -{ - struct snd_soc_codec *codec; - u16 format, master, bcp, lrp; - - codec = dai->codec; - - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_I2S: - format = 0x2; - break; - case SND_SOC_DAIFMT_RIGHT_J: - format = 0x0; - break; - case SND_SOC_DAIFMT_LEFT_J: - format = 0x1; - break; - case SND_SOC_DAIFMT_DSP_A: - case SND_SOC_DAIFMT_DSP_B: - format = 0x3; - break; - default: - dev_err(dai->dev, "Unknown dai format\n"); - return -EINVAL; - } - - /* set data format */ - snd_soc_update_bits(codec, WM8804_AIFTX, 0x3, format); - snd_soc_update_bits(codec, WM8804_AIFRX, 0x3, format); - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBM_CFM: - master = 1; - break; - case SND_SOC_DAIFMT_CBS_CFS: - master = 0; - break; - default: - dev_err(dai->dev, "Unknown master/slave configuration\n"); - return -EINVAL; - } - - /* set master/slave mode */ - snd_soc_update_bits(codec, WM8804_AIFRX, 0x40, master << 6); - - bcp = lrp = 0; - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { - case SND_SOC_DAIFMT_NB_NF: - break; - case SND_SOC_DAIFMT_IB_IF: - bcp = lrp = 1; - break; - case SND_SOC_DAIFMT_IB_NF: - bcp = 1; - break; - case SND_SOC_DAIFMT_NB_IF: - lrp = 1; - break; - default: - dev_err(dai->dev, "Unknown polarity configuration\n"); - return -EINVAL; - } - - /* set frame inversion */ - snd_soc_update_bits(codec, WM8804_AIFTX, 0x10 | 0x20, - (bcp << 4) | (lrp << 5)); - snd_soc_update_bits(codec, WM8804_AIFRX, 0x10 | 0x20, - (bcp << 4) | (lrp << 5)); - return 0; -} - -static int wm8804_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct snd_soc_codec *codec; - u16 blen; - - codec = dai->codec; - - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S16_LE: - blen = 0x0; - break; - case SNDRV_PCM_FORMAT_S20_3LE: - blen = 0x1; - break; - case SNDRV_PCM_FORMAT_S24_LE: - blen = 0x2; - break; - default: - dev_err(dai->dev, "Unsupported word length: %u\n", - params_format(params)); - return -EINVAL; - } - - /* set word length */ - snd_soc_update_bits(codec, WM8804_AIFTX, 0xc, blen << 2); - snd_soc_update_bits(codec, WM8804_AIFRX, 0xc, blen << 2); - - return 0; -} - -struct pll_div { - u32 prescale:1; - u32 mclkdiv:1; - u32 freqmode:2; - u32 n:4; - u32 k:22; -}; - -/* PLL rate to output rate divisions */ -static struct { - unsigned int div; - unsigned int freqmode; - unsigned int mclkdiv; -} post_table[] = { - { 2, 0, 0 }, - { 4, 0, 1 }, - { 4, 1, 0 }, - { 8, 1, 1 }, - { 8, 2, 0 }, - { 16, 2, 1 }, - { 12, 3, 0 }, - { 24, 3, 1 } -}; - -#define FIXED_PLL_SIZE ((1ULL << 22) * 10) -static int pll_factors(struct pll_div *pll_div, unsigned int target, - unsigned int source) -{ - u64 Kpart; - unsigned long int K, Ndiv, Nmod, tmp; - int i; - - /* - * Scale the output frequency up; the PLL should run in the - * region of 90-100MHz. - */ - for (i = 0; i < ARRAY_SIZE(post_table); i++) { - tmp = target * post_table[i].div; - if (tmp >= 90000000 && tmp <= 100000000) { - pll_div->freqmode = post_table[i].freqmode; - pll_div->mclkdiv = post_table[i].mclkdiv; - target *= post_table[i].div; - break; - } - } - - if (i == ARRAY_SIZE(post_table)) { - pr_err("%s: Unable to scale output frequency: %uHz\n", - __func__, target); - return -EINVAL; - } - - pll_div->prescale = 0; - Ndiv = target / source; - if (Ndiv < 5) { - source >>= 1; - pll_div->prescale = 1; - Ndiv = target / source; - } - - if (Ndiv < 5 || Ndiv > 13) { - pr_err("%s: WM8804 N value is not within the recommended range: %lu\n", - __func__, Ndiv); - return -EINVAL; - } - pll_div->n = Ndiv; - - Nmod = target % source; - Kpart = FIXED_PLL_SIZE * (u64)Nmod; - - do_div(Kpart, source); - - K = Kpart & 0xffffffff; - if ((K % 10) >= 5) - K += 5; - K /= 10; - pll_div->k = K; - - return 0; -} - -static int wm8804_set_pll(struct snd_soc_dai *dai, int pll_id, - int source, unsigned int freq_in, - unsigned int freq_out) -{ - struct snd_soc_codec *codec; - - codec = dai->codec; - if (!freq_in || !freq_out) { - /* disable the PLL */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x1, 0x1); - return 0; - } else { - int ret; - struct pll_div pll_div; - - ret = pll_factors(&pll_div, freq_out, freq_in); - if (ret) - return ret; - - /* power down the PLL before reprogramming it */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x1, 0x1); - - if (!freq_in || !freq_out) - return 0; - - /* set PLLN and PRESCALE */ - snd_soc_update_bits(codec, WM8804_PLL4, 0xf | 0x10, - pll_div.n | (pll_div.prescale << 4)); - /* set mclkdiv and freqmode */ - snd_soc_update_bits(codec, WM8804_PLL5, 0x3 | 0x8, - pll_div.freqmode | (pll_div.mclkdiv << 3)); - /* set PLLK */ - snd_soc_write(codec, WM8804_PLL1, pll_div.k & 0xff); - snd_soc_write(codec, WM8804_PLL2, (pll_div.k >> 8) & 0xff); - snd_soc_write(codec, WM8804_PLL3, pll_div.k >> 16); - - /* power up the PLL */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x1, 0); - } - - return 0; -} - -static int wm8804_set_sysclk(struct snd_soc_dai *dai, - int clk_id, unsigned int freq, int dir) -{ - struct snd_soc_codec *codec; - - codec = dai->codec; - - switch (clk_id) { - case WM8804_TX_CLKSRC_MCLK: - if ((freq >= 10000000 && freq <= 14400000) - || (freq >= 16280000 && freq <= 27000000)) - snd_soc_update_bits(codec, WM8804_PLL6, 0x80, 0x80); - else { - dev_err(dai->dev, "OSCCLOCK is not within the " - "recommended range: %uHz\n", freq); - return -EINVAL; - } - break; - case WM8804_TX_CLKSRC_PLL: - snd_soc_update_bits(codec, WM8804_PLL6, 0x80, 0); - break; - case WM8804_CLKOUT_SRC_CLK1: - snd_soc_update_bits(codec, WM8804_PLL6, 0x8, 0); - break; - case WM8804_CLKOUT_SRC_OSCCLK: - snd_soc_update_bits(codec, WM8804_PLL6, 0x8, 0x8); - break; - default: - dev_err(dai->dev, "Unknown clock source: %d\n", clk_id); - return -EINVAL; - } - - return 0; -} - -static int wm8804_set_clkdiv(struct snd_soc_dai *dai, - int div_id, int div) -{ - struct snd_soc_codec *codec; - - codec = dai->codec; - switch (div_id) { - case WM8804_CLKOUT_DIV: - snd_soc_update_bits(codec, WM8804_PLL5, 0x30, - (div & 0x3) << 4); - break; - default: - dev_err(dai->dev, "Unknown clock divider: %d\n", div_id); - return -EINVAL; - } - return 0; -} - -static void wm8804_sync_cache(struct snd_soc_codec *codec) -{ - short i; - u8 *cache; - - if (!codec->cache_sync) - return; - - codec->cache_only = 0; - cache = codec->reg_cache; - for (i = 0; i < codec->driver->reg_cache_size; i++) { - if (i == WM8804_RST_DEVID1 || cache[i] == wm8804_reg_defs[i]) - continue; - snd_soc_write(codec, i, cache[i]); - } - codec->cache_sync = 0; -} - -static int wm8804_set_bias_level(struct snd_soc_codec *codec, - enum snd_soc_bias_level level) -{ - int ret; - struct wm8804_priv *wm8804; - - wm8804 = snd_soc_codec_get_drvdata(codec); - switch (level) { - case SND_SOC_BIAS_ON: - break; - case SND_SOC_BIAS_PREPARE: - /* power up the OSC and the PLL */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0); - break; - case SND_SOC_BIAS_STANDBY: - if (codec->bias_level == SND_SOC_BIAS_OFF) { - ret = regulator_bulk_enable(ARRAY_SIZE(wm8804->supplies), - wm8804->supplies); - if (ret) { - dev_err(codec->dev, - "Failed to enable supplies: %d\n", - ret); - return ret; - } - wm8804_sync_cache(codec); - } - /* power down the OSC and the PLL */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0x9); - break; - case SND_SOC_BIAS_OFF: - /* power down the OSC and the PLL */ - snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0x9); - regulator_bulk_disable(ARRAY_SIZE(wm8804->supplies), - wm8804->supplies); - break; - } - - codec->bias_level = level; - return 0; -} - -#ifdef CONFIG_PM -static int wm8804_suspend(struct snd_soc_codec *codec, pm_message_t state) -{ - wm8804_set_bias_level(codec, SND_SOC_BIAS_OFF); - return 0; -} - -static int wm8804_resume(struct snd_soc_codec *codec) -{ - wm8804_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - return 0; -} -#else -#define wm8804_suspend NULL -#define wm8804_resume NULL -#endif - -static int wm8804_remove(struct snd_soc_codec *codec) -{ - struct wm8804_priv *wm8804; - int i; - - wm8804 = snd_soc_codec_get_drvdata(codec); - wm8804_set_bias_level(codec, SND_SOC_BIAS_OFF); - - for (i = 0; i < ARRAY_SIZE(wm8804->supplies); ++i) - regulator_unregister_notifier(wm8804->supplies[i].consumer, - &wm8804->disable_nb[i]); - regulator_bulk_free(ARRAY_SIZE(wm8804->supplies), wm8804->supplies); - return 0; -} - -static int wm8804_probe(struct snd_soc_codec *codec) -{ - struct wm8804_priv *wm8804; - int i, id1, id2, ret; - - wm8804 = snd_soc_codec_get_drvdata(codec); - wm8804->codec = codec; - - codec->idle_bias_off = 1; - - ret = snd_soc_codec_set_cache_io(codec, 8, 8, wm8804->control_type); - if (ret < 0) { - dev_err(codec->dev, "Failed to set cache i/o: %d\n", ret); - return ret; - } - - for (i = 0; i < ARRAY_SIZE(wm8804->supplies); i++) - wm8804->supplies[i].supply = wm8804_supply_names[i]; - - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8804->supplies), - wm8804->supplies); - if (ret) { - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - return ret; - } - - wm8804->disable_nb[0].notifier_call = wm8804_regulator_event_0; - wm8804->disable_nb[1].notifier_call = wm8804_regulator_event_1; - - /* This should really be moved into the regulator core */ - for (i = 0; i < ARRAY_SIZE(wm8804->supplies); i++) { - ret = regulator_register_notifier(wm8804->supplies[i].consumer, - &wm8804->disable_nb[i]); - if (ret != 0) { - dev_err(codec->dev, - "Failed to register regulator notifier: %d\n", - ret); - } - } - - ret = regulator_bulk_enable(ARRAY_SIZE(wm8804->supplies), - wm8804->supplies); - if (ret) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); - goto err_reg_get; - } - - id1 = snd_soc_read(codec, WM8804_RST_DEVID1); - if (id1 < 0) { - dev_err(codec->dev, "Failed to read device ID: %d\n", id1); - ret = id1; - goto err_reg_enable; - } - - id2 = snd_soc_read(codec, WM8804_DEVID2); - if (id2 < 0) { - dev_err(codec->dev, "Failed to read device ID: %d\n", id2); - ret = id2; - goto err_reg_enable; - } - - id2 = (id2 << 8) | id1; - - if (id2 != ((wm8804_reg_defs[WM8804_DEVID2] << 8) - | wm8804_reg_defs[WM8804_RST_DEVID1])) { - dev_err(codec->dev, "Invalid device ID: %#x\n", id2); - ret = -EINVAL; - goto err_reg_enable; - } - - ret = wm8804_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset: %d\n", ret); - goto err_reg_enable; - } - - wm8804_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - snd_soc_add_controls(codec, wm8804_snd_controls, - ARRAY_SIZE(wm8804_snd_controls)); - return 0; - -err_reg_enable: - regulator_bulk_disable(ARRAY_SIZE(wm8804->supplies), wm8804->supplies); -err_reg_get: - regulator_bulk_free(ARRAY_SIZE(wm8804->supplies), wm8804->supplies); - return ret; -} - -static struct snd_soc_dai_ops wm8804_dai_ops = { - .hw_params = wm8804_hw_params, - .set_fmt = wm8804_set_fmt, - .set_sysclk = wm8804_set_sysclk, - .set_clkdiv = wm8804_set_clkdiv, - .set_pll = wm8804_set_pll -}; - -#define WM8804_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ - SNDRV_PCM_FMTBIT_S24_LE) - -static struct snd_soc_dai_driver wm8804_dai = { - .name = "wm8804-spdif", - .playback = { - .stream_name = "Playback", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = WM8804_FORMATS, - }, - .capture = { - .stream_name = "Capture", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_192000, - .formats = WM8804_FORMATS, - }, - .ops = &wm8804_dai_ops, - .symmetric_rates = 1 -}; - -static struct snd_soc_codec_driver soc_codec_dev_wm8804 = { - .probe = wm8804_probe, - .remove = wm8804_remove, - .suspend = wm8804_suspend, - .resume = wm8804_resume, - .set_bias_level = wm8804_set_bias_level, - .reg_cache_size = ARRAY_SIZE(wm8804_reg_defs), - .reg_word_size = sizeof(u8), - .reg_cache_default = wm8804_reg_defs, - .volatile_register = wm8804_volatile -}; - -#if defined(CONFIG_SPI_MASTER) -static int __devinit wm8804_spi_probe(struct spi_device *spi) -{ - struct wm8804_priv *wm8804; - int ret; - - wm8804 = kzalloc(sizeof *wm8804, GFP_KERNEL); - if (IS_ERR(wm8804)) - return PTR_ERR(wm8804); - - wm8804->control_type = SND_SOC_SPI; - spi_set_drvdata(spi, wm8804); - - ret = snd_soc_register_codec(&spi->dev, - &soc_codec_dev_wm8804, &wm8804_dai, 1); - if (ret < 0) - kfree(wm8804); - return ret; -} - -static int __devexit wm8804_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - kfree(spi_get_drvdata(spi)); - return 0; -} - -static struct spi_driver wm8804_spi_driver = { - .driver = { - .name = "wm8804", - .owner = THIS_MODULE, - }, - .probe = wm8804_spi_probe, - .remove = __devexit_p(wm8804_spi_remove) -}; -#endif - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -static __devinit int wm8804_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - struct wm8804_priv *wm8804; - int ret; - - wm8804 = kzalloc(sizeof *wm8804, GFP_KERNEL); - if (IS_ERR(wm8804)) - return PTR_ERR(wm8804); - - wm8804->control_type = SND_SOC_I2C; - i2c_set_clientdata(i2c, wm8804); - - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_wm8804, &wm8804_dai, 1); - if (ret < 0) - kfree(wm8804); - return ret; -} - -static __devexit int wm8804_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - kfree(i2c_get_clientdata(client)); - return 0; -} - -static const struct i2c_device_id wm8804_i2c_id[] = { - { "wm8804", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8804_i2c_id); - -static struct i2c_driver wm8804_i2c_driver = { - .driver = { - .name = "wm8804", - .owner = THIS_MODULE, - }, - .probe = wm8804_i2c_probe, - .remove = __devexit_p(wm8804_i2c_remove), - .id_table = wm8804_i2c_id -}; -#endif - -static int __init wm8804_modinit(void) -{ - int ret = 0; - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - ret = i2c_add_driver(&wm8804_i2c_driver); - if (ret) { - printk(KERN_ERR "Failed to register wm8804 I2C driver: %d\n", - ret); - } -#endif -#if defined(CONFIG_SPI_MASTER) - ret = spi_register_driver(&wm8804_spi_driver); - if (ret != 0) { - printk(KERN_ERR "Failed to register wm8804 SPI driver: %d\n", - ret); - } -#endif - return ret; -} -module_init(wm8804_modinit); - -static void __exit wm8804_exit(void) -{ -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - i2c_del_driver(&wm8804_i2c_driver); -#endif -#if defined(CONFIG_SPI_MASTER) - spi_unregister_driver(&wm8804_spi_driver); -#endif -} -module_exit(wm8804_exit); - -MODULE_DESCRIPTION("ASoC WM8804 driver"); -MODULE_AUTHOR("Dimitris Papastamos "); -MODULE_LICENSE("GPL"); diff --git a/trunk/sound/soc/codecs/wm8804.h b/trunk/sound/soc/codecs/wm8804.h deleted file mode 100644 index 8ec14f5573cb..000000000000 --- a/trunk/sound/soc/codecs/wm8804.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * wm8804.h -- WM8804 S/PDIF transceiver driver - * - * Copyright 2010 Wolfson Microelectronics plc - * - * Author: Dimitris Papastamos - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _WM8804_H -#define _WM8804_H - -/* - * Register values. - */ -#define WM8804_RST_DEVID1 0x00 -#define WM8804_DEVID2 0x01 -#define WM8804_DEVREV 0x02 -#define WM8804_PLL1 0x03 -#define WM8804_PLL2 0x04 -#define WM8804_PLL3 0x05 -#define WM8804_PLL4 0x06 -#define WM8804_PLL5 0x07 -#define WM8804_PLL6 0x08 -#define WM8804_SPDMODE 0x09 -#define WM8804_INTMASK 0x0A -#define WM8804_INTSTAT 0x0B -#define WM8804_SPDSTAT 0x0C -#define WM8804_RXCHAN1 0x0D -#define WM8804_RXCHAN2 0x0E -#define WM8804_RXCHAN3 0x0F -#define WM8804_RXCHAN4 0x10 -#define WM8804_RXCHAN5 0x11 -#define WM8804_SPDTX1 0x12 -#define WM8804_SPDTX2 0x13 -#define WM8804_SPDTX3 0x14 -#define WM8804_SPDTX4 0x15 -#define WM8804_SPDTX5 0x16 -#define WM8804_GPO0 0x17 -#define WM8804_GPO1 0x18 -#define WM8804_GPO2 0x1A -#define WM8804_AIFTX 0x1B -#define WM8804_AIFRX 0x1C -#define WM8804_SPDRX1 0x1D -#define WM8804_PWRDN 0x1E - -#define WM8804_REGISTER_COUNT 30 -#define WM8804_MAX_REGISTER 0x1E - -#define WM8804_TX_CLKSRC_MCLK 1 -#define WM8804_TX_CLKSRC_PLL 2 - -#define WM8804_CLKOUT_SRC_CLK1 3 -#define WM8804_CLKOUT_SRC_OSCCLK 4 - -#define WM8804_CLKOUT_DIV 1 - -#endif /* _WM8804_H */ diff --git a/trunk/sound/soc/codecs/wm8900.c b/trunk/sound/soc/codecs/wm8900.c index b4f11724a63f..25c8ccdb6e8d 100644 --- a/trunk/sound/soc/codecs/wm8900.c +++ b/trunk/sound/soc/codecs/wm8900.c @@ -1291,6 +1291,7 @@ static int __devexit wm8900_spi_remove(struct spi_device *spi) static struct spi_driver wm8900_spi_driver = { .driver = { .name = "wm8900-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8900_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8962-tables.c b/trunk/sound/soc/codecs/wm8962-tables.c index 6fa98ea0ae40..f21a8c1b9d47 100644 --- a/trunk/sound/soc/codecs/wm8962-tables.c +++ b/trunk/sound/soc/codecs/wm8962-tables.c @@ -21204,7 +21204,7 @@ const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1] = { { 0x0000, 0x0000, 0x0000 }, /* R45 */ { 0x0000, 0x0000, 0x0000 }, /* R46 */ { 0x000F, 0x0000, 0x0000 }, /* R47 - Thermal Shutdown Status */ - { 0x7EC7, 0x7E07, 0xFFFF }, /* R48 - Additional Control (4) */ + { 0x7EC7, 0x7E07, 0x0000 }, /* R48 - Additional Control (4) */ { 0x00D3, 0x00D7, 0xFFFF }, /* R49 - Class D Control 1 */ { 0x0000, 0x0000, 0x0000 }, /* R50 */ { 0x0047, 0x0047, 0x0000 }, /* R51 - Class D Control 2 */ diff --git a/trunk/sound/soc/codecs/wm8962.c b/trunk/sound/soc/codecs/wm8962.c index 6d30f3464bad..7de519479801 100644 --- a/trunk/sound/soc/codecs/wm8962.c +++ b/trunk/sound/soc/codecs/wm8962.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -25,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -64,9 +62,6 @@ struct wm8962_priv { int fll_fref; int fll_fout; - struct delayed_work mic_work; - struct snd_soc_jack *jack; - struct regulator_bulk_data supplies[WM8962_NUM_SUPPLIES]; struct notifier_block disable_nb[WM8962_NUM_SUPPLIES]; @@ -75,10 +70,6 @@ struct wm8962_priv { struct work_struct beep_work; int beep_rate; #endif - -#ifdef CONFIG_GPIOLIB - struct gpio_chip gpio_chip; -#endif }; /* We can't use the same notifier block for more than one supply and @@ -639,8 +630,6 @@ SND_SOC_DAPM_INPUT("IN4L"), SND_SOC_DAPM_INPUT("IN4R"), SND_SOC_DAPM_INPUT("Beep"), -SND_SOC_DAPM_MICBIAS("MICBIAS", WM8962_PWR_MGMT_1, 1, 0), - SND_SOC_DAPM_SUPPLY("Class G", WM8962_CHARGE_PUMP_B, 0, 1, NULL, 0), SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, sysclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), @@ -920,6 +909,12 @@ static void wm8962_configure_bclk(struct snd_soc_codec *codec) int clocking2 = 0; int aif2 = 0; + /* If the CODEC is powered on we can configure BCLK */ + if (codec->bias_level != SND_SOC_BIAS_OFF) { + dev_dbg(codec->dev, "Bias is off, can't configure BCLK\n"); + return; + } + if (!wm8962->bclk) { dev_dbg(codec->dev, "No BCLK rate configured\n"); return; @@ -1347,7 +1342,7 @@ static int wm8962_set_fll(struct snd_soc_dai *dai, int fll_id, int source, struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); struct _fll_div fll_div; int ret; - int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1) & WM8962_FLL_ENA; + int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1); /* Any change? */ if (source == wm8962->fll_src && Fref == wm8962->fll_fref && @@ -1466,107 +1461,6 @@ static struct snd_soc_dai_driver wm8962_dai = { .symmetric_rates = 1, }; -static void wm8962_mic_work(struct work_struct *work) -{ - struct wm8962_priv *wm8962 = container_of(work, - struct wm8962_priv, - mic_work.work); - struct snd_soc_codec *codec = wm8962->codec; - int status = 0; - int irq_pol = 0; - int reg; - - reg = snd_soc_read(codec, WM8962_ADDITIONAL_CONTROL_4); - - if (reg & WM8962_MICDET_STS) { - status |= SND_JACK_MICROPHONE; - irq_pol |= WM8962_MICD_IRQ_POL; - } - - if (reg & WM8962_MICSHORT_STS) { - status |= SND_JACK_BTN_0; - irq_pol |= WM8962_MICSCD_IRQ_POL; - } - - snd_soc_jack_report(wm8962->jack, status, - SND_JACK_MICROPHONE | SND_JACK_BTN_0); - - snd_soc_update_bits(codec, WM8962_MICINT_SOURCE_POL, - WM8962_MICSCD_IRQ_POL | - WM8962_MICD_IRQ_POL, irq_pol); -} - -static irqreturn_t wm8962_irq(int irq, void *data) -{ - struct snd_soc_codec *codec = data; - struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); - int mask; - int active; - - mask = snd_soc_read(codec, WM8962_INTERRUPT_STATUS_2); - - active = snd_soc_read(codec, WM8962_INTERRUPT_STATUS_2); - active &= ~mask; - - if (active & WM8962_FIFOS_ERR_EINT) - dev_err(codec->dev, "FIFO error\n"); - - if (active & WM8962_TEMP_SHUT_EINT) - dev_crit(codec->dev, "Thermal shutdown\n"); - - if (active & (WM8962_MICSCD_EINT | WM8962_MICD_EINT)) { - dev_dbg(codec->dev, "Microphone event detected\n"); - - schedule_delayed_work(&wm8962->mic_work, - msecs_to_jiffies(250)); - } - - /* Acknowledge the interrupts */ - snd_soc_write(codec, WM8962_INTERRUPT_STATUS_2, active); - - return IRQ_HANDLED; -} - -/** - * wm8962_mic_detect - Enable microphone detection via the WM8962 IRQ - * - * @codec: WM8962 codec - * @jack: jack to report detection events on - * - * Enable microphone detection via IRQ on the WM8962. If GPIOs are - * being used to bring out signals to the processor then only platform - * data configuration is needed for WM8962 and processor GPIOs should - * be configured using snd_soc_jack_add_gpios() instead. - * - * If no jack is supplied detection will be disabled. - */ -int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) -{ - struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); - int irq_mask, enable; - - wm8962->jack = jack; - if (jack) { - irq_mask = 0; - enable = WM8962_MICDET_ENA; - } else { - irq_mask = WM8962_MICD_EINT | WM8962_MICSCD_EINT; - enable = 0; - } - - snd_soc_update_bits(codec, WM8962_INTERRUPT_STATUS_2_MASK, - WM8962_MICD_EINT | WM8962_MICSCD_EINT, irq_mask); - snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_4, - WM8962_MICDET_ENA, enable); - - /* Send an initial empty report */ - snd_soc_jack_report(wm8962->jack, 0, - SND_JACK_MICROPHONE | SND_JACK_BTN_0); - - return 0; -} -EXPORT_SYMBOL_GPL(wm8962_mic_detect); - #ifdef CONFIG_PM static int wm8962_resume(struct snd_soc_codec *codec) { @@ -1733,143 +1627,14 @@ static void wm8962_free_beep(struct snd_soc_codec *codec) } #endif -static void wm8962_set_gpio_mode(struct snd_soc_codec *codec, int gpio) -{ - int mask = 0; - int val = 0; - - /* Some of the GPIOs are behind MFP configuration and need to - * be put into GPIO mode. */ - switch (gpio) { - case 2: - mask = WM8962_CLKOUT2_SEL_MASK; - val = 1 << WM8962_CLKOUT2_SEL_SHIFT; - break; - case 3: - mask = WM8962_CLKOUT3_SEL_MASK; - val = 1 << WM8962_CLKOUT3_SEL_SHIFT; - break; - default: - break; - } - - if (mask) - snd_soc_update_bits(codec, WM8962_ANALOGUE_CLOCKING1, - mask, val); -} - -#ifdef CONFIG_GPIOLIB -static inline struct wm8962_priv *gpio_to_wm8962(struct gpio_chip *chip) -{ - return container_of(chip, struct wm8962_priv, gpio_chip); -} - -static int wm8962_gpio_request(struct gpio_chip *chip, unsigned offset) -{ - struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); - struct snd_soc_codec *codec = wm8962->codec; - - /* The WM8962 GPIOs aren't linearly numbered. For simplicity - * we export linear numbers and error out if the unsupported - * ones are requsted. - */ - switch (offset + 1) { - case 2: - case 3: - case 5: - case 6: - break; - default: - return -EINVAL; - } - - wm8962_set_gpio_mode(codec, offset + 1); - - return 0; -} - -static void wm8962_gpio_set(struct gpio_chip *chip, unsigned offset, int value) -{ - struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); - struct snd_soc_codec *codec = wm8962->codec; - - snd_soc_update_bits(codec, WM8962_GPIO_BASE + offset, - WM8962_GP2_LVL, value << WM8962_GP2_LVL_SHIFT); -} - -static int wm8962_gpio_direction_out(struct gpio_chip *chip, - unsigned offset, int value) -{ - struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); - struct snd_soc_codec *codec = wm8962->codec; - int val; - - /* Force function 1 (logic output) */ - val = (1 << WM8962_GP2_FN_SHIFT) | (value << WM8962_GP2_LVL_SHIFT); - - return snd_soc_update_bits(codec, WM8962_GPIO_BASE + offset, - WM8962_GP2_FN_MASK | WM8962_GP2_LVL, val); -} - -static struct gpio_chip wm8962_template_chip = { - .label = "wm8962", - .owner = THIS_MODULE, - .request = wm8962_gpio_request, - .direction_output = wm8962_gpio_direction_out, - .set = wm8962_gpio_set, - .can_sleep = 1, -}; - -static void wm8962_init_gpio(struct snd_soc_codec *codec) -{ - struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); - struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); - int ret; - - wm8962->gpio_chip = wm8962_template_chip; - wm8962->gpio_chip.ngpio = WM8962_MAX_GPIO; - wm8962->gpio_chip.dev = codec->dev; - - if (pdata && pdata->gpio_base) - wm8962->gpio_chip.base = pdata->gpio_base; - else - wm8962->gpio_chip.base = -1; - - ret = gpiochip_add(&wm8962->gpio_chip); - if (ret != 0) - dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret); -} - -static void wm8962_free_gpio(struct snd_soc_codec *codec) -{ - struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); - int ret; - - ret = gpiochip_remove(&wm8962->gpio_chip); - if (ret != 0) - dev_err(codec->dev, "Failed to remove GPIOs: %d\n", ret); -} -#else -static void wm8962_init_gpio(struct snd_soc_codec *codec) -{ -} - -static void wm8962_free_gpio(struct snd_soc_codec *codec) -{ -} -#endif - static int wm8962_probe(struct snd_soc_codec *codec) { int ret; struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); - struct i2c_client *i2c = container_of(codec->dev, struct i2c_client, - dev); - int i, trigger, irq_pol; + int i; wm8962->codec = codec; - INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); codec->cache_sync = 1; codec->idle_bias_off = 1; @@ -1957,26 +1722,14 @@ static int wm8962_probe(struct snd_soc_codec *codec) if (pdata) { /* Apply static configuration for GPIOs */ for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++) - if (pdata->gpio_init[i]) { - wm8962_set_gpio_mode(codec, i + 1); + if (pdata->gpio_init[i]) snd_soc_write(codec, 0x200 + i, pdata->gpio_init[i] & 0xffff); - } /* Put the speakers into mono mode? */ if (pdata->spk_mono) wm8962->reg_cache[WM8962_CLASS_D_CONTROL_2] |= WM8962_SPK_MONO; - - /* Micbias setup, detection enable and detection - * threasholds. */ - if (pdata->mic_cfg) - snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_4, - WM8962_MICDET_ENA | - WM8962_MICDET_THR_MASK | - WM8962_MICSHORT_THR_MASK | - WM8962_MICBIAS_LVL, - pdata->mic_cfg); } /* Latch volume update bits */ @@ -1994,35 +1747,6 @@ static int wm8962_probe(struct snd_soc_codec *codec) wm8962_add_widgets(codec); wm8962_init_beep(codec); - wm8962_init_gpio(codec); - - if (i2c->irq) { - if (pdata && pdata->irq_active_low) { - trigger = IRQF_TRIGGER_LOW; - irq_pol = WM8962_IRQ_POL; - } else { - trigger = IRQF_TRIGGER_HIGH; - irq_pol = 0; - } - - snd_soc_update_bits(codec, WM8962_INTERRUPT_CONTROL, - WM8962_IRQ_POL, irq_pol); - - ret = request_threaded_irq(i2c->irq, NULL, wm8962_irq, - trigger | IRQF_ONESHOT, - "wm8962", codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to request IRQ %d: %d\n", - i2c->irq, ret); - /* Non-fatal */ - } else { - /* Enable error reporting IRQs by default */ - snd_soc_update_bits(codec, - WM8962_INTERRUPT_STATUS_2_MASK, - WM8962_TEMP_SHUT_EINT | - WM8962_FIFOS_ERR_EINT, 0); - } - } return 0; @@ -2038,16 +1762,8 @@ static int wm8962_probe(struct snd_soc_codec *codec) static int wm8962_remove(struct snd_soc_codec *codec) { struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *i2c = container_of(codec->dev, struct i2c_client, - dev); int i; - if (i2c->irq) - free_irq(i2c->irq, codec); - - cancel_delayed_work_sync(&wm8962->mic_work); - - wm8962_free_gpio(codec); wm8962_free_beep(codec); for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) regulator_unregister_notifier(wm8962->supplies[i].consumer, @@ -2105,7 +1821,7 @@ MODULE_DEVICE_TABLE(i2c, wm8962_i2c_id); static struct i2c_driver wm8962_i2c_driver = { .driver = { - .name = "wm8962", + .name = "WM8962", .owner = THIS_MODULE, }, .probe = wm8962_i2c_probe, diff --git a/trunk/sound/soc/codecs/wm8962.h b/trunk/sound/soc/codecs/wm8962.h index 2af6c9371fcc..6145399acb16 100644 --- a/trunk/sound/soc/codecs/wm8962.h +++ b/trunk/sound/soc/codecs/wm8962.h @@ -14,7 +14,6 @@ #define _WM8962_H #include -#include #define WM8962_SYSCLK_MCLK 1 #define WM8962_SYSCLK_FLL 2 @@ -182,7 +181,6 @@ #define WM8962_EQ39 0x175 #define WM8962_EQ40 0x176 #define WM8962_EQ41 0x177 -#define WM8962_GPIO_BASE 0x200 #define WM8962_GPIO_2 0x201 #define WM8962_GPIO_3 0x202 #define WM8962_GPIO_5 0x204 @@ -3786,6 +3784,4 @@ struct wm8962_reg_access { extern const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1]; -int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack); - #endif diff --git a/trunk/sound/soc/codecs/wm8985.c b/trunk/sound/soc/codecs/wm8985.c index ae9020a2a195..b94af96f2bd7 100644 --- a/trunk/sound/soc/codecs/wm8985.c +++ b/trunk/sound/soc/codecs/wm8985.c @@ -185,8 +185,8 @@ static const SOC_ENUM_SINGLE_DECL(filter_mode, WM8985_ADC_CONTROL, 7, static const char *eq_bw_text[] = { "Narrow", "Wide" }; static const char *eqmode_text[] = { "Capture", "Playback" }; -static const SOC_ENUM_SINGLE_EXT_DECL(eqmode, eqmode_text); - +static const SOC_ENUM_SINGLE_DECL(eqmode, WM8985_EQ1_LOW_SHELF, 8, + eqmode_text); static const char *eq1_cutoff_text[] = { "80Hz", "105Hz", "135Hz", "175Hz" }; @@ -644,7 +644,7 @@ static int wm8985_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - int i; + size_t i; struct snd_soc_codec *codec; struct wm8985_priv *wm8985; u16 blen, srate_idx; @@ -1102,6 +1102,7 @@ static int __devexit wm8985_spi_remove(struct spi_device *spi) static struct spi_driver wm8985_spi_driver = { .driver = { .name = "wm8985", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8985_spi_probe, diff --git a/trunk/sound/soc/codecs/wm8988.c b/trunk/sound/soc/codecs/wm8988.c index d7f259711970..d08b1fe6c42c 100644 --- a/trunk/sound/soc/codecs/wm8988.c +++ b/trunk/sound/soc/codecs/wm8988.c @@ -844,6 +844,7 @@ static int __devexit wm8988_spi_remove(struct spi_device *spi) static struct spi_driver wm8988_spi_driver = { .driver = { .name = "wm8988-codec", + .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8988_spi_probe, diff --git a/trunk/sound/soc/davinci/davinci-i2s.c b/trunk/sound/soc/davinci/davinci-i2s.c index d46b545d41f4..9f8b6c556866 100644 --- a/trunk/sound/soc/davinci/davinci-i2s.c +++ b/trunk/sound/soc/davinci/davinci-i2s.c @@ -574,6 +574,10 @@ static int davinci_i2s_prepare(struct snd_pcm_substream *substream, struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); davinci_mcbsp_stop(dev, playback); + if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0) { + /* codec is master */ + davinci_mcbsp_start(dev, substream); + } return 0; } @@ -583,6 +587,8 @@ static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); int ret = 0; int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0) + return 0; /* return if codec is master */ switch (cmd) { case SNDRV_PCM_TRIGGER_START: diff --git a/trunk/sound/soc/imx/eukrea-tlv320.c b/trunk/sound/soc/imx/eukrea-tlv320.c index b59675257ce5..807f736ee294 100644 --- a/trunk/sound/soc/imx/eukrea-tlv320.c +++ b/trunk/sound/soc/imx/eukrea-tlv320.c @@ -82,7 +82,7 @@ static struct snd_soc_dai_link eukrea_tlv320_dai = { .codec_dai = "tlv320aic23-hifi", .platform_name = "imx-pcm-audio.0", .codec_name = "tlv320aic23-codec.0-001a", - .cpu_dai = "imx-ssi.0", + .cpu_dai = "imx-ssi-dai.0", .ops = &eukrea_tlv320_snd_ops, }; diff --git a/trunk/sound/soc/imx/imx-ssi.c b/trunk/sound/soc/imx/imx-ssi.c index d4bd345b0a8d..26716e9626f4 100644 --- a/trunk/sound/soc/imx/imx-ssi.c +++ b/trunk/sound/soc/imx/imx-ssi.c @@ -734,7 +734,7 @@ static struct platform_driver imx_ssi_driver = { .remove = __devexit_p(imx_ssi_remove), .driver = { - .name = "imx-ssi", + .name = "imx-ssi-dai", .owner = THIS_MODULE, }, }; diff --git a/trunk/sound/soc/imx/phycore-ac97.c b/trunk/sound/soc/imx/phycore-ac97.c index 6a65dd705519..65f0f99ca6dd 100644 --- a/trunk/sound/soc/imx/phycore-ac97.c +++ b/trunk/sound/soc/imx/phycore-ac97.c @@ -34,7 +34,7 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = { .stream_name = "HiFi", .codec_dai_name = "wm9712-hifi", .codec_name = "wm9712-codec", - .cpu_dai_name = "imx-ssi.0", + .cpu_dai_name = "imx-ssi-dai.0", .platform_name = "imx-fiq-pcm-audio.0", .ops = &imx_phycore_hifi_ops, }, diff --git a/trunk/sound/soc/imx/wm1133-ev1.c b/trunk/sound/soc/imx/wm1133-ev1.c index 30fdb15065be..74068636c1d8 100644 --- a/trunk/sound/soc/imx/wm1133-ev1.c +++ b/trunk/sound/soc/imx/wm1133-ev1.c @@ -243,7 +243,7 @@ static int wm1133_ev1_init(struct snd_soc_pcm_runtime *rtd) static struct snd_soc_dai_link wm1133_ev1_dai = { .name = "WM1133-EV1", .stream_name = "Audio", - .cpu_dai_name = "imx-ssi.0", + .cpu_dai_name = "imx-ssi-dai.0", .codec_dai_name = "wm8350-hifi", .platform_name = "imx-fiq-pcm-audio.0", .codec_name = "wm8350-codec.0-0x1a",