mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
ASoC: Fixes for v4.19
This is the usual set of small fixes scatterd around various drivers, plus one fix for DAPM and a UAPI build fix. There's not a huge amount that stands out here relative to anything else. -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAluf2AQTHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0BojB/9ZpiRgSSjKTFSmGgu3OFI7Nvj63ruB hxOnwOc8Bea8tZtpzgEcx/aLZ1sbWVT4uRUYZv0Tf6UJtuOQagbJDEUkUdRitKtX 1khSMyKFlAa7cIbv19ZOMCN0pjcs7hlHCPryT8AyCWCWN8yPdlUsDqWfyfUoq56r qpdu/OQ4E9VvS8OcX1gPjcop3gE/fYEoU+mbUpr0KYUXaroEzJm85tOqpGYk4+XW GCNUR19vNRJr5G6ANqIx96JOlgF5nRZu7aOfvLceiWH5BgPdW3iNRAJkPmKCIHwb a1+X21eCC7Ec2/7bQmR5Aoxz1yqzhngrevSFNLrqXFZmMmNrEfkfdCrJ =gVzO -----END PGP SIGNATURE----- Merge tag 'asoc-v4.19-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v4.19 This is the usual set of small fixes scatterd around various drivers, plus one fix for DAPM and a UAPI build fix. There's not a huge amount that stands out here relative to anything else.
This commit is contained in:
commit
196f4eeeb7
@ -13432,9 +13432,8 @@ F: drivers/i2c/busses/i2c-synquacer.c
|
||||
F: Documentation/devicetree/bindings/i2c/i2c-synquacer.txt
|
||||
|
||||
SOCIONEXT UNIPHIER SOUND DRIVER
|
||||
M: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: sound/soc/uniphier/
|
||||
|
||||
SOEKRIS NET48XX LED SUPPORT
|
||||
|
@ -412,6 +412,7 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_stop_cmd_io(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_enter_link_reset(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_exit_link_reset(struct hdac_bus *bus);
|
||||
int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset);
|
||||
|
||||
void snd_hdac_bus_update_rirb(struct hdac_bus *bus);
|
||||
int snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
|
||||
|
@ -407,6 +407,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
|
||||
int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
|
||||
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
|
||||
int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
|
||||
struct snd_soc_pcm_runtime *rtd,
|
||||
const struct snd_soc_pcm_stream *params,
|
||||
unsigned int num_params,
|
||||
struct snd_soc_dapm_widget *source,
|
||||
|
@ -10,6 +10,8 @@
|
||||
#ifndef __HDA_TPLG_INTERFACE_H__
|
||||
#define __HDA_TPLG_INTERFACE_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* Default types range from 0~12. type can range from 0 to 0xff
|
||||
* SST types start at higher to avoid any overlapping in future
|
||||
@ -143,10 +145,10 @@ enum skl_module_param_type {
|
||||
};
|
||||
|
||||
struct skl_dfw_algo_data {
|
||||
u32 set_params:2;
|
||||
u32 rsvd:30;
|
||||
u32 param_id;
|
||||
u32 max;
|
||||
__u32 set_params:2;
|
||||
__u32 rsvd:30;
|
||||
__u32 param_id;
|
||||
__u32 max;
|
||||
char params[0];
|
||||
} __packed;
|
||||
|
||||
@ -163,68 +165,68 @@ enum skl_tuple_type {
|
||||
/* v4 configuration data */
|
||||
|
||||
struct skl_dfw_v4_module_pin {
|
||||
u16 module_id;
|
||||
u16 instance_id;
|
||||
__u16 module_id;
|
||||
__u16 instance_id;
|
||||
} __packed;
|
||||
|
||||
struct skl_dfw_v4_module_fmt {
|
||||
u32 channels;
|
||||
u32 freq;
|
||||
u32 bit_depth;
|
||||
u32 valid_bit_depth;
|
||||
u32 ch_cfg;
|
||||
u32 interleaving_style;
|
||||
u32 sample_type;
|
||||
u32 ch_map;
|
||||
__u32 channels;
|
||||
__u32 freq;
|
||||
__u32 bit_depth;
|
||||
__u32 valid_bit_depth;
|
||||
__u32 ch_cfg;
|
||||
__u32 interleaving_style;
|
||||
__u32 sample_type;
|
||||
__u32 ch_map;
|
||||
} __packed;
|
||||
|
||||
struct skl_dfw_v4_module_caps {
|
||||
u32 set_params:2;
|
||||
u32 rsvd:30;
|
||||
u32 param_id;
|
||||
u32 caps_size;
|
||||
u32 caps[HDA_SST_CFG_MAX];
|
||||
__u32 set_params:2;
|
||||
__u32 rsvd:30;
|
||||
__u32 param_id;
|
||||
__u32 caps_size;
|
||||
__u32 caps[HDA_SST_CFG_MAX];
|
||||
} __packed;
|
||||
|
||||
struct skl_dfw_v4_pipe {
|
||||
u8 pipe_id;
|
||||
u8 pipe_priority;
|
||||
u16 conn_type:4;
|
||||
u16 rsvd:4;
|
||||
u16 memory_pages:8;
|
||||
__u8 pipe_id;
|
||||
__u8 pipe_priority;
|
||||
__u16 conn_type:4;
|
||||
__u16 rsvd:4;
|
||||
__u16 memory_pages:8;
|
||||
} __packed;
|
||||
|
||||
struct skl_dfw_v4_module {
|
||||
char uuid[SKL_UUID_STR_SZ];
|
||||
|
||||
u16 module_id;
|
||||
u16 instance_id;
|
||||
u32 max_mcps;
|
||||
u32 mem_pages;
|
||||
u32 obs;
|
||||
u32 ibs;
|
||||
u32 vbus_id;
|
||||
__u16 module_id;
|
||||
__u16 instance_id;
|
||||
__u32 max_mcps;
|
||||
__u32 mem_pages;
|
||||
__u32 obs;
|
||||
__u32 ibs;
|
||||
__u32 vbus_id;
|
||||
|
||||
u32 max_in_queue:8;
|
||||
u32 max_out_queue:8;
|
||||
u32 time_slot:8;
|
||||
u32 core_id:4;
|
||||
u32 rsvd1:4;
|
||||
__u32 max_in_queue:8;
|
||||
__u32 max_out_queue:8;
|
||||
__u32 time_slot:8;
|
||||
__u32 core_id:4;
|
||||
__u32 rsvd1:4;
|
||||
|
||||
u32 module_type:8;
|
||||
u32 conn_type:4;
|
||||
u32 dev_type:4;
|
||||
u32 hw_conn_type:4;
|
||||
u32 rsvd2:12;
|
||||
__u32 module_type:8;
|
||||
__u32 conn_type:4;
|
||||
__u32 dev_type:4;
|
||||
__u32 hw_conn_type:4;
|
||||
__u32 rsvd2:12;
|
||||
|
||||
u32 params_fixup:8;
|
||||
u32 converter:8;
|
||||
u32 input_pin_type:1;
|
||||
u32 output_pin_type:1;
|
||||
u32 is_dynamic_in_pin:1;
|
||||
u32 is_dynamic_out_pin:1;
|
||||
u32 is_loadable:1;
|
||||
u32 rsvd3:11;
|
||||
__u32 params_fixup:8;
|
||||
__u32 converter:8;
|
||||
__u32 input_pin_type:1;
|
||||
__u32 output_pin_type:1;
|
||||
__u32 is_dynamic_in_pin:1;
|
||||
__u32 is_dynamic_out_pin:1;
|
||||
__u32 is_loadable:1;
|
||||
__u32 rsvd3:11;
|
||||
|
||||
struct skl_dfw_v4_pipe pipe;
|
||||
struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
|
||||
|
@ -40,6 +40,8 @@ static void azx_clear_corbrp(struct hdac_bus *bus)
|
||||
*/
|
||||
void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
|
||||
{
|
||||
WARN_ON_ONCE(!bus->rb.area);
|
||||
|
||||
spin_lock_irq(&bus->reg_lock);
|
||||
/* CORB set up */
|
||||
bus->corb.addr = bus->rb.addr;
|
||||
@ -383,7 +385,7 @@ void snd_hdac_bus_exit_link_reset(struct hdac_bus *bus)
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_exit_link_reset);
|
||||
|
||||
/* reset codec link */
|
||||
static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset)
|
||||
{
|
||||
if (!full_reset)
|
||||
goto skip_reset;
|
||||
@ -408,7 +410,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
skip_reset:
|
||||
/* check to see if controller is ready */
|
||||
if (!snd_hdac_chip_readb(bus, GCTL)) {
|
||||
dev_dbg(bus->dev, "azx_reset: controller not ready!\n");
|
||||
dev_dbg(bus->dev, "controller not ready!\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@ -423,6 +425,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_reset_link);
|
||||
|
||||
/* enable interrupts */
|
||||
static void azx_int_enable(struct hdac_bus *bus)
|
||||
@ -477,15 +480,17 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
|
||||
return false;
|
||||
|
||||
/* reset controller */
|
||||
azx_reset(bus, full_reset);
|
||||
snd_hdac_bus_reset_link(bus, full_reset);
|
||||
|
||||
/* initialize interrupts */
|
||||
/* clear interrupts */
|
||||
azx_int_clear(bus);
|
||||
azx_int_enable(bus);
|
||||
|
||||
/* initialize the codec command I/O */
|
||||
snd_hdac_bus_init_cmd_io(bus);
|
||||
|
||||
/* enable interrupts after CORB/RIRB buffers are initialized above */
|
||||
azx_int_enable(bus);
|
||||
|
||||
/* program the position buffer */
|
||||
if (bus->use_posbuf && bus->posbuf.addr) {
|
||||
snd_hdac_chip_writel(bus, DPLBASE, (u32)bus->posbuf.addr);
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
@ -184,6 +185,24 @@ static void config_dma_descriptor_in_sram(void __iomem *acp_mmio,
|
||||
acp_reg_write(descr_info->xfer_val, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
|
||||
}
|
||||
|
||||
static void pre_config_reset(void __iomem *acp_mmio, u16 ch_num)
|
||||
{
|
||||
u32 dma_ctrl;
|
||||
int ret;
|
||||
|
||||
/* clear the reset bit */
|
||||
dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
|
||||
dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRst_MASK;
|
||||
acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
|
||||
/* check the reset bit before programming configuration registers */
|
||||
ret = readl_poll_timeout(acp_mmio + ((mmACP_DMA_CNTL_0 + ch_num) * 4),
|
||||
dma_ctrl,
|
||||
!(dma_ctrl & ACP_DMA_CNTL_0__DMAChRst_MASK),
|
||||
100, ACP_DMA_RESET_TIME);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to clear reset of channel : %d\n", ch_num);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the DMA descriptor information for transfer between
|
||||
* system memory <-> ACP SRAM
|
||||
@ -236,6 +255,7 @@ static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio,
|
||||
config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
|
||||
&dmadscr[i]);
|
||||
}
|
||||
pre_config_reset(acp_mmio, ch);
|
||||
config_acp_dma_channel(acp_mmio, ch,
|
||||
dma_dscr_idx - 1,
|
||||
NUM_DSCRS_PER_CHANNEL,
|
||||
@ -275,6 +295,7 @@ static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio, u32 size,
|
||||
config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
|
||||
&dmadscr[i]);
|
||||
}
|
||||
pre_config_reset(acp_mmio, ch);
|
||||
/* Configure the DMA channel with the above descriptore */
|
||||
config_acp_dma_channel(acp_mmio, ch, dma_dscr_idx - 1,
|
||||
NUM_DSCRS_PER_CHANNEL,
|
||||
|
@ -157,8 +157,8 @@ static const struct snd_kcontrol_new cs4265_snd_controls[] = {
|
||||
SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2,
|
||||
3, 1, 0),
|
||||
SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum),
|
||||
SOC_SINGLE("MMTLR Data Switch", 0,
|
||||
1, 1, 0),
|
||||
SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2,
|
||||
0, 1, 0),
|
||||
SOC_ENUM("Mono Channel Select", spdif_mono_select_enum),
|
||||
SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24),
|
||||
};
|
||||
|
@ -520,6 +520,7 @@ static bool max98373_volatile_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case MAX98373_R2000_SW_RESET ... MAX98373_R2009_INT_FLAG3:
|
||||
case MAX98373_R203E_AMP_PATH_GAIN:
|
||||
case MAX98373_R2054_MEAS_ADC_PVDD_CH_READBACK:
|
||||
case MAX98373_R2055_MEAS_ADC_THERM_CH_READBACK:
|
||||
case MAX98373_R20B6_BDE_CUR_STATE_READBACK:
|
||||
@ -729,6 +730,7 @@ static int max98373_probe(struct snd_soc_component *component)
|
||||
/* Software Reset */
|
||||
regmap_write(max98373->regmap,
|
||||
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
||||
usleep_range(10000, 11000);
|
||||
|
||||
/* IV default slot configuration */
|
||||
regmap_write(max98373->regmap,
|
||||
@ -817,6 +819,7 @@ static int max98373_resume(struct device *dev)
|
||||
|
||||
regmap_write(max98373->regmap,
|
||||
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
||||
usleep_range(10000, 11000);
|
||||
regcache_cache_only(max98373->regmap, false);
|
||||
regcache_sync(max98373->regmap);
|
||||
return 0;
|
||||
|
@ -64,8 +64,8 @@ static const struct reg_sequence rt5514_patch[] = {
|
||||
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
||||
{RT5514_ANA_CTRL_ADCFED, 0x00000800},
|
||||
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000352},
|
||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000352},
|
||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000342},
|
||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000342},
|
||||
};
|
||||
|
||||
static const struct reg_default rt5514_reg[] = {
|
||||
@ -92,10 +92,10 @@ static const struct reg_default rt5514_reg[] = {
|
||||
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
||||
{RT5514_DOWNFILTER0_CTRL1, 0x00020c2f},
|
||||
{RT5514_DOWNFILTER0_CTRL2, 0x00020c2f},
|
||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000352},
|
||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000342},
|
||||
{RT5514_DOWNFILTER1_CTRL1, 0x00020c2f},
|
||||
{RT5514_DOWNFILTER1_CTRL2, 0x00020c2f},
|
||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000352},
|
||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000342},
|
||||
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
||||
{RT5514_ANA_CTRL_LDO18_16, 0x02000345},
|
||||
{RT5514_ANA_CTRL_ADC12, 0x0000a2a8},
|
||||
|
@ -750,8 +750,8 @@ static bool rt5682_readable_register(struct device *dev, unsigned int reg)
|
||||
}
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -2250, 150, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
|
||||
|
||||
/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
|
||||
@ -1114,7 +1114,7 @@ static const struct snd_kcontrol_new rt5682_snd_controls[] = {
|
||||
|
||||
/* DAC Digital Volume */
|
||||
SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL,
|
||||
RT5682_L_VOL_SFT, RT5682_R_VOL_SFT, 175, 0, dac_vol_tlv),
|
||||
RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 86, 0, dac_vol_tlv),
|
||||
|
||||
/* IN Boost Volume */
|
||||
SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL,
|
||||
@ -1124,7 +1124,7 @@ static const struct snd_kcontrol_new rt5682_snd_controls[] = {
|
||||
SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL,
|
||||
RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
|
||||
SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL,
|
||||
RT5682_L_VOL_SFT, RT5682_R_VOL_SFT, 127, 0, adc_vol_tlv),
|
||||
RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),
|
||||
|
||||
/* ADC Boost Volume Control */
|
||||
SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST,
|
||||
|
@ -117,8 +117,7 @@ static int sigmadsp_ctrl_write(struct sigmadsp *sigmadsp,
|
||||
struct sigmadsp_control *ctrl, void *data)
|
||||
{
|
||||
/* safeload loads up to 20 bytes in a atomic operation */
|
||||
if (ctrl->num_bytes > 4 && ctrl->num_bytes <= 20 && sigmadsp->ops &&
|
||||
sigmadsp->ops->safeload)
|
||||
if (ctrl->num_bytes <= 20 && sigmadsp->ops && sigmadsp->ops->safeload)
|
||||
return sigmadsp->ops->safeload(sigmadsp, ctrl->addr, data,
|
||||
ctrl->num_bytes);
|
||||
else
|
||||
|
@ -424,8 +424,10 @@ static void tas6424_fault_check_work(struct work_struct *work)
|
||||
TAS6424_FAULT_PVDD_UV |
|
||||
TAS6424_FAULT_VBAT_UV;
|
||||
|
||||
if (reg)
|
||||
if (!reg) {
|
||||
tas6424->last_fault1 = reg;
|
||||
goto check_global_fault2_reg;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only flag errors once for a given occurrence. This is needed as
|
||||
@ -461,8 +463,10 @@ check_global_fault2_reg:
|
||||
TAS6424_FAULT_OTSD_CH3 |
|
||||
TAS6424_FAULT_OTSD_CH4;
|
||||
|
||||
if (!reg)
|
||||
if (!reg) {
|
||||
tas6424->last_fault2 = reg;
|
||||
goto check_warn_reg;
|
||||
}
|
||||
|
||||
if ((reg & TAS6424_FAULT_OTSD) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD))
|
||||
dev_crit(dev, "experienced a global overtemp shutdown\n");
|
||||
@ -497,8 +501,10 @@ check_warn_reg:
|
||||
TAS6424_WARN_VDD_OTW_CH3 |
|
||||
TAS6424_WARN_VDD_OTW_CH4;
|
||||
|
||||
if (!reg)
|
||||
if (!reg) {
|
||||
tas6424->last_warn = reg;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((reg & TAS6424_WARN_VDD_UV) && !(tas6424->last_warn & TAS6424_WARN_VDD_UV))
|
||||
dev_warn(dev, "experienced a VDD under voltage condition\n");
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include "wm8804.h"
|
||||
|
||||
@ -40,17 +41,29 @@ static const struct i2c_device_id wm8804_i2c_id[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wm8804_i2c_id);
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id wm8804_of_match[] = {
|
||||
{ .compatible = "wlf,wm8804", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wm8804_of_match);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id wm8804_acpi_match[] = {
|
||||
{ "1AEC8804", 0 }, /* Wolfson PCI ID + part ID */
|
||||
{ "10138804", 0 }, /* Cirrus Logic PCI ID + part ID */
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, wm8804_acpi_match);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver wm8804_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "wm8804",
|
||||
.pm = &wm8804_pm,
|
||||
.of_match_table = wm8804_of_match,
|
||||
.of_match_table = of_match_ptr(wm8804_of_match),
|
||||
.acpi_match_table = ACPI_PTR(wm8804_acpi_match),
|
||||
},
|
||||
.probe = wm8804_i2c_probe,
|
||||
.remove = wm8804_i2c_remove,
|
||||
|
@ -719,7 +719,7 @@ static int wm9712_probe(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver wm9712_component_driver = {
|
||||
.driver = {
|
||||
.name = "wm9712-component",
|
||||
.name = "wm9712-codec",
|
||||
},
|
||||
|
||||
.probe = wm9712_probe,
|
||||
|
@ -575,6 +575,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Linx Linx7 tablet */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LINX"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LINX7"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_JD_NOT_INV |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* MSI S100 tablet */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Micro-Star International Co., Ltd."),
|
||||
@ -602,6 +613,21 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Onda v975w */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
|
||||
/* The above are too generic, also match BIOS info */
|
||||
DMI_EXACT_MATCH(DMI_BIOS_VERSION, "5.6.5"),
|
||||
DMI_EXACT_MATCH(DMI_BIOS_DATE, "07/25/2014"),
|
||||
},
|
||||
.driver_data = (void *)(BYT_RT5640_IN1_MAP |
|
||||
BYT_RT5640_JD_SRC_JD2_IN4N |
|
||||
BYT_RT5640_OVCD_TH_2000UA |
|
||||
BYT_RT5640_OVCD_SF_0P75 |
|
||||
BYT_RT5640_DIFF_MIC |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Pipo W4 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
|
@ -834,7 +834,7 @@ static int skl_first_init(struct hdac_bus *bus)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
skl_init_chip(bus, true);
|
||||
snd_hdac_bus_reset_link(bus, true);
|
||||
|
||||
snd_hdac_bus_parse_capabilities(bus);
|
||||
|
||||
|
@ -960,8 +960,10 @@ static int msm_routing_probe(struct snd_soc_component *c)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_SESSIONS; i++)
|
||||
for (i = 0; i < MAX_SESSIONS; i++) {
|
||||
routing_data->sessions[i].port_id = -1;
|
||||
routing_data->sessions[i].fedai_id = -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -462,6 +462,11 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
|
||||
goto rsnd_adg_get_clkout_end;
|
||||
|
||||
req_size = prop->length / sizeof(u32);
|
||||
if (req_size > REQ_SIZE) {
|
||||
dev_err(dev,
|
||||
"too many clock-frequency, use top %d\n", REQ_SIZE);
|
||||
req_size = REQ_SIZE;
|
||||
}
|
||||
|
||||
of_property_read_u32_array(np, "clock-frequency", req_rate, req_size);
|
||||
req_48kHz_rate = 0;
|
||||
|
@ -478,7 +478,7 @@ static int rsnd_status_update(u32 *status,
|
||||
(func_call && (mod)->ops->fn) ? #fn : ""); \
|
||||
if (func_call && (mod)->ops->fn) \
|
||||
tmp = (mod)->ops->fn(mod, io, param); \
|
||||
if (tmp) \
|
||||
if (tmp && (tmp != -EPROBE_DEFER)) \
|
||||
dev_err(dev, "%s[%d] : %s error %d\n", \
|
||||
rsnd_mod_name(mod), rsnd_mod_id(mod), \
|
||||
#fn, tmp); \
|
||||
@ -958,12 +958,23 @@ static void rsnd_soc_dai_shutdown(struct snd_pcm_substream *substream,
|
||||
rsnd_dai_stream_quit(io);
|
||||
}
|
||||
|
||||
static int rsnd_soc_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
|
||||
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
|
||||
struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
|
||||
|
||||
return rsnd_dai_call(prepare, io, priv);
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
|
||||
.startup = rsnd_soc_dai_startup,
|
||||
.shutdown = rsnd_soc_dai_shutdown,
|
||||
.trigger = rsnd_soc_dai_trigger,
|
||||
.set_fmt = rsnd_soc_dai_set_fmt,
|
||||
.set_tdm_slot = rsnd_soc_set_dai_tdm_slot,
|
||||
.prepare = rsnd_soc_dai_prepare,
|
||||
};
|
||||
|
||||
void rsnd_parse_connect_common(struct rsnd_dai *rdai,
|
||||
@ -1550,6 +1561,14 @@ exit_snd_probe:
|
||||
rsnd_dai_call(remove, &rdai->capture, priv);
|
||||
}
|
||||
|
||||
/*
|
||||
* adg is very special mod which can't use rsnd_dai_call(remove),
|
||||
* and it registers ADG clock on probe.
|
||||
* It should be unregister if probe failed.
|
||||
* Mainly it is assuming -EPROBE_DEFER case
|
||||
*/
|
||||
rsnd_adg_remove(priv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -241,6 +241,10 @@ static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
|
||||
/* try to get DMAEngine channel */
|
||||
chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
|
||||
if (IS_ERR_OR_NULL(chan)) {
|
||||
/* Let's follow when -EPROBE_DEFER case */
|
||||
if (PTR_ERR(chan) == -EPROBE_DEFER)
|
||||
return PTR_ERR(chan);
|
||||
|
||||
/*
|
||||
* DMA failed. try to PIO mode
|
||||
* see
|
||||
|
@ -280,6 +280,9 @@ struct rsnd_mod_ops {
|
||||
int (*nolock_stop)(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv);
|
||||
int (*prepare)(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv);
|
||||
};
|
||||
|
||||
struct rsnd_dai_stream;
|
||||
@ -309,6 +312,7 @@ struct rsnd_mod {
|
||||
* H 0: fallback
|
||||
* H 0: hw_params
|
||||
* H 0: pointer
|
||||
* H 0: prepare
|
||||
*/
|
||||
#define __rsnd_mod_shift_nolock_start 0
|
||||
#define __rsnd_mod_shift_nolock_stop 0
|
||||
@ -323,6 +327,7 @@ struct rsnd_mod {
|
||||
#define __rsnd_mod_shift_fallback 28 /* always called */
|
||||
#define __rsnd_mod_shift_hw_params 28 /* always called */
|
||||
#define __rsnd_mod_shift_pointer 28 /* always called */
|
||||
#define __rsnd_mod_shift_prepare 28 /* always called */
|
||||
|
||||
#define __rsnd_mod_add_probe 0
|
||||
#define __rsnd_mod_add_remove 0
|
||||
@ -337,6 +342,7 @@ struct rsnd_mod {
|
||||
#define __rsnd_mod_add_fallback 0
|
||||
#define __rsnd_mod_add_hw_params 0
|
||||
#define __rsnd_mod_add_pointer 0
|
||||
#define __rsnd_mod_add_prepare 0
|
||||
|
||||
#define __rsnd_mod_call_probe 0
|
||||
#define __rsnd_mod_call_remove 0
|
||||
@ -351,6 +357,7 @@ struct rsnd_mod {
|
||||
#define __rsnd_mod_call_pointer 0
|
||||
#define __rsnd_mod_call_nolock_start 0
|
||||
#define __rsnd_mod_call_nolock_stop 1
|
||||
#define __rsnd_mod_call_prepare 0
|
||||
|
||||
#define rsnd_mod_to_priv(mod) ((mod)->priv)
|
||||
#define rsnd_mod_name(mod) ((mod)->ops->name)
|
||||
|
@ -283,7 +283,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
|
||||
if (rsnd_ssi_is_multi_slave(mod, io))
|
||||
return 0;
|
||||
|
||||
if (ssi->usrcnt > 1) {
|
||||
if (ssi->rate) {
|
||||
if (ssi->rate != rate) {
|
||||
dev_err(dev, "SSI parent/child should use same rate\n");
|
||||
return -EINVAL;
|
||||
@ -434,7 +434,6 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
|
||||
struct rsnd_priv *priv)
|
||||
{
|
||||
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
|
||||
int ret;
|
||||
|
||||
if (!rsnd_ssi_is_run_mods(mod, io))
|
||||
return 0;
|
||||
@ -443,10 +442,6 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
|
||||
|
||||
rsnd_mod_power_on(mod);
|
||||
|
||||
ret = rsnd_ssi_master_clk_start(mod, io);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
rsnd_ssi_config_init(mod, io);
|
||||
|
||||
rsnd_ssi_register_setup(mod);
|
||||
@ -852,6 +847,13 @@ static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rsnd_ssi_prepare(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv)
|
||||
{
|
||||
return rsnd_ssi_master_clk_start(mod, io);
|
||||
}
|
||||
|
||||
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
|
||||
.name = SSI_NAME,
|
||||
.probe = rsnd_ssi_common_probe,
|
||||
@ -864,6 +866,7 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
|
||||
.pointer = rsnd_ssi_pio_pointer,
|
||||
.pcm_new = rsnd_ssi_pcm_new,
|
||||
.hw_params = rsnd_ssi_hw_params,
|
||||
.prepare = rsnd_ssi_prepare,
|
||||
};
|
||||
|
||||
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
|
||||
@ -940,6 +943,7 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
|
||||
.pcm_new = rsnd_ssi_pcm_new,
|
||||
.fallback = rsnd_ssi_fallback,
|
||||
.hw_params = rsnd_ssi_hw_params,
|
||||
.prepare = rsnd_ssi_prepare,
|
||||
};
|
||||
|
||||
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
|
||||
|
@ -1447,7 +1447,7 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
|
||||
sink = codec_dai->playback_widget;
|
||||
source = cpu_dai->capture_widget;
|
||||
if (sink && source) {
|
||||
ret = snd_soc_dapm_new_pcm(card, dai_link->params,
|
||||
ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
|
||||
dai_link->num_params,
|
||||
source, sink);
|
||||
if (ret != 0) {
|
||||
@ -1460,7 +1460,7 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
|
||||
sink = cpu_dai->playback_widget;
|
||||
source = codec_dai->capture_widget;
|
||||
if (sink && source) {
|
||||
ret = snd_soc_dapm_new_pcm(card, dai_link->params,
|
||||
ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
|
||||
dai_link->num_params,
|
||||
source, sink);
|
||||
if (ret != 0) {
|
||||
|
@ -3652,6 +3652,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
{
|
||||
struct snd_soc_dapm_path *source_p, *sink_p;
|
||||
struct snd_soc_dai *source, *sink;
|
||||
struct snd_soc_pcm_runtime *rtd = w->priv;
|
||||
const struct snd_soc_pcm_stream *config = w->params + w->params_select;
|
||||
struct snd_pcm_substream substream;
|
||||
struct snd_pcm_hw_params *params = NULL;
|
||||
@ -3711,6 +3712,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
goto out;
|
||||
}
|
||||
substream.runtime = runtime;
|
||||
substream.private_data = rtd;
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
@ -3895,6 +3897,7 @@ outfree_w_param:
|
||||
}
|
||||
|
||||
int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
|
||||
struct snd_soc_pcm_runtime *rtd,
|
||||
const struct snd_soc_pcm_stream *params,
|
||||
unsigned int num_params,
|
||||
struct snd_soc_dapm_widget *source,
|
||||
@ -3963,6 +3966,7 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
|
||||
|
||||
w->params = params;
|
||||
w->num_params = num_params;
|
||||
w->priv = rtd;
|
||||
|
||||
ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
|
||||
if (ret)
|
||||
|
Loading…
Reference in New Issue
Block a user