select SND_SOC_AD1980 if SND_SOC_AC97_BUS
select SND_SOC_AD73311
select SND_SOC_ADAU1373 if I2C
++ select SND_SOC_ADAU1761_I2C if I2C
++ select SND_SOC_ADAU1761_SPI if SPI
++ select SND_SOC_ADAU1781_I2C if I2C
++ select SND_SOC_ADAU1781_SPI if SPI
select SND_SOC_ADAV801 if SPI_MASTER
select SND_SOC_ADAV803 if I2C
select SND_SOC_ADAU1977_SPI if SPI_MASTER
select SND_SOC_ALC5623 if I2C
select SND_SOC_ALC5632 if I2C
select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC
-- select SND_SOC_CS42L51 if I2C
-- select SND_SOC_CS42L52 if I2C
++ select SND_SOC_CS42L51_I2C if I2C
++ select SND_SOC_CS42L52 if I2C && INPUT
++ select SND_SOC_CS42L56 if I2C && INPUT
select SND_SOC_CS42L73 if I2C
select SND_SOC_CS4270 if I2C
select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI
select SND_SOC_RT5640 if I2C
select SND_SOC_RT5645 if I2C
select SND_SOC_RT5651 if I2C
++ select SND_SOC_RT5677 if I2C
select SND_SOC_SGTL5000 if I2C
select SND_SOC_SI476X if MFD_SI476X_CORE
select SND_SOC_SIRF_AUDIO_CODEC
select SND_SOC_SSM2602_SPI if SPI_MASTER
select SND_SOC_SSM2602_I2C if I2C
select SND_SOC_STA32X if I2C
++ select SND_SOC_STA350 if I2C
select SND_SOC_STA529 if I2C
select SND_SOC_STAC9766 if SND_SOC_AC97_BUS
select SND_SOC_TAS5086 if I2C
select SND_SOC_WM8955 if I2C
select SND_SOC_WM8960 if I2C
select SND_SOC_WM8961 if I2C
-- select SND_SOC_WM8962 if I2C
++ select SND_SOC_WM8962 if I2C && INPUT
select SND_SOC_WM8971 if I2C
select SND_SOC_WM8974 if I2C
select SND_SOC_WM8978 if I2C
config SND_SOC_AD73311
tristate
++config SND_SOC_ADAU1373
++ tristate
++
config SND_SOC_ADAU1701
tristate "Analog Devices ADAU1701 CODEC"
depends on I2C
select SND_SOC_SIGMADSP
--config SND_SOC_ADAU1373
++config SND_SOC_ADAU17X1
++ tristate
++ select SND_SOC_SIGMADSP
++
++config SND_SOC_ADAU1761
++ tristate
++ select SND_SOC_ADAU17X1
++
++config SND_SOC_ADAU1761_I2C
++ tristate
++ select SND_SOC_ADAU1761
++ select REGMAP_I2C
++
++config SND_SOC_ADAU1761_SPI
++ tristate
++ select SND_SOC_ADAU1761
++ select REGMAP_SPI
++
++config SND_SOC_ADAU1781
++ select SND_SOC_ADAU17X1
++ tristate
++
++config SND_SOC_ADAU1781_I2C
++ tristate
++ select SND_SOC_ADAU1781
++ select REGMAP_I2C
++
++config SND_SOC_ADAU1781_SPI
tristate
++ select SND_SOC_ADAU1781
++ select REGMAP_SPI
config SND_SOC_ADAU1977
tristate
tristate "AKM AK5638 CODEC"
config SND_SOC_ALC5623
-- tristate
++ tristate "Realtek ALC5623 CODEC"
++ depends on I2C
config SND_SOC_ALC5632
tristate
config SND_SOC_CS42L51
tristate
++config SND_SOC_CS42L51_I2C
++ tristate
++ select SND_SOC_CS42L51
++
config SND_SOC_CS42L52
tristate "Cirrus Logic CS42L52 CODEC"
-- depends on I2C
++ depends on I2C && INPUT
++
++config SND_SOC_CS42L56
++ tristate "Cirrus Logic CS42L56 CODEC"
++ depends on I2C && INPUT
config SND_SOC_CS42L73
tristate "Cirrus Logic CS42L73 CODEC"
select SND_SOC_PCM512x
select REGMAP_SPI
+ +config SND_SOC_RL6231
+ + tristate
+ + default y if SND_SOC_RT5640=y
+ + default y if SND_SOC_RT5645=y
+ + default y if SND_SOC_RT5651=y
+ + default m if SND_SOC_RT5640=m
+ + default m if SND_SOC_RT5645=m
+ + default m if SND_SOC_RT5651=m
+ +
config SND_SOC_RT5631
tristate
config SND_SOC_RT5651
tristate
++ config SND_SOC_RT5677
++ tristate
++
#Freescale sgtl5000 codec
config SND_SOC_SGTL5000
tristate "Freescale SGTL5000 CODEC"
config SND_SOC_STA32X
tristate
++config SND_SOC_STA350
++ tristate "STA350 speaker amplifier"
++ depends on I2C
++
config SND_SOC_STA529
tristate
config SND_SOC_WM8962
tristate "Wolfson Microelectronics WM8962 CODEC"
-- depends on I2C
++ depends on I2C && INPUT
config SND_SOC_WM8971
tristate
snd-soc-ad193x-i2c-objs := ad193x-i2c.o
snd-soc-ad1980-objs := ad1980.o
snd-soc-ad73311-objs := ad73311.o
--snd-soc-adau1701-objs := adau1701.o
snd-soc-adau1373-objs := adau1373.o
++snd-soc-adau1701-objs := adau1701.o
++snd-soc-adau17x1-objs := adau17x1.o
++snd-soc-adau1761-objs := adau1761.o
++snd-soc-adau1761-i2c-objs := adau1761-i2c.o
++snd-soc-adau1761-spi-objs := adau1761-spi.o
++snd-soc-adau1781-objs := adau1781.o
++snd-soc-adau1781-i2c-objs := adau1781-i2c.o
++snd-soc-adau1781-spi-objs := adau1781-spi.o
snd-soc-adau1977-objs := adau1977.o
snd-soc-adau1977-spi-objs := adau1977-spi.o
snd-soc-adau1977-i2c-objs := adau1977-i2c.o
snd-soc-arizona-objs := arizona.o
snd-soc-cq93vc-objs := cq93vc.o
snd-soc-cs42l51-objs := cs42l51.o
++snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o
snd-soc-cs42l52-objs := cs42l52.o
++snd-soc-cs42l56-objs := cs42l56.o
snd-soc-cs42l73-objs := cs42l73.o
snd-soc-cs4270-objs := cs4270.o
snd-soc-cs4271-objs := cs4271.o
snd-soc-pcm512x-objs := pcm512x.o
snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o
snd-soc-pcm512x-spi-objs := pcm512x-spi.o
+ +snd-soc-rl6231-objs := rl6231.o
snd-soc-rt5631-objs := rt5631.o
snd-soc-rt5640-objs := rt5640.o
snd-soc-rt5645-objs := rt5645.o
snd-soc-rt5651-objs := rt5651.o
++ snd-soc-rt5677-objs := rt5677.o
snd-soc-sgtl5000-objs := sgtl5000.o
snd-soc-alc5623-objs := alc5623.o
snd-soc-alc5632-objs := alc5632.o
snd-soc-ssm2602-spi-objs := ssm2602-spi.o
snd-soc-ssm2602-i2c-objs := ssm2602-i2c.o
snd-soc-sta32x-objs := sta32x.o
++snd-soc-sta350-objs := sta350.o
snd-soc-sta529-objs := sta529.o
snd-soc-stac9766-objs := stac9766.o
snd-soc-tas5086-objs := tas5086.o
obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o
obj-$(CONFIG_SND_SOC_AD73311) += snd-soc-ad73311.o
obj-$(CONFIG_SND_SOC_ADAU1373) += snd-soc-adau1373.o
++obj-$(CONFIG_SND_SOC_ADAU1701) += snd-soc-adau1701.o
++obj-$(CONFIG_SND_SOC_ADAU17X1) += snd-soc-adau17x1.o
++obj-$(CONFIG_SND_SOC_ADAU1761) += snd-soc-adau1761.o
++obj-$(CONFIG_SND_SOC_ADAU1761_I2C) += snd-soc-adau1761-i2c.o
++obj-$(CONFIG_SND_SOC_ADAU1761_SPI) += snd-soc-adau1761-spi.o
++obj-$(CONFIG_SND_SOC_ADAU1781) += snd-soc-adau1781.o
++obj-$(CONFIG_SND_SOC_ADAU1781_I2C) += snd-soc-adau1781-i2c.o
++obj-$(CONFIG_SND_SOC_ADAU1781_SPI) += snd-soc-adau1781-spi.o
obj-$(CONFIG_SND_SOC_ADAU1977) += snd-soc-adau1977.o
obj-$(CONFIG_SND_SOC_ADAU1977_SPI) += snd-soc-adau1977-spi.o
obj-$(CONFIG_SND_SOC_ADAU1977_I2C) += snd-soc-adau1977-i2c.o
--obj-$(CONFIG_SND_SOC_ADAU1701) += snd-soc-adau1701.o
obj-$(CONFIG_SND_SOC_ADAV80X) += snd-soc-adav80x.o
obj-$(CONFIG_SND_SOC_ADAV801) += snd-soc-adav801.o
obj-$(CONFIG_SND_SOC_ADAV803) += snd-soc-adav803.o
obj-$(CONFIG_SND_SOC_ARIZONA) += snd-soc-arizona.o
obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o
++obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o
obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o
++obj-$(CONFIG_SND_SOC_CS42L56) += snd-soc-cs42l56.o
obj-$(CONFIG_SND_SOC_CS42L73) += snd-soc-cs42l73.o
obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o
obj-$(CONFIG_SND_SOC_CS4271) += snd-soc-cs4271.o
obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o
obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o
obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o
+ +obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o
obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o
obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o
obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o
++ obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o
obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o
obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o
obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o
obj-$(CONFIG_SND_SOC_SSM2602_SPI) += snd-soc-ssm2602-spi.o
obj-$(CONFIG_SND_SOC_SSM2602_I2C) += snd-soc-ssm2602-i2c.o
obj-$(CONFIG_SND_SOC_STA32X) += snd-soc-sta32x.o
++obj-$(CONFIG_SND_SOC_STA350) += snd-soc-sta350.o
obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o
obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o
obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
++#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <sound/initval.h>
#include <sound/tlv.h>
+ +#include "rl6231.h"
#include "rt5640.h"
#define RT5640_DEVICE_ID 0x6231
* @kcontrol: The kcontrol of this widget.
* @event: Event id.
*
- - * Choose dmic clock between 1MHz and 3MHz.
- - * It is better for clock to approximate 3MHz.
*/
static int set_dmic_clk(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
- - int div[] = {2, 3, 4, 6, 8, 12};
- - int idx = -EINVAL, i;
- - int rate, red, bound, temp;
- -
- - rate = rt5640->sysclk;
- - red = 3000000 * 12;
- - for (i = 0; i < ARRAY_SIZE(div); i++) {
- - bound = div[i] * 3000000;
- - if (rate > bound)
- - continue;
- - temp = bound - rate;
- - if (temp < red) {
- - red = temp;
- - idx = i;
- - }
- - }
+ + int idx = -EINVAL;
+ +
+ + idx = rl6231_calc_dmic_clk(rt5640->sysclk);
+ +
if (idx < 0)
dev_err(codec->dev, "Failed to set DMIC clock\n");
else
0x3, rt5640_dac_l2_src, rt5640_dac_l2_values);
static const struct snd_kcontrol_new rt5640_dac_l2_mux =
-- SOC_DAPM_VALUE_ENUM("DAC2 left channel source", rt5640_dac_l2_enum);
++ SOC_DAPM_ENUM("DAC2 left channel source", rt5640_dac_l2_enum);
static const char * const rt5640_dac_r2_src[] = {
"IF2",
rt5640_dai_iis_map_values);
static const struct snd_kcontrol_new rt5640_dai_mux =
-- SOC_DAPM_VALUE_ENUM("DAI select", rt5640_dai_iis_map_enum);
++ SOC_DAPM_ENUM("DAI select", rt5640_dai_iis_map_enum);
/* SDI select */
static const char * const rt5640_sdi_sel[] = {
return ret;
}
- -static int get_clk_info(int sclk, int rate)
- -{
- - int i, pd[] = {1, 2, 3, 4, 6, 8, 12, 16};
- -
- - if (sclk <= 0 || rate <= 0)
- - return -EINVAL;
- -
- - rate = rate << 8;
- - for (i = 0; i < ARRAY_SIZE(pd); i++)
- - if (sclk == rate * pd[i])
- - return i;
- -
- - return -EINVAL;
- -}
- -
static int rt5640_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
{
int dai_sel, pre_div, bclk_ms, frame_size;
rt5640->lrck[dai->id] = params_rate(params);
- - pre_div = get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]);
+ + pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]);
if (pre_div < 0) {
dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
rt5640->lrck[dai->id], dai->id);
return 0;
}
- -/**
- - * rt5640_pll_calc - Calculate PLL M/N/K code.
- - * @freq_in: external clock provided to codec.
- - * @freq_out: target clock which codec works on.
- - * @pll_code: Pointer to structure with M, N, K and bypass flag.
- - *
- - * Calculate M/N/K code to configure PLL for codec. And K is assigned to 2
- - * which make calculation more efficiently.
- - *
- - * Returns 0 for success or negative error code.
- - */
- -static int rt5640_pll_calc(const unsigned int freq_in,
- - const unsigned int freq_out, struct rt5640_pll_code *pll_code)
- -{
- - int max_n = RT5640_PLL_N_MAX, max_m = RT5640_PLL_M_MAX;
- - int n = 0, m = 0, red, n_t, m_t, in_t, out_t;
- - int red_t = abs(freq_out - freq_in);
- - bool bypass = false;
- -
- - if (RT5640_PLL_INP_MAX < freq_in || RT5640_PLL_INP_MIN > freq_in)
- - return -EINVAL;
- -
- - for (n_t = 0; n_t <= max_n; n_t++) {
- - in_t = (freq_in >> 1) + (freq_in >> 2) * n_t;
- - if (in_t < 0)
- - continue;
- - if (in_t == freq_out) {
- - bypass = true;
- - n = n_t;
- - goto code_find;
- - }
- - for (m_t = 0; m_t <= max_m; m_t++) {
- - out_t = in_t / (m_t + 2);
- - red = abs(out_t - freq_out);
- - if (red < red_t) {
- - n = n_t;
- - m = m_t;
- - if (red == 0)
- - goto code_find;
- - red_t = red;
- - }
- - }
- - }
- - pr_debug("Only get approximation about PLL\n");
- -
- -code_find:
- - pll_code->m_bp = bypass;
- - pll_code->m_code = m;
- - pll_code->n_code = n;
- - pll_code->k_code = 2;
- - return 0;
- -}
- -
static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
unsigned int freq_in, unsigned int freq_out)
{
struct snd_soc_codec *codec = dai->codec;
struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
- - struct rt5640_pll_code *pll_code = &rt5640->pll_code;
+ + struct rl6231_pll_code pll_code;
int ret, dai_sel;
if (source == rt5640->pll_src && freq_in == rt5640->pll_in &&
return -EINVAL;
}
- - ret = rt5640_pll_calc(freq_in, freq_out, pll_code);
+ + ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
if (ret < 0) {
dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
return ret;
}
- - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=2\n", pll_code->m_bp,
- - (pll_code->m_bp ? 0 : pll_code->m_code), pll_code->n_code);
+ + dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
+ + pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
+ + pll_code.n_code, pll_code.k_code);
snd_soc_write(codec, RT5640_PLL_CTRL1,
- - pll_code->n_code << RT5640_PLL_N_SFT | pll_code->k_code);
+ + pll_code.n_code << RT5640_PLL_N_SFT | pll_code.k_code);
snd_soc_write(codec, RT5640_PLL_CTRL2,
- - (pll_code->m_bp ? 0 : pll_code->m_code) << RT5640_PLL_M_SFT |
- - pll_code->m_bp << RT5640_PLL_M_BP_SFT);
+ + (pll_code.m_bp ? 0 : pll_code.m_code) << RT5640_PLL_M_SFT |
+ + pll_code.m_bp << RT5640_PLL_M_BP_SFT);
rt5640->pll_in = freq_in;
rt5640->pll_out = freq_out;