Merge: ac108 work for 4mic & 8mic

This commit is contained in:
peter.yang 2018-02-05 10:45:55 +08:00
parent add8afa699
commit edb5a1da65
12 changed files with 417 additions and 66 deletions

38
ac101.c
View file

@ -19,6 +19,7 @@
* the License, or (at your option) any later version.
*
*/
#undef AC10X_DEBG
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
@ -64,7 +65,9 @@ static int adc_digital_val = 0;
static bool agc_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 | \
SNDRV_PCM_FMTBIT_S16_LE | \
SNDRV_PCM_FMTBIT_S18_3LE | \
@ -103,7 +106,6 @@ struct ac10x_priv {
struct work_struct codec_resume;
struct delayed_work dlywork;
int trgr_cnt;
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[] = {
{44100, 2, 7, _SERIES_22_579K},
{48000, 2, 8},
{8000, 12, 0},
{11025, 8, 1, _SERIES_22_579K},
{12000, 8, 2},
{16000, 6, 3},
{22050, 4, 4, _SERIES_22_579K},
{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},
};
@ -1303,8 +1305,6 @@ static int ac10x_hw_params(struct snd_pcm_substream *substream,
AC10X_DBG("%s() L%d +++\n", __func__, __LINE__);
ac10x->trgr_cnt = 0;
/* get channels count & slot size */
channels = params_channels(params);
@ -1585,17 +1585,16 @@ static void __ac10x_work_start_clock(struct work_struct *work) {
return;
}
int ac10x_start_clock(void) {
ac10x_aif1clk(static_ac10x->codec, SND_SOC_DAPM_PRE_PMU);
extern int register_start_clock(int (*start_clock)(void));
static int ac10x_start_clock(void) {
schedule_delayed_work(&static_ac10x->dlywork, msecs_to_jiffies(30));
return 0;
}
EXPORT_SYMBOL(ac10x_start_clock);
static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
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;
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_RESUME:
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_SUSPEND:
@ -1620,9 +1612,7 @@ static int ac10x_trigger(struct snd_pcm_substream *substream, int cmd,
default:
ret = -EINVAL;
}
return 0;
return ret;
}
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);
val = simple_strtol(buf, NULL, 16);
flag = (val >> 24) & 0xF;
if(flag) {//write
if(flag) {
reg = (val >> 16) & 0xFF;
value_w = val & 0xFFFF;
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->aifclk_mutex);
register_start_clock(ac10x_start_clock);
ac10x->num_supplies = ARRAY_SIZE(ac10x_supplies);
ac10x->supplies = devm_kzalloc(ac10x->codec->dev,
sizeof(struct regulator_bulk_data) *

View file

@ -424,7 +424,6 @@ struct spk_gpio {
u32 gpio;
bool used;
};
#define AC10X_DEBG
#ifdef AC10X_DEBG
#define AC10X_DBG(format,args...) printk("[AC101] "format,##args)
#else

142
ac108.c
View file

@ -8,7 +8,7 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define DEBUG
#undef DEBUG
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
@ -27,7 +27,7 @@
#include "ac108.h"
#define _USE_CAPTURE 0
#define _MASTER_INDEX 1
#define _MASTER_INDEX 0
/**
* TODO:
@ -56,6 +56,7 @@ struct ac108_priv {
unsigned char data_protocol;
struct delayed_work dlywork;
int trgr_cnt;
int tdm_chips_cnt;
};
static struct ac108_priv *ac108;
@ -165,8 +166,13 @@ static const struct pll_div ac108_pll_div_list[] = {
/* AC108 definition */
#define AC108_CHANNELS_MAX 16 /* range[1, 16] */
#define AC108_RATES (SNDRV_PCM_RATE_8000_96000 | SNDRV_PCM_RATE_KNOT)
#define AC108_FORMATS (/* SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |*/ SNDRV_PCM_FMTBIT_S32_LE)
#define AC108_RATES (SNDRV_PCM_RATE_8000_96000 & \
~(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_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) }
static const struct snd_kcontrol_new ac108_snd_controls[] = {
/* ### chip 0 ### */
/*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),
/*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*/
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*/
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*/
@ -481,14 +498,6 @@ static const struct snd_kcontrol_new ac108_snd_controls[] = {
/*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),
/*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*/
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*/
@ -631,8 +640,6 @@ static const struct snd_soc_dapm_widget ac108_dapm_widgets[] = {
/*0x62:Digital MIC Enable Register*/
SND_SOC_DAPM_MICBIAS("DMIC1 enable", DMIC_EN, 0, 0),
SND_SOC_DAPM_MICBIAS("DMIC2 enable", DMIC_EN, 1, 0),
/**/
};
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) {
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++) {
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;
/* 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_CTRL2, (vec >> 0) & 0xFF, ac->i2c[i]);
ac108_write(I2S_TX1_CTRL3, (vec >> 8) & 0xFF, ac->i2c[i]);
/* 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_CTRL2, (vec >> 8) & 0xFF, ac->i2c[i]);
ac108_write(I2S_TX1_CHMP_CTRL3, (vec >> 16) & 0xFF, ac->i2c[i]);
@ -1064,17 +1112,20 @@ static int ac108_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) {
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: /*AC108 Master*/
dev_dbg(dai->dev, "AC108 set to work as Master\n");
#if 0
/**
* 0x30:chip is master mode ,BCLK & LRCK output
*/
ac108_multi_chips_update_bits(I2S_CTRL, 0x03 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN,
if (ac108->tdm_chips_cnt < 2) {
dev_dbg(dai->dev, "AC108 set to work as Master\n");
/**
* 0x30:chip is master mode ,BCLK & LRCK output
*/
ac108_multi_chips_update_bits(I2S_CTRL, 0x03 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN,
0x00 << LRCK_IOEN | 0x03 << SDO1_EN | 0x1 << TXEN | 0x1 << GEN, ac108);
/* 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]);
break;
#endif
/* 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]);
break;
} 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*/
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);
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);
/**
@ -1358,10 +1417,15 @@ static struct snd_soc_dai_driver *ac108_dai[] = {
};
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);
int ctrl_cnt = ARRAY_SIZE(ac108_snd_controls);
snd_soc_add_codec_controls(codec, ac108_snd_controls,
ARRAY_SIZE(ac108_snd_controls));
/* only register controls correspond to exist chips */
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,
ARRAY_SIZE(ac108_dapm_widgets));
@ -1508,19 +1572,25 @@ static int ac108_i2c_probe(struct i2c_client *i2c,
}
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);
msleep(1);
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 I2S data protocol type :%d\n", ac108->data_protocol);
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 data protocol: %d\n", ac108->data_protocol);
ac108->i2c[i2c_id->driver_data] = i2c;
ac108->codec_index++;
/* we need i2c[0] && i2c[1], codec bind with i2c[_MASTER_INDEX] */
if (ac108->codec_index == 2) {
/* when all i2c prepared, we bind codec to i2c[_MASTER_INDEX] */
if (ac108->codec_index == ac108->tdm_chips_cnt) {
ret = snd_soc_register_codec(&ac108->i2c[_MASTER_INDEX]->dev, &ac108_soc_codec_driver,
ac108_dai[_MASTER_INDEX], 1);
if (ret < 0) {

View file

@ -51,7 +51,7 @@
simple-audio-card,bitclock-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>;
cpu_dai: simple-audio-card,cpu {

Binary file not shown.

View file

@ -58,6 +58,7 @@
reg = <0x35>;
#sound-dai-cells = <0>;
data-protocol = <0>;
tdm-chips-count = <2>;
};
ac108_b: ac108@3b{
@ -65,6 +66,7 @@
reg = <0x3b>;
#sound-dai-cells = <0>;
data-protocol = <0>;
tdm-chips-count = <2>;
};
};
};
@ -81,6 +83,7 @@
simple-audio-card,dai-link@0 {
format = "dsp_a";
/* below is dummy master, real clock master is ac101 */
bitclock-master = <&codec0_dai>;
frame-master = <&codec0_dai>;
@ -93,7 +96,7 @@
};
codec0_dai: codec {
sound-dai = <&ac108_b>;
sound-dai = <&ac108_a>;
clocks = <&ac10x_mclk>;
system-clock-id = <1>;
};

Binary file not shown.

View file

@ -195,7 +195,13 @@ err:
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)
{
@ -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_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
ac10x_start_clock();
if (_start_clock) _start_clock();
break;
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;
if (np && of_device_is_available(np)) {
ret = asoc_simple_card_parse_of(np, priv);
if (ret < 0) {
if (ret != -EPROBE_DEFER)
dev_err(dev, "parse error %d\n", ret);
goto err;
}
} else {
struct asoc_simple_card_info *cinfo;

72
snd-soc-ac101.mod.c Normal file
View 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
View 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
View 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
View 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");