Merge remote-tracking branches 'asoc/fix/fsl-sai', 'asoc/fix/intel', 'asoc/fix/max98090' and 'asoc/fix/s6000' into asoc-linus
This commit is contained in:
commit
a3e048a5bb
|
@ -2284,7 +2284,7 @@ static int max98090_probe(struct snd_soc_codec *codec)
|
||||||
/* Register for interrupts */
|
/* Register for interrupts */
|
||||||
dev_dbg(codec->dev, "irq = %d\n", max98090->irq);
|
dev_dbg(codec->dev, "irq = %d\n", max98090->irq);
|
||||||
|
|
||||||
ret = request_threaded_irq(max98090->irq, NULL,
|
ret = devm_request_threaded_irq(codec->dev, max98090->irq, NULL,
|
||||||
max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||||
"max98090_interrupt", codec);
|
"max98090_interrupt", codec);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -106,7 +106,7 @@ irq_rx:
|
||||||
xcsr &= ~FSL_SAI_CSR_xF_MASK;
|
xcsr &= ~FSL_SAI_CSR_xF_MASK;
|
||||||
|
|
||||||
if (flags)
|
if (flags)
|
||||||
regmap_write(sai->regmap, FSL_SAI_TCSR, flags | xcsr);
|
regmap_write(sai->regmap, FSL_SAI_RCSR, flags | xcsr);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (irq_none)
|
if (irq_none)
|
||||||
|
@ -371,10 +371,13 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
|
|
||||||
/* Check if the opposite FRDE is also disabled */
|
/* Check if the opposite FRDE is also disabled */
|
||||||
if (!(tx ? rcsr & FSL_SAI_CSR_FRDE : tcsr & FSL_SAI_CSR_FRDE)) {
|
if (!(tx ? rcsr & FSL_SAI_CSR_FRDE : tcsr & FSL_SAI_CSR_FRDE)) {
|
||||||
|
/* Disable both directions and reset their FIFOs */
|
||||||
regmap_update_bits(sai->regmap, FSL_SAI_TCSR,
|
regmap_update_bits(sai->regmap, FSL_SAI_TCSR,
|
||||||
FSL_SAI_CSR_TERE, 0);
|
FSL_SAI_CSR_TERE | FSL_SAI_CSR_FR,
|
||||||
|
FSL_SAI_CSR_FR);
|
||||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR,
|
regmap_update_bits(sai->regmap, FSL_SAI_RCSR,
|
||||||
FSL_SAI_CSR_TERE, 0);
|
FSL_SAI_CSR_TERE | FSL_SAI_CSR_FR,
|
||||||
|
FSL_SAI_CSR_FR);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -39,8 +39,7 @@ static const struct snd_soc_dapm_widget byt_max98090_widgets[] = {
|
||||||
|
|
||||||
static const struct snd_soc_dapm_route byt_max98090_audio_map[] = {
|
static const struct snd_soc_dapm_route byt_max98090_audio_map[] = {
|
||||||
{"IN34", NULL, "Headset Mic"},
|
{"IN34", NULL, "Headset Mic"},
|
||||||
{"IN34", NULL, "MICBIAS"},
|
{"Headset Mic", NULL, "MICBIAS"},
|
||||||
{"MICBIAS", NULL, "Headset Mic"},
|
|
||||||
{"DMICL", NULL, "Int Mic"},
|
{"DMICL", NULL, "Int Mic"},
|
||||||
{"Headphone", NULL, "HPL"},
|
{"Headphone", NULL, "HPL"},
|
||||||
{"Headphone", NULL, "HPR"},
|
{"Headphone", NULL, "HPR"},
|
||||||
|
@ -84,7 +83,8 @@ static struct snd_soc_jack_gpio hs_jack_gpios[] = {
|
||||||
{
|
{
|
||||||
.name = "mic-gpio",
|
.name = "mic-gpio",
|
||||||
.idx = 1,
|
.idx = 1,
|
||||||
.report = SND_JACK_MICROPHONE | SND_JACK_LINEIN,
|
.invert = 1,
|
||||||
|
.report = SND_JACK_MICROPHONE,
|
||||||
.debounce_time = 200,
|
.debounce_time = 200,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -108,7 +108,8 @@ static int byt_max98090_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable jack detection */
|
/* Enable jack detection */
|
||||||
ret = snd_soc_jack_new(codec, "Headphone", SND_JACK_HEADPHONE, jack);
|
ret = snd_soc_jack_new(codec, "Headset",
|
||||||
|
SND_JACK_LINEOUT | SND_JACK_HEADSET, jack);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -117,13 +118,9 @@ static int byt_max98090_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = snd_soc_jack_add_gpiods(card->dev->parent, jack,
|
return snd_soc_jack_add_gpiods(card->dev->parent, jack,
|
||||||
ARRAY_SIZE(hs_jack_gpios),
|
ARRAY_SIZE(hs_jack_gpios),
|
||||||
hs_jack_gpios);
|
hs_jack_gpios);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return max98090_mic_detect(codec, jack);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct snd_soc_dai_link byt_max98090_dais[] = {
|
static struct snd_soc_dai_link byt_max98090_dais[] = {
|
||||||
|
|
|
@ -32,7 +32,7 @@ static const struct snd_pcm_hardware sst_byt_pcm_hardware = {
|
||||||
SNDRV_PCM_INFO_PAUSE |
|
SNDRV_PCM_INFO_PAUSE |
|
||||||
SNDRV_PCM_INFO_RESUME,
|
SNDRV_PCM_INFO_RESUME,
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||||||
SNDRV_PCM_FORMAT_S24_LE,
|
SNDRV_PCM_FMTBIT_S24_LE,
|
||||||
.period_bytes_min = 384,
|
.period_bytes_min = 384,
|
||||||
.period_bytes_max = 48000,
|
.period_bytes_max = 48000,
|
||||||
.periods_min = 2,
|
.periods_min = 2,
|
||||||
|
|
|
@ -359,6 +359,17 @@ static u32 hsw_block_get_bit(struct sst_mem_block *block)
|
||||||
return bit;
|
return bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*dummy read a SRAM block.*/
|
||||||
|
static void sst_mem_block_dummy_read(struct sst_mem_block *block)
|
||||||
|
{
|
||||||
|
u32 size;
|
||||||
|
u8 tmp_buf[4];
|
||||||
|
struct sst_dsp *sst = block->dsp;
|
||||||
|
|
||||||
|
size = block->size > 4 ? 4 : block->size;
|
||||||
|
memcpy_fromio(tmp_buf, sst->addr.lpe + block->offset, size);
|
||||||
|
}
|
||||||
|
|
||||||
/* enable 32kB memory block - locks held by caller */
|
/* enable 32kB memory block - locks held by caller */
|
||||||
static int hsw_block_enable(struct sst_mem_block *block)
|
static int hsw_block_enable(struct sst_mem_block *block)
|
||||||
{
|
{
|
||||||
|
@ -378,6 +389,8 @@ static int hsw_block_enable(struct sst_mem_block *block)
|
||||||
/* wait 18 DSP clock ticks */
|
/* wait 18 DSP clock ticks */
|
||||||
udelay(10);
|
udelay(10);
|
||||||
|
|
||||||
|
/*add a dummy read before the SRAM block is written, otherwise the writing may miss bytes sometimes.*/
|
||||||
|
sst_mem_block_dummy_read(block);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ static const struct snd_pcm_hardware hsw_pcm_hardware = {
|
||||||
SNDRV_PCM_INFO_PAUSE |
|
SNDRV_PCM_INFO_PAUSE |
|
||||||
SNDRV_PCM_INFO_RESUME |
|
SNDRV_PCM_INFO_RESUME |
|
||||||
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE |
|
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
|
||||||
SNDRV_PCM_FMTBIT_S32_LE,
|
SNDRV_PCM_FMTBIT_S32_LE,
|
||||||
.period_bytes_min = PAGE_SIZE,
|
.period_bytes_min = PAGE_SIZE,
|
||||||
.period_bytes_max = (HSW_PCM_PERIODS_MAX / HSW_PCM_PERIODS_MIN) * PAGE_SIZE,
|
.period_bytes_max = (HSW_PCM_PERIODS_MAX / HSW_PCM_PERIODS_MIN) * PAGE_SIZE,
|
||||||
|
@ -400,7 +400,15 @@ static int hsw_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||||
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 16);
|
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 16);
|
||||||
break;
|
break;
|
||||||
case SNDRV_PCM_FORMAT_S24_LE:
|
case SNDRV_PCM_FORMAT_S24_LE:
|
||||||
bits = SST_HSW_DEPTH_24BIT;
|
bits = SST_HSW_DEPTH_32BIT;
|
||||||
|
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 24);
|
||||||
|
break;
|
||||||
|
case SNDRV_PCM_FORMAT_S8:
|
||||||
|
bits = SST_HSW_DEPTH_8BIT;
|
||||||
|
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 8);
|
||||||
|
break;
|
||||||
|
case SNDRV_PCM_FORMAT_S32_LE:
|
||||||
|
bits = SST_HSW_DEPTH_32BIT;
|
||||||
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 32);
|
sst_hsw_stream_set_valid(hsw, pcm_data->stream, 32);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -685,8 +693,9 @@ static int hsw_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HSW_FORMATS \
|
#define HSW_FORMATS \
|
||||||
(SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S16_LE |\
|
(SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
|
||||||
SNDRV_PCM_FMTBIT_S32_LE)
|
SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S16_LE |\
|
||||||
|
SNDRV_PCM_FMTBIT_S8)
|
||||||
|
|
||||||
static struct snd_soc_dai_driver hsw_dais[] = {
|
static struct snd_soc_dai_driver hsw_dais[] = {
|
||||||
{
|
{
|
||||||
|
@ -696,7 +705,7 @@ static struct snd_soc_dai_driver hsw_dais[] = {
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.rates = SNDRV_PCM_RATE_48000,
|
.rates = SNDRV_PCM_RATE_48000,
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
.formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -727,8 +736,8 @@ static struct snd_soc_dai_driver hsw_dais[] = {
|
||||||
.stream_name = "Loopback Capture",
|
.stream_name = "Loopback Capture",
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
.rates = SNDRV_PCM_RATE_48000,
|
||||||
.formats = HSW_FORMATS,
|
.formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -737,8 +746,8 @@ static struct snd_soc_dai_driver hsw_dais[] = {
|
||||||
.stream_name = "Analog Capture",
|
.stream_name = "Analog Capture",
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
.rates = SNDRV_PCM_RATE_48000,
|
||||||
.formats = HSW_FORMATS,
|
.formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -570,7 +570,7 @@ err_release_none:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s6000_i2s_remove(struct platform_device *pdev)
|
static int s6000_i2s_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct s6000_i2s_dev *dev = dev_get_drvdata(&pdev->dev);
|
struct s6000_i2s_dev *dev = dev_get_drvdata(&pdev->dev);
|
||||||
struct resource *region;
|
struct resource *region;
|
||||||
|
@ -597,6 +597,8 @@ static void s6000_i2s_remove(struct platform_device *pdev)
|
||||||
iounmap(mmio);
|
iounmap(mmio);
|
||||||
region = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
region = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
||||||
release_mem_region(region->start, resource_size(region));
|
release_mem_region(region->start, resource_size(region));
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct platform_driver s6000_i2s_driver = {
|
static struct platform_driver s6000_i2s_driver = {
|
||||||
|
|
Loading…
Reference in New Issue