forked from Minki/linux
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
|
F: Documentation/devicetree/bindings/i2c/i2c-synquacer.txt
|
||||||
|
|
||||||
SOCIONEXT UNIPHIER SOUND DRIVER
|
SOCIONEXT UNIPHIER SOUND DRIVER
|
||||||
M: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
|
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: sound/soc/uniphier/
|
F: sound/soc/uniphier/
|
||||||
|
|
||||||
SOEKRIS NET48XX LED SUPPORT
|
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_stop_cmd_io(struct hdac_bus *bus);
|
||||||
void snd_hdac_bus_enter_link_reset(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);
|
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);
|
void snd_hdac_bus_update_rirb(struct hdac_bus *bus);
|
||||||
int snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
|
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);
|
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);
|
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
|
||||||
int snd_soc_dapm_new_pcm(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,
|
const struct snd_soc_pcm_stream *params,
|
||||||
unsigned int num_params,
|
unsigned int num_params,
|
||||||
struct snd_soc_dapm_widget *source,
|
struct snd_soc_dapm_widget *source,
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#ifndef __HDA_TPLG_INTERFACE_H__
|
#ifndef __HDA_TPLG_INTERFACE_H__
|
||||||
#define __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
|
* Default types range from 0~12. type can range from 0 to 0xff
|
||||||
* SST types start at higher to avoid any overlapping in future
|
* 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 {
|
struct skl_dfw_algo_data {
|
||||||
u32 set_params:2;
|
__u32 set_params:2;
|
||||||
u32 rsvd:30;
|
__u32 rsvd:30;
|
||||||
u32 param_id;
|
__u32 param_id;
|
||||||
u32 max;
|
__u32 max;
|
||||||
char params[0];
|
char params[0];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
@ -163,68 +165,68 @@ enum skl_tuple_type {
|
|||||||
/* v4 configuration data */
|
/* v4 configuration data */
|
||||||
|
|
||||||
struct skl_dfw_v4_module_pin {
|
struct skl_dfw_v4_module_pin {
|
||||||
u16 module_id;
|
__u16 module_id;
|
||||||
u16 instance_id;
|
__u16 instance_id;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct skl_dfw_v4_module_fmt {
|
struct skl_dfw_v4_module_fmt {
|
||||||
u32 channels;
|
__u32 channels;
|
||||||
u32 freq;
|
__u32 freq;
|
||||||
u32 bit_depth;
|
__u32 bit_depth;
|
||||||
u32 valid_bit_depth;
|
__u32 valid_bit_depth;
|
||||||
u32 ch_cfg;
|
__u32 ch_cfg;
|
||||||
u32 interleaving_style;
|
__u32 interleaving_style;
|
||||||
u32 sample_type;
|
__u32 sample_type;
|
||||||
u32 ch_map;
|
__u32 ch_map;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct skl_dfw_v4_module_caps {
|
struct skl_dfw_v4_module_caps {
|
||||||
u32 set_params:2;
|
__u32 set_params:2;
|
||||||
u32 rsvd:30;
|
__u32 rsvd:30;
|
||||||
u32 param_id;
|
__u32 param_id;
|
||||||
u32 caps_size;
|
__u32 caps_size;
|
||||||
u32 caps[HDA_SST_CFG_MAX];
|
__u32 caps[HDA_SST_CFG_MAX];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct skl_dfw_v4_pipe {
|
struct skl_dfw_v4_pipe {
|
||||||
u8 pipe_id;
|
__u8 pipe_id;
|
||||||
u8 pipe_priority;
|
__u8 pipe_priority;
|
||||||
u16 conn_type:4;
|
__u16 conn_type:4;
|
||||||
u16 rsvd:4;
|
__u16 rsvd:4;
|
||||||
u16 memory_pages:8;
|
__u16 memory_pages:8;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct skl_dfw_v4_module {
|
struct skl_dfw_v4_module {
|
||||||
char uuid[SKL_UUID_STR_SZ];
|
char uuid[SKL_UUID_STR_SZ];
|
||||||
|
|
||||||
u16 module_id;
|
__u16 module_id;
|
||||||
u16 instance_id;
|
__u16 instance_id;
|
||||||
u32 max_mcps;
|
__u32 max_mcps;
|
||||||
u32 mem_pages;
|
__u32 mem_pages;
|
||||||
u32 obs;
|
__u32 obs;
|
||||||
u32 ibs;
|
__u32 ibs;
|
||||||
u32 vbus_id;
|
__u32 vbus_id;
|
||||||
|
|
||||||
u32 max_in_queue:8;
|
__u32 max_in_queue:8;
|
||||||
u32 max_out_queue:8;
|
__u32 max_out_queue:8;
|
||||||
u32 time_slot:8;
|
__u32 time_slot:8;
|
||||||
u32 core_id:4;
|
__u32 core_id:4;
|
||||||
u32 rsvd1:4;
|
__u32 rsvd1:4;
|
||||||
|
|
||||||
u32 module_type:8;
|
__u32 module_type:8;
|
||||||
u32 conn_type:4;
|
__u32 conn_type:4;
|
||||||
u32 dev_type:4;
|
__u32 dev_type:4;
|
||||||
u32 hw_conn_type:4;
|
__u32 hw_conn_type:4;
|
||||||
u32 rsvd2:12;
|
__u32 rsvd2:12;
|
||||||
|
|
||||||
u32 params_fixup:8;
|
__u32 params_fixup:8;
|
||||||
u32 converter:8;
|
__u32 converter:8;
|
||||||
u32 input_pin_type:1;
|
__u32 input_pin_type:1;
|
||||||
u32 output_pin_type:1;
|
__u32 output_pin_type:1;
|
||||||
u32 is_dynamic_in_pin:1;
|
__u32 is_dynamic_in_pin:1;
|
||||||
u32 is_dynamic_out_pin:1;
|
__u32 is_dynamic_out_pin:1;
|
||||||
u32 is_loadable:1;
|
__u32 is_loadable:1;
|
||||||
u32 rsvd3:11;
|
__u32 rsvd3:11;
|
||||||
|
|
||||||
struct skl_dfw_v4_pipe pipe;
|
struct skl_dfw_v4_pipe pipe;
|
||||||
struct skl_dfw_v4_module_fmt in_fmt[MAX_IN_QUEUE];
|
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)
|
void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
|
||||||
{
|
{
|
||||||
|
WARN_ON_ONCE(!bus->rb.area);
|
||||||
|
|
||||||
spin_lock_irq(&bus->reg_lock);
|
spin_lock_irq(&bus->reg_lock);
|
||||||
/* CORB set up */
|
/* CORB set up */
|
||||||
bus->corb.addr = bus->rb.addr;
|
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);
|
EXPORT_SYMBOL_GPL(snd_hdac_bus_exit_link_reset);
|
||||||
|
|
||||||
/* reset codec link */
|
/* 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)
|
if (!full_reset)
|
||||||
goto skip_reset;
|
goto skip_reset;
|
||||||
@ -408,7 +410,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
|||||||
skip_reset:
|
skip_reset:
|
||||||
/* check to see if controller is ready */
|
/* check to see if controller is ready */
|
||||||
if (!snd_hdac_chip_readb(bus, GCTL)) {
|
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;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,6 +425,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_hdac_bus_reset_link);
|
||||||
|
|
||||||
/* enable interrupts */
|
/* enable interrupts */
|
||||||
static void azx_int_enable(struct hdac_bus *bus)
|
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;
|
return false;
|
||||||
|
|
||||||
/* reset controller */
|
/* 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_clear(bus);
|
||||||
azx_int_enable(bus);
|
|
||||||
|
|
||||||
/* initialize the codec command I/O */
|
/* initialize the codec command I/O */
|
||||||
snd_hdac_bus_init_cmd_io(bus);
|
snd_hdac_bus_init_cmd_io(bus);
|
||||||
|
|
||||||
|
/* enable interrupts after CORB/RIRB buffers are initialized above */
|
||||||
|
azx_int_enable(bus);
|
||||||
|
|
||||||
/* program the position buffer */
|
/* program the position buffer */
|
||||||
if (bus->use_posbuf && bus->posbuf.addr) {
|
if (bus->use_posbuf && bus->posbuf.addr) {
|
||||||
snd_hdac_chip_writel(bus, DPLBASE, (u32)bus->posbuf.addr);
|
snd_hdac_chip_writel(bus, DPLBASE, (u32)bus->posbuf.addr);
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/iopoll.h>
|
||||||
#include <linux/sizes.h>
|
#include <linux/sizes.h>
|
||||||
#include <linux/pm_runtime.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);
|
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
|
* Initialize the DMA descriptor information for transfer between
|
||||||
* system memory <-> ACP SRAM
|
* 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,
|
config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
|
||||||
&dmadscr[i]);
|
&dmadscr[i]);
|
||||||
}
|
}
|
||||||
|
pre_config_reset(acp_mmio, ch);
|
||||||
config_acp_dma_channel(acp_mmio, ch,
|
config_acp_dma_channel(acp_mmio, ch,
|
||||||
dma_dscr_idx - 1,
|
dma_dscr_idx - 1,
|
||||||
NUM_DSCRS_PER_CHANNEL,
|
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,
|
config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
|
||||||
&dmadscr[i]);
|
&dmadscr[i]);
|
||||||
}
|
}
|
||||||
|
pre_config_reset(acp_mmio, ch);
|
||||||
/* Configure the DMA channel with the above descriptore */
|
/* Configure the DMA channel with the above descriptore */
|
||||||
config_acp_dma_channel(acp_mmio, ch, dma_dscr_idx - 1,
|
config_acp_dma_channel(acp_mmio, ch, dma_dscr_idx - 1,
|
||||||
NUM_DSCRS_PER_CHANNEL,
|
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,
|
SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2,
|
||||||
3, 1, 0),
|
3, 1, 0),
|
||||||
SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum),
|
SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum),
|
||||||
SOC_SINGLE("MMTLR Data Switch", 0,
|
SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2,
|
||||||
1, 1, 0),
|
0, 1, 0),
|
||||||
SOC_ENUM("Mono Channel Select", spdif_mono_select_enum),
|
SOC_ENUM("Mono Channel Select", spdif_mono_select_enum),
|
||||||
SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24),
|
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) {
|
switch (reg) {
|
||||||
case MAX98373_R2000_SW_RESET ... MAX98373_R2009_INT_FLAG3:
|
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_R2054_MEAS_ADC_PVDD_CH_READBACK:
|
||||||
case MAX98373_R2055_MEAS_ADC_THERM_CH_READBACK:
|
case MAX98373_R2055_MEAS_ADC_THERM_CH_READBACK:
|
||||||
case MAX98373_R20B6_BDE_CUR_STATE_READBACK:
|
case MAX98373_R20B6_BDE_CUR_STATE_READBACK:
|
||||||
@ -729,6 +730,7 @@ static int max98373_probe(struct snd_soc_component *component)
|
|||||||
/* Software Reset */
|
/* Software Reset */
|
||||||
regmap_write(max98373->regmap,
|
regmap_write(max98373->regmap,
|
||||||
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
||||||
|
usleep_range(10000, 11000);
|
||||||
|
|
||||||
/* IV default slot configuration */
|
/* IV default slot configuration */
|
||||||
regmap_write(max98373->regmap,
|
regmap_write(max98373->regmap,
|
||||||
@ -817,6 +819,7 @@ static int max98373_resume(struct device *dev)
|
|||||||
|
|
||||||
regmap_write(max98373->regmap,
|
regmap_write(max98373->regmap,
|
||||||
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
MAX98373_R2000_SW_RESET, MAX98373_SOFT_RESET);
|
||||||
|
usleep_range(10000, 11000);
|
||||||
regcache_cache_only(max98373->regmap, false);
|
regcache_cache_only(max98373->regmap, false);
|
||||||
regcache_sync(max98373->regmap);
|
regcache_sync(max98373->regmap);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -64,8 +64,8 @@ static const struct reg_sequence rt5514_patch[] = {
|
|||||||
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
||||||
{RT5514_ANA_CTRL_ADCFED, 0x00000800},
|
{RT5514_ANA_CTRL_ADCFED, 0x00000800},
|
||||||
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
||||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000352},
|
{RT5514_DOWNFILTER0_CTRL3, 0x10000342},
|
||||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000352},
|
{RT5514_DOWNFILTER1_CTRL3, 0x10000342},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct reg_default rt5514_reg[] = {
|
static const struct reg_default rt5514_reg[] = {
|
||||||
@ -92,10 +92,10 @@ static const struct reg_default rt5514_reg[] = {
|
|||||||
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
{RT5514_ASRC_IN_CTRL1, 0x00000003},
|
||||||
{RT5514_DOWNFILTER0_CTRL1, 0x00020c2f},
|
{RT5514_DOWNFILTER0_CTRL1, 0x00020c2f},
|
||||||
{RT5514_DOWNFILTER0_CTRL2, 0x00020c2f},
|
{RT5514_DOWNFILTER0_CTRL2, 0x00020c2f},
|
||||||
{RT5514_DOWNFILTER0_CTRL3, 0x10000352},
|
{RT5514_DOWNFILTER0_CTRL3, 0x10000342},
|
||||||
{RT5514_DOWNFILTER1_CTRL1, 0x00020c2f},
|
{RT5514_DOWNFILTER1_CTRL1, 0x00020c2f},
|
||||||
{RT5514_DOWNFILTER1_CTRL2, 0x00020c2f},
|
{RT5514_DOWNFILTER1_CTRL2, 0x00020c2f},
|
||||||
{RT5514_DOWNFILTER1_CTRL3, 0x10000352},
|
{RT5514_DOWNFILTER1_CTRL3, 0x10000342},
|
||||||
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
{RT5514_ANA_CTRL_LDO10, 0x00028604},
|
||||||
{RT5514_ANA_CTRL_LDO18_16, 0x02000345},
|
{RT5514_ANA_CTRL_LDO18_16, 0x02000345},
|
||||||
{RT5514_ANA_CTRL_ADC12, 0x0000a2a8},
|
{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(hp_vol_tlv, -2250, 150, 0);
|
||||||
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
|
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
|
||||||
static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 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);
|
static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
|
||||||
|
|
||||||
/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
|
/* {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 */
|
/* DAC Digital Volume */
|
||||||
SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL,
|
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 */
|
/* IN Boost Volume */
|
||||||
SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL,
|
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,
|
SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL,
|
||||||
RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
|
RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1),
|
||||||
SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL,
|
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 */
|
/* ADC Boost Volume Control */
|
||||||
SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST,
|
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)
|
struct sigmadsp_control *ctrl, void *data)
|
||||||
{
|
{
|
||||||
/* safeload loads up to 20 bytes in a atomic operation */
|
/* safeload loads up to 20 bytes in a atomic operation */
|
||||||
if (ctrl->num_bytes > 4 && ctrl->num_bytes <= 20 && sigmadsp->ops &&
|
if (ctrl->num_bytes <= 20 && sigmadsp->ops && sigmadsp->ops->safeload)
|
||||||
sigmadsp->ops->safeload)
|
|
||||||
return sigmadsp->ops->safeload(sigmadsp, ctrl->addr, data,
|
return sigmadsp->ops->safeload(sigmadsp, ctrl->addr, data,
|
||||||
ctrl->num_bytes);
|
ctrl->num_bytes);
|
||||||
else
|
else
|
||||||
|
@ -424,8 +424,10 @@ static void tas6424_fault_check_work(struct work_struct *work)
|
|||||||
TAS6424_FAULT_PVDD_UV |
|
TAS6424_FAULT_PVDD_UV |
|
||||||
TAS6424_FAULT_VBAT_UV;
|
TAS6424_FAULT_VBAT_UV;
|
||||||
|
|
||||||
if (reg)
|
if (!reg) {
|
||||||
|
tas6424->last_fault1 = reg;
|
||||||
goto check_global_fault2_reg;
|
goto check_global_fault2_reg;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only flag errors once for a given occurrence. This is needed as
|
* 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_CH3 |
|
||||||
TAS6424_FAULT_OTSD_CH4;
|
TAS6424_FAULT_OTSD_CH4;
|
||||||
|
|
||||||
if (!reg)
|
if (!reg) {
|
||||||
|
tas6424->last_fault2 = reg;
|
||||||
goto check_warn_reg;
|
goto check_warn_reg;
|
||||||
|
}
|
||||||
|
|
||||||
if ((reg & TAS6424_FAULT_OTSD) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD))
|
if ((reg & TAS6424_FAULT_OTSD) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD))
|
||||||
dev_crit(dev, "experienced a global overtemp shutdown\n");
|
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_CH3 |
|
||||||
TAS6424_WARN_VDD_OTW_CH4;
|
TAS6424_WARN_VDD_OTW_CH4;
|
||||||
|
|
||||||
if (!reg)
|
if (!reg) {
|
||||||
|
tas6424->last_warn = reg;
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if ((reg & TAS6424_WARN_VDD_UV) && !(tas6424->last_warn & TAS6424_WARN_VDD_UV))
|
if ((reg & TAS6424_WARN_VDD_UV) && !(tas6424->last_warn & TAS6424_WARN_VDD_UV))
|
||||||
dev_warn(dev, "experienced a VDD under voltage condition\n");
|
dev_warn(dev, "experienced a VDD under voltage condition\n");
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
|
|
||||||
#include "wm8804.h"
|
#include "wm8804.h"
|
||||||
|
|
||||||
@ -40,17 +41,29 @@ static const struct i2c_device_id wm8804_i2c_id[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, wm8804_i2c_id);
|
MODULE_DEVICE_TABLE(i2c, wm8804_i2c_id);
|
||||||
|
|
||||||
|
#if defined(CONFIG_OF)
|
||||||
static const struct of_device_id wm8804_of_match[] = {
|
static const struct of_device_id wm8804_of_match[] = {
|
||||||
{ .compatible = "wlf,wm8804", },
|
{ .compatible = "wlf,wm8804", },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, wm8804_of_match);
|
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 = {
|
static struct i2c_driver wm8804_i2c_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "wm8804",
|
.name = "wm8804",
|
||||||
.pm = &wm8804_pm,
|
.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,
|
.probe = wm8804_i2c_probe,
|
||||||
.remove = wm8804_i2c_remove,
|
.remove = wm8804_i2c_remove,
|
||||||
|
@ -719,7 +719,7 @@ static int wm9712_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
static struct platform_driver wm9712_component_driver = {
|
static struct platform_driver wm9712_component_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "wm9712-component",
|
.name = "wm9712-codec",
|
||||||
},
|
},
|
||||||
|
|
||||||
.probe = wm9712_probe,
|
.probe = wm9712_probe,
|
||||||
|
@ -575,6 +575,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||||||
BYT_RT5640_MONO_SPEAKER |
|
BYT_RT5640_MONO_SPEAKER |
|
||||||
BYT_RT5640_MCLK_EN),
|
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 */
|
{ /* MSI S100 tablet */
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Micro-Star International Co., Ltd."),
|
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_SSP0_AIF1 |
|
||||||
BYT_RT5640_MCLK_EN),
|
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 */
|
{ /* Pipo W4 */
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||||
|
@ -834,7 +834,7 @@ static int skl_first_init(struct hdac_bus *bus)
|
|||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
skl_init_chip(bus, true);
|
snd_hdac_bus_reset_link(bus, true);
|
||||||
|
|
||||||
snd_hdac_bus_parse_capabilities(bus);
|
snd_hdac_bus_parse_capabilities(bus);
|
||||||
|
|
||||||
|
@ -960,8 +960,10 @@ static int msm_routing_probe(struct snd_soc_component *c)
|
|||||||
{
|
{
|
||||||
int i;
|
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].port_id = -1;
|
||||||
|
routing_data->sessions[i].fedai_id = -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -462,6 +462,11 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
|
|||||||
goto rsnd_adg_get_clkout_end;
|
goto rsnd_adg_get_clkout_end;
|
||||||
|
|
||||||
req_size = prop->length / sizeof(u32);
|
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);
|
of_property_read_u32_array(np, "clock-frequency", req_rate, req_size);
|
||||||
req_48kHz_rate = 0;
|
req_48kHz_rate = 0;
|
||||||
|
@ -478,7 +478,7 @@ static int rsnd_status_update(u32 *status,
|
|||||||
(func_call && (mod)->ops->fn) ? #fn : ""); \
|
(func_call && (mod)->ops->fn) ? #fn : ""); \
|
||||||
if (func_call && (mod)->ops->fn) \
|
if (func_call && (mod)->ops->fn) \
|
||||||
tmp = (mod)->ops->fn(mod, io, param); \
|
tmp = (mod)->ops->fn(mod, io, param); \
|
||||||
if (tmp) \
|
if (tmp && (tmp != -EPROBE_DEFER)) \
|
||||||
dev_err(dev, "%s[%d] : %s error %d\n", \
|
dev_err(dev, "%s[%d] : %s error %d\n", \
|
||||||
rsnd_mod_name(mod), rsnd_mod_id(mod), \
|
rsnd_mod_name(mod), rsnd_mod_id(mod), \
|
||||||
#fn, tmp); \
|
#fn, tmp); \
|
||||||
@ -958,12 +958,23 @@ static void rsnd_soc_dai_shutdown(struct snd_pcm_substream *substream,
|
|||||||
rsnd_dai_stream_quit(io);
|
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 = {
|
static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
|
||||||
.startup = rsnd_soc_dai_startup,
|
.startup = rsnd_soc_dai_startup,
|
||||||
.shutdown = rsnd_soc_dai_shutdown,
|
.shutdown = rsnd_soc_dai_shutdown,
|
||||||
.trigger = rsnd_soc_dai_trigger,
|
.trigger = rsnd_soc_dai_trigger,
|
||||||
.set_fmt = rsnd_soc_dai_set_fmt,
|
.set_fmt = rsnd_soc_dai_set_fmt,
|
||||||
.set_tdm_slot = rsnd_soc_set_dai_tdm_slot,
|
.set_tdm_slot = rsnd_soc_set_dai_tdm_slot,
|
||||||
|
.prepare = rsnd_soc_dai_prepare,
|
||||||
};
|
};
|
||||||
|
|
||||||
void rsnd_parse_connect_common(struct rsnd_dai *rdai,
|
void rsnd_parse_connect_common(struct rsnd_dai *rdai,
|
||||||
@ -1550,6 +1561,14 @@ exit_snd_probe:
|
|||||||
rsnd_dai_call(remove, &rdai->capture, priv);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +241,10 @@ static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
|
|||||||
/* try to get DMAEngine channel */
|
/* try to get DMAEngine channel */
|
||||||
chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
|
chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
|
||||||
if (IS_ERR_OR_NULL(chan)) {
|
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
|
* DMA failed. try to PIO mode
|
||||||
* see
|
* see
|
||||||
|
@ -280,6 +280,9 @@ struct rsnd_mod_ops {
|
|||||||
int (*nolock_stop)(struct rsnd_mod *mod,
|
int (*nolock_stop)(struct rsnd_mod *mod,
|
||||||
struct rsnd_dai_stream *io,
|
struct rsnd_dai_stream *io,
|
||||||
struct rsnd_priv *priv);
|
struct rsnd_priv *priv);
|
||||||
|
int (*prepare)(struct rsnd_mod *mod,
|
||||||
|
struct rsnd_dai_stream *io,
|
||||||
|
struct rsnd_priv *priv);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rsnd_dai_stream;
|
struct rsnd_dai_stream;
|
||||||
@ -309,6 +312,7 @@ struct rsnd_mod {
|
|||||||
* H 0: fallback
|
* H 0: fallback
|
||||||
* H 0: hw_params
|
* H 0: hw_params
|
||||||
* H 0: pointer
|
* H 0: pointer
|
||||||
|
* H 0: prepare
|
||||||
*/
|
*/
|
||||||
#define __rsnd_mod_shift_nolock_start 0
|
#define __rsnd_mod_shift_nolock_start 0
|
||||||
#define __rsnd_mod_shift_nolock_stop 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_fallback 28 /* always called */
|
||||||
#define __rsnd_mod_shift_hw_params 28 /* always called */
|
#define __rsnd_mod_shift_hw_params 28 /* always called */
|
||||||
#define __rsnd_mod_shift_pointer 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_probe 0
|
||||||
#define __rsnd_mod_add_remove 0
|
#define __rsnd_mod_add_remove 0
|
||||||
@ -337,6 +342,7 @@ struct rsnd_mod {
|
|||||||
#define __rsnd_mod_add_fallback 0
|
#define __rsnd_mod_add_fallback 0
|
||||||
#define __rsnd_mod_add_hw_params 0
|
#define __rsnd_mod_add_hw_params 0
|
||||||
#define __rsnd_mod_add_pointer 0
|
#define __rsnd_mod_add_pointer 0
|
||||||
|
#define __rsnd_mod_add_prepare 0
|
||||||
|
|
||||||
#define __rsnd_mod_call_probe 0
|
#define __rsnd_mod_call_probe 0
|
||||||
#define __rsnd_mod_call_remove 0
|
#define __rsnd_mod_call_remove 0
|
||||||
@ -351,6 +357,7 @@ struct rsnd_mod {
|
|||||||
#define __rsnd_mod_call_pointer 0
|
#define __rsnd_mod_call_pointer 0
|
||||||
#define __rsnd_mod_call_nolock_start 0
|
#define __rsnd_mod_call_nolock_start 0
|
||||||
#define __rsnd_mod_call_nolock_stop 1
|
#define __rsnd_mod_call_nolock_stop 1
|
||||||
|
#define __rsnd_mod_call_prepare 0
|
||||||
|
|
||||||
#define rsnd_mod_to_priv(mod) ((mod)->priv)
|
#define rsnd_mod_to_priv(mod) ((mod)->priv)
|
||||||
#define rsnd_mod_name(mod) ((mod)->ops->name)
|
#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))
|
if (rsnd_ssi_is_multi_slave(mod, io))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (ssi->usrcnt > 1) {
|
if (ssi->rate) {
|
||||||
if (ssi->rate != rate) {
|
if (ssi->rate != rate) {
|
||||||
dev_err(dev, "SSI parent/child should use same rate\n");
|
dev_err(dev, "SSI parent/child should use same rate\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -434,7 +434,6 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
|
|||||||
struct rsnd_priv *priv)
|
struct rsnd_priv *priv)
|
||||||
{
|
{
|
||||||
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
|
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!rsnd_ssi_is_run_mods(mod, io))
|
if (!rsnd_ssi_is_run_mods(mod, io))
|
||||||
return 0;
|
return 0;
|
||||||
@ -443,10 +442,6 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
|
|||||||
|
|
||||||
rsnd_mod_power_on(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_config_init(mod, io);
|
||||||
|
|
||||||
rsnd_ssi_register_setup(mod);
|
rsnd_ssi_register_setup(mod);
|
||||||
@ -852,6 +847,13 @@ static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
|
|||||||
return 0;
|
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 = {
|
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
|
||||||
.name = SSI_NAME,
|
.name = SSI_NAME,
|
||||||
.probe = rsnd_ssi_common_probe,
|
.probe = rsnd_ssi_common_probe,
|
||||||
@ -864,6 +866,7 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
|
|||||||
.pointer = rsnd_ssi_pio_pointer,
|
.pointer = rsnd_ssi_pio_pointer,
|
||||||
.pcm_new = rsnd_ssi_pcm_new,
|
.pcm_new = rsnd_ssi_pcm_new,
|
||||||
.hw_params = rsnd_ssi_hw_params,
|
.hw_params = rsnd_ssi_hw_params,
|
||||||
|
.prepare = rsnd_ssi_prepare,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
|
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,
|
.pcm_new = rsnd_ssi_pcm_new,
|
||||||
.fallback = rsnd_ssi_fallback,
|
.fallback = rsnd_ssi_fallback,
|
||||||
.hw_params = rsnd_ssi_hw_params,
|
.hw_params = rsnd_ssi_hw_params,
|
||||||
|
.prepare = rsnd_ssi_prepare,
|
||||||
};
|
};
|
||||||
|
|
||||||
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
|
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;
|
sink = codec_dai->playback_widget;
|
||||||
source = cpu_dai->capture_widget;
|
source = cpu_dai->capture_widget;
|
||||||
if (sink && source) {
|
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,
|
dai_link->num_params,
|
||||||
source, sink);
|
source, sink);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
@ -1460,7 +1460,7 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
|
|||||||
sink = cpu_dai->playback_widget;
|
sink = cpu_dai->playback_widget;
|
||||||
source = codec_dai->capture_widget;
|
source = codec_dai->capture_widget;
|
||||||
if (sink && source) {
|
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,
|
dai_link->num_params,
|
||||||
source, sink);
|
source, sink);
|
||||||
if (ret != 0) {
|
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_dapm_path *source_p, *sink_p;
|
||||||
struct snd_soc_dai *source, *sink;
|
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;
|
const struct snd_soc_pcm_stream *config = w->params + w->params_select;
|
||||||
struct snd_pcm_substream substream;
|
struct snd_pcm_substream substream;
|
||||||
struct snd_pcm_hw_params *params = NULL;
|
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;
|
goto out;
|
||||||
}
|
}
|
||||||
substream.runtime = runtime;
|
substream.runtime = runtime;
|
||||||
|
substream.private_data = rtd;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
case SND_SOC_DAPM_PRE_PMU:
|
||||||
@ -3895,6 +3897,7 @@ outfree_w_param:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int snd_soc_dapm_new_pcm(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,
|
const struct snd_soc_pcm_stream *params,
|
||||||
unsigned int num_params,
|
unsigned int num_params,
|
||||||
struct snd_soc_dapm_widget *source,
|
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->params = params;
|
||||||
w->num_params = num_params;
|
w->num_params = num_params;
|
||||||
|
w->priv = rtd;
|
||||||
|
|
||||||
ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
|
ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
Loading…
Reference in New Issue
Block a user