diff options
| -rw-r--r-- | sound/soc/codecs/wm8962.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 3a1db4a76a64..6d30f3464bad 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -1733,6 +1733,31 @@ static void wm8962_free_beep(struct snd_soc_codec *codec) | |||
| 1733 | } | 1733 | } |
| 1734 | #endif | 1734 | #endif |
| 1735 | 1735 | ||
| 1736 | static void wm8962_set_gpio_mode(struct snd_soc_codec *codec, int gpio) | ||
| 1737 | { | ||
| 1738 | int mask = 0; | ||
| 1739 | int val = 0; | ||
| 1740 | |||
| 1741 | /* Some of the GPIOs are behind MFP configuration and need to | ||
| 1742 | * be put into GPIO mode. */ | ||
| 1743 | switch (gpio) { | ||
| 1744 | case 2: | ||
| 1745 | mask = WM8962_CLKOUT2_SEL_MASK; | ||
| 1746 | val = 1 << WM8962_CLKOUT2_SEL_SHIFT; | ||
| 1747 | break; | ||
| 1748 | case 3: | ||
| 1749 | mask = WM8962_CLKOUT3_SEL_MASK; | ||
| 1750 | val = 1 << WM8962_CLKOUT3_SEL_SHIFT; | ||
| 1751 | break; | ||
| 1752 | default: | ||
| 1753 | break; | ||
| 1754 | } | ||
| 1755 | |||
| 1756 | if (mask) | ||
| 1757 | snd_soc_update_bits(codec, WM8962_ANALOGUE_CLOCKING1, | ||
| 1758 | mask, val); | ||
| 1759 | } | ||
| 1760 | |||
| 1736 | #ifdef CONFIG_GPIOLIB | 1761 | #ifdef CONFIG_GPIOLIB |
| 1737 | static inline struct wm8962_priv *gpio_to_wm8962(struct gpio_chip *chip) | 1762 | static inline struct wm8962_priv *gpio_to_wm8962(struct gpio_chip *chip) |
| 1738 | { | 1763 | { |
| @@ -1743,8 +1768,6 @@ static int wm8962_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
| 1743 | { | 1768 | { |
| 1744 | struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); | 1769 | struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); |
| 1745 | struct snd_soc_codec *codec = wm8962->codec; | 1770 | struct snd_soc_codec *codec = wm8962->codec; |
| 1746 | int mask = 0; | ||
| 1747 | int val; | ||
| 1748 | 1771 | ||
| 1749 | /* The WM8962 GPIOs aren't linearly numbered. For simplicity | 1772 | /* The WM8962 GPIOs aren't linearly numbered. For simplicity |
| 1750 | * we export linear numbers and error out if the unsupported | 1773 | * we export linear numbers and error out if the unsupported |
| @@ -1752,13 +1775,7 @@ static int wm8962_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
| 1752 | */ | 1775 | */ |
| 1753 | switch (offset + 1) { | 1776 | switch (offset + 1) { |
| 1754 | case 2: | 1777 | case 2: |
| 1755 | mask = WM8962_CLKOUT2_SEL_MASK; | ||
| 1756 | val = 1 << WM8962_CLKOUT2_SEL_SHIFT; | ||
| 1757 | break; | ||
| 1758 | case 3: | 1778 | case 3: |
| 1759 | mask = WM8962_CLKOUT3_SEL_MASK; | ||
| 1760 | val = 1 << WM8962_CLKOUT3_SEL_SHIFT; | ||
| 1761 | break; | ||
| 1762 | case 5: | 1779 | case 5: |
| 1763 | case 6: | 1780 | case 6: |
| 1764 | break; | 1781 | break; |
| @@ -1766,10 +1783,7 @@ static int wm8962_gpio_request(struct gpio_chip *chip, unsigned offset) | |||
| 1766 | return -EINVAL; | 1783 | return -EINVAL; |
| 1767 | } | 1784 | } |
| 1768 | 1785 | ||
| 1769 | /* Some of the GPIOs are behind MFP configuration */ | 1786 | wm8962_set_gpio_mode(codec, offset + 1); |
| 1770 | if (mask) | ||
| 1771 | snd_soc_update_bits(codec, WM8962_ANALOGUE_CLOCKING1, | ||
| 1772 | mask, val); | ||
| 1773 | 1787 | ||
| 1774 | return 0; | 1788 | return 0; |
| 1775 | } | 1789 | } |
| @@ -1943,9 +1957,11 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 1943 | if (pdata) { | 1957 | if (pdata) { |
| 1944 | /* Apply static configuration for GPIOs */ | 1958 | /* Apply static configuration for GPIOs */ |
| 1945 | for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++) | 1959 | for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++) |
| 1946 | if (pdata->gpio_init[i]) | 1960 | if (pdata->gpio_init[i]) { |
| 1961 | wm8962_set_gpio_mode(codec, i + 1); | ||
| 1947 | snd_soc_write(codec, 0x200 + i, | 1962 | snd_soc_write(codec, 0x200 + i, |
| 1948 | pdata->gpio_init[i] & 0xffff); | 1963 | pdata->gpio_init[i] & 0xffff); |
| 1964 | } | ||
| 1949 | 1965 | ||
| 1950 | /* Put the speakers into mono mode? */ | 1966 | /* Put the speakers into mono mode? */ |
| 1951 | if (pdata->spk_mono) | 1967 | if (pdata->spk_mono) |
