From 96aa0c6b0b179518e0c228362ea55f1c7793bb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Tue, 7 Feb 2017 21:07:54 +0100 Subject: brcm2708: add linux 4.9 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patches from Raspberry Pi repo: https://github.com/raspberrypi/linux/commits/rpi-4.9.y Signed-off-by: Álvaro Fernández Rojas --- ...d-driver-for-HiFiBerry-Amp-amplifier-add-.patch | 807 +++++++++++++++++++++ 1 file changed, 807 insertions(+) create mode 100644 target/linux/brcm2708/patches-4.9/0074-Revert-Added-driver-for-HiFiBerry-Amp-amplifier-add-.patch (limited to 'target/linux/brcm2708/patches-4.9/0074-Revert-Added-driver-for-HiFiBerry-Amp-amplifier-add-.patch') diff --git a/target/linux/brcm2708/patches-4.9/0074-Revert-Added-driver-for-HiFiBerry-Amp-amplifier-add-.patch b/target/linux/brcm2708/patches-4.9/0074-Revert-Added-driver-for-HiFiBerry-Amp-amplifier-add-.patch new file mode 100644 index 0000000000..412398731e --- /dev/null +++ b/target/linux/brcm2708/patches-4.9/0074-Revert-Added-driver-for-HiFiBerry-Amp-amplifier-add-.patch @@ -0,0 +1,807 @@ +From 321a000ddec470ccbe496e6ae2cdc65286d8f491 Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Mon, 12 Dec 2016 16:26:54 +0000 +Subject: [PATCH] Revert "Added driver for HiFiBerry Amp amplifier add-on + board" + +This reverts commit 3e6b00833d92a50cbcc9922deb6e1bc8fcdbb587. +--- + sound/soc/bcm/Kconfig | 7 - + sound/soc/bcm/Makefile | 2 - + sound/soc/bcm/hifiberry_amp.c | 129 --------------- + sound/soc/codecs/Kconfig | 4 - + sound/soc/codecs/Makefile | 2 - + sound/soc/codecs/tas5713.c | 369 ------------------------------------------ + sound/soc/codecs/tas5713.h | 210 ------------------------ + 7 files changed, 723 deletions(-) + delete mode 100644 sound/soc/bcm/hifiberry_amp.c + delete mode 100644 sound/soc/codecs/tas5713.c + delete mode 100644 sound/soc/codecs/tas5713.h + +--- a/sound/soc/bcm/Kconfig ++++ b/sound/soc/bcm/Kconfig +@@ -38,13 +38,6 @@ config SND_BCM2708_SOC_HIFIBERRY_DIGI + help + Say Y or M if you want to add support for HifiBerry Digi S/PDIF output board. + +-config SND_BCM2708_SOC_HIFIBERRY_AMP +- tristate "Support for the HifiBerry Amp" +- depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S +- select SND_SOC_TAS5713 +- help +- Say Y or M if you want to add support for the HifiBerry Amp amplifier board. +- + config SND_BCM2708_SOC_RPI_DAC + tristate "Support for RPi-DAC" + depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S +--- a/sound/soc/bcm/Makefile ++++ b/sound/soc/bcm/Makefile +@@ -12,13 +12,11 @@ obj-$(CONFIG_SND_SOC_CYGNUS) += snd-soc- + snd-soc-hifiberry-dac-objs := hifiberry_dac.o + snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o + snd-soc-hifiberry-digi-objs := hifiberry_digi.o +-snd-soc-hifiberry-amp-objs := hifiberry_amp.o + snd-soc-rpi-dac-objs := rpi-dac.o + snd-soc-iqaudio-dac-objs := iqaudio-dac.o + + obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o + obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o + obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI) += snd-soc-hifiberry-digi.o +-obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP) += snd-soc-hifiberry-amp.o + obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o + obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o +--- a/sound/soc/bcm/hifiberry_amp.c ++++ /dev/null +@@ -1,129 +0,0 @@ +-/* +- * ASoC Driver for HifiBerry AMP +- * +- * Author: Sebastian Eickhoff +- * Copyright 2014 +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * version 2 as published by the Free Software Foundation. +- * +- * This program is distributed in the hope that it will be useful, but +- * WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- */ +- +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +- +-static int snd_rpi_hifiberry_amp_init(struct snd_soc_pcm_runtime *rtd) +-{ +- // ToDo: init of the dsp-registers. +- return 0; +-} +- +-static int snd_rpi_hifiberry_amp_hw_params( struct snd_pcm_substream *substream, +- struct snd_pcm_hw_params *params ) +-{ +- struct snd_soc_pcm_runtime *rtd = substream->private_data; +- struct snd_soc_dai *cpu_dai = rtd->cpu_dai; +- +- return snd_soc_dai_set_bclk_ratio(cpu_dai, 64); +-} +- +-static struct snd_soc_ops snd_rpi_hifiberry_amp_ops = { +- .hw_params = snd_rpi_hifiberry_amp_hw_params, +-}; +- +-static struct snd_soc_dai_link snd_rpi_hifiberry_amp_dai[] = { +- { +- .name = "HifiBerry AMP", +- .stream_name = "HifiBerry AMP HiFi", +- .cpu_dai_name = "bcm2708-i2s.0", +- .codec_dai_name = "tas5713-hifi", +- .platform_name = "bcm2708-i2s.0", +- .codec_name = "tas5713.1-001b", +- .dai_fmt = SND_SOC_DAIFMT_I2S | +- SND_SOC_DAIFMT_NB_NF | +- SND_SOC_DAIFMT_CBS_CFS, +- .ops = &snd_rpi_hifiberry_amp_ops, +- .init = snd_rpi_hifiberry_amp_init, +- }, +-}; +- +- +-static struct snd_soc_card snd_rpi_hifiberry_amp = { +- .name = "snd_rpi_hifiberry_amp", +- .driver_name = "HifiberryAmp", +- .owner = THIS_MODULE, +- .dai_link = snd_rpi_hifiberry_amp_dai, +- .num_links = ARRAY_SIZE(snd_rpi_hifiberry_amp_dai), +-}; +- +-static const struct of_device_id snd_rpi_hifiberry_amp_of_match[] = { +- { .compatible = "hifiberry,hifiberry-amp", }, +- {}, +-}; +-MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_amp_of_match); +- +- +-static int snd_rpi_hifiberry_amp_probe(struct platform_device *pdev) +-{ +- int ret = 0; +- +- snd_rpi_hifiberry_amp.dev = &pdev->dev; +- +- if (pdev->dev.of_node) { +- struct device_node *i2s_node; +- struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_amp_dai[0]; +- i2s_node = of_parse_phandle(pdev->dev.of_node, +- "i2s-controller", 0); +- +- if (i2s_node) { +- dai->cpu_dai_name = NULL; +- dai->cpu_of_node = i2s_node; +- dai->platform_name = NULL; +- dai->platform_of_node = i2s_node; +- } +- } +- +- ret = snd_soc_register_card(&snd_rpi_hifiberry_amp); +- +- if (ret != 0) { +- dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret); +- } +- +- return ret; +-} +- +- +-static int snd_rpi_hifiberry_amp_remove(struct platform_device *pdev) +-{ +- return snd_soc_unregister_card(&snd_rpi_hifiberry_amp); +-} +- +- +-static struct platform_driver snd_rpi_hifiberry_amp_driver = { +- .driver = { +- .name = "snd-hifiberry-amp", +- .owner = THIS_MODULE, +- .of_match_table = snd_rpi_hifiberry_amp_of_match, +- }, +- .probe = snd_rpi_hifiberry_amp_probe, +- .remove = snd_rpi_hifiberry_amp_remove, +-}; +- +- +-module_platform_driver(snd_rpi_hifiberry_amp_driver); +- +- +-MODULE_AUTHOR("Sebastian Eickhoff "); +-MODULE_DESCRIPTION("ASoC driver for HiFiBerry-AMP"); +-MODULE_LICENSE("GPL v2"); +--- a/sound/soc/codecs/Kconfig ++++ b/sound/soc/codecs/Kconfig +@@ -139,7 +139,6 @@ config SND_SOC_ALL_CODECS + select SND_SOC_TFA9879 if I2C + select SND_SOC_TLV320AIC23_I2C if I2C + select SND_SOC_TLV320AIC23_SPI if SPI_MASTER +- select SND_SOC_TAS5713 if I2C + select SND_SOC_TLV320AIC26 if SPI_MASTER + select SND_SOC_TLV320AIC31XX if I2C + select SND_SOC_TLV320AIC32X4_I2C if I2C +@@ -822,9 +821,6 @@ config SND_SOC_TFA9879 + tristate "NXP Semiconductors TFA9879 amplifier" + depends on I2C + +-config SND_SOC_TAS5713 +- tristate +- + config SND_SOC_TLV320AIC23 + tristate + +--- a/sound/soc/codecs/Makefile ++++ b/sound/soc/codecs/Makefile +@@ -144,7 +144,6 @@ snd-soc-tas5086-objs := tas5086.o + snd-soc-tas571x-objs := tas571x.o + snd-soc-tas5720-objs := tas5720.o + snd-soc-tfa9879-objs := tfa9879.o +-snd-soc-tas5713-objs := tas5713.o + snd-soc-tlv320aic23-objs := tlv320aic23.o + snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o + snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o +@@ -367,7 +366,6 @@ obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc + obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o + obj-$(CONFIG_SND_SOC_TAS5720) += snd-soc-tas5720.o + obj-$(CONFIG_SND_SOC_TFA9879) += snd-soc-tfa9879.o +-obj-$(CONFIG_SND_SOC_TAS5713) += snd-soc-tas5713.o + obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o + obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o + obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o +--- a/sound/soc/codecs/tas5713.c ++++ /dev/null +@@ -1,369 +0,0 @@ +-/* +- * ASoC Driver for TAS5713 +- * +- * Author: Sebastian Eickhoff +- * Copyright 2014 +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * version 2 as published by the Free Software Foundation. +- * +- * This program is distributed in the hope that it will be useful, but +- * WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +- +-#include "tas5713.h" +- +- +-static struct i2c_client *i2c; +- +-struct tas5713_priv { +- struct regmap *regmap; +- int mclk_div; +- struct snd_soc_codec *codec; +-}; +- +-static struct tas5713_priv *priv_data; +- +- +- +- +-/* +- * _ _ ___ _ ___ _ _ +- * /_\ | | / __| /_\ / __|___ _ _| |_ _ _ ___| |___ +- * / _ \| |__\__ \/ _ \ | (__/ _ \ ' \ _| '_/ _ \ (_-< +- * /_/ \_\____|___/_/ \_\ \___\___/_||_\__|_| \___/_/__/ +- * +- */ +- +-static const DECLARE_TLV_DB_SCALE(tas5713_vol_tlv, -10000, 50, 1); +- +- +-static const struct snd_kcontrol_new tas5713_snd_controls[] = { +- SOC_SINGLE_TLV ("Master" , TAS5713_VOL_MASTER, 0, 248, 1, tas5713_vol_tlv), +- SOC_DOUBLE_R_TLV("Channels" , TAS5713_VOL_CH1, TAS5713_VOL_CH2, 0, 248, 1, tas5713_vol_tlv) +-}; +- +- +- +- +-/* +- * __ __ _ _ ___ _ +- * | \/ |__ _ __| |_ (_)_ _ ___ | \ _ _(_)_ _____ _ _ +- * | |\/| / _` / _| ' \| | ' \/ -_) | |) | '_| \ V / -_) '_| +- * |_| |_\__,_\__|_||_|_|_||_\___| |___/|_| |_|\_/\___|_| +- * +- */ +- +-static int tas5713_hw_params(struct snd_pcm_substream *substream, +- struct snd_pcm_hw_params *params, +- struct snd_soc_dai *dai) +-{ +- u16 blen = 0x00; +- +- struct snd_soc_codec *codec; +- codec = dai->codec; +- priv_data->codec = dai->codec; +- +- switch (params_format(params)) { +- case SNDRV_PCM_FORMAT_S16_LE: +- blen = 0x03; +- break; +- case SNDRV_PCM_FORMAT_S20_3LE: +- blen = 0x1; +- break; +- case SNDRV_PCM_FORMAT_S24_LE: +- blen = 0x04; +- break; +- case SNDRV_PCM_FORMAT_S32_LE: +- blen = 0x05; +- break; +- default: +- dev_err(dai->dev, "Unsupported word length: %u\n", +- params_format(params)); +- return -EINVAL; +- } +- +- // set word length +- snd_soc_update_bits(codec, TAS5713_SERIAL_DATA_INTERFACE, 0x7, blen); +- +- return 0; +-} +- +- +-static int tas5713_mute_stream(struct snd_soc_dai *dai, int mute, int stream) +-{ +- unsigned int val = 0; +- +- struct tas5713_priv *tas5713; +- struct snd_soc_codec *codec = dai->codec; +- tas5713 = snd_soc_codec_get_drvdata(codec); +- +- if (mute) { +- val = TAS5713_SOFT_MUTE_ALL; +- } +- +- return regmap_write(tas5713->regmap, TAS5713_SOFT_MUTE, val); +-} +- +- +-static const struct snd_soc_dai_ops tas5713_dai_ops = { +- .hw_params = tas5713_hw_params, +- .mute_stream = tas5713_mute_stream, +-}; +- +- +-static struct snd_soc_dai_driver tas5713_dai = { +- .name = "tas5713-hifi", +- .playback = { +- .stream_name = "Playback", +- .channels_min = 2, +- .channels_max = 2, +- .rates = SNDRV_PCM_RATE_8000_48000, +- .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE ), +- }, +- .ops = &tas5713_dai_ops, +-}; +- +- +- +- +-/* +- * ___ _ ___ _ +- * / __|___ __| |___ __ | \ _ _(_)_ _____ _ _ +- * | (__/ _ \/ _` / -_) _| | |) | '_| \ V / -_) '_| +- * \___\___/\__,_\___\__| |___/|_| |_|\_/\___|_| +- * +- */ +- +-static int tas5713_remove(struct snd_soc_codec *codec) +-{ +- struct tas5713_priv *tas5713; +- +- tas5713 = snd_soc_codec_get_drvdata(codec); +- +- return 0; +-} +- +- +-static int tas5713_probe(struct snd_soc_codec *codec) +-{ +- struct tas5713_priv *tas5713; +- int i, ret; +- +- i2c = container_of(codec->dev, struct i2c_client, dev); +- +- tas5713 = snd_soc_codec_get_drvdata(codec); +- +- // Reset error +- ret = snd_soc_write(codec, TAS5713_ERROR_STATUS, 0x00); +- if (ret < 0) return ret; +- +- // Trim oscillator +- ret = snd_soc_write(codec, TAS5713_OSC_TRIM, 0x00); +- if (ret < 0) return ret; +- msleep(1000); +- +- // Reset error +- ret = snd_soc_write(codec, TAS5713_ERROR_STATUS, 0x00); +- if (ret < 0) return ret; +- +- // Clock mode: 44/48kHz, MCLK=64xfs +- ret = snd_soc_write(codec, TAS5713_CLOCK_CTRL, 0x60); +- if (ret < 0) return ret; +- +- // I2S 24bit +- ret = snd_soc_write(codec, TAS5713_SERIAL_DATA_INTERFACE, 0x05); +- if (ret < 0) return ret; +- +- // Unmute +- ret = snd_soc_write(codec, TAS5713_SYSTEM_CTRL2, 0x00); +- if (ret < 0) return ret; +- ret = snd_soc_write(codec, TAS5713_SOFT_MUTE, 0x00); +- if (ret < 0) return ret; +- +- // Set volume to 0db +- ret = snd_soc_write(codec, TAS5713_VOL_MASTER, 0x00); +- if (ret < 0) return ret; +- +- // Now start programming the default initialization sequence +- for (i = 0; i < ARRAY_SIZE(tas5713_init_sequence); ++i) { +- ret = i2c_master_send(i2c, +- tas5713_init_sequence[i].data, +- tas5713_init_sequence[i].size); +- if (ret < 0) { +- printk(KERN_INFO "TAS5713 CODEC PROBE: InitSeq returns: %d\n", ret); +- } +- } +- +- // Unmute +- ret = snd_soc_write(codec, TAS5713_SYSTEM_CTRL2, 0x00); +- if (ret < 0) return ret; +- +- return 0; +-} +- +- +-static struct snd_soc_codec_driver soc_codec_dev_tas5713 = { +- .probe = tas5713_probe, +- .remove = tas5713_remove, +- .controls = tas5713_snd_controls, +- .num_controls = ARRAY_SIZE(tas5713_snd_controls), +-}; +- +- +- +- +-/* +- * ___ ___ ___ ___ _ +- * |_ _|_ ) __| | \ _ _(_)_ _____ _ _ +- * | | / / (__ | |) | '_| \ V / -_) '_| +- * |___/___\___| |___/|_| |_|\_/\___|_| +- * +- */ +- +-static const struct reg_default tas5713_reg_defaults[] = { +- { 0x07 ,0x80 }, // R7 - VOL_MASTER - -40dB +- { 0x08 , 30 }, // R8 - VOL_CH1 - 0dB +- { 0x09 , 30 }, // R9 - VOL_CH2 - 0dB +- { 0x0A ,0x80 }, // R10 - VOL_HEADPHONE - -40dB +-}; +- +- +-static bool tas5713_reg_volatile(struct device *dev, unsigned int reg) +-{ +- switch (reg) { +- case TAS5713_DEVICE_ID: +- case TAS5713_ERROR_STATUS: +- return true; +- default: +- return false; +- } +-} +- +- +-static const struct of_device_id tas5713_of_match[] = { +- { .compatible = "ti,tas5713", }, +- { } +-}; +-MODULE_DEVICE_TABLE(of, tas5713_of_match); +- +- +-static struct regmap_config tas5713_regmap_config = { +- .reg_bits = 8, +- .val_bits = 8, +- +- .max_register = TAS5713_MAX_REGISTER, +- .volatile_reg = tas5713_reg_volatile, +- +- .cache_type = REGCACHE_RBTREE, +- .reg_defaults = tas5713_reg_defaults, +- .num_reg_defaults = ARRAY_SIZE(tas5713_reg_defaults), +-}; +- +- +-static int tas5713_i2c_probe(struct i2c_client *i2c, +- const struct i2c_device_id *id) +-{ +- int ret; +- +- priv_data = devm_kzalloc(&i2c->dev, sizeof *priv_data, GFP_KERNEL); +- if (!priv_data) +- return -ENOMEM; +- +- priv_data->regmap = devm_regmap_init_i2c(i2c, &tas5713_regmap_config); +- if (IS_ERR(priv_data->regmap)) { +- ret = PTR_ERR(priv_data->regmap); +- return ret; +- } +- +- i2c_set_clientdata(i2c, priv_data); +- +- ret = snd_soc_register_codec(&i2c->dev, +- &soc_codec_dev_tas5713, &tas5713_dai, 1); +- +- return ret; +-} +- +- +-static int tas5713_i2c_remove(struct i2c_client *i2c) +-{ +- snd_soc_unregister_codec(&i2c->dev); +- i2c_set_clientdata(i2c, NULL); +- +- kfree(priv_data); +- +- return 0; +-} +- +- +-static const struct i2c_device_id tas5713_i2c_id[] = { +- { "tas5713", 0 }, +- { } +-}; +- +-MODULE_DEVICE_TABLE(i2c, tas5713_i2c_id); +- +- +-static struct i2c_driver tas5713_i2c_driver = { +- .driver = { +- .name = "tas5713", +- .owner = THIS_MODULE, +- .of_match_table = tas5713_of_match, +- }, +- .probe = tas5713_i2c_probe, +- .remove = tas5713_i2c_remove, +- .id_table = tas5713_i2c_id +-}; +- +- +-static int __init tas5713_modinit(void) +-{ +- int ret = 0; +- +- ret = i2c_add_driver(&tas5713_i2c_driver); +- if (ret) { +- printk(KERN_ERR "Failed to register tas5713 I2C driver: %d\n", +- ret); +- } +- +- return ret; +-} +-module_init(tas5713_modinit); +- +- +-static void __exit tas5713_exit(void) +-{ +- i2c_del_driver(&tas5713_i2c_driver); +-} +-module_exit(tas5713_exit); +- +- +-MODULE_AUTHOR("Sebastian Eickhoff "); +-MODULE_DESCRIPTION("ASoC driver for TAS5713"); +-MODULE_LICENSE("GPL v2"); +--- a/sound/soc/codecs/tas5713.h ++++ /dev/null +@@ -1,210 +0,0 @@ +-/* +- * ASoC Driver for TAS5713 +- * +- * Author: Sebastian Eickhoff +- * Copyright 2014 +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * version 2 as published by the Free Software Foundation. +- * +- * This program is distributed in the hope that it will be useful, but +- * WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- */ +- +-#ifndef _TAS5713_H +-#define _TAS5713_H +- +- +-// TAS5713 I2C-bus register addresses +- +-#define TAS5713_CLOCK_CTRL 0x00 +-#define TAS5713_DEVICE_ID 0x01 +-#define TAS5713_ERROR_STATUS 0x02 +-#define TAS5713_SYSTEM_CTRL1 0x03 +-#define TAS5713_SERIAL_DATA_INTERFACE 0x04 +-#define TAS5713_SYSTEM_CTRL2 0x05 +-#define TAS5713_SOFT_MUTE 0x06 +-#define TAS5713_VOL_MASTER 0x07 +-#define TAS5713_VOL_CH1 0x08 +-#define TAS5713_VOL_CH2 0x09 +-#define TAS5713_VOL_HEADPHONE 0x0A +-#define TAS5713_VOL_CONFIG 0x0E +-#define TAS5713_MODULATION_LIMIT 0x10 +-#define TAS5713_IC_DLY_CH1 0x11 +-#define TAS5713_IC_DLY_CH2 0x12 +-#define TAS5713_IC_DLY_CH3 0x13 +-#define TAS5713_IC_DLY_CH4 0x14 +- +-#define TAS5713_START_STOP_PERIOD 0x1A +-#define TAS5713_OSC_TRIM 0x1B +-#define TAS5713_BKND_ERR 0x1C +- +-#define TAS5713_INPUT_MUX 0x20 +-#define TAS5713_SRC_SELECT_CH4 0x21 +-#define TAS5713_PWM_MUX 0x25 +- +-#define TAS5713_CH1_BQ0 0x29 +-#define TAS5713_CH1_BQ1 0x2A +-#define TAS5713_CH1_BQ2 0x2B +-#define TAS5713_CH1_BQ3 0x2C +-#define TAS5713_CH1_BQ4 0x2D +-#define TAS5713_CH1_BQ5 0x2E +-#define TAS5713_CH1_BQ6 0x2F +-#define TAS5713_CH1_BQ7 0x58 +-#define TAS5713_CH1_BQ8 0x59 +- +-#define TAS5713_CH2_BQ0 0x30 +-#define TAS5713_CH2_BQ1 0x31 +-#define TAS5713_CH2_BQ2 0x32 +-#define TAS5713_CH2_BQ3 0x33 +-#define TAS5713_CH2_BQ4 0x34 +-#define TAS5713_CH2_BQ5 0x35 +-#define TAS5713_CH2_BQ6 0x36 +-#define TAS5713_CH2_BQ7 0x5C +-#define TAS5713_CH2_BQ8 0x5D +- +-#define TAS5713_CH4_BQ0 0x5A +-#define TAS5713_CH4_BQ1 0x5B +-#define TAS5713_CH3_BQ0 0x5E +-#define TAS5713_CH3_BQ1 0x5F +- +-#define TAS5713_DRC1_SOFTENING_FILTER_ALPHA_OMEGA 0x3B +-#define TAS5713_DRC1_ATTACK_RELEASE_RATE 0x3C +-#define TAS5713_DRC2_SOFTENING_FILTER_ALPHA_OMEGA 0x3E +-#define TAS5713_DRC2_ATTACK_RELEASE_RATE 0x3F +-#define TAS5713_DRC1_ATTACK_RELEASE_THRES 0x40 +-#define TAS5713_DRC2_ATTACK_RELEASE_THRES 0x43 +-#define TAS5713_DRC_CTRL 0x46 +- +-#define TAS5713_BANK_SW_CTRL 0x50 +-#define TAS5713_CH1_OUTPUT_MIXER 0x51 +-#define TAS5713_CH2_OUTPUT_MIXER 0x52 +-#define TAS5713_CH1_INPUT_MIXER 0x53 +-#define TAS5713_CH2_INPUT_MIXER 0x54 +-#define TAS5713_OUTPUT_POST_SCALE 0x56 +-#define TAS5713_OUTPUT_PRESCALE 0x57 +- +-#define TAS5713_IDF_POST_SCALE 0x62 +- +-#define TAS5713_CH1_INLINE_MIXER 0x70 +-#define TAS5713_CH1_INLINE_DRC_EN_MIXER 0x71 +-#define TAS5713_CH1_R_CHANNEL_MIXER 0x72 +-#define TAS5713_CH1_L_CHANNEL_MIXER 0x73 +-#define TAS5713_CH2_INLINE_MIXER 0x74 +-#define TAS5713_CH2_INLINE_DRC_EN_MIXER 0x75 +-#define TAS5713_CH2_L_CHANNEL_MIXER 0x76 +-#define TAS5713_CH2_R_CHANNEL_MIXER 0x77 +- +-#define TAS5713_UPDATE_DEV_ADDR_KEY 0xF8 +-#define TAS5713_UPDATE_DEV_ADDR_REG 0xF9 +- +-#define TAS5713_REGISTER_COUNT 0x46 +-#define TAS5713_MAX_REGISTER 0xF9 +- +- +-// Bitmasks for registers +-#define TAS5713_SOFT_MUTE_ALL 0x07 +- +- +- +-struct tas5713_init_command { +- const int size; +- const char *const data; +-}; +- +-static const struct tas5713_init_command tas5713_init_sequence[] = { +- +- // Trim oscillator +- { .size = 2, .data = "\x1B\x00" }, +- // System control register 1 (0x03): block DC +- { .size = 2, .data = "\x03\x80" }, +- // Mute everything +- { .size = 2, .data = "\x05\x40" }, +- // Modulation limit register (0x10): 97.7% +- { .size = 2, .data = "\x10\x02" }, +- // Interchannel delay registers +- // (0x11, 0x12, 0x13, and 0x14): BD mode +- { .size = 2, .data = "\x11\xB8" }, +- { .size = 2, .data = "\x12\x60" }, +- { .size = 2, .data = "\x13\xA0" }, +- { .size = 2, .data = "\x14\x48" }, +- // PWM shutdown group register (0x19): no shutdown +- { .size = 2, .data = "\x19\x00" }, +- // Input multiplexer register (0x20): BD mode +- { .size = 2, .data = "\x20\x00\x89\x77\x72" }, +- // PWM output mux register (0x25) +- // Channel 1 --> OUTA, channel 1 neg --> OUTB +- // Channel 2 --> OUTC, channel 2 neg --> OUTD +- { .size = 5, .data = "\x25\x01\x02\x13\x45" }, +- // DRC control (0x46): DRC off +- { .size = 5, .data = "\x46\x00\x00\x00\x00" }, +- // BKND_ERR register (0x1C): 299ms reset period +- { .size = 2, .data = "\x1C\x07" }, +- // Mute channel 3 +- { .size = 2, .data = "\x0A\xFF" }, +- // Volume configuration register (0x0E): volume slew 512 steps +- { .size = 2, .data = "\x0E\x90" }, +- // Clock control register (0x00): 44/48kHz, MCLK=64xfs +- { .size = 2, .data = "\x00\x60" }, +- // Bank switch and eq control (0x50): no bank switching +- { .size = 5, .data = "\x50\x00\x00\x00\x00" }, +- // Volume registers (0x07, 0x08, 0x09, 0x0A) +- { .size = 2, .data = "\x07\x20" }, +- { .size = 2, .data = "\x08\x30" }, +- { .size = 2, .data = "\x09\x30" }, +- { .size = 2, .data = "\x0A\xFF" }, +- // 0x72, 0x73, 0x76, 0x77 input mixer: +- // no intermix between channels +- { .size = 5, .data = "\x72\x00\x00\x00\x00" }, +- { .size = 5, .data = "\x73\x00\x80\x00\x00" }, +- { .size = 5, .data = "\x76\x00\x00\x00\x00" }, +- { .size = 5, .data = "\x77\x00\x80\x00\x00" }, +- // 0x70, 0x71, 0x74, 0x75 inline DRC mixer: +- // no inline DRC inmix +- { .size = 5, .data = "\x70\x00\x80\x00\x00" }, +- { .size = 5, .data = "\x71\x00\x00\x00\x00" }, +- { .size = 5, .data = "\x74\x00\x80\x00\x00" }, +- { .size = 5, .data = "\x75\x00\x00\x00\x00" }, +- // 0x56, 0x57 Output scale +- { .size = 5, .data = "\x56\x00\x80\x00\x00" }, +- { .size = 5, .data = "\x57\x00\x02\x00\x00" }, +- // 0x3B, 0x3c +- { .size = 9, .data = "\x3B\x00\x08\x00\x00\x00\x78\x00\x00" }, +- { .size = 9, .data = "\x3C\x00\x00\x01\x00\xFF\xFF\xFF\x00" }, +- { .size = 9, .data = "\x3E\x00\x08\x00\x00\x00\x78\x00\x00" }, +- { .size = 9, .data = "\x3F\x00\x00\x01\x00\xFF\xFF\xFF\x00" }, +- { .size = 9, .data = "\x40\x00\x00\x01\x00\xFF\xFF\xFF\x00" }, +- { .size = 9, .data = "\x43\x00\x00\x01\x00\xFF\xFF\xFF\x00" }, +- // 0x51, 0x52: output mixer +- { .size = 9, .data = "\x51\x00\x80\x00\x00\x00\x00\x00\x00" }, +- { .size = 9, .data = "\x52\x00\x80\x00\x00\x00\x00\x00\x00" }, +- // PEQ defaults +- { .size = 21, .data = "\x29\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2A\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2B\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2C\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2D\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2E\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x2F\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x30\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x31\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x32\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x33\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x34\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x35\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x36\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x58\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x59\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5C\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5D\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5E\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5F\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5A\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +- { .size = 21, .data = "\x5B\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" }, +-}; +- +- +-#endif /* _TAS5713_H */ -- cgit v1.2.3