Merge: ac108 work for 4mic & 8mic
This commit is contained in:
parent
add8afa699
commit
edb5a1da65
12 changed files with 417 additions and 66 deletions
38
ac101.c
38
ac101.c
|
@ -19,6 +19,7 @@
|
||||||
* the License, or (at your option) any later version.
|
* the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#undef AC10X_DEBG
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -64,7 +65,9 @@ static int adc_digital_val = 0;
|
||||||
static bool agc_used = false;
|
static bool agc_used = false;
|
||||||
static bool drc_used = false;
|
static bool drc_used = false;
|
||||||
|
|
||||||
#define ac10x_RATES (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_KNOT)
|
#define ac10x_RATES (SNDRV_PCM_RATE_8000_96000 & \
|
||||||
|
~(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_64000 | \
|
||||||
|
SNDRV_PCM_RATE_88200))
|
||||||
#define ac10x_FORMATS ( /*SNDRV_PCM_FMTBIT_S8 | \
|
#define ac10x_FORMATS ( /*SNDRV_PCM_FMTBIT_S8 | \
|
||||||
SNDRV_PCM_FMTBIT_S16_LE | \
|
SNDRV_PCM_FMTBIT_S16_LE | \
|
||||||
SNDRV_PCM_FMTBIT_S18_3LE | \
|
SNDRV_PCM_FMTBIT_S18_3LE | \
|
||||||
|
@ -103,7 +106,6 @@ struct ac10x_priv {
|
||||||
|
|
||||||
struct work_struct codec_resume;
|
struct work_struct codec_resume;
|
||||||
struct delayed_work dlywork;
|
struct delayed_work dlywork;
|
||||||
int trgr_cnt;
|
|
||||||
|
|
||||||
struct gpio_desc* gpiod_spk_amp_switch;
|
struct gpio_desc* gpiod_spk_amp_switch;
|
||||||
};
|
};
|
||||||
|
@ -1192,15 +1194,15 @@ static const struct pll_div codec_pll_div[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct aif1_fs codec_aif1_fs[] = {
|
static const struct aif1_fs codec_aif1_fs[] = {
|
||||||
{44100, 2, 7, _SERIES_22_579K},
|
|
||||||
{48000, 2, 8},
|
|
||||||
{8000, 12, 0},
|
{8000, 12, 0},
|
||||||
{11025, 8, 1, _SERIES_22_579K},
|
{11025, 8, 1, _SERIES_22_579K},
|
||||||
{12000, 8, 2},
|
{12000, 8, 2},
|
||||||
{16000, 6, 3},
|
{16000, 6, 3},
|
||||||
{22050, 4, 4, _SERIES_22_579K},
|
{22050, 4, 4, _SERIES_22_579K},
|
||||||
{24000, 4, 5},
|
{24000, 4, 5},
|
||||||
/* {32000, 3, 6}, not support */
|
/* {32000, 3, 6}, dividing by 3 is not support */
|
||||||
|
{44100, 2, 7, _SERIES_22_579K},
|
||||||
|
{48000, 2, 8},
|
||||||
{96000, 1, 9},
|
{96000, 1, 9},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1303,8 +1305,6 @@ static int ac10x_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
|
||||||
AC10X_DBG("%s() L%d +++\n", __func__, __LINE__);
|
AC10X_DBG("%s() L%d +++\n", __func__, __LINE__);
|
||||||
|
|
||||||
ac10x->trgr_cnt = 0;
|
|
||||||
|
|
||||||
/* get channels count & slot size */
|
/* get channels count & slot size */
|
||||||
channels = params_channels(params);
|
channels = params_channels(params);
|
||||||
|
|
||||||
|
@ -1585,17 +1585,16 @@ static void __ac10x_work_start_clock(struct work_struct *work) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ac10x_start_clock(void) {
|
extern int register_start_clock(int (*start_clock)(void));
|
||||||
ac10x_aif1clk(static_ac10x->codec, SND_SOC_DAPM_PRE_PMU);
|
|
||||||
|
static int ac10x_start_clock(void) {
|
||||||
|
schedule_delayed_work(&static_ac10x->dlywork, msecs_to_jiffies(30));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ac10x_start_clock);
|
|
||||||
|
|
||||||
static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
|
static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = dai->codec;
|
|
||||||
struct ac10x_priv *ac10x = snd_soc_codec_get_drvdata(codec);
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
AC10X_DBG("%s() stream=%d cmd=%d\n",
|
AC10X_DBG("%s() stream=%d cmd=%d\n",
|
||||||
|
@ -1605,13 +1604,6 @@ static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||||
if (ac10x->trgr_cnt++ > 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* delayed clock starting */
|
|
||||||
schedule_delayed_work(&ac10x->dlywork, msecs_to_jiffies(30));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||||
|
@ -1620,9 +1612,7 @@ static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct snd_soc_dai_ops ac10x_aif1_dai_ops = {
|
static const struct snd_soc_dai_ops ac10x_aif1_dai_ops = {
|
||||||
|
@ -1702,7 +1692,7 @@ static ssize_t ac10x_debug_store(struct device *dev,
|
||||||
struct ac10x_priv *ac10x = dev_get_drvdata(dev);
|
struct ac10x_priv *ac10x = dev_get_drvdata(dev);
|
||||||
val = simple_strtol(buf, NULL, 16);
|
val = simple_strtol(buf, NULL, 16);
|
||||||
flag = (val >> 24) & 0xF;
|
flag = (val >> 24) & 0xF;
|
||||||
if(flag) {//write
|
if(flag) {
|
||||||
reg = (val >> 16) & 0xFF;
|
reg = (val >> 16) & 0xFF;
|
||||||
value_w = val & 0xFFFF;
|
value_w = val & 0xFFFF;
|
||||||
snd_soc_write(ac10x->codec, reg, value_w);
|
snd_soc_write(ac10x->codec, reg, value_w);
|
||||||
|
@ -1781,6 +1771,8 @@ static int ac10x_codec_probe(struct snd_soc_codec *codec)
|
||||||
mutex_init(&ac10x->adc_mutex);
|
mutex_init(&ac10x->adc_mutex);
|
||||||
mutex_init(&ac10x->aifclk_mutex);
|
mutex_init(&ac10x->aifclk_mutex);
|
||||||
|
|
||||||
|
register_start_clock(ac10x_start_clock);
|
||||||
|
|
||||||
ac10x->num_supplies = ARRAY_SIZE(ac10x_supplies);
|
ac10x->num_supplies = ARRAY_SIZE(ac10x_supplies);
|
||||||
ac10x->supplies = devm_kzalloc(ac10x->codec->dev,
|
ac10x->supplies = devm_kzalloc(ac10x->codec->dev,
|
||||||
sizeof(struct regulator_bulk_data) *
|
sizeof(struct regulator_bulk_data) *
|
||||||
|
|
1
ac101.h
1
ac101.h
|
@ -424,7 +424,6 @@ struct spk_gpio {
|
||||||
u32 gpio;
|
u32 gpio;
|
||||||
bool used;
|
bool used;
|
||||||
};
|
};
|
||||||
#define AC10X_DEBG
|
|
||||||
#ifdef AC10X_DEBG
|
#ifdef AC10X_DEBG
|
||||||
#define AC10X_DBG(format,args...) printk("[AC101] "format,##args)
|
#define AC10X_DBG(format,args...) printk("[AC101] "format,##args)
|
||||||
#else
|
#else
|
||||||
|
|
122
ac108.c
122
ac108.c
|
@ -8,7 +8,7 @@
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
#define DEBUG
|
#undef DEBUG
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
#include "ac108.h"
|
#include "ac108.h"
|
||||||
|
|
||||||
#define _USE_CAPTURE 0
|
#define _USE_CAPTURE 0
|
||||||
#define _MASTER_INDEX 1
|
#define _MASTER_INDEX 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO:
|
* TODO:
|
||||||
|
@ -56,6 +56,7 @@ struct ac108_priv {
|
||||||
unsigned char data_protocol;
|
unsigned char data_protocol;
|
||||||
struct delayed_work dlywork;
|
struct delayed_work dlywork;
|
||||||
int trgr_cnt;
|
int trgr_cnt;
|
||||||
|
int tdm_chips_cnt;
|
||||||
};
|
};
|
||||||
static struct ac108_priv *ac108;
|
static struct ac108_priv *ac108;
|
||||||
|
|
||||||
|
@ -165,8 +166,13 @@ static const struct pll_div ac108_pll_div_list[] = {
|
||||||
|
|
||||||
/* AC108 definition */
|
/* AC108 definition */
|
||||||
#define AC108_CHANNELS_MAX 16 /* range[1, 16] */
|
#define AC108_CHANNELS_MAX 16 /* range[1, 16] */
|
||||||
#define AC108_RATES (SNDRV_PCM_RATE_8000_96000 | SNDRV_PCM_RATE_KNOT)
|
#define AC108_RATES (SNDRV_PCM_RATE_8000_96000 & \
|
||||||
#define AC108_FORMATS (/* SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |*/ SNDRV_PCM_FMTBIT_S32_LE)
|
~(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_64000 | \
|
||||||
|
SNDRV_PCM_RATE_88200))
|
||||||
|
#define AC108_FORMATS (/*SNDRV_PCM_FMTBIT_S16_LE | \
|
||||||
|
SNDRV_PCM_FMTBIT_S20_3LE | \
|
||||||
|
SNDRV_PCM_FMTBIT_S24_LE |*/ \
|
||||||
|
SNDRV_PCM_FMTBIT_S32_LE)
|
||||||
|
|
||||||
static const DECLARE_TLV_DB_SCALE(tlv_adc_pga_gain, 0, 100, 0);
|
static const DECLARE_TLV_DB_SCALE(tlv_adc_pga_gain, 0, 100, 0);
|
||||||
static const DECLARE_TLV_DB_SCALE(tlv_ch_digital_vol, -11925,75,0);
|
static const DECLARE_TLV_DB_SCALE(tlv_ch_digital_vol, -11925,75,0);
|
||||||
|
@ -463,6 +469,7 @@ static int snd_ac108_put_volsw(struct snd_kcontrol *kcontrol,
|
||||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, chip) }
|
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, chip) }
|
||||||
|
|
||||||
static const struct snd_kcontrol_new ac108_snd_controls[] = {
|
static const struct snd_kcontrol_new ac108_snd_controls[] = {
|
||||||
|
/* ### chip 0 ### */
|
||||||
/*0x70: ADC1 Digital Channel Volume Control Register*/
|
/*0x70: ADC1 Digital Channel Volume Control Register*/
|
||||||
SOC_AC108_SINGLE_TLV("CH1 digital volume", ADC1_DVOL_CTRL, 0, 0xff, 0, 0, tlv_ch_digital_vol),
|
SOC_AC108_SINGLE_TLV("CH1 digital volume", ADC1_DVOL_CTRL, 0, 0xff, 0, 0, tlv_ch_digital_vol),
|
||||||
/*0x71: ADC2 Digital Channel Volume Control Register*/
|
/*0x71: ADC2 Digital Channel Volume Control Register*/
|
||||||
|
@ -472,6 +479,16 @@ static const struct snd_kcontrol_new ac108_snd_controls[] = {
|
||||||
/*0x73: ADC4 Digital Channel Volume Control Register*/
|
/*0x73: ADC4 Digital Channel Volume Control Register*/
|
||||||
SOC_AC108_SINGLE_TLV("CH4 digital volume", ADC4_DVOL_CTRL, 0, 0xff, 0, 0, tlv_ch_digital_vol),
|
SOC_AC108_SINGLE_TLV("CH4 digital volume", ADC4_DVOL_CTRL, 0, 0xff, 0, 0, tlv_ch_digital_vol),
|
||||||
|
|
||||||
|
/*0x90: Analog PGA1 Control Register*/
|
||||||
|
SOC_AC108_SINGLE_TLV("ADC1 PGA gain", ANA_PGA1_CTRL, ADC1_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
||||||
|
/*0x91: Analog PGA2 Control Register*/
|
||||||
|
SOC_AC108_SINGLE_TLV("ADC2 PGA gain", ANA_PGA2_CTRL, ADC2_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
||||||
|
/*0x92: Analog PGA3 Control Register*/
|
||||||
|
SOC_AC108_SINGLE_TLV("ADC3 PGA gain", ANA_PGA3_CTRL, ADC3_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
||||||
|
/*0x93: Analog PGA4 Control Register*/
|
||||||
|
SOC_AC108_SINGLE_TLV("ADC4 PGA gain", ANA_PGA4_CTRL, ADC4_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
||||||
|
|
||||||
|
/* ### chip 1 ### */
|
||||||
/*0x70: ADC1 Digital Channel Volume Control Register*/
|
/*0x70: ADC1 Digital Channel Volume Control Register*/
|
||||||
SOC_AC108_SINGLE_TLV("CH5 digital volume", ADC1_DVOL_CTRL, 0, 0xff, 0, 1, tlv_ch_digital_vol),
|
SOC_AC108_SINGLE_TLV("CH5 digital volume", ADC1_DVOL_CTRL, 0, 0xff, 0, 1, tlv_ch_digital_vol),
|
||||||
/*0x71: ADC2 Digital Channel Volume Control Register*/
|
/*0x71: ADC2 Digital Channel Volume Control Register*/
|
||||||
|
@ -481,14 +498,6 @@ static const struct snd_kcontrol_new ac108_snd_controls[] = {
|
||||||
/*0x73: ADC4 Digital Channel Volume Control Register*/
|
/*0x73: ADC4 Digital Channel Volume Control Register*/
|
||||||
SOC_AC108_SINGLE_TLV("CH8 digital volume", ADC4_DVOL_CTRL, 0, 0xff, 0, 1, tlv_ch_digital_vol),
|
SOC_AC108_SINGLE_TLV("CH8 digital volume", ADC4_DVOL_CTRL, 0, 0xff, 0, 1, tlv_ch_digital_vol),
|
||||||
|
|
||||||
/*0x90: Analog PGA1 Control Register*/
|
|
||||||
SOC_AC108_SINGLE_TLV("ADC1 PGA gain", ANA_PGA1_CTRL, ADC1_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
|
||||||
/*0x91: Analog PGA2 Control Register*/
|
|
||||||
SOC_AC108_SINGLE_TLV("ADC2 PGA gain", ANA_PGA2_CTRL, ADC2_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
|
||||||
/*0x92: Analog PGA3 Control Register*/
|
|
||||||
SOC_AC108_SINGLE_TLV("ADC3 PGA gain", ANA_PGA3_CTRL, ADC3_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
|
||||||
/*0x93: Analog PGA4 Control Register*/
|
|
||||||
SOC_AC108_SINGLE_TLV("ADC4 PGA gain", ANA_PGA4_CTRL, ADC4_ANALOG_PGA, 0x1f, 0, 0, tlv_adc_pga_gain),
|
|
||||||
/*0x90: Analog PGA1 Control Register*/
|
/*0x90: Analog PGA1 Control Register*/
|
||||||
SOC_AC108_SINGLE_TLV("ADC5 PGA gain", ANA_PGA1_CTRL, ADC1_ANALOG_PGA, 0x1f, 0, 1, tlv_adc_pga_gain),
|
SOC_AC108_SINGLE_TLV("ADC5 PGA gain", ANA_PGA1_CTRL, ADC1_ANALOG_PGA, 0x1f, 0, 1, tlv_adc_pga_gain),
|
||||||
/*0x91: Analog PGA2 Control Register*/
|
/*0x91: Analog PGA2 Control Register*/
|
||||||
|
@ -631,8 +640,6 @@ static const struct snd_soc_dapm_widget ac108_dapm_widgets[] = {
|
||||||
/*0x62:Digital MIC Enable Register*/
|
/*0x62:Digital MIC Enable Register*/
|
||||||
SND_SOC_DAPM_MICBIAS("DMIC1 enable", DMIC_EN, 0, 0),
|
SND_SOC_DAPM_MICBIAS("DMIC1 enable", DMIC_EN, 0, 0),
|
||||||
SND_SOC_DAPM_MICBIAS("DMIC2 enable", DMIC_EN, 1, 0),
|
SND_SOC_DAPM_MICBIAS("DMIC2 enable", DMIC_EN, 1, 0),
|
||||||
|
|
||||||
/**/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_dapm_route ac108_dapm_routes[] = {
|
static const struct snd_soc_dapm_route ac108_dapm_routes[] = {
|
||||||
|
@ -860,20 +867,61 @@ static int ac108_configure_clocking(struct ac108_priv *ac108, unsigned int rate)
|
||||||
static int ac108_multi_chips_slots(struct ac108_priv *ac, int slots) {
|
static int ac108_multi_chips_slots(struct ac108_priv *ac, int slots) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* codec0 enable slots 1,2,3,4
|
/*
|
||||||
* codec1 enable slots 5,6,7,8 etc
|
* codec0 enable slots 2,3,0,1 when 1 codec
|
||||||
|
*
|
||||||
|
* codec0 enable slots 6,7,0,1 when 2 codec
|
||||||
|
* codec1 enable slots 2,3,4,5
|
||||||
|
*
|
||||||
|
* ...
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < ac->codec_index; i++) {
|
for (i = 0; i < ac->codec_index; i++) {
|
||||||
|
const unsigned vec_mask[] = {
|
||||||
|
0x3 << 6 | 0x3, // slots 6,7,0,1
|
||||||
|
0xF << 2, // slots 2,3,4,5
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
const unsigned vec_maps[] = {
|
||||||
|
/*
|
||||||
|
* chip 0,
|
||||||
|
* mic 0 sample -> slot 6
|
||||||
|
* mic 1 sample -> slot 7
|
||||||
|
* mic 2 sample -> slot 0
|
||||||
|
* mic 3 sample -> slot 1
|
||||||
|
*/
|
||||||
|
0x0 << 12 | 0x1 << 14 | 0x2 << 0 | 0x3 << 2,
|
||||||
|
/*
|
||||||
|
* chip 1,
|
||||||
|
* mic 0 sample -> slot 2
|
||||||
|
* mic 1 sample -> slot 3
|
||||||
|
* mic 2 sample -> slot 4
|
||||||
|
* mic 3 sample -> slot 5
|
||||||
|
*/
|
||||||
|
0x0 << 4 | 0x1 << 6 | 0x2 << 8 | 0x3 << 10,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
};
|
||||||
unsigned vec;
|
unsigned vec;
|
||||||
|
|
||||||
/* 0x38-0x3A I2S_TX1_CTRLx */
|
/* 0x38-0x3A I2S_TX1_CTRLx */
|
||||||
vec = 0xFUL << (i << 2);
|
/* rotate map, due to channels rotated by CPU_DAI */
|
||||||
|
if (ac->codec_index == 1) {
|
||||||
|
vec = 0xFUL;
|
||||||
|
} else {
|
||||||
|
vec = vec_mask[i];
|
||||||
|
}
|
||||||
ac108_write(I2S_TX1_CTRL1, slots - 1, ac->i2c[i]);
|
ac108_write(I2S_TX1_CTRL1, slots - 1, ac->i2c[i]);
|
||||||
ac108_write(I2S_TX1_CTRL2, (vec >> 0) & 0xFF, ac->i2c[i]);
|
ac108_write(I2S_TX1_CTRL2, (vec >> 0) & 0xFF, ac->i2c[i]);
|
||||||
ac108_write(I2S_TX1_CTRL3, (vec >> 8) & 0xFF, ac->i2c[i]);
|
ac108_write(I2S_TX1_CTRL3, (vec >> 8) & 0xFF, ac->i2c[i]);
|
||||||
|
|
||||||
/* 0x3C-0x3F I2S_TX1_CHMP_CTRLx */
|
/* 0x3C-0x3F I2S_TX1_CHMP_CTRLx */
|
||||||
vec = (0x0 << 0 | 0x1 << 2 | 0x2 << 4 | 0x3 << 6) << (i << 3);
|
if (ac->codec_index == 1) {
|
||||||
|
vec = (0x2 << 0 | 0x3 << 2 | 0x0 << 4 | 0x1 << 6);
|
||||||
|
} else if (ac->codec_index == 2) {
|
||||||
|
vec = vec_maps[i];
|
||||||
|
}
|
||||||
|
|
||||||
ac108_write(I2S_TX1_CHMP_CTRL1, (vec >> 0) & 0xFF, ac->i2c[i]);
|
ac108_write(I2S_TX1_CHMP_CTRL1, (vec >> 0) & 0xFF, ac->i2c[i]);
|
||||||
ac108_write(I2S_TX1_CHMP_CTRL2, (vec >> 8) & 0xFF, ac->i2c[i]);
|
ac108_write(I2S_TX1_CHMP_CTRL2, (vec >> 8) & 0xFF, ac->i2c[i]);
|
||||||
ac108_write(I2S_TX1_CHMP_CTRL3, (vec >> 16) & 0xFF, ac->i2c[i]);
|
ac108_write(I2S_TX1_CHMP_CTRL3, (vec >> 16) & 0xFF, ac->i2c[i]);
|
||||||
|
@ -1064,8 +1112,8 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
|
||||||
|
|
||||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||||
case SND_SOC_DAIFMT_CBM_CFM: /*AC108 Master*/
|
case SND_SOC_DAIFMT_CBM_CFM: /*AC108 Master*/
|
||||||
|
if (ac108->tdm_chips_cnt < 2) {
|
||||||
dev_dbg(dai->dev, "AC108 set to work as Master\n");
|
dev_dbg(dai->dev, "AC108 set to work as Master\n");
|
||||||
#if 0
|
|
||||||
/**
|
/**
|
||||||
* 0x30:chip is master mode ,BCLK & LRCK output
|
* 0x30:chip is master mode ,BCLK & LRCK output
|
||||||
*/
|
*/
|
||||||
|
@ -1074,7 +1122,10 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
|
||||||
/* multi_chips: only one chip set as Master, and the others also need to set as Slave */
|
/* multi_chips: only one chip set as Master, and the others also need to set as Slave */
|
||||||
ac108_update_bits(I2S_CTRL, 0x3 << LRCK_IOEN, 0x2 << LRCK_IOEN, ac108->i2c[_MASTER_INDEX]);
|
ac108_update_bits(I2S_CTRL, 0x3 << LRCK_IOEN, 0x2 << LRCK_IOEN, ac108->i2c[_MASTER_INDEX]);
|
||||||
break;
|
break;
|
||||||
#endif
|
} else {
|
||||||
|
/* TODO: Both cpu_dai and codec_dai(AC108) be set as slave in DTS */
|
||||||
|
dev_dbg(dai->dev, "used as slave when AC101 is master\n");
|
||||||
|
}
|
||||||
case SND_SOC_DAIFMT_CBS_CFS: /*AC108 Slave*/
|
case SND_SOC_DAIFMT_CBS_CFS: /*AC108 Slave*/
|
||||||
dev_dbg(dai->dev, "AC108 set to work as Slave\n");
|
dev_dbg(dai->dev, "AC108 set to work as Slave\n");
|
||||||
/**
|
/**
|
||||||
|
@ -1148,6 +1199,14 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
|
||||||
pr_err("AC108 config BCLK/LRCLK polarity error:%u\n\n", (fmt & SND_SOC_DAIFMT_INV_MASK) >> 8);
|
pr_err("AC108 config BCLK/LRCLK polarity error:%u\n\n", (fmt & SND_SOC_DAIFMT_INV_MASK) >> 8);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* revert LRCK polarity if it's single chip (master mode) */
|
||||||
|
if (ac108->tdm_chips_cnt < 2) {
|
||||||
|
lrck_polarity = (lrck_polarity == LRCK_LEFT_HIGH_RIGHT_LOW)?
|
||||||
|
LRCK_LEFT_LOW_RIGHT_HIGH: LRCK_LEFT_HIGH_RIGHT_LOW;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
ac108_configure_power(ac108);
|
ac108_configure_power(ac108);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1358,10 +1417,15 @@ static struct snd_soc_dai_driver *ac108_dai[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ac108_add_widgets(struct snd_soc_codec *codec) {
|
static int ac108_add_widgets(struct snd_soc_codec *codec) {
|
||||||
|
struct ac108_priv *ac108 = snd_soc_codec_get_drvdata(codec);
|
||||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||||
|
int ctrl_cnt = ARRAY_SIZE(ac108_snd_controls);
|
||||||
|
|
||||||
snd_soc_add_codec_controls(codec, ac108_snd_controls,
|
/* only register controls correspond to exist chips */
|
||||||
ARRAY_SIZE(ac108_snd_controls));
|
if (ac108->tdm_chips_cnt < 2) {
|
||||||
|
ctrl_cnt /= 2;
|
||||||
|
}
|
||||||
|
snd_soc_add_codec_controls(codec, ac108_snd_controls, ctrl_cnt);
|
||||||
|
|
||||||
snd_soc_dapm_new_controls(dapm, ac108_dapm_widgets,
|
snd_soc_dapm_new_controls(dapm, ac108_dapm_widgets,
|
||||||
ARRAY_SIZE(ac108_dapm_widgets));
|
ARRAY_SIZE(ac108_dapm_widgets));
|
||||||
|
@ -1508,19 +1572,25 @@ static int ac108_i2c_probe(struct i2c_client *i2c,
|
||||||
}
|
}
|
||||||
ac108->data_protocol = val;
|
ac108->data_protocol = val;
|
||||||
|
|
||||||
/*Writing this register 0x12 resets all register to their default state.*/
|
ret = of_property_read_u32(np, "tdm-chips-count", &val);
|
||||||
|
if (ret) {
|
||||||
|
val = 1;
|
||||||
|
}
|
||||||
|
ac108->tdm_chips_cnt = val;
|
||||||
|
|
||||||
|
/* Writing this register with 0x12 will resets all register to their default state. */
|
||||||
ac108_write(CHIP_RST, CHIP_RST_VAL, i2c);
|
ac108_write(CHIP_RST, CHIP_RST_VAL, i2c);
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
|
||||||
pr_err(" i2c_id number : %d\n", (int)(i2c_id->driver_data));
|
pr_err(" i2c_id number : %d\n", (int)(i2c_id->driver_data));
|
||||||
pr_err(" ac108 codec_index : %d\n", ac108->codec_index);
|
pr_err(" ac108 codec_index : %d\n", ac108->codec_index);
|
||||||
pr_err(" ac108 I2S data protocol type :%d\n", ac108->data_protocol);
|
pr_err(" ac108 data protocol: %d\n", ac108->data_protocol);
|
||||||
|
|
||||||
ac108->i2c[i2c_id->driver_data] = i2c;
|
ac108->i2c[i2c_id->driver_data] = i2c;
|
||||||
ac108->codec_index++;
|
ac108->codec_index++;
|
||||||
|
|
||||||
/* we need i2c[0] && i2c[1], codec bind with i2c[_MASTER_INDEX] */
|
/* when all i2c prepared, we bind codec to i2c[_MASTER_INDEX] */
|
||||||
if (ac108->codec_index == 2) {
|
if (ac108->codec_index == ac108->tdm_chips_cnt) {
|
||||||
ret = snd_soc_register_codec(&ac108->i2c[_MASTER_INDEX]->dev, &ac108_soc_codec_driver,
|
ret = snd_soc_register_codec(&ac108->i2c[_MASTER_INDEX]->dev, &ac108_soc_codec_driver,
|
||||||
ac108_dai[_MASTER_INDEX], 1);
|
ac108_dai[_MASTER_INDEX], 1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
|
|
||||||
simple-audio-card,bitclock-master = <&codec_dai>;
|
simple-audio-card,bitclock-master = <&codec_dai>;
|
||||||
simple-audio-card,frame-master = <&codec_dai>;
|
simple-audio-card,frame-master = <&codec_dai>;
|
||||||
simple-audio-card,channels-playback-override = <2>;
|
simple-audio-card,channels-playback-override = <4>;
|
||||||
simple-audio-card,channels-capture-override = <4>;
|
simple-audio-card,channels-capture-override = <4>;
|
||||||
|
|
||||||
cpu_dai: simple-audio-card,cpu {
|
cpu_dai: simple-audio-card,cpu {
|
||||||
|
|
Binary file not shown.
|
@ -58,6 +58,7 @@
|
||||||
reg = <0x35>;
|
reg = <0x35>;
|
||||||
#sound-dai-cells = <0>;
|
#sound-dai-cells = <0>;
|
||||||
data-protocol = <0>;
|
data-protocol = <0>;
|
||||||
|
tdm-chips-count = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ac108_b: ac108@3b{
|
ac108_b: ac108@3b{
|
||||||
|
@ -65,6 +66,7 @@
|
||||||
reg = <0x3b>;
|
reg = <0x3b>;
|
||||||
#sound-dai-cells = <0>;
|
#sound-dai-cells = <0>;
|
||||||
data-protocol = <0>;
|
data-protocol = <0>;
|
||||||
|
tdm-chips-count = <2>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -81,6 +83,7 @@
|
||||||
|
|
||||||
simple-audio-card,dai-link@0 {
|
simple-audio-card,dai-link@0 {
|
||||||
format = "dsp_a";
|
format = "dsp_a";
|
||||||
|
/* below is dummy master, real clock master is ac101 */
|
||||||
bitclock-master = <&codec0_dai>;
|
bitclock-master = <&codec0_dai>;
|
||||||
frame-master = <&codec0_dai>;
|
frame-master = <&codec0_dai>;
|
||||||
|
|
||||||
|
@ -93,7 +96,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
codec0_dai: codec {
|
codec0_dai: codec {
|
||||||
sound-dai = <&ac108_b>;
|
sound-dai = <&ac108_a>;
|
||||||
clocks = <&ac10x_mclk>;
|
clocks = <&ac10x_mclk>;
|
||||||
system-clock-id = <1>;
|
system-clock-id = <1>;
|
||||||
};
|
};
|
||||||
|
|
Binary file not shown.
|
@ -195,7 +195,13 @@ err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ac10x_start_clock(void);
|
static int (* _start_clock)(void);
|
||||||
|
|
||||||
|
int register_start_clock(int (*start_clock)(void)) {
|
||||||
|
_start_clock = start_clock;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(register_start_clock);
|
||||||
|
|
||||||
static int asoc_simple_card_trigger(struct snd_pcm_substream *substream, int cmd)
|
static int asoc_simple_card_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||||
{
|
{
|
||||||
|
@ -208,7 +214,7 @@ static int asoc_simple_card_trigger(struct snd_pcm_substream *substream, int cmd
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||||
ac10x_start_clock();
|
if (_start_clock) _start_clock();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
|
@ -514,14 +520,12 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
|
||||||
priv->snd_card.num_links = num;
|
priv->snd_card.num_links = num;
|
||||||
|
|
||||||
if (np && of_device_is_available(np)) {
|
if (np && of_device_is_available(np)) {
|
||||||
|
|
||||||
ret = asoc_simple_card_parse_of(np, priv);
|
ret = asoc_simple_card_parse_of(np, priv);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (ret != -EPROBE_DEFER)
|
if (ret != -EPROBE_DEFER)
|
||||||
dev_err(dev, "parse error %d\n", ret);
|
dev_err(dev, "parse error %d\n", ret);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
struct asoc_simple_card_info *cinfo;
|
struct asoc_simple_card_info *cinfo;
|
||||||
|
|
||||||
|
|
72
snd-soc-ac101.mod.c
Normal file
72
snd-soc-ac101.mod.c
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/vermagic.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
MODULE_INFO(vermagic, VERMAGIC_STRING);
|
||||||
|
|
||||||
|
__visible struct module __this_module
|
||||||
|
__attribute__((section(".gnu.linkonce.this_module"))) = {
|
||||||
|
.name = KBUILD_MODNAME,
|
||||||
|
.init = init_module,
|
||||||
|
#ifdef CONFIG_MODULE_UNLOAD
|
||||||
|
.exit = cleanup_module,
|
||||||
|
#endif
|
||||||
|
.arch = MODULE_ARCH_INIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct modversion_info ____versions[]
|
||||||
|
__used
|
||||||
|
__attribute__((section("__versions"))) = {
|
||||||
|
{ 0xdb0d8ebc, __VMLINUX_SYMBOL_STR(module_layout) },
|
||||||
|
{ 0x2d3385d3, __VMLINUX_SYMBOL_STR(system_wq) },
|
||||||
|
{ 0xf9a482f9, __VMLINUX_SYMBOL_STR(msleep) },
|
||||||
|
{ 0x2e5810c6, __VMLINUX_SYMBOL_STR(__aeabi_unwind_cpp_pr1) },
|
||||||
|
{ 0xd9ead207, __VMLINUX_SYMBOL_STR(i2c_del_driver) },
|
||||||
|
{ 0x1c9ec9e6, __VMLINUX_SYMBOL_STR(regulator_disable) },
|
||||||
|
{ 0x6b06fdce, __VMLINUX_SYMBOL_STR(delayed_work_timer_fn) },
|
||||||
|
{ 0x70139129, __VMLINUX_SYMBOL_STR(snd_soc_add_codec_controls) },
|
||||||
|
{ 0xb1ad28e0, __VMLINUX_SYMBOL_STR(__gnu_mcount_nc) },
|
||||||
|
{ 0x8fdf772a, __VMLINUX_SYMBOL_STR(init_timer_key) },
|
||||||
|
{ 0x2f1f8f20, __VMLINUX_SYMBOL_STR(mutex_unlock) },
|
||||||
|
{ 0xcb5daba2, __VMLINUX_SYMBOL_STR(snd_soc_put_volsw) },
|
||||||
|
{ 0xe1250b50, __VMLINUX_SYMBOL_STR(regmap_read) },
|
||||||
|
{ 0x66da0eca, __VMLINUX_SYMBOL_STR(snd_soc_get_volsw) },
|
||||||
|
{ 0xb1ea493e, __VMLINUX_SYMBOL_STR(sysfs_remove_group) },
|
||||||
|
{ 0x84e40310, __VMLINUX_SYMBOL_STR(register_start_clock) },
|
||||||
|
{ 0xe707d823, __VMLINUX_SYMBOL_STR(__aeabi_uidiv) },
|
||||||
|
{ 0xe872d1ce, __VMLINUX_SYMBOL_STR(snd_soc_read) },
|
||||||
|
{ 0x1b55d4fa, __VMLINUX_SYMBOL_STR(dev_err) },
|
||||||
|
{ 0xf090eadf, __VMLINUX_SYMBOL_STR(__mutex_init) },
|
||||||
|
{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
|
||||||
|
{ 0x19d3b7d8, __VMLINUX_SYMBOL_STR(sysfs_create_group) },
|
||||||
|
{ 0xac92dc30, __VMLINUX_SYMBOL_STR(snd_soc_update_bits) },
|
||||||
|
{ 0xb729ab40, __VMLINUX_SYMBOL_STR(regulator_bulk_get) },
|
||||||
|
{ 0x9138e27f, __VMLINUX_SYMBOL_STR(mutex_lock) },
|
||||||
|
{ 0x94680ad3, __VMLINUX_SYMBOL_STR(snd_soc_info_volsw) },
|
||||||
|
{ 0xf204b815, __VMLINUX_SYMBOL_STR(i2c_register_driver) },
|
||||||
|
{ 0x85d472aa, __VMLINUX_SYMBOL_STR(queue_delayed_work_on) },
|
||||||
|
{ 0xff227eee, __VMLINUX_SYMBOL_STR(__devm_regmap_init_i2c) },
|
||||||
|
{ 0xee9ce628, __VMLINUX_SYMBOL_STR(snd_soc_unregister_codec) },
|
||||||
|
{ 0xbeea083, __VMLINUX_SYMBOL_STR(devm_gpiod_get_optional) },
|
||||||
|
{ 0x37a0cba, __VMLINUX_SYMBOL_STR(kfree) },
|
||||||
|
{ 0x3b045959, __VMLINUX_SYMBOL_STR(regulator_put) },
|
||||||
|
{ 0xb742fd7, __VMLINUX_SYMBOL_STR(simple_strtol) },
|
||||||
|
{ 0xb2d48a2e, __VMLINUX_SYMBOL_STR(queue_work_on) },
|
||||||
|
{ 0x103b85f7, __VMLINUX_SYMBOL_STR(snd_soc_register_codec) },
|
||||||
|
{ 0x5445472c, __VMLINUX_SYMBOL_STR(gpiod_set_value) },
|
||||||
|
{ 0x40c57909, __VMLINUX_SYMBOL_STR(devm_kmalloc) },
|
||||||
|
{ 0xad83053c, __VMLINUX_SYMBOL_STR(regcache_sync) },
|
||||||
|
{ 0x99b90480, __VMLINUX_SYMBOL_STR(regcache_cache_only) },
|
||||||
|
{ 0x3f14810b, __VMLINUX_SYMBOL_STR(regulator_enable) },
|
||||||
|
{ 0x44c19f83, __VMLINUX_SYMBOL_STR(snd_soc_write) },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char __module_depends[]
|
||||||
|
__used
|
||||||
|
__attribute__((section(".modinfo"))) =
|
||||||
|
"depends=snd-soc-core,snd-soc-simple-card";
|
||||||
|
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac101");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac101C*");
|
||||||
|
|
||||||
|
MODULE_INFO(srcversion, "D993030BC9B6E1FB4EEB3FC");
|
68
snd-soc-ac108.mod.c
Normal file
68
snd-soc-ac108.mod.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/vermagic.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
MODULE_INFO(vermagic, VERMAGIC_STRING);
|
||||||
|
|
||||||
|
__visible struct module __this_module
|
||||||
|
__attribute__((section(".gnu.linkonce.this_module"))) = {
|
||||||
|
.name = KBUILD_MODNAME,
|
||||||
|
.init = init_module,
|
||||||
|
#ifdef CONFIG_MODULE_UNLOAD
|
||||||
|
.exit = cleanup_module,
|
||||||
|
#endif
|
||||||
|
.arch = MODULE_ARCH_INIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct modversion_info ____versions[]
|
||||||
|
__used
|
||||||
|
__attribute__((section("__versions"))) = {
|
||||||
|
{ 0xdb0d8ebc, __VMLINUX_SYMBOL_STR(module_layout) },
|
||||||
|
{ 0x2d3385d3, __VMLINUX_SYMBOL_STR(system_wq) },
|
||||||
|
{ 0x7ace506a, __VMLINUX_SYMBOL_STR(i2c_master_send) },
|
||||||
|
{ 0xf9a482f9, __VMLINUX_SYMBOL_STR(msleep) },
|
||||||
|
{ 0x2e5810c6, __VMLINUX_SYMBOL_STR(__aeabi_unwind_cpp_pr1) },
|
||||||
|
{ 0xd9ead207, __VMLINUX_SYMBOL_STR(i2c_del_driver) },
|
||||||
|
{ 0xabdbe515, __VMLINUX_SYMBOL_STR(dev_printk) },
|
||||||
|
{ 0xf7802486, __VMLINUX_SYMBOL_STR(__aeabi_uidivmod) },
|
||||||
|
{ 0x6b06fdce, __VMLINUX_SYMBOL_STR(delayed_work_timer_fn) },
|
||||||
|
{ 0x70139129, __VMLINUX_SYMBOL_STR(snd_soc_add_codec_controls) },
|
||||||
|
{ 0xb1ad28e0, __VMLINUX_SYMBOL_STR(__gnu_mcount_nc) },
|
||||||
|
{ 0xb7051343, __VMLINUX_SYMBOL_STR(snd_soc_dapm_new_controls) },
|
||||||
|
{ 0x8fdf772a, __VMLINUX_SYMBOL_STR(init_timer_key) },
|
||||||
|
{ 0x82108f90, __VMLINUX_SYMBOL_STR(snd_soc_dapm_add_routes) },
|
||||||
|
{ 0xe707d823, __VMLINUX_SYMBOL_STR(__aeabi_uidiv) },
|
||||||
|
{ 0xfa2a45e, __VMLINUX_SYMBOL_STR(__memzero) },
|
||||||
|
{ 0x1b55d4fa, __VMLINUX_SYMBOL_STR(dev_err) },
|
||||||
|
{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
|
||||||
|
{ 0x19d3b7d8, __VMLINUX_SYMBOL_STR(sysfs_create_group) },
|
||||||
|
{ 0x94680ad3, __VMLINUX_SYMBOL_STR(snd_soc_info_volsw) },
|
||||||
|
{ 0xf204b815, __VMLINUX_SYMBOL_STR(i2c_register_driver) },
|
||||||
|
{ 0x85d472aa, __VMLINUX_SYMBOL_STR(queue_delayed_work_on) },
|
||||||
|
{ 0x31475f0c, __VMLINUX_SYMBOL_STR(i2c_master_recv) },
|
||||||
|
{ 0xee9ce628, __VMLINUX_SYMBOL_STR(snd_soc_unregister_codec) },
|
||||||
|
{ 0xb742fd7, __VMLINUX_SYMBOL_STR(simple_strtol) },
|
||||||
|
{ 0xc5844d6f, __VMLINUX_SYMBOL_STR(of_property_read_variable_u32_array) },
|
||||||
|
{ 0x103b85f7, __VMLINUX_SYMBOL_STR(snd_soc_register_codec) },
|
||||||
|
{ 0x40c57909, __VMLINUX_SYMBOL_STR(devm_kmalloc) },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char __module_depends[]
|
||||||
|
__used
|
||||||
|
__attribute__((section(".modinfo"))) =
|
||||||
|
"depends=snd-soc-core";
|
||||||
|
|
||||||
|
MODULE_ALIAS("i2c:ac108_0");
|
||||||
|
MODULE_ALIAS("i2c:ac108_1");
|
||||||
|
MODULE_ALIAS("i2c:ac108_2");
|
||||||
|
MODULE_ALIAS("i2c:ac108_3");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_0");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_0C*");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_1");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_1C*");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_2");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_2C*");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_3");
|
||||||
|
MODULE_ALIAS("of:N*T*Cx-power,ac108_3C*");
|
||||||
|
|
||||||
|
MODULE_INFO(srcversion, "8ED7730CCF1BF1674A70161");
|
69
snd-soc-simple-card.mod.c
Normal file
69
snd-soc-simple-card.mod.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/vermagic.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
MODULE_INFO(vermagic, VERMAGIC_STRING);
|
||||||
|
|
||||||
|
__visible struct module __this_module
|
||||||
|
__attribute__((section(".gnu.linkonce.this_module"))) = {
|
||||||
|
.name = KBUILD_MODNAME,
|
||||||
|
.init = init_module,
|
||||||
|
#ifdef CONFIG_MODULE_UNLOAD
|
||||||
|
.exit = cleanup_module,
|
||||||
|
#endif
|
||||||
|
.arch = MODULE_ARCH_INIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct modversion_info ____versions[]
|
||||||
|
__used
|
||||||
|
__attribute__((section("__versions"))) = {
|
||||||
|
{ 0xdb0d8ebc, __VMLINUX_SYMBOL_STR(module_layout) },
|
||||||
|
{ 0xb077e70a, __VMLINUX_SYMBOL_STR(clk_unprepare) },
|
||||||
|
{ 0x8fc5dfb7, __VMLINUX_SYMBOL_STR(devm_snd_soc_register_card) },
|
||||||
|
{ 0x815588a6, __VMLINUX_SYMBOL_STR(clk_enable) },
|
||||||
|
{ 0xbcfd140b, __VMLINUX_SYMBOL_STR(asoc_simple_card_canonicalize_dailink) },
|
||||||
|
{ 0x2733a62b, __VMLINUX_SYMBOL_STR(snd_soc_of_parse_audio_simple_widgets) },
|
||||||
|
{ 0x2e5810c6, __VMLINUX_SYMBOL_STR(__aeabi_unwind_cpp_pr1) },
|
||||||
|
{ 0xc3f4c05, __VMLINUX_SYMBOL_STR(asoc_simple_card_canonicalize_cpu) },
|
||||||
|
{ 0x3dd3f751, __VMLINUX_SYMBOL_STR(of_parse_phandle) },
|
||||||
|
{ 0xb9e26d37, __VMLINUX_SYMBOL_STR(asoc_simple_card_clean_reference) },
|
||||||
|
{ 0x870fc8b2, __VMLINUX_SYMBOL_STR(snd_soc_pm_ops) },
|
||||||
|
{ 0xb6e6d99d, __VMLINUX_SYMBOL_STR(clk_disable) },
|
||||||
|
{ 0xb1ad28e0, __VMLINUX_SYMBOL_STR(__gnu_mcount_nc) },
|
||||||
|
{ 0x88dc7e6f, __VMLINUX_SYMBOL_STR(__platform_driver_register) },
|
||||||
|
{ 0x1b55d4fa, __VMLINUX_SYMBOL_STR(dev_err) },
|
||||||
|
{ 0x3199c87d, __VMLINUX_SYMBOL_STR(of_device_is_available) },
|
||||||
|
{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
|
||||||
|
{ 0x3e9d3734, __VMLINUX_SYMBOL_STR(of_find_property) },
|
||||||
|
{ 0x378c26fe, __VMLINUX_SYMBOL_STR(asoc_simple_card_set_dailink_name) },
|
||||||
|
{ 0xb9dc6bef, __VMLINUX_SYMBOL_STR(of_get_child_by_name) },
|
||||||
|
{ 0x848b1a5b, __VMLINUX_SYMBOL_STR(asoc_simple_card_init_dai) },
|
||||||
|
{ 0x42a0de39, __VMLINUX_SYMBOL_STR(asoc_simple_card_parse_clk) },
|
||||||
|
{ 0x94c40b85, __VMLINUX_SYMBOL_STR(asoc_simple_card_parse_daifmt) },
|
||||||
|
{ 0xe912cd9a, __VMLINUX_SYMBOL_STR(of_get_next_child) },
|
||||||
|
{ 0x7c9a7371, __VMLINUX_SYMBOL_STR(clk_prepare) },
|
||||||
|
{ 0x149259a, __VMLINUX_SYMBOL_STR(of_get_named_gpio_flags) },
|
||||||
|
{ 0xa6d8aaef, __VMLINUX_SYMBOL_STR(snd_soc_dai_set_sysclk) },
|
||||||
|
{ 0x4cce7249, __VMLINUX_SYMBOL_STR(snd_soc_of_parse_audio_routing) },
|
||||||
|
{ 0x48b6c9b2, __VMLINUX_SYMBOL_STR(snd_soc_card_jack_new) },
|
||||||
|
{ 0xd1b73339, __VMLINUX_SYMBOL_STR(snd_soc_jack_add_gpios) },
|
||||||
|
{ 0x5a371847, __VMLINUX_SYMBOL_STR(asoc_simple_card_parse_card_name) },
|
||||||
|
{ 0xb81960ca, __VMLINUX_SYMBOL_STR(snprintf) },
|
||||||
|
{ 0x63fbc1b9, __VMLINUX_SYMBOL_STR(snd_soc_jack_free_gpios) },
|
||||||
|
{ 0xfc01da1c, __VMLINUX_SYMBOL_STR(platform_driver_unregister) },
|
||||||
|
{ 0xc5844d6f, __VMLINUX_SYMBOL_STR(of_property_read_variable_u32_array) },
|
||||||
|
{ 0x973c1054, __VMLINUX_SYMBOL_STR(of_node_put) },
|
||||||
|
{ 0x40c57909, __VMLINUX_SYMBOL_STR(devm_kmalloc) },
|
||||||
|
{ 0x4716d13d, __VMLINUX_SYMBOL_STR(snd_soc_of_parse_tdm_slot) },
|
||||||
|
{ 0xee2335c2, __VMLINUX_SYMBOL_STR(asoc_simple_card_parse_dai) },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char __module_depends[]
|
||||||
|
__used
|
||||||
|
__attribute__((section(".modinfo"))) =
|
||||||
|
"depends=snd-soc-core,snd-soc-simple-card-utils";
|
||||||
|
|
||||||
|
MODULE_ALIAS("of:N*T*Csimple-audio-card");
|
||||||
|
MODULE_ALIAS("of:N*T*Csimple-audio-cardC*");
|
||||||
|
|
||||||
|
MODULE_INFO(srcversion, "4AD728D0E5FB89C88D04665");
|
74
snd-soc-wm8960.mod.c
Normal file
74
snd-soc-wm8960.mod.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/vermagic.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
MODULE_INFO(vermagic, VERMAGIC_STRING);
|
||||||
|
|
||||||
|
__visible struct module __this_module
|
||||||
|
__attribute__((section(".gnu.linkonce.this_module"))) = {
|
||||||
|
.name = KBUILD_MODNAME,
|
||||||
|
.init = init_module,
|
||||||
|
#ifdef CONFIG_MODULE_UNLOAD
|
||||||
|
.exit = cleanup_module,
|
||||||
|
#endif
|
||||||
|
.arch = MODULE_ARCH_INIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct modversion_info ____versions[]
|
||||||
|
__used
|
||||||
|
__attribute__((section("__versions"))) = {
|
||||||
|
{ 0xdb0d8ebc, __VMLINUX_SYMBOL_STR(module_layout) },
|
||||||
|
{ 0xb077e70a, __VMLINUX_SYMBOL_STR(clk_unprepare) },
|
||||||
|
{ 0xe56a9336, __VMLINUX_SYMBOL_STR(snd_pcm_format_width) },
|
||||||
|
{ 0xf9a482f9, __VMLINUX_SYMBOL_STR(msleep) },
|
||||||
|
{ 0xeb711ae7, __VMLINUX_SYMBOL_STR(snd_soc_params_to_bclk) },
|
||||||
|
{ 0x815588a6, __VMLINUX_SYMBOL_STR(clk_enable) },
|
||||||
|
{ 0x2e5810c6, __VMLINUX_SYMBOL_STR(__aeabi_unwind_cpp_pr1) },
|
||||||
|
{ 0xd9ead207, __VMLINUX_SYMBOL_STR(i2c_del_driver) },
|
||||||
|
{ 0xaa3b6018, __VMLINUX_SYMBOL_STR(snd_soc_dapm_get_volsw) },
|
||||||
|
{ 0x52eb2dc5, __VMLINUX_SYMBOL_STR(regmap_update_bits_base) },
|
||||||
|
{ 0xb6e6d99d, __VMLINUX_SYMBOL_STR(clk_disable) },
|
||||||
|
{ 0xf7802486, __VMLINUX_SYMBOL_STR(__aeabi_uidivmod) },
|
||||||
|
{ 0x70139129, __VMLINUX_SYMBOL_STR(snd_soc_add_codec_controls) },
|
||||||
|
{ 0xb1ad28e0, __VMLINUX_SYMBOL_STR(__gnu_mcount_nc) },
|
||||||
|
{ 0xb7051343, __VMLINUX_SYMBOL_STR(snd_soc_dapm_new_controls) },
|
||||||
|
{ 0xcb5daba2, __VMLINUX_SYMBOL_STR(snd_soc_put_volsw) },
|
||||||
|
{ 0x66da0eca, __VMLINUX_SYMBOL_STR(snd_soc_get_volsw) },
|
||||||
|
{ 0xe2d5255a, __VMLINUX_SYMBOL_STR(strcmp) },
|
||||||
|
{ 0x37dc1ecd, __VMLINUX_SYMBOL_STR(snd_soc_info_enum_double) },
|
||||||
|
{ 0x82108f90, __VMLINUX_SYMBOL_STR(snd_soc_dapm_add_routes) },
|
||||||
|
{ 0xe707d823, __VMLINUX_SYMBOL_STR(__aeabi_uidiv) },
|
||||||
|
{ 0xe872d1ce, __VMLINUX_SYMBOL_STR(snd_soc_read) },
|
||||||
|
{ 0x1b55d4fa, __VMLINUX_SYMBOL_STR(dev_err) },
|
||||||
|
{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
|
||||||
|
{ 0xac92dc30, __VMLINUX_SYMBOL_STR(snd_soc_update_bits) },
|
||||||
|
{ 0x3e9d3734, __VMLINUX_SYMBOL_STR(of_find_property) },
|
||||||
|
{ 0x8b4dfb4c, __VMLINUX_SYMBOL_STR(snd_soc_dapm_put_volsw) },
|
||||||
|
{ 0xa0195a8c, __VMLINUX_SYMBOL_STR(snd_ctl_boolean_mono_info) },
|
||||||
|
{ 0x2196324, __VMLINUX_SYMBOL_STR(__aeabi_idiv) },
|
||||||
|
{ 0x59e5070d, __VMLINUX_SYMBOL_STR(__do_div64) },
|
||||||
|
{ 0x94680ad3, __VMLINUX_SYMBOL_STR(snd_soc_info_volsw) },
|
||||||
|
{ 0xf204b815, __VMLINUX_SYMBOL_STR(i2c_register_driver) },
|
||||||
|
{ 0x34cffba9, __VMLINUX_SYMBOL_STR(snd_soc_get_enum_double) },
|
||||||
|
{ 0xff227eee, __VMLINUX_SYMBOL_STR(__devm_regmap_init_i2c) },
|
||||||
|
{ 0x7c9a7371, __VMLINUX_SYMBOL_STR(clk_prepare) },
|
||||||
|
{ 0x8c211eeb, __VMLINUX_SYMBOL_STR(devm_clk_get) },
|
||||||
|
{ 0xee9ce628, __VMLINUX_SYMBOL_STR(snd_soc_unregister_codec) },
|
||||||
|
{ 0xc98126c9, __VMLINUX_SYMBOL_STR(snd_soc_put_enum_double) },
|
||||||
|
{ 0x103b85f7, __VMLINUX_SYMBOL_STR(snd_soc_register_codec) },
|
||||||
|
{ 0x40c57909, __VMLINUX_SYMBOL_STR(devm_kmalloc) },
|
||||||
|
{ 0xd79caef6, __VMLINUX_SYMBOL_STR(regmap_write) },
|
||||||
|
{ 0xad83053c, __VMLINUX_SYMBOL_STR(regcache_sync) },
|
||||||
|
{ 0x44c19f83, __VMLINUX_SYMBOL_STR(snd_soc_write) },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char __module_depends[]
|
||||||
|
__used
|
||||||
|
__attribute__((section(".modinfo"))) =
|
||||||
|
"depends=snd-pcm,snd-soc-core,snd";
|
||||||
|
|
||||||
|
MODULE_ALIAS("i2c:wm8960");
|
||||||
|
MODULE_ALIAS("of:N*T*Cwlf,wm8960");
|
||||||
|
MODULE_ALIAS("of:N*T*Cwlf,wm8960C*");
|
||||||
|
|
||||||
|
MODULE_INFO(srcversion, "2690F666DC1933DEF3E5373");
|
Loading…
Reference in a new issue