[PATCH 0/5] ASoC: ti: davinci-mcasp: Fix the DIT mode and OMAP4 support
Hi,
it has been on my todo list for several years to support McASP on OMAP4 devices. For Galaxy Nexus we had an omap-mcasp driver (which was mostly a stripped down davinci-mcasp driver) to support what was needed on that specific phone + it's dock for S/PDIF (48KHz, 16bit, stereo).
Not many (if any) device available to test the DIT mode of McASP. I have used BeagleBone White (McASP1 AXR3 can be routed to a pin) to get the S/PDIF mode working then PandaES for OMAP4 support (on PandaES the gpio_121 is not used and the signal is routed to expansion J6 pin14)
In theory the McASP in OMAP5 should be working after this series, but the OMAP5 TRM is not public and I do not have one to check the addresses and see if there is a way to test it on omap5-uevm.
Mark, Tony: The ASoC and dts patches can go via separate tree I felt that it is better if they are together, at least initially.
Nikolaus: fyi, this might be useful for Pyra?
Regards, Péter --- Peter Ujfalusi (5): ASoC: ti: davinci-mcasp: Fix DIT mode support ASoC: dt-bindings: davinci-mcasp: Add compatible string for OMAP4 ASoC: ti: davinci-mcasp: Add support for the OMAP4 version of McASP ARM: dts: omap4-l4-abe: Correct sidle modes for McASP ARM: dts: omap4-l4-abe: Add McASP configuration
.../bindings/sound/davinci-mcasp-audio.txt | 1 + arch/arm/boot/dts/omap4-l4-abe.dtsi | 39 ++-- include/linux/platform_data/davinci_asp.h | 1 + sound/soc/ti/Kconfig | 1 + sound/soc/ti/davinci-mcasp.c | 168 +++++++++++++++--- 5 files changed, 168 insertions(+), 42 deletions(-)
The DIT mode support has not been tested due to lack of platform where it can be tested. To be able to use the McASP on OMAP4/5 (only supporting DIT mode) we need to have DIT mode working in the McASP driver on a know platform. After hacking around (on BBW, mcasp1.axr1 can be routed out for this) it appeared that DIT mode is broken.
This patch fixes it up and 16/24 bit audio works along with passthrough, but I have only tested with DTS example and test files.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@gmail.com --- sound/soc/ti/davinci-mcasp.c | 142 ++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 20 deletions(-)
diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index 017a5a5e56cd..e56a22c28467 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -83,6 +83,8 @@ struct davinci_mcasp { struct snd_pcm_substream *substreams[2]; unsigned int dai_fmt;
+ u32 iec958_status; + /* Audio can not be enabled due to missing parameter(s) */ bool missing_audio_param;
@@ -757,6 +759,9 @@ static int davinci_mcasp_set_tdm_slot(struct snd_soc_dai *dai, { struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
+ if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) + return 0; + dev_dbg(mcasp->dev, "%s() tx_mask 0x%08x rx_mask 0x%08x slots %d width %d\n", __func__, tx_mask, rx_mask, slots, slot_width); @@ -827,6 +832,20 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp, mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate), RXROT(7)); mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask); + } else { + /* + * according to the TRM it should be TXROT=0, this one works: + * 16 bit to 23-8 (TXROT=6, rotate 24 bits) + * 24 bit to 23-0 (TXROT=0, rotate 0 bits) + * + * TXROT = 0 only works with 24bit samples + */ + tx_rotate = (sample_width / 4 + 2) & 0x7; + + mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate), + TXROT(7)); + mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(15), + TXSSZ(0x0F)); }
mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask); @@ -841,7 +860,7 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, int i; u8 tx_ser = 0; u8 rx_ser = 0; - u8 slots = mcasp->tdm_slots; + u8 slots = mcasp->op_mode == DAVINCI_MCASP_DIT_MODE ? 384 : mcasp->tdm_slots; u8 max_active_serializers = (channels + slots - 1) / slots; u8 max_rx_serializers, max_tx_serializers; int active_serializers, numevt; @@ -1031,16 +1050,18 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream, static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp, unsigned int rate) { - u32 cs_value = 0; - u8 *cs_bytes = (u8*) &cs_value; + u8 *cs_bytes = (u8 *)&mcasp->iec958_status;
- /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0 - and LSB first */ - mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15)); + if (!mcasp->dat_port) + mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSEL); + else + mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSEL);
/* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */ mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE | FSXMOD(0x180));
+ mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, 0xFFFF); + /* Set the TX tdm : for all the slots */ mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
@@ -1049,16 +1070,8 @@ static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp,
mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
- /* Only 44100 and 48000 are valid, both have the same setting */ - mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3)); - - /* Enable the DIT */ - mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN); - /* Set S/PDIF channel status bits */ - cs_bytes[0] = IEC958_AES0_CON_NOT_COPYRIGHT; - cs_bytes[1] = IEC958_AES1_CON_PCM_CODER; - + cs_bytes[3] &= ~IEC958_AES3_CON_FS; switch (rate) { case 22050: cs_bytes[3] |= IEC958_AES3_CON_FS_22050; @@ -1088,12 +1101,15 @@ static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp, cs_bytes[3] |= IEC958_AES3_CON_FS_192000; break; default: - printk(KERN_WARNING "unsupported sampling rate: %d\n", rate); + dev_err(mcasp->dev, "unsupported sampling rate: %d\n", rate); return -EINVAL; }
- mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, cs_value); - mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, cs_value); + mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, mcasp->iec958_status); + mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, mcasp->iec958_status); + + /* Enable the DIT */ + mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
return 0; } @@ -1237,12 +1253,18 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, int slots = mcasp->tdm_slots; int rate = params_rate(params); int sbits = params_width(params); + unsigned int bclk_target;
if (mcasp->slot_width) sbits = mcasp->slot_width;
+ if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) + bclk_target = rate * sbits * slots; + else + bclk_target = rate * 128; + davinci_mcasp_calc_clk_div(mcasp, mcasp->sysclk_freq, - rate * sbits * slots, true); + bclk_target, true); }
ret = mcasp_common_hw_param(mcasp, substream->stream, @@ -1598,6 +1620,77 @@ static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = { .set_tdm_slot = davinci_mcasp_set_tdm_slot, };
+static int davinci_mcasp_iec958_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; + uinfo->count = 1; + + return 0; +} + +static int davinci_mcasp_iec958_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *uctl) +{ + struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol); + struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); + + memcpy(uctl->value.iec958.status, &mcasp->iec958_status, + sizeof(mcasp->iec958_status)); + + return 0; +} + +static int davinci_mcasp_iec958_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *uctl) +{ + struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol); + struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); + + memcpy(&mcasp->iec958_status, uctl->value.iec958.status, + sizeof(mcasp->iec958_status)); + + return 0; +} + +static int davinci_mcasp_iec958_con_mask_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol); + struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); + + memset(ucontrol->value.iec958.status, 0xff, sizeof(mcasp->iec958_status)); + return 0; +} + +static const struct snd_kcontrol_new davinci_mcasp_iec958_ctls[] = { + { + .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_VOLATILE), + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), + .info = davinci_mcasp_iec958_info, + .get = davinci_mcasp_iec958_get, + .put = davinci_mcasp_iec958_put, + }, { + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK), + .info = davinci_mcasp_iec958_info, + .get = davinci_mcasp_iec958_con_mask_get, + }, +}; + +static void davinci_mcasp_init_iec958_status(struct davinci_mcasp *mcasp) +{ + unsigned char *cs = (u8 *)&mcasp->iec958_status; + + cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; + cs[1] = IEC958_AES1_CON_PCM_CODER; + cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; + cs[3] = IEC958_AES3_CON_CLOCK_1000PPM; +} + static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai) { struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai); @@ -1605,6 +1698,12 @@ static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai) dai->playback_dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; dai->capture_dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
+ if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE) { + davinci_mcasp_init_iec958_status(mcasp); + snd_soc_add_dai_controls(dai, davinci_mcasp_iec958_ctls, + ARRAY_SIZE(davinci_mcasp_iec958_ctls)); + } + return 0; }
@@ -1651,7 +1750,8 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = { .channels_min = 1, .channels_max = 384, .rates = DAVINCI_MCASP_RATES, - .formats = DAVINCI_MCASP_PCM_FMTS, + .formats = SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE, }, .ops = &davinci_mcasp_dai_ops, }, @@ -1871,6 +1971,8 @@ static int davinci_mcasp_get_config(struct davinci_mcasp *mcasp, } else { mcasp->tdm_slots = pdata->tdm_slots; } + } else { + mcasp->tdm_slots = 32; }
mcasp->num_serializer = pdata->num_serializer;
Hi,
On 04/07/2021 18:04, Peter Ujfalusi wrote:
The DIT mode support has not been tested due to lack of platform where it can be tested. To be able to use the McASP on OMAP4/5 (only supporting DIT mode) we need to have DIT mode working in the McASP driver on a know platform. After hacking around (on BBW, mcasp1.axr1 can be routed out for this) it appeared that DIT mode is broken.
This patch fixes it up and 16/24 bit audio works along with passthrough, but I have only tested with DTS example and test files.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@gmail.com
sound/soc/ti/davinci-mcasp.c | 142 ++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 20 deletions(-)
diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index 017a5a5e56cd..e56a22c28467 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -83,6 +83,8 @@ struct davinci_mcasp { struct snd_pcm_substream *substreams[2]; unsigned int dai_fmt;
- u32 iec958_status;
- /* Audio can not be enabled due to missing parameter(s) */ bool missing_audio_param;
@@ -757,6 +759,9 @@ static int davinci_mcasp_set_tdm_slot(struct snd_soc_dai *dai, { struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
- if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
return 0;
- dev_dbg(mcasp->dev, "%s() tx_mask 0x%08x rx_mask 0x%08x slots %d width %d\n", __func__, tx_mask, rx_mask, slots, slot_width);
@@ -827,6 +832,20 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp, mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate), RXROT(7)); mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask);
} else {
/*
* according to the TRM it should be TXROT=0, this one works:
* 16 bit to 23-8 (TXROT=6, rotate 24 bits)
* 24 bit to 23-0 (TXROT=0, rotate 0 bits)
*
* TXROT = 0 only works with 24bit samples
*/
tx_rotate = (sample_width / 4 + 2) & 0x7;
mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate),
TXROT(7));
mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(15),
TXSSZ(0x0F));
}
mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
@@ -841,7 +860,7 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, int i; u8 tx_ser = 0; u8 rx_ser = 0;
- u8 slots = mcasp->tdm_slots;
- u8 slots = mcasp->op_mode == DAVINCI_MCASP_DIT_MODE ? 384 : mcasp->tdm_slots;
This is wrong. 384 will not fit to u8... I wonder why I don't saw this...
On Mon, Jul 05, 2021 at 05:58:04PM +0300, Péter Ujfalusi wrote:
On 04/07/2021 18:04, Peter Ujfalusi wrote:
- u8 slots = mcasp->op_mode == DAVINCI_MCASP_DIT_MODE ? 384 : mcasp->tdm_slots;
This is wrong. 384 will not fit to u8... I wonder why I don't saw this...
Or the compiler for that matter...
OMAP4 has one McASP instance with single serializer and supporting only DIT mode. According to the TRM the DAT port needs to be accessed as specific offset compared to other devices where access to any part of the DAT region is valid. To handle this constraint we need to introduce a new compatiple string for OMAP4.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@gmail.com --- Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt | 1 + 1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt index c483dcec01f8..bd863bd69501 100644 --- a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt +++ b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt @@ -6,6 +6,7 @@ Required properties: "ti,da830-mcasp-audio" : for both DA830 & DA850 platforms "ti,am33xx-mcasp-audio" : for AM33xx platforms (AM33xx, AM43xx, TI81xx) "ti,dra7-mcasp-audio" : for DRA7xx platforms + "ti,omap4-mcasp-audio" : for OMAP4
- reg : Should contain reg specifiers for the entries in the reg-names property. - reg-names : Should contain:
From: Peter Ujfalusi peter.ujfalusi@ti.com
There is a single McASP on OMAP4 (and OMAP5) which is configured to only support DIT playback mode on a single serializer.
Add 0x200 offset to DAT port address as the TRM suggests it.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com --- include/linux/platform_data/davinci_asp.h | 1 + sound/soc/ti/Kconfig | 1 + sound/soc/ti/davinci-mcasp.c | 26 ++++++++++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/platform_data/davinci_asp.h index 5d1fb0d78a22..76b13ef67562 100644 --- a/include/linux/platform_data/davinci_asp.h +++ b/include/linux/platform_data/davinci_asp.h @@ -96,6 +96,7 @@ enum { MCASP_VERSION_2, /* DA8xx/OMAPL1x */ MCASP_VERSION_3, /* TI81xx/AM33xx */ MCASP_VERSION_4, /* DRA7xxx */ + MCASP_VERSION_OMAP, /* OMAP4/5 */ };
enum mcbsp_clk_input_pin { diff --git a/sound/soc/ti/Kconfig b/sound/soc/ti/Kconfig index 698d7bc84dcf..1d9fe3fca193 100644 --- a/sound/soc/ti/Kconfig +++ b/sound/soc/ti/Kconfig @@ -35,6 +35,7 @@ config SND_SOC_DAVINCI_MCASP various Texas Instruments SoCs like: - daVinci devices - Sitara line of SoCs (AM335x, AM438x, etc) + - OMAP4 - DRA7x devices - Keystone devices - K3 devices (am654, j721e) diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index e56a22c28467..f453728d2afc 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -1788,6 +1788,12 @@ static struct davinci_mcasp_pdata dra7_mcasp_pdata = { .version = MCASP_VERSION_4, };
+static struct davinci_mcasp_pdata omap_mcasp_pdata = { + .tx_dma_offset = 0x200, + .rx_dma_offset = 0, + .version = MCASP_VERSION_OMAP, +}; + static const struct of_device_id mcasp_dt_ids[] = { { .compatible = "ti,dm646x-mcasp-audio", @@ -1805,6 +1811,10 @@ static const struct of_device_id mcasp_dt_ids[] = { .compatible = "ti,dra7-mcasp-audio", .data = &dra7_mcasp_pdata, }, + { + .compatible = "ti,omap4-mcasp-audio", + .data = &omap_mcasp_pdata, + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, mcasp_dt_ids); @@ -2344,10 +2354,17 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; dma_data->filter_data = "tx"; - if (dat) + if (dat) { dma_data->addr = dat->start; - else + /* + * According to the TRM there should be 0x200 offset added to + * the DAT port address + */ + if (mcasp->version == MCASP_VERSION_OMAP) + dma_data->addr += davinci_mcasp_txdma_offset(mcasp->pdata); + } else { dma_data->addr = mem->start + davinci_mcasp_txdma_offset(mcasp->pdata); + }
/* RX is not valid in DIT mode */ @@ -2412,7 +2429,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ret = edma_pcm_platform_register(&pdev->dev); break; case PCM_SDMA: - ret = sdma_pcm_platform_register(&pdev->dev, "tx", "rx"); + if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) + ret = sdma_pcm_platform_register(&pdev->dev, "tx", "rx"); + else + ret = sdma_pcm_platform_register(&pdev->dev, "tx", NULL); break; case PCM_UDMA: ret = udma_pcm_platform_register(&pdev->dev);
McASP only supports Force-idle, No-idle and Smart-idle modes
Signed-off-by: Peter Ujfalusi peter.ujfalusi@gmail.com --- arch/arm/boot/dts/omap4-l4-abe.dtsi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/arch/arm/boot/dts/omap4-l4-abe.dtsi b/arch/arm/boot/dts/omap4-l4-abe.dtsi index a9573d441dea..8287fdaa526e 100644 --- a/arch/arm/boot/dts/omap4-l4-abe.dtsi +++ b/arch/arm/boot/dts/omap4-l4-abe.dtsi @@ -192,8 +192,7 @@ target-module@28000 { /* 0x40128000, ap 8 08.0 */ reg-names = "rev", "sysc"; ti,sysc-sidle = <SYSC_IDLE_FORCE>, <SYSC_IDLE_NO>, - <SYSC_IDLE_SMART>, - <SYSC_IDLE_SMART_WKUP>; + <SYSC_IDLE_SMART>; /* Domains (V, P, C): iva, abe_pwrdm, abe_clkdm */ clocks = <&abe_clkctrl OMAP4_MCASP_CLKCTRL 0>; clock-names = "fck";
OMAP4 has a single McASP instance with single serializer and locked for DIT mode. To be able to enable the support the following fixes needed: - Add the DAT port ranges to the target module's ranges - SIDLE mode must be disabled as it is not working with McASP most likely module integration issue with McASP
We can already fill in the op-mode and serial-dir for McASP as it only supports this configuration, but keep the module disabled as there is no known device available where it is used.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@gmail.com --- arch/arm/boot/dts/omap4-l4-abe.dtsi | 38 +++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/arch/arm/boot/dts/omap4-l4-abe.dtsi b/arch/arm/boot/dts/omap4-l4-abe.dtsi index 8287fdaa526e..a8d66240d17d 100644 --- a/arch/arm/boot/dts/omap4-l4-abe.dtsi +++ b/arch/arm/boot/dts/omap4-l4-abe.dtsi @@ -186,36 +186,38 @@ mcbsp3: mcbsp@0 { };
target-module@28000 { /* 0x40128000, ap 8 08.0 */ + /* 0x4012a000, ap 10 0a.0 */ compatible = "ti,sysc-mcasp", "ti,sysc"; reg = <0x28000 0x4>, <0x28004 0x4>; reg-names = "rev", "sysc"; ti,sysc-sidle = <SYSC_IDLE_FORCE>, - <SYSC_IDLE_NO>, - <SYSC_IDLE_SMART>; + <SYSC_IDLE_NO>; /* Domains (V, P, C): iva, abe_pwrdm, abe_clkdm */ clocks = <&abe_clkctrl OMAP4_MCASP_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0x28000 0x1000>, - <0x49028000 0x49028000 0x1000>; - - /* - * Child device unsupported by davinci-mcasp. At least - * RX path is disabled for omap4, and only DIT mode - * works with no I2S. See also old Android kernel - * omap-mcasp driver for more information. - */ - }; - - target-module@2a000 { /* 0x4012a000, ap 10 0a.0 */ - compatible = "ti,sysc"; - status = "disabled"; - #address-cells = <1>; - #size-cells = <1>; - ranges = <0x0 0x2a000 0x1000>, + <0x49028000 0x49028000 0x1000>, + <0x2000 0x2a000 0x1000>, <0x4902a000 0x4902a000 0x1000>; + + mcasp0: mcasp@0 { + compatible = "ti,omap4-mcasp-audio"; + reg = <0x0 0x2000>, + <0x4902a000 0x1000>; /* L3 data port */ + reg-names = "mpu","dat"; + interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "tx"; + dmas = <&sdma 8>; + dma-names = "tx"; + clocks = <&abe_clkctrl OMAP4_MCASP_CLKCTRL 0>; + clock-names = "fck"; + op-mode = <1>; /* MCASP_DIT_MODE */ + serial-dir = < 1 >; /* 1 TX serializers */ + status = "disabled"; + }; };
target-module@2e000 { /* 0x4012e000, ap 12 0c.0 */
Hi Péter,
Am 04.07.2021 um 17:04 schrieb Peter Ujfalusi peter.ujfalusi@gmail.com:
Hi,
it has been on my todo list for several years to support McASP on OMAP4 devices. For Galaxy Nexus we had an omap-mcasp driver (which was mostly a stripped down davinci-mcasp driver) to support what was needed on that specific phone + it's dock for S/PDIF (48KHz, 16bit, stereo).
Not many (if any) device available to test the DIT mode of McASP. I have used BeagleBone White (McASP1 AXR3 can be routed to a pin) to get the S/PDIF mode working then PandaES for OMAP4 support (on PandaES the gpio_121 is not used and the signal is routed to expansion J6 pin14)
In theory the McASP in OMAP5 should be working after this series, but the OMAP5 TRM is not public and I do not have one to check the addresses and see if there is a way to test it on omap5-uevm.
Mark, Tony: The ASoC and dts patches can go via separate tree I felt that it is better if they are together, at least initially.
Nikolaus: fyi, this might be useful for Pyra?
Yes, definitively.
I just wonder how compatible it is with the "old" omap-mcasp driver we carry along for the Pyra:
https://git.goldelico.com/?p=letux-kernel.git;a=blob;f=sound/soc/ti/omap-mca...
Does it now have additional functionality or robustness? And does it need changes of the OMAP5 device tree?
And also important seems to be the ABE/AESS integration where we so far failed to make it work again on more recent kernels. Our most recent patch set is here:
https://git.goldelico.com/?p=letux-kernel.git;a=shortlog;h=refs/heads/letux/...
Anyways I am happy to see a little progress on the omap4/5 audio subsystem.
BR and thanks, Nikolaus
Regards, Péter
Peter Ujfalusi (5): ASoC: ti: davinci-mcasp: Fix DIT mode support ASoC: dt-bindings: davinci-mcasp: Add compatible string for OMAP4 ASoC: ti: davinci-mcasp: Add support for the OMAP4 version of McASP ARM: dts: omap4-l4-abe: Correct sidle modes for McASP ARM: dts: omap4-l4-abe: Add McASP configuration
.../bindings/sound/davinci-mcasp-audio.txt | 1 + arch/arm/boot/dts/omap4-l4-abe.dtsi | 39 ++-- include/linux/platform_data/davinci_asp.h | 1 + sound/soc/ti/Kconfig | 1 + sound/soc/ti/davinci-mcasp.c | 168 +++++++++++++++--- 5 files changed, 168 insertions(+), 42 deletions(-)
-- 2.32.0
Hi Nikolaus,
On 05/07/2021 16:32, H. Nikolaus Schaller wrote:
Hi Péter,
Am 04.07.2021 um 17:04 schrieb Peter Ujfalusi peter.ujfalusi@gmail.com:
Hi,
it has been on my todo list for several years to support McASP on OMAP4 devices. For Galaxy Nexus we had an omap-mcasp driver (which was mostly a stripped down davinci-mcasp driver) to support what was needed on that specific phone + it's dock for S/PDIF (48KHz, 16bit, stereo).
Not many (if any) device available to test the DIT mode of McASP. I have used BeagleBone White (McASP1 AXR3 can be routed to a pin) to get the S/PDIF mode working then PandaES for OMAP4 support (on PandaES the gpio_121 is not used and the signal is routed to expansion J6 pin14)
In theory the McASP in OMAP5 should be working after this series, but the OMAP5 TRM is not public and I do not have one to check the addresses and see if there is a way to test it on omap5-uevm.
Mark, Tony: The ASoC and dts patches can go via separate tree I felt that it is better if they are together, at least initially.
Nikolaus: fyi, this might be useful for Pyra?
Yes, definitively.
I just wonder how compatible it is with the "old" omap-mcasp driver we carry along for the Pyra:
https://git.goldelico.com/?p=letux-kernel.git;a=blob;f=sound/soc/ti/omap-mca...
Does it now have additional functionality or robustness?
The davinci-mcasp with series does work on OMAP4. I could not made the omap-mcasp working. I have picked the driver from pyra in hopes that it is working so I will ahve a stable base. Have you tested it?
the omap-mcasp supports only 48KHz and 16bit, no passthrough, no 24bit, all is hardwired for the Galaxy Nexus setup, afaik.
The davinci-mcasp should be better all around, I think the PM side is also more robust.
The other point is that I would not accept the omap-mcasp driver upstream. The IP is the same so the driver should be also...
And does it need changes of the OMAP5 device tree?
In a similar way as the dts patches in this series. fwiw: https://github.com/omap-audio/linux-audio/commit/2f0a632db0b52321f1fc3623d08... is the patch I have for PandaES to get S/PDIF working.
And also important seems to be the ABE/AESS integration where we so far failed to make it work again on more recent kernels.
The McASP is not routed via ABE/AESS, it has been always handled outside of the firmware, so it is just a simple link outside.
Our most recent patch set is here:
https://git.goldelico.com/?p=letux-kernel.git;a=shortlog;h=refs/heads/letux/...
Yes, I'm following it ;)
Anyways I am happy to see a little progress on the omap4/5 audio subsystem.
It is in maintenance mode as there is not much of an interest outside of a small group of people, but I try to help to get it better for Pyra.
BR and thanks, Nikolaus
Regards, Péter
Peter Ujfalusi (5): ASoC: ti: davinci-mcasp: Fix DIT mode support ASoC: dt-bindings: davinci-mcasp: Add compatible string for OMAP4 ASoC: ti: davinci-mcasp: Add support for the OMAP4 version of McASP ARM: dts: omap4-l4-abe: Correct sidle modes for McASP ARM: dts: omap4-l4-abe: Add McASP configuration
.../bindings/sound/davinci-mcasp-audio.txt | 1 + arch/arm/boot/dts/omap4-l4-abe.dtsi | 39 ++-- include/linux/platform_data/davinci_asp.h | 1 + sound/soc/ti/Kconfig | 1 + sound/soc/ti/davinci-mcasp.c | 168 +++++++++++++++--- 5 files changed, 168 insertions(+), 42 deletions(-)
-- 2.32.0
Am 05.07.2021 um 16:10 schrieb Péter Ujfalusi peter.ujfalusi@gmail.com:
Hi Nikolaus,
Yes, definitively.
I just wonder how compatible it is with the "old" omap-mcasp driver we carry along for the Pyra:
https://git.goldelico.com/?p=letux-kernel.git;a=blob;f=sound/soc/ti/omap-mca...
Does it now have additional functionality or robustness?
The davinci-mcasp with series does work on OMAP4. I could not made the omap-mcasp working. I have picked the driver from pyra in hopes that it is working so I will ahve a stable base. Have you tested it?
AFAIR it was not tested. e have the sound system working (with some glitches) but that goes through McPDM I think.
the omap-mcasp supports only 48KHz and 16bit, no passthrough, no 24bit, all is hardwired for the Galaxy Nexus setup, afaik.
The davinci-mcasp should be better all around, I think the PM side is also more robust.
The other point is that I would not accept the omap-mcasp driver upstream. The IP is the same so the driver should be also...
:)
And does it need changes of the OMAP5 device tree?
In a similar way as the dts patches in this series. fwiw: https://github.com/omap-audio/linux-audio/commit/2f0a632db0b52321f1fc3623d08... is the patch I have for PandaES to get S/PDIF working.
If I find a little time it should not be difficult to replace your new driver and fix the DTS in our ABE/AESS branch.
And also important seems to be the ABE/AESS integration where we so far failed to make it work again on more recent kernels.
The McASP is not routed via ABE/AESS, it has been always handled outside of the firmware, so it is just a simple link outside.
Ah, ok. Makes it easier to test :)
Our most recent patch set is here:
https://git.goldelico.com/?p=letux-kernel.git;a=shortlog;h=refs/heads/letux/...
Yes, I'm following it ;)
Anyways I am happy to see a little progress on the omap4/5 audio subsystem.
It is in maintenance mode as there is not much of an interest outside of a small group of people, but I try to help to get it better for Pyra.
And a lot of public information has been lost (OMAPpedia). But there are some backups:
https://web.archive.org/web/20181111114134/http://omappedia.org/wiki/Audio_D...
BR and thanks, Nikolaus
participants (3)
-
H. Nikolaus Schaller
-
Mark Brown
-
Peter Ujfalusi