diff --git a/ac101.c b/ac101.c index b82b566..f0ba56d 100644 --- a/ac101.c +++ b/ac101.c @@ -19,6 +19,7 @@ * the License, or (at your option) any later version. * */ +#undef AC10X_DEBG #include #include #include @@ -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) * diff --git a/ac101.h b/ac101.h index fb3f390..540773e 100644 --- a/ac101.h +++ b/ac101.h @@ -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 diff --git a/ac108.c b/ac108.c index 21f55b8..627de75 100644 --- a/ac108.c +++ b/ac108.c @@ -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 #include #include @@ -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) { diff --git a/seeed-4mic-voicecard-overlay.dts b/seeed-4mic-voicecard-overlay.dts index 32abf75..1c9ef66 100644 --- a/seeed-4mic-voicecard-overlay.dts +++ b/seeed-4mic-voicecard-overlay.dts @@ -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 { diff --git a/seeed-4mic-voicecard.dtbo b/seeed-4mic-voicecard.dtbo index a7c3e97..02649ab 100644 Binary files a/seeed-4mic-voicecard.dtbo and b/seeed-4mic-voicecard.dtbo differ diff --git a/seeed-8mic-voicecard-overlay.dts b/seeed-8mic-voicecard-overlay.dts index 978fb28..6a0af40 100644 --- a/seeed-8mic-voicecard-overlay.dts +++ b/seeed-8mic-voicecard-overlay.dts @@ -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>; }; diff --git a/seeed-8mic-voicecard.dtbo b/seeed-8mic-voicecard.dtbo index 024d5e3..20e533a 100644 Binary files a/seeed-8mic-voicecard.dtbo and b/seeed-8mic-voicecard.dtbo differ diff --git a/simple-card.c b/simple-card.c index de08ffe..756ee58 100644 --- a/simple-card.c +++ b/simple-card.c @@ -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; diff --git a/snd-soc-ac101.mod.c b/snd-soc-ac101.mod.c new file mode 100644 index 0000000..01d309f --- /dev/null +++ b/snd-soc-ac101.mod.c @@ -0,0 +1,72 @@ +#include +#include +#include + +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"); diff --git a/snd-soc-ac108.mod.c b/snd-soc-ac108.mod.c new file mode 100644 index 0000000..c517e5d --- /dev/null +++ b/snd-soc-ac108.mod.c @@ -0,0 +1,68 @@ +#include +#include +#include + +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"); diff --git a/snd-soc-simple-card.mod.c b/snd-soc-simple-card.mod.c new file mode 100644 index 0000000..2ffbf1a --- /dev/null +++ b/snd-soc-simple-card.mod.c @@ -0,0 +1,69 @@ +#include +#include +#include + +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"); diff --git a/snd-soc-wm8960.mod.c b/snd-soc-wm8960.mod.c new file mode 100644 index 0000000..b75d7be --- /dev/null +++ b/snd-soc-wm8960.mod.c @@ -0,0 +1,74 @@ +#include +#include +#include + +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");