Commit a3e048a5 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/fix/fsl-sai', 'asoc/fix/intel',...

Merge remote-tracking branches 'asoc/fix/fsl-sai', 'asoc/fix/intel', 'asoc/fix/max98090' and 'asoc/fix/s6000' into asoc-linus
...@@ -2284,7 +2284,7 @@ static int max98090_probe(struct snd_soc_codec *codec) ...@@ -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 @@ static irqreturn_t fsl_sai_isr(int irq, void *devid) ...@@ -106,7 +106,7 @@ static irqreturn_t fsl_sai_isr(int irq, void *devid)
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, ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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, ...@@ -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) ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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 @@ static int s6000_i2s_probe(struct platform_device *pdev) ...@@ -570,7 +570,7 @@ static int s6000_i2s_probe(struct platform_device *pdev)
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) ...@@ -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 = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment