提交 4cdbbbd1 编写于 作者: L Linus Torvalds

Merge tag 'sound-4.7-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "Here are a collection of small fixes: at this time, we've got a
  slightly high amount, but all small and trivial fixes, and nothing
  scary can be seen there"

* tag 'sound-4.7-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (21 commits)
  ALSA: hda/realtek: Add Lenovo L460 to docking unit fixup
  ALSA: timer: Fix negative queue usage by racy accesses
  ASoC: rt5645: fix reg-2f default value.
  ASoC: fsl_ssi: Fix number of words per frame for I2S-slave mode
  ALSA: au88x0: Fix calculation in vortex_wtdma_bufshift()
  ALSA: hda - Add PCI ID for Kabylake-H
  ALSA: echoaudio: Fix memory allocation
  ASoC: Intel: atom: fix missing breaks that would cause the wrong operation to execute
  ALSA: hda - fix read before array start
  ASoC: cx20442: set tty->receiver_room in v253_open
  ASoC: ak4613: Enable cache usage to fix crashes on resume
  ASoC: wm8940: Enable cache usage to fix crashes on resume
  ASoC: Intel: Skylake: Initialize module list for Broxton
  ASoC: wm5102: Correct supported channels on trace compressed DAI
  ASoC: wm5110: Add missing route from OUT3R to SYSCLK
  ASoC: rt5670: fix HP Playback Volume control
  ASoC: hdmi-codec: select CONFIG_HDMI
  ASoC: davinci-mcasp: Fix dra7 DMA offset when using CFG port
  ASoC: hdac_hdmi: Fix potential NULL dereference
  ASoC: ak4613: Remove owner assignment from platform_driver
  ...
...@@ -1955,6 +1955,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, ...@@ -1955,6 +1955,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
qhead = tu->qhead++; qhead = tu->qhead++;
tu->qhead %= tu->queue_size; tu->qhead %= tu->queue_size;
tu->qused--;
spin_unlock_irq(&tu->qlock); spin_unlock_irq(&tu->qlock);
if (tu->tread) { if (tu->tread) {
...@@ -1968,7 +1969,6 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, ...@@ -1968,7 +1969,6 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
} }
spin_lock_irq(&tu->qlock); spin_lock_irq(&tu->qlock);
tu->qused--;
if (err < 0) if (err < 0)
goto _error; goto _error;
result += unit; result += unit;
......
...@@ -1444,9 +1444,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma) ...@@ -1444,9 +1444,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
int page, p, pp, delta, i; int page, p, pp, delta, i;
page = page =
(hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) & (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2))
WT_SUBBUF_MASK) >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK;
>> WT_SUBBUF_SHIFT;
if (dma->nr_periods >= 4) if (dma->nr_periods >= 4)
delta = (page - dma->period_real) & 3; delta = (page - dma->period_real) & 3;
else { else {
......
...@@ -2200,11 +2200,11 @@ static int snd_echo_resume(struct device *dev) ...@@ -2200,11 +2200,11 @@ static int snd_echo_resume(struct device *dev)
u32 pipe_alloc_mask; u32 pipe_alloc_mask;
int err; int err;
commpage_bak = kmalloc(sizeof(struct echoaudio), GFP_KERNEL); commpage_bak = kmalloc(sizeof(*commpage), GFP_KERNEL);
if (commpage_bak == NULL) if (commpage_bak == NULL)
return -ENOMEM; return -ENOMEM;
commpage = chip->comm_page; commpage = chip->comm_page;
memcpy(commpage_bak, commpage, sizeof(struct comm_page)); memcpy(commpage_bak, commpage, sizeof(*commpage));
err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);
if (err < 0) { if (err < 0) {
......
...@@ -3977,6 +3977,8 @@ static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid, ...@@ -3977,6 +3977,8 @@ static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid,
for (n = 0; n < spec->paths.used; n++) { for (n = 0; n < spec->paths.used; n++) {
path = snd_array_elem(&spec->paths, n); path = snd_array_elem(&spec->paths, n);
if (!path->depth)
continue;
if (path->path[0] == nid || if (path->path[0] == nid ||
path->path[path->depth - 1] == nid) { path->path[path->depth - 1] == nid) {
bool pin_old = path->pin_enabled; bool pin_old = path->pin_enabled;
......
...@@ -367,9 +367,10 @@ enum { ...@@ -367,9 +367,10 @@ enum {
#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70) #define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
#define IS_KBL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa171) #define IS_KBL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa171)
#define IS_KBL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d71) #define IS_KBL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d71)
#define IS_KBL_H(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa2f0)
#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci)) || \ #define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci)) || \
IS_KBL(pci) || IS_KBL_LP(pci) IS_KBL(pci) || IS_KBL_LP(pci) || IS_KBL_H(pci)
static char *driver_short_names[] = { static char *driver_short_names[] = {
[AZX_DRIVER_ICH] = "HDA Intel", [AZX_DRIVER_ICH] = "HDA Intel",
...@@ -2190,6 +2191,9 @@ static const struct pci_device_id azx_ids[] = { ...@@ -2190,6 +2191,9 @@ static const struct pci_device_id azx_ids[] = {
/* Kabylake-LP */ /* Kabylake-LP */
{ PCI_DEVICE(0x8086, 0x9d71), { PCI_DEVICE(0x8086, 0x9d71),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE }, .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
/* Kabylake-H */
{ PCI_DEVICE(0x8086, 0xa2f0),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
/* Broxton-P(Apollolake) */ /* Broxton-P(Apollolake) */
{ PCI_DEVICE(0x8086, 0x5a98), { PCI_DEVICE(0x8086, 0x5a98),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON }, .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON },
......
...@@ -5651,6 +5651,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -5651,6 +5651,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK), SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460), SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460), SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
......
...@@ -483,9 +483,10 @@ config SND_SOC_DMIC ...@@ -483,9 +483,10 @@ config SND_SOC_DMIC
tristate tristate
config SND_SOC_HDMI_CODEC config SND_SOC_HDMI_CODEC
tristate tristate
select SND_PCM_ELD select SND_PCM_ELD
select SND_PCM_IEC958 select SND_PCM_IEC958
select HDMI
config SND_SOC_ES8328 config SND_SOC_ES8328
tristate "Everest Semi ES8328 CODEC" tristate "Everest Semi ES8328 CODEC"
......
...@@ -146,6 +146,7 @@ static const struct regmap_config ak4613_regmap_cfg = { ...@@ -146,6 +146,7 @@ static const struct regmap_config ak4613_regmap_cfg = {
.max_register = 0x16, .max_register = 0x16,
.reg_defaults = ak4613_reg, .reg_defaults = ak4613_reg,
.num_reg_defaults = ARRAY_SIZE(ak4613_reg), .num_reg_defaults = ARRAY_SIZE(ak4613_reg),
.cache_type = REGCACHE_RBTREE,
}; };
static const struct of_device_id ak4613_of_match[] = { static const struct of_device_id ak4613_of_match[] = {
...@@ -530,7 +531,6 @@ static int ak4613_i2c_remove(struct i2c_client *client) ...@@ -530,7 +531,6 @@ static int ak4613_i2c_remove(struct i2c_client *client)
static struct i2c_driver ak4613_i2c_driver = { static struct i2c_driver ak4613_i2c_driver = {
.driver = { .driver = {
.name = "ak4613-codec", .name = "ak4613-codec",
.owner = THIS_MODULE,
.of_match_table = ak4613_of_match, .of_match_table = ak4613_of_match,
}, },
.probe = ak4613_i2c_probe, .probe = ak4613_i2c_probe,
......
...@@ -226,6 +226,7 @@ static int v253_open(struct tty_struct *tty) ...@@ -226,6 +226,7 @@ static int v253_open(struct tty_struct *tty)
if (!tty->disc_data) if (!tty->disc_data)
return -ENODEV; return -ENODEV;
tty->receive_room = 16;
if (tty->ops->write(tty, v253_init, len) != len) { if (tty->ops->write(tty, v253_init, len) != len) {
ret = -EIO; ret = -EIO;
goto err; goto err;
......
...@@ -1474,6 +1474,11 @@ static int hdmi_codec_probe(struct snd_soc_codec *codec) ...@@ -1474,6 +1474,11 @@ static int hdmi_codec_probe(struct snd_soc_codec *codec)
* exit, we call pm_runtime_suspend() so that will do for us * exit, we call pm_runtime_suspend() so that will do for us
*/ */
hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev)); hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev));
if (!hlink) {
dev_err(&edev->hdac.dev, "hdac link not found\n");
return -EIO;
}
snd_hdac_ext_bus_link_get(edev->ebus, hlink); snd_hdac_ext_bus_link_get(edev->ebus, hlink);
ret = create_fill_widget_route_map(dapm); ret = create_fill_widget_route_map(dapm);
...@@ -1634,6 +1639,11 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev) ...@@ -1634,6 +1639,11 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
/* hold the ref while we probe */ /* hold the ref while we probe */
hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev)); hlink = snd_hdac_ext_bus_get_link(edev->ebus, dev_name(&edev->hdac.dev));
if (!hlink) {
dev_err(&edev->hdac.dev, "hdac link not found\n");
return -EIO;
}
snd_hdac_ext_bus_link_get(edev->ebus, hlink); snd_hdac_ext_bus_link_get(edev->ebus, hlink);
hdmi_priv = devm_kzalloc(&codec->dev, sizeof(*hdmi_priv), GFP_KERNEL); hdmi_priv = devm_kzalloc(&codec->dev, sizeof(*hdmi_priv), GFP_KERNEL);
...@@ -1744,6 +1754,11 @@ static int hdac_hdmi_runtime_suspend(struct device *dev) ...@@ -1744,6 +1754,11 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
} }
hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev)); hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev));
if (!hlink) {
dev_err(dev, "hdac link not found\n");
return -EIO;
}
snd_hdac_ext_bus_link_put(ebus, hlink); snd_hdac_ext_bus_link_put(ebus, hlink);
return 0; return 0;
...@@ -1765,6 +1780,11 @@ static int hdac_hdmi_runtime_resume(struct device *dev) ...@@ -1765,6 +1780,11 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
return 0; return 0;
hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev)); hlink = snd_hdac_ext_bus_get_link(ebus, dev_name(dev));
if (!hlink) {
dev_err(dev, "hdac link not found\n");
return -EIO;
}
snd_hdac_ext_bus_link_get(ebus, hlink); snd_hdac_ext_bus_link_get(ebus, hlink);
err = snd_hdac_display_power(bus, true); err = snd_hdac_display_power(bus, true);
......
...@@ -253,7 +253,7 @@ static const struct reg_default rt5650_reg[] = { ...@@ -253,7 +253,7 @@ static const struct reg_default rt5650_reg[] = {
{ 0x2b, 0x5454 }, { 0x2b, 0x5454 },
{ 0x2c, 0xaaa0 }, { 0x2c, 0xaaa0 },
{ 0x2d, 0x0000 }, { 0x2d, 0x0000 },
{ 0x2f, 0x1002 }, { 0x2f, 0x5002 },
{ 0x31, 0x5000 }, { 0x31, 0x5000 },
{ 0x32, 0x0000 }, { 0x32, 0x0000 },
{ 0x33, 0x0000 }, { 0x33, 0x0000 },
......
...@@ -619,7 +619,7 @@ static const struct snd_kcontrol_new rt5670_snd_controls[] = { ...@@ -619,7 +619,7 @@ static const struct snd_kcontrol_new rt5670_snd_controls[] = {
RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1), RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1),
SOC_DOUBLE_TLV("HP Playback Volume", RT5670_HP_VOL, SOC_DOUBLE_TLV("HP Playback Volume", RT5670_HP_VOL,
RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
39, 0, out_vol_tlv), 39, 1, out_vol_tlv),
/* OUTPUT Control */ /* OUTPUT Control */
SOC_DOUBLE("OUT Channel Switch", RT5670_LOUT1, SOC_DOUBLE("OUT Channel Switch", RT5670_LOUT1,
RT5670_VOL_L_SFT, RT5670_VOL_R_SFT, 1, 1), RT5670_VOL_L_SFT, RT5670_VOL_R_SFT, 1, 1),
......
...@@ -1872,7 +1872,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = { ...@@ -1872,7 +1872,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
.capture = { .capture = {
.stream_name = "Audio Trace CPU", .stream_name = "Audio Trace CPU",
.channels_min = 1, .channels_min = 1,
.channels_max = 6, .channels_max = 4,
.rates = WM5102_RATES, .rates = WM5102_RATES,
.formats = WM5102_FORMATS, .formats = WM5102_FORMATS,
}, },
......
...@@ -1723,6 +1723,7 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { ...@@ -1723,6 +1723,7 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
{ "OUT2L", NULL, "SYSCLK" }, { "OUT2L", NULL, "SYSCLK" },
{ "OUT2R", NULL, "SYSCLK" }, { "OUT2R", NULL, "SYSCLK" },
{ "OUT3L", NULL, "SYSCLK" }, { "OUT3L", NULL, "SYSCLK" },
{ "OUT3R", NULL, "SYSCLK" },
{ "OUT4L", NULL, "SYSCLK" }, { "OUT4L", NULL, "SYSCLK" },
{ "OUT4R", NULL, "SYSCLK" }, { "OUT4R", NULL, "SYSCLK" },
{ "OUT5L", NULL, "SYSCLK" }, { "OUT5L", NULL, "SYSCLK" },
......
...@@ -743,6 +743,7 @@ static const struct regmap_config wm8940_regmap = { ...@@ -743,6 +743,7 @@ static const struct regmap_config wm8940_regmap = {
.max_register = WM8940_MONOMIX, .max_register = WM8940_MONOMIX,
.reg_defaults = wm8940_reg_defaults, .reg_defaults = wm8940_reg_defaults,
.num_reg_defaults = ARRAY_SIZE(wm8940_reg_defaults), .num_reg_defaults = ARRAY_SIZE(wm8940_reg_defaults),
.cache_type = REGCACHE_RBTREE,
.readable_reg = wm8940_readable_register, .readable_reg = wm8940_readable_register,
.volatile_reg = wm8940_volatile_register, .volatile_reg = wm8940_volatile_register,
......
...@@ -1513,8 +1513,9 @@ static struct davinci_mcasp_pdata am33xx_mcasp_pdata = { ...@@ -1513,8 +1513,9 @@ static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
}; };
static struct davinci_mcasp_pdata dra7_mcasp_pdata = { static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
.tx_dma_offset = 0x200, /* The CFG port offset will be calculated if it is needed */
.rx_dma_offset = 0x284, .tx_dma_offset = 0,
.rx_dma_offset = 0,
.version = MCASP_VERSION_4, .version = MCASP_VERSION_4,
}; };
...@@ -1734,6 +1735,52 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp) ...@@ -1734,6 +1735,52 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
return PCM_EDMA; return PCM_EDMA;
} }
static u32 davinci_mcasp_txdma_offset(struct davinci_mcasp_pdata *pdata)
{
int i;
u32 offset = 0;
if (pdata->version != MCASP_VERSION_4)
return pdata->tx_dma_offset;
for (i = 0; i < pdata->num_serializer; i++) {
if (pdata->serial_dir[i] == TX_MODE) {
if (!offset) {
offset = DAVINCI_MCASP_TXBUF_REG(i);
} else {
pr_err("%s: Only one serializer allowed!\n",
__func__);
break;
}
}
}
return offset;
}
static u32 davinci_mcasp_rxdma_offset(struct davinci_mcasp_pdata *pdata)
{
int i;
u32 offset = 0;
if (pdata->version != MCASP_VERSION_4)
return pdata->rx_dma_offset;
for (i = 0; i < pdata->num_serializer; i++) {
if (pdata->serial_dir[i] == RX_MODE) {
if (!offset) {
offset = DAVINCI_MCASP_RXBUF_REG(i);
} else {
pr_err("%s: Only one serializer allowed!\n",
__func__);
break;
}
}
}
return offset;
}
static int davinci_mcasp_probe(struct platform_device *pdev) static int davinci_mcasp_probe(struct platform_device *pdev)
{ {
struct snd_dmaengine_dai_dma_data *dma_data; struct snd_dmaengine_dai_dma_data *dma_data;
...@@ -1862,7 +1909,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1862,7 +1909,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
if (dat) if (dat)
dma_data->addr = dat->start; dma_data->addr = dat->start;
else else
dma_data->addr = mem->start + pdata->tx_dma_offset; dma_data->addr = mem->start + davinci_mcasp_txdma_offset(pdata);
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK]; dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
res = platform_get_resource(pdev, IORESOURCE_DMA, 0); res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
...@@ -1883,7 +1930,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1883,7 +1930,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
if (dat) if (dat)
dma_data->addr = dat->start; dma_data->addr = dat->start;
else else
dma_data->addr = mem->start + pdata->rx_dma_offset; dma_data->addr =
mem->start + davinci_mcasp_rxdma_offset(pdata);
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_CAPTURE]; dma = &mcasp->dma_request[SNDRV_PCM_STREAM_CAPTURE];
res = platform_get_resource(pdev, IORESOURCE_DMA, 1); res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
......
...@@ -85,9 +85,9 @@ ...@@ -85,9 +85,9 @@
(n << 2)) (n << 2))
/* Transmit Buffer for Serializer n */ /* Transmit Buffer for Serializer n */
#define DAVINCI_MCASP_TXBUF_REG 0x200 #define DAVINCI_MCASP_TXBUF_REG(n) (0x200 + (n << 2))
/* Receive Buffer for Serializer n */ /* Receive Buffer for Serializer n */
#define DAVINCI_MCASP_RXBUF_REG 0x280 #define DAVINCI_MCASP_RXBUF_REG(n) (0x280 + (n << 2))
/* McASP FIFO Registers */ /* McASP FIFO Registers */
#define DAVINCI_MCASP_V2_AFIFO_BASE (0x1010) #define DAVINCI_MCASP_V2_AFIFO_BASE (0x1010)
......
...@@ -952,16 +952,16 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev, ...@@ -952,16 +952,16 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev,
ssi_private->i2s_mode = CCSR_SSI_SCR_NET; ssi_private->i2s_mode = CCSR_SSI_SCR_NET;
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_I2S:
regmap_update_bits(regs, CCSR_SSI_STCCR,
CCSR_SSI_SxCCR_DC_MASK,
CCSR_SSI_SxCCR_DC(2));
regmap_update_bits(regs, CCSR_SSI_SRCCR,
CCSR_SSI_SxCCR_DC_MASK,
CCSR_SSI_SxCCR_DC(2));
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFS: case SND_SOC_DAIFMT_CBM_CFS:
case SND_SOC_DAIFMT_CBS_CFS: case SND_SOC_DAIFMT_CBS_CFS:
ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER; ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER;
regmap_update_bits(regs, CCSR_SSI_STCCR,
CCSR_SSI_SxCCR_DC_MASK,
CCSR_SSI_SxCCR_DC(2));
regmap_update_bits(regs, CCSR_SSI_SRCCR,
CCSR_SSI_SxCCR_DC_MASK,
CCSR_SSI_SxCCR_DC(2));
break; break;
case SND_SOC_DAIFMT_CBM_CFM: case SND_SOC_DAIFMT_CBM_CFM:
ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE; ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE;
......
...@@ -182,24 +182,29 @@ static int sst_platform_compr_trigger(struct snd_compr_stream *cstream, int cmd) ...@@ -182,24 +182,29 @@ static int sst_platform_compr_trigger(struct snd_compr_stream *cstream, int cmd)
case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_START:
if (stream->compr_ops->stream_start) if (stream->compr_ops->stream_start)
return stream->compr_ops->stream_start(sst->dev, stream->id); return stream->compr_ops->stream_start(sst->dev, stream->id);
break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
if (stream->compr_ops->stream_drop) if (stream->compr_ops->stream_drop)
return stream->compr_ops->stream_drop(sst->dev, stream->id); return stream->compr_ops->stream_drop(sst->dev, stream->id);
break;
case SND_COMPR_TRIGGER_DRAIN: case SND_COMPR_TRIGGER_DRAIN:
if (stream->compr_ops->stream_drain) if (stream->compr_ops->stream_drain)
return stream->compr_ops->stream_drain(sst->dev, stream->id); return stream->compr_ops->stream_drain(sst->dev, stream->id);
break;
case SND_COMPR_TRIGGER_PARTIAL_DRAIN: case SND_COMPR_TRIGGER_PARTIAL_DRAIN:
if (stream->compr_ops->stream_partial_drain) if (stream->compr_ops->stream_partial_drain)
return stream->compr_ops->stream_partial_drain(sst->dev, stream->id); return stream->compr_ops->stream_partial_drain(sst->dev, stream->id);
break;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (stream->compr_ops->stream_pause) if (stream->compr_ops->stream_pause)
return stream->compr_ops->stream_pause(sst->dev, stream->id); return stream->compr_ops->stream_pause(sst->dev, stream->id);
break;
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (stream->compr_ops->stream_pause_release) if (stream->compr_ops->stream_pause_release)
return stream->compr_ops->stream_pause_release(sst->dev, stream->id); return stream->compr_ops->stream_pause_release(sst->dev, stream->id);
default: break;
return -EINVAL;
} }
return -EINVAL;
} }
static int sst_platform_compr_pointer(struct snd_compr_stream *cstream, static int sst_platform_compr_pointer(struct snd_compr_stream *cstream,
......
...@@ -291,6 +291,7 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, ...@@ -291,6 +291,7 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
sst_dsp_mailbox_init(sst, (BXT_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ), sst_dsp_mailbox_init(sst, (BXT_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ),
SKL_ADSP_W0_UP_SZ, BXT_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ); SKL_ADSP_W0_UP_SZ, BXT_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
INIT_LIST_HEAD(&sst->module_list);
ret = skl_ipc_init(dev, skl); ret = skl_ipc_init(dev, skl);
if (ret) if (ret)
return ret; return ret;
......
...@@ -518,7 +518,7 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv, ...@@ -518,7 +518,7 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
} }
} }
rsnd_mod_bset(adg_mod, SSICKR, 0x00FF0000, ckr); rsnd_mod_bset(adg_mod, SSICKR, 0x80FF0000, ckr);
rsnd_mod_write(adg_mod, BRRA, rbga); rsnd_mod_write(adg_mod, BRRA, rbga);
rsnd_mod_write(adg_mod, BRRB, rbgb); rsnd_mod_write(adg_mod, BRRB, rbgb);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册