Message ID | 20190826180734.15801-2-codekipper@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ASoC: sun4i-i2s: Updates to the driver | expand |
On Tue, Aug 27, 2019 at 2:07 AM <codekipper@gmail.com> wrote: > > From: Marcus Cooper <codekipper@gmail.com> > > The regmap configuration is set up for the legacy block on the > A83T whereas it uses the new block with a larger register map. Looking at the code Allwinner previously released [1], that doesn't seem to be the case. Keep in mind that the register map shown in the user manual is for the TDM interface, which we don't actually support right now. The file shows the base address as 0x01c22800, and the last defined register is SUNXI_RXCHMAP at 0x3c. The I2S driver [2] also shows that it is the old register map size, but with TX_FIFO and INT_STA swapped around. This might mean that it would need a separate regmap_config, as the read/write callbacks need to be changed to fit the swapped registers. Finally, the TDM driver [3], which matches the TDM section in the manual, shows a larger register map. A83T is SUN8IW6, while SUN8IW7 refers to the H3. ChenYu [1] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.h [2] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/i2s0/sunxi-i2s0.h [3] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/daudio0/sunxi-daudio0.h > Fixes: 21faaea1343f ("ASoC: sun4i-i2s: Add support for A83T") > Signed-off-by: Marcus Cooper <codekipper@gmail.com> > --- > sound/soc/sunxi/sun4i-i2s.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c > index 57bf2a33753e..34575a8aa9f6 100644 > --- a/sound/soc/sunxi/sun4i-i2s.c > +++ b/sound/soc/sunxi/sun4i-i2s.c > @@ -1100,7 +1100,7 @@ static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = { > static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = { > .has_reset = true, > .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, > - .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, > + .sun4i_i2s_regmap = &sun8i_i2s_regmap_config, > .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), > .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), > .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), > -- > 2.23.0 > > -- > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/20190826180734.15801-2-codekipper%40gmail.com.
On Tue, 27 Aug 2019 at 06:13, Chen-Yu Tsai <wens@csie.org> wrote: > > On Tue, Aug 27, 2019 at 2:07 AM <codekipper@gmail.com> wrote: > > > > From: Marcus Cooper <codekipper@gmail.com> > > > > The regmap configuration is set up for the legacy block on the > > A83T whereas it uses the new block with a larger register map. > > Looking at the code Allwinner previously released [1], that doesn't seem to be > the case. Keep in mind that the register map shown in the user manual is for > the TDM interface, which we don't actually support right now. Should it matter what we support right now?, the block according to the user manual shows the bigger range. I don't have a A83T device and from what I gather not many users do. But the compatible for the H3 has been removed and replaced with the settings for the A83T which also has default settings in registers further up than SUNXI_RXCHMAP. > > The file shows the base address as 0x01c22800, and the last defined register > is SUNXI_RXCHMAP at 0x3c. > > The I2S driver [2] also shows that it is the old register map size, but with > TX_FIFO and INT_STA swapped around. This might mean that it would need a > separate regmap_config, as the read/write callbacks need to be changed to > fit the swapped registers. > > Finally, the TDM driver [3], which matches the TDM section in the manual, shows > a larger register map. > > A83T is SUN8IW6, while SUN8IW7 refers to the H3. Since when have we trusted Allwinner code?, the TDM labelled block clearly supports I2S. The biggest use case for this block is getting HDMI audio working on the newer devices(LibreELEC nightlies has a user base of over 300) and I've tested this on numerous set ups over the last couple of years. Failing that reverting (3e9acd7ac693: "ASoC: sun4i-i2s: Remove duplicated quirks structure") would help. BR, CK > > ChenYu > > [1] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.h > [2] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/i2s0/sunxi-i2s0.h > [3] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/daudio0/sunxi-daudio0.h > > > Fixes: 21faaea1343f ("ASoC: sun4i-i2s: Add support for A83T") > > Signed-off-by: Marcus Cooper <codekipper@gmail.com> > > --- > > sound/soc/sunxi/sun4i-i2s.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c > > index 57bf2a33753e..34575a8aa9f6 100644 > > --- a/sound/soc/sunxi/sun4i-i2s.c > > +++ b/sound/soc/sunxi/sun4i-i2s.c > > @@ -1100,7 +1100,7 @@ static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = { > > static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = { > > .has_reset = true, > > .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, > > - .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, > > + .sun4i_i2s_regmap = &sun8i_i2s_regmap_config, > > .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), > > .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), > > .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), > > -- > > 2.23.0 > > > > -- > > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/20190826180734.15801-2-codekipper%40gmail.com.
On Tue, Aug 27, 2019 at 1:55 PM Code Kipper <codekipper@gmail.com> wrote: > > On Tue, 27 Aug 2019 at 06:13, Chen-Yu Tsai <wens@csie.org> wrote: > > > > On Tue, Aug 27, 2019 at 2:07 AM <codekipper@gmail.com> wrote: > > > > > > From: Marcus Cooper <codekipper@gmail.com> > > > > > > The regmap configuration is set up for the legacy block on the > > > A83T whereas it uses the new block with a larger register map. > > > > Looking at the code Allwinner previously released [1], that doesn't seem to be > > the case. Keep in mind that the register map shown in the user manual is for > > the TDM interface, which we don't actually support right now. > > Should it matter what we support right now?, the block according to the user > manual shows the bigger range. I don't have a A83T device and from what I There are a total of four I2S controllers on the A83T. Currently three of them are listed in the dtsi file, which are _not_ the one shown in the user manual. The one shown is the fourth one, which is the TDM controller. It's not like we haven't seen this before. IIRC the A64 also had two variants of the I2S interface. The one coupled with the audio codec was different from the others. > gather not many users do. But the compatible for the H3 has been removed > and replaced with the settings for the A83T which also has default settings in > registers further up than SUNXI_RXCHMAP. I'll sync up with Maxime on this. > > > > The file shows the base address as 0x01c22800, and the last defined register > > is SUNXI_RXCHMAP at 0x3c. > > > > The I2S driver [2] also shows that it is the old register map size, but with > > TX_FIFO and INT_STA swapped around. This might mean that it would need a > > separate regmap_config, as the read/write callbacks need to be changed to > > fit the swapped registers. > > > > Finally, the TDM driver [3], which matches the TDM section in the manual, shows > > a larger register map. > > > > A83T is SUN8IW6, while SUN8IW7 refers to the H3. > > Since when have we trusted Allwinner code?, the TDM labelled block > clearly supports Since they haven't listed the I2S block in the user manual, so that is what we have to go by. The TDM section in the user manual only lists the block at 0x1c23000. The memory map says DAUDIO-[012] for addresses 0x1c22000, 0x1c22400, 0x1c22800, and TDM for address 0x1c23000. One would assume this meant these are somewhat different. > I2S. The biggest use case for this block is getting HDMI audio working > on the newer I understand that. > devices(LibreELEC nightlies has a user base of over 300) and I've tested this on > numerous set ups over the last couple of years. Tested on the H3, correct? > Failing that reverting (3e9acd7ac693: "ASoC: sun4i-i2s: Remove > duplicated quirks structure") > would help. I'll take a look. IIRC it worked with the old layout, with the two registers swapped, playing standard 48 KHz / 16 bit audio when I added supported for the A83T. Then again maybe the stars were perfectly aligned. At the very least we could separate A83T and H3 as you suggested. ChenYu > BR, > CK > > > > ChenYu > > > > [1] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.h > > [2] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/i2s0/sunxi-i2s0.h > > [3] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/daudio0/sunxi-daudio0.h > > > > > Fixes: 21faaea1343f ("ASoC: sun4i-i2s: Add support for A83T") > > > Signed-off-by: Marcus Cooper <codekipper@gmail.com> > > > --- > > > sound/soc/sunxi/sun4i-i2s.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c > > > index 57bf2a33753e..34575a8aa9f6 100644 > > > --- a/sound/soc/sunxi/sun4i-i2s.c > > > +++ b/sound/soc/sunxi/sun4i-i2s.c > > > @@ -1100,7 +1100,7 @@ static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = { > > > static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = { > > > .has_reset = true, > > > .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, > > > - .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, > > > + .sun4i_i2s_regmap = &sun8i_i2s_regmap_config, > > > .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), > > > .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), > > > .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), > > > -- > > > 2.23.0 > > > > > > -- > > > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > > > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > > > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/20190826180734.15801-2-codekipper%40gmail.com. > > -- > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/CAEKpxBmCg4AkqKM-O3C76gto%2BmPWyEdDbviAmRJ8PxLOOMTJ7w%40mail.gmail.com.
On Tue, 27 Aug 2019 at 10:01, Chen-Yu Tsai <wens@csie.org> wrote: > > On Tue, Aug 27, 2019 at 1:55 PM Code Kipper <codekipper@gmail.com> wrote: > > > > On Tue, 27 Aug 2019 at 06:13, Chen-Yu Tsai <wens@csie.org> wrote: > > > > > > On Tue, Aug 27, 2019 at 2:07 AM <codekipper@gmail.com> wrote: > > > > > > > > From: Marcus Cooper <codekipper@gmail.com> > > > > > > > > The regmap configuration is set up for the legacy block on the > > > > A83T whereas it uses the new block with a larger register map. > > > > > > Looking at the code Allwinner previously released [1], that doesn't seem to be > > > the case. Keep in mind that the register map shown in the user manual is for > > > the TDM interface, which we don't actually support right now. > > > > Should it matter what we support right now?, the block according to the user > > manual shows the bigger range. I don't have a A83T device and from what I > > There are a total of four I2S controllers on the A83T. Currently three of them > are listed in the dtsi file, which are _not_ the one shown in the user manual. > The one shown is the fourth one, which is the TDM controller. The configuration for the A83T suggests that it's a mixture of old and new which I don't think is the case considering it was released around the same time as the H3. There is enough similarity between the blocks for it to still work. For example on the H6 we referenced by mistake the H3 block and we still got audio (with only slight distortion). I would suggest to validate all of the i2s blocks we need to test using the internal loopback as that will also cover capture. > > It's not like we haven't seen this before. IIRC the A64 also had two variants > of the I2S interface. The one coupled with the audio codec was different from > the others. Yes...but the i2s of the audio codec was documented in the audio codec section. I've used this device to ensure that I've not broken anything in the old block with these new changes. > > > gather not many users do. But the compatible for the H3 has been removed > > and replaced with the settings for the A83T which also has default settings in > > registers further up than SUNXI_RXCHMAP. > > I'll sync up with Maxime on this. > > > > > > > The file shows the base address as 0x01c22800, and the last defined register > > > is SUNXI_RXCHMAP at 0x3c. > > > > > > The I2S driver [2] also shows that it is the old register map size, but with > > > TX_FIFO and INT_STA swapped around. This might mean that it would need a > > > separate regmap_config, as the read/write callbacks need to be changed to > > > fit the swapped registers. > > > > > > Finally, the TDM driver [3], which matches the TDM section in the manual, shows > > > a larger register map. > > > > > > A83T is SUN8IW6, while SUN8IW7 refers to the H3. > > > > Since when have we trusted Allwinner code?, the TDM labelled block > > clearly supports > > Since they haven't listed the I2S block in the user manual, so that is what we > have to go by. > > The TDM section in the user manual only lists the block at 0x1c23000. The memory > map says DAUDIO-[012] for addresses 0x1c22000, 0x1c22400, 0x1c22800, and TDM for > address 0x1c23000. One would assume this meant these are somewhat different. > > > I2S. The biggest use case for this block is getting HDMI audio working > > on the newer > > I understand that. > > > devices(LibreELEC nightlies has a user base of over 300) and I've tested this on > > numerous set ups over the last couple of years. > > Tested on the H3, correct? Yes....but only with the additional changes for multi-channel with my LibreELEC build. These changes I tested on my pine64 before pushing upstream. > > > Failing that reverting (3e9acd7ac693: "ASoC: sun4i-i2s: Remove > > duplicated quirks structure") > > would help. > > I'll take a look. IIRC it worked with the old layout, with the two registers > swapped, playing standard 48 KHz / 16 bit audio when I added supported for > the A83T. Then again maybe the stars were perfectly aligned. At the very least > we could separate A83T and H3 as you suggested. Thanks, CK > > ChenYu > > > > BR, > > CK > > > > > > ChenYu > > > > > > [1] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.h > > > [2] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/i2s0/sunxi-i2s0.h > > > [3] https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/sound/soc/sunxi/daudio0/sunxi-daudio0.h > > > > > > > Fixes: 21faaea1343f ("ASoC: sun4i-i2s: Add support for A83T") > > > > Signed-off-by: Marcus Cooper <codekipper@gmail.com> > > > > --- > > > > sound/soc/sunxi/sun4i-i2s.c | 2 +- > > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c > > > > index 57bf2a33753e..34575a8aa9f6 100644 > > > > --- a/sound/soc/sunxi/sun4i-i2s.c > > > > +++ b/sound/soc/sunxi/sun4i-i2s.c > > > > @@ -1100,7 +1100,7 @@ static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = { > > > > static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = { > > > > .has_reset = true, > > > > .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, > > > > - .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, > > > > + .sun4i_i2s_regmap = &sun8i_i2s_regmap_config, > > > > .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), > > > > .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), > > > > .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), > > > > -- > > > > 2.23.0 > > > > > > > > -- > > > > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > > > > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > > > > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/20190826180734.15801-2-codekipper%40gmail.com. > > > > -- > > You received this message because you are subscribed to the Google Groups "linux-sunxi" group. > > To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com. > > To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/CAEKpxBmCg4AkqKM-O3C76gto%2BmPWyEdDbviAmRJ8PxLOOMTJ7w%40mail.gmail.com.
On Tue, Aug 27, 2019 at 4:35 PM Code Kipper <codekipper@gmail.com> wrote: > > On Tue, 27 Aug 2019 at 10:01, Chen-Yu Tsai <wens@csie.org> wrote: > > > > On Tue, Aug 27, 2019 at 1:55 PM Code Kipper <codekipper@gmail.com> wrote: > > > > > > On Tue, 27 Aug 2019 at 06:13, Chen-Yu Tsai <wens@csie.org> wrote: > > > > > > > > On Tue, Aug 27, 2019 at 2:07 AM <codekipper@gmail.com> wrote: > > > > > > > > > > From: Marcus Cooper <codekipper@gmail.com> > > > > > > > > > > The regmap configuration is set up for the legacy block on the > > > > > A83T whereas it uses the new block with a larger register map. > > > > > > > > Looking at the code Allwinner previously released [1], that doesn't seem to be > > > > the case. Keep in mind that the register map shown in the user manual is for > > > > the TDM interface, which we don't actually support right now. > > > > > > Should it matter what we support right now?, the block according to the user > > > manual shows the bigger range. I don't have a A83T device and from what I > > > > There are a total of four I2S controllers on the A83T. Currently three of them > > are listed in the dtsi file, which are _not_ the one shown in the user manual. > > The one shown is the fourth one, which is the TDM controller. > > The configuration for the A83T suggests that it's a mixture of old and > new which I don't > think is the case considering it was released around the same time as > the H3. There > is enough similarity between the blocks for it to still work. For > example on the H6 > we referenced by mistake the H3 block and we still got audio (with > only slight distortion). The difference with the A83T here is large enough that if you play anything it will simply stall. I already reported it as broken and Maxime has sent fixes. > I would suggest to validate all of the i2s blocks we need to test > using the internal loopback > as that will also cover capture. > > > > > It's not like we haven't seen this before. IIRC the A64 also had two variants > > of the I2S interface. The one coupled with the audio codec was different from > > the others. > > Yes...but the i2s of the audio codec was documented in the audio codec > section. I've used > this device to ensure that I've not broken anything in the old block > with these new changes. > > > > > > gather not many users do. But the compatible for the H3 has been removed > > > and replaced with the settings for the A83T which also has default settings in > > > registers further up than SUNXI_RXCHMAP. > > > > I'll sync up with Maxime on this. > > > > > > > > > > The file shows the base address as 0x01c22800, and the last defined register > > > > is SUNXI_RXCHMAP at 0x3c. > > > > > > > > The I2S driver [2] also shows that it is the old register map size, but with > > > > TX_FIFO and INT_STA swapped around. This might mean that it would need a > > > > separate regmap_config, as the read/write callbacks need to be changed to > > > > fit the swapped registers. > > > > > > > > Finally, the TDM driver [3], which matches the TDM section in the manual, shows > > > > a larger register map. > > > > > > > > A83T is SUN8IW6, while SUN8IW7 refers to the H3. > > > > > > Since when have we trusted Allwinner code?, the TDM labelled block > > > clearly supports > > > > Since they haven't listed the I2S block in the user manual, so that is what we > > have to go by. > > > > The TDM section in the user manual only lists the block at 0x1c23000. The memory > > map says DAUDIO-[012] for addresses 0x1c22000, 0x1c22400, 0x1c22800, and TDM for > > address 0x1c23000. One would assume this meant these are somewhat different. > > > > > I2S. The biggest use case for this block is getting HDMI audio working > > > on the newer > > > > I understand that. > > > > > devices(LibreELEC nightlies has a user base of over 300) and I've tested this on > > > numerous set ups over the last couple of years. > > > > Tested on the H3, correct? > > Yes....but only with the additional changes for multi-channel with my > LibreELEC build. > These changes I tested on my pine64 before pushing upstream. > > > > > > Failing that reverting (3e9acd7ac693: "ASoC: sun4i-i2s: Remove > > > duplicated quirks structure") > > > would help. > > > > I'll take a look. IIRC it worked with the old layout, with the two registers > > swapped, playing standard 48 KHz / 16 bit audio when I added supported for > > the A83T. Then again maybe the stars were perfectly aligned. At the very least > > we could separate A83T and H3 as you suggested. Maxime has sent a patch reverting the merger. ChenYu
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index 57bf2a33753e..34575a8aa9f6 100644 --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -1100,7 +1100,7 @@ static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = { static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = { .has_reset = true, .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, - .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, + .sun4i_i2s_regmap = &sun8i_i2s_regmap_config, .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6),