Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Tue, 3 May 2016 12:21:25 +0200, Enric Balletbo Serra wrote: > 2016-05-03 11:43 GMT+02:00 John Keeping: > > On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: > >> 2016-05-03 6:12 GMT+02:00 sugar : > >> > On 4/30/2016 15:00, John Keeping Wrote: > >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > >> >>> > >> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : > >> > >> If we only clear the tx/rx state when both are disabled it is not > >> possible to start/stop one multiple times while the other is running. > >> Since the two are independently controlled, treat them as such and > >> remove the false dependency between capture and playback. > >> > >> Signed-off-by: John Keeping > >> --- > >> sound/soc/rockchip/rockchip_i2s.c | 72 > >> +-- > >> 1 file changed, 32 insertions(+), 40 deletions(-) > >> > >> diff --git a/sound/soc/rockchip/rockchip_i2s.c > >> b/sound/soc/rockchip/rockchip_i2s.c > >> index 83b1b9c..acc6225 100644 > >> --- a/sound/soc/rockchip/rockchip_i2s.c > >> +++ b/sound/soc/rockchip/rockchip_i2s.c > >> @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > >> *i2s, int on) > >> I2S_DMACR_TDE_ENABLE, > >> I2S_DMACR_TDE_ENABLE); > >> > >> regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START); > >> + I2S_XFER_TXS_START, > >> + I2S_XFER_TXS_START); > >> > >> i2s->tx_start = true; > >> } else { > >> @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > >> *i2s, int on) > >> regmap_update_bits(i2s->regmap, I2S_DMACR, > >> I2S_DMACR_TDE_ENABLE, > >> I2S_DMACR_TDE_DISABLE); > >> > >> - if (!i2s->rx_start) { > >> - regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> - I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_STOP | > >> - I2S_XFER_RXS_STOP); > >> + regmap_update_bits(i2s->regmap, I2S_XFER, > >> + I2S_XFER_TXS_START, > >> + I2S_XFER_TXS_STOP); > >> > >> - regmap_update_bits(i2s->regmap, I2S_CLR, > >> - I2S_CLR_TXC | I2S_CLR_RXC, > >> - I2S_CLR_TXC | I2S_CLR_RXC); > >> + regmap_update_bits(i2s->regmap, I2S_CLR, > >> + I2S_CLR_TXC, > >> + I2S_CLR_TXC); > >> > >> - regmap_read(i2s->regmap, I2S_CLR, ); > >> + regmap_read(i2s->regmap, I2S_CLR, ); > >> > >> - /* Should wait for clear operation to finish > >> */ > >> - while (val) { > >> - regmap_read(i2s->regmap, I2S_CLR, > >> ); > >> - retry--; > >> - if (!retry) { > >> - dev_warn(i2s->dev, "fail to > >> clear\n"); > >> - break; > >> - } > >> + /* Should wait for clear operation to finish */ > >> + while (val & I2S_CLR_TXC) { > >> + regmap_read(i2s->regmap, I2S_CLR, ); > >> + retry--; > >> + if (!retry) { > >> + dev_warn(i2s->dev, "fail to clear\n"); > >> + break; > >> } > >> } > >> } > >> @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > >> *i2s, int on) > >> I2S_DMACR_RDE_ENABLE, > >> I2S_DMACR_RDE_ENABLE); > >> > >> regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START); > >>
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Tue, 3 May 2016 12:21:25 +0200, Enric Balletbo Serra wrote: > 2016-05-03 11:43 GMT+02:00 John Keeping : > > On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: > >> 2016-05-03 6:12 GMT+02:00 sugar : > >> > On 4/30/2016 15:00, John Keeping Wrote: > >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > >> >>> > >> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : > >> > >> If we only clear the tx/rx state when both are disabled it is not > >> possible to start/stop one multiple times while the other is running. > >> Since the two are independently controlled, treat them as such and > >> remove the false dependency between capture and playback. > >> > >> Signed-off-by: John Keeping > >> --- > >> sound/soc/rockchip/rockchip_i2s.c | 72 > >> +-- > >> 1 file changed, 32 insertions(+), 40 deletions(-) > >> > >> diff --git a/sound/soc/rockchip/rockchip_i2s.c > >> b/sound/soc/rockchip/rockchip_i2s.c > >> index 83b1b9c..acc6225 100644 > >> --- a/sound/soc/rockchip/rockchip_i2s.c > >> +++ b/sound/soc/rockchip/rockchip_i2s.c > >> @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > >> *i2s, int on) > >> I2S_DMACR_TDE_ENABLE, > >> I2S_DMACR_TDE_ENABLE); > >> > >> regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START); > >> + I2S_XFER_TXS_START, > >> + I2S_XFER_TXS_START); > >> > >> i2s->tx_start = true; > >> } else { > >> @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > >> *i2s, int on) > >> regmap_update_bits(i2s->regmap, I2S_DMACR, > >> I2S_DMACR_TDE_ENABLE, > >> I2S_DMACR_TDE_DISABLE); > >> > >> - if (!i2s->rx_start) { > >> - regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> - I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_STOP | > >> - I2S_XFER_RXS_STOP); > >> + regmap_update_bits(i2s->regmap, I2S_XFER, > >> + I2S_XFER_TXS_START, > >> + I2S_XFER_TXS_STOP); > >> > >> - regmap_update_bits(i2s->regmap, I2S_CLR, > >> - I2S_CLR_TXC | I2S_CLR_RXC, > >> - I2S_CLR_TXC | I2S_CLR_RXC); > >> + regmap_update_bits(i2s->regmap, I2S_CLR, > >> + I2S_CLR_TXC, > >> + I2S_CLR_TXC); > >> > >> - regmap_read(i2s->regmap, I2S_CLR, ); > >> + regmap_read(i2s->regmap, I2S_CLR, ); > >> > >> - /* Should wait for clear operation to finish > >> */ > >> - while (val) { > >> - regmap_read(i2s->regmap, I2S_CLR, > >> ); > >> - retry--; > >> - if (!retry) { > >> - dev_warn(i2s->dev, "fail to > >> clear\n"); > >> - break; > >> - } > >> + /* Should wait for clear operation to finish */ > >> + while (val & I2S_CLR_TXC) { > >> + regmap_read(i2s->regmap, I2S_CLR, ); > >> + retry--; > >> + if (!retry) { > >> + dev_warn(i2s->dev, "fail to clear\n"); > >> + break; > >> } > >> } > >> } > >> @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > >> *i2s, int on) > >> I2S_DMACR_RDE_ENABLE, > >> I2S_DMACR_RDE_ENABLE); > >> > >> regmap_update_bits(i2s->regmap, I2S_XFER, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START, > >> - I2S_XFER_TXS_START | > >> I2S_XFER_RXS_START); > >> + I2S_XFER_RXS_START, > >> +
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, 2016-05-03 11:43 GMT+02:00 John Keeping: > Hi Enric, > > On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: >> 2016-05-03 6:12 GMT+02:00 sugar : >> > On 4/30/2016 15:00, John Keeping Wrote: >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >> >>> >> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : >> >> If we only clear the tx/rx state when both are disabled it is not >> possible to start/stop one multiple times while the other is running. >> Since the two are independently controlled, treat them as such and >> remove the false dependency between capture and playback. >> >> Signed-off-by: John Keeping >> --- >> sound/soc/rockchip/rockchip_i2s.c | 72 >> +-- >> 1 file changed, 32 insertions(+), 40 deletions(-) >> >> diff --git a/sound/soc/rockchip/rockchip_i2s.c >> b/sound/soc/rockchip/rockchip_i2s.c >> index 83b1b9c..acc6225 100644 >> --- a/sound/soc/rockchip/rockchip_i2s.c >> +++ b/sound/soc/rockchip/rockchip_i2s.c >> @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> *i2s, int on) >> I2S_DMACR_TDE_ENABLE, >> I2S_DMACR_TDE_ENABLE); >> >> regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START); >> + I2S_XFER_TXS_START, >> + I2S_XFER_TXS_START); >> >> i2s->tx_start = true; >> } else { >> @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> *i2s, int on) >> regmap_update_bits(i2s->regmap, I2S_DMACR, >> I2S_DMACR_TDE_ENABLE, >> I2S_DMACR_TDE_DISABLE); >> >> - if (!i2s->rx_start) { >> - regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> - I2S_XFER_RXS_START, >> - I2S_XFER_TXS_STOP | >> - I2S_XFER_RXS_STOP); >> + regmap_update_bits(i2s->regmap, I2S_XFER, >> + I2S_XFER_TXS_START, >> + I2S_XFER_TXS_STOP); >> >> - regmap_update_bits(i2s->regmap, I2S_CLR, >> - I2S_CLR_TXC | I2S_CLR_RXC, >> - I2S_CLR_TXC | I2S_CLR_RXC); >> + regmap_update_bits(i2s->regmap, I2S_CLR, >> + I2S_CLR_TXC, >> + I2S_CLR_TXC); >> >> - regmap_read(i2s->regmap, I2S_CLR, ); >> + regmap_read(i2s->regmap, I2S_CLR, ); >> >> - /* Should wait for clear operation to finish */ >> - while (val) { >> - regmap_read(i2s->regmap, I2S_CLR, ); >> - retry--; >> - if (!retry) { >> - dev_warn(i2s->dev, "fail to >> clear\n"); >> - break; >> - } >> + /* Should wait for clear operation to finish */ >> + while (val & I2S_CLR_TXC) { >> + regmap_read(i2s->regmap, I2S_CLR, ); >> + retry--; >> + if (!retry) { >> + dev_warn(i2s->dev, "fail to clear\n"); >> + break; >> } >> } >> } >> @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> *i2s, int on) >> I2S_DMACR_RDE_ENABLE, >> I2S_DMACR_RDE_ENABLE); >> >> regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START); >> + I2S_XFER_RXS_START, >> + I2S_XFER_RXS_START); >> >> i2s->rx_start = true; >> } else { >> @@ -138,27 +134,23 @@ static void
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, 2016-05-03 11:43 GMT+02:00 John Keeping : > Hi Enric, > > On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: >> 2016-05-03 6:12 GMT+02:00 sugar : >> > On 4/30/2016 15:00, John Keeping Wrote: >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >> >>> >> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : >> >> If we only clear the tx/rx state when both are disabled it is not >> possible to start/stop one multiple times while the other is running. >> Since the two are independently controlled, treat them as such and >> remove the false dependency between capture and playback. >> >> Signed-off-by: John Keeping >> --- >> sound/soc/rockchip/rockchip_i2s.c | 72 >> +-- >> 1 file changed, 32 insertions(+), 40 deletions(-) >> >> diff --git a/sound/soc/rockchip/rockchip_i2s.c >> b/sound/soc/rockchip/rockchip_i2s.c >> index 83b1b9c..acc6225 100644 >> --- a/sound/soc/rockchip/rockchip_i2s.c >> +++ b/sound/soc/rockchip/rockchip_i2s.c >> @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> *i2s, int on) >> I2S_DMACR_TDE_ENABLE, >> I2S_DMACR_TDE_ENABLE); >> >> regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START); >> + I2S_XFER_TXS_START, >> + I2S_XFER_TXS_START); >> >> i2s->tx_start = true; >> } else { >> @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> *i2s, int on) >> regmap_update_bits(i2s->regmap, I2S_DMACR, >> I2S_DMACR_TDE_ENABLE, >> I2S_DMACR_TDE_DISABLE); >> >> - if (!i2s->rx_start) { >> - regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> - I2S_XFER_RXS_START, >> - I2S_XFER_TXS_STOP | >> - I2S_XFER_RXS_STOP); >> + regmap_update_bits(i2s->regmap, I2S_XFER, >> + I2S_XFER_TXS_START, >> + I2S_XFER_TXS_STOP); >> >> - regmap_update_bits(i2s->regmap, I2S_CLR, >> - I2S_CLR_TXC | I2S_CLR_RXC, >> - I2S_CLR_TXC | I2S_CLR_RXC); >> + regmap_update_bits(i2s->regmap, I2S_CLR, >> + I2S_CLR_TXC, >> + I2S_CLR_TXC); >> >> - regmap_read(i2s->regmap, I2S_CLR, ); >> + regmap_read(i2s->regmap, I2S_CLR, ); >> >> - /* Should wait for clear operation to finish */ >> - while (val) { >> - regmap_read(i2s->regmap, I2S_CLR, ); >> - retry--; >> - if (!retry) { >> - dev_warn(i2s->dev, "fail to >> clear\n"); >> - break; >> - } >> + /* Should wait for clear operation to finish */ >> + while (val & I2S_CLR_TXC) { >> + regmap_read(i2s->regmap, I2S_CLR, ); >> + retry--; >> + if (!retry) { >> + dev_warn(i2s->dev, "fail to clear\n"); >> + break; >> } >> } >> } >> @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> *i2s, int on) >> I2S_DMACR_RDE_ENABLE, >> I2S_DMACR_RDE_ENABLE); >> >> regmap_update_bits(i2s->regmap, I2S_XFER, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START, >> - I2S_XFER_TXS_START | >> I2S_XFER_RXS_START); >> + I2S_XFER_RXS_START, >> + I2S_XFER_RXS_START); >> >> i2s->rx_start = true; >> } else { >> @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> *i2s, int on) >>
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: > 2016-05-03 6:12 GMT+02:00 sugar: > > On 4/30/2016 15:00, John Keeping Wrote: > >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > >>> > >>> 2015-12-09 11:32 GMT+01:00 John Keeping : > > If we only clear the tx/rx state when both are disabled it is not > possible to start/stop one multiple times while the other is running. > Since the two are independently controlled, treat them as such and > remove the false dependency between capture and playback. > > Signed-off-by: John Keeping > --- > sound/soc/rockchip/rockchip_i2s.c | 72 > +-- > 1 file changed, 32 insertions(+), 40 deletions(-) > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > b/sound/soc/rockchip/rockchip_i2s.c > index 83b1b9c..acc6225 100644 > --- a/sound/soc/rockchip/rockchip_i2s.c > +++ b/sound/soc/rockchip/rockchip_i2s.c > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > *i2s, int on) > I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START); > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_START); > > i2s->tx_start = true; > } else { > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > *i2s, int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, > I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_DISABLE); > > - if (!i2s->rx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > - I2S_CLR_TXC | I2S_CLR_RXC); > + regmap_update_bits(i2s->regmap, I2S_CLR, > + I2S_CLR_TXC, > + I2S_CLR_TXC); > > - regmap_read(i2s->regmap, I2S_CLR, ); > + regmap_read(i2s->regmap, I2S_CLR, ); > > - /* Should wait for clear operation to finish */ > - while (val) { > - regmap_read(i2s->regmap, I2S_CLR, ); > - retry--; > - if (!retry) { > - dev_warn(i2s->dev, "fail to > clear\n"); > - break; > - } > + /* Should wait for clear operation to finish */ > + while (val & I2S_CLR_TXC) { > + regmap_read(i2s->regmap, I2S_CLR, ); > + retry--; > + if (!retry) { > + dev_warn(i2s->dev, "fail to clear\n"); > + break; > } > } > } > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > *i2s, int on) > I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START); > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_START); > > i2s->rx_start = true; > } else { > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > *i2s, int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, > I2S_DMACR_RDE_ENABLE, >
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Tue, 3 May 2016 11:16:58 +0200, Enric Balletbo Serra wrote: > 2016-05-03 6:12 GMT+02:00 sugar : > > On 4/30/2016 15:00, John Keeping Wrote: > >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > >>> > >>> 2015-12-09 11:32 GMT+01:00 John Keeping : > > If we only clear the tx/rx state when both are disabled it is not > possible to start/stop one multiple times while the other is running. > Since the two are independently controlled, treat them as such and > remove the false dependency between capture and playback. > > Signed-off-by: John Keeping > --- > sound/soc/rockchip/rockchip_i2s.c | 72 > +-- > 1 file changed, 32 insertions(+), 40 deletions(-) > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > b/sound/soc/rockchip/rockchip_i2s.c > index 83b1b9c..acc6225 100644 > --- a/sound/soc/rockchip/rockchip_i2s.c > +++ b/sound/soc/rockchip/rockchip_i2s.c > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > *i2s, int on) > I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START); > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_START); > > i2s->tx_start = true; > } else { > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev > *i2s, int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, > I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_DISABLE); > > - if (!i2s->rx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > - I2S_CLR_TXC | I2S_CLR_RXC); > + regmap_update_bits(i2s->regmap, I2S_CLR, > + I2S_CLR_TXC, > + I2S_CLR_TXC); > > - regmap_read(i2s->regmap, I2S_CLR, ); > + regmap_read(i2s->regmap, I2S_CLR, ); > > - /* Should wait for clear operation to finish */ > - while (val) { > - regmap_read(i2s->regmap, I2S_CLR, ); > - retry--; > - if (!retry) { > - dev_warn(i2s->dev, "fail to > clear\n"); > - break; > - } > + /* Should wait for clear operation to finish */ > + while (val & I2S_CLR_TXC) { > + regmap_read(i2s->regmap, I2S_CLR, ); > + retry--; > + if (!retry) { > + dev_warn(i2s->dev, "fail to clear\n"); > + break; > } > } > } > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > *i2s, int on) > I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | > I2S_XFER_RXS_START); > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_START); > > i2s->rx_start = true; > } else { > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > *i2s, int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, > I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_DISABLE); > > - if
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi all, 2016-05-03 6:12 GMT+02:00 sugar: > Hi John, > > > On 4/30/2016 15:00, John Keeping Wrote: >> >> Hi Enric, >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >>> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping --- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | -
Re: [alsa-devel] [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi all, 2016-05-03 6:12 GMT+02:00 sugar : > Hi John, > > > On 4/30/2016 15:00, John Keeping Wrote: >> >> Hi Enric, >> >> On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >>> >>> 2015-12-09 11:32 GMT+01:00 John Keeping : If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping --- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, -
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, On 4/30/2016 15:00, John Keeping Wrote: Hi Enric, On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: 2015-12-09 11:32 GMT+01:00 John Keeping: If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping --- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_RXS_START, + I2S_XFER_RXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); +
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, On 4/30/2016 15:00, John Keeping Wrote: Hi Enric, On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: 2015-12-09 11:32 GMT+01:00 John Keeping : If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping --- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_RXS_START, + I2S_XFER_RXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, +
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, Thanks for answer. 2016-04-30 9:00 GMT+02:00 John Keeping: > Hi Enric, > > On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >> 2015-12-09 11:32 GMT+01:00 John Keeping : >> > If we only clear the tx/rx state when both are disabled it is not >> > possible to start/stop one multiple times while the other is running. >> > Since the two are independently controlled, treat them as such and >> > remove the false dependency between capture and playback. >> > >> > Signed-off-by: John Keeping >> > --- >> > sound/soc/rockchip/rockchip_i2s.c | 72 >> > +-- >> > 1 file changed, 32 insertions(+), 40 deletions(-) >> > >> > diff --git a/sound/soc/rockchip/rockchip_i2s.c >> > b/sound/soc/rockchip/rockchip_i2s.c >> > index 83b1b9c..acc6225 100644 >> > --- a/sound/soc/rockchip/rockchip_i2s.c >> > +++ b/sound/soc/rockchip/rockchip_i2s.c >> > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, >> > int on) >> >I2S_DMACR_TDE_ENABLE, >> > I2S_DMACR_TDE_ENABLE); >> > >> > regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_START | >> > I2S_XFER_RXS_START); >> > + I2S_XFER_TXS_START, >> > + I2S_XFER_TXS_START); >> > >> > i2s->tx_start = true; >> > } else { >> > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> > *i2s, int on) >> > regmap_update_bits(i2s->regmap, I2S_DMACR, >> >I2S_DMACR_TDE_ENABLE, >> > I2S_DMACR_TDE_DISABLE); >> > >> > - if (!i2s->rx_start) { >> > - regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | >> > - I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_STOP | >> > - I2S_XFER_RXS_STOP); >> > + regmap_update_bits(i2s->regmap, I2S_XFER, >> > + I2S_XFER_TXS_START, >> > + I2S_XFER_TXS_STOP); >> > >> > - regmap_update_bits(i2s->regmap, I2S_CLR, >> > - I2S_CLR_TXC | I2S_CLR_RXC, >> > - I2S_CLR_TXC | I2S_CLR_RXC); >> > + regmap_update_bits(i2s->regmap, I2S_CLR, >> > + I2S_CLR_TXC, >> > + I2S_CLR_TXC); >> > >> > - regmap_read(i2s->regmap, I2S_CLR, ); >> > + regmap_read(i2s->regmap, I2S_CLR, ); >> > >> > - /* Should wait for clear operation to finish */ >> > - while (val) { >> > - regmap_read(i2s->regmap, I2S_CLR, ); >> > - retry--; >> > - if (!retry) { >> > - dev_warn(i2s->dev, "fail to >> > clear\n"); >> > - break; >> > - } >> > + /* Should wait for clear operation to finish */ >> > + while (val & I2S_CLR_TXC) { >> > + regmap_read(i2s->regmap, I2S_CLR, ); >> > + retry--; >> > + if (!retry) { >> > + dev_warn(i2s->dev, "fail to clear\n"); >> > + break; >> > } >> > } >> > } >> > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> > *i2s, int on) >> >I2S_DMACR_RDE_ENABLE, >> > I2S_DMACR_RDE_ENABLE); >> > >> > regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_START | >> > I2S_XFER_RXS_START); >> > + I2S_XFER_RXS_START, >> > + I2S_XFER_RXS_START); >> > >> > i2s->rx_start = true; >> > } else { >> > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> > *i2s, int on) >> > regmap_update_bits(i2s->regmap, I2S_DMACR, >> >I2S_DMACR_RDE_ENABLE, >> > I2S_DMACR_RDE_DISABLE); >> > >> > - if (!i2s->tx_start) { >> > - regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | >> > - I2S_XFER_RXS_START, >> > -
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, Thanks for answer. 2016-04-30 9:00 GMT+02:00 John Keeping : > Hi Enric, > > On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: >> 2015-12-09 11:32 GMT+01:00 John Keeping : >> > If we only clear the tx/rx state when both are disabled it is not >> > possible to start/stop one multiple times while the other is running. >> > Since the two are independently controlled, treat them as such and >> > remove the false dependency between capture and playback. >> > >> > Signed-off-by: John Keeping >> > --- >> > sound/soc/rockchip/rockchip_i2s.c | 72 >> > +-- >> > 1 file changed, 32 insertions(+), 40 deletions(-) >> > >> > diff --git a/sound/soc/rockchip/rockchip_i2s.c >> > b/sound/soc/rockchip/rockchip_i2s.c >> > index 83b1b9c..acc6225 100644 >> > --- a/sound/soc/rockchip/rockchip_i2s.c >> > +++ b/sound/soc/rockchip/rockchip_i2s.c >> > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, >> > int on) >> >I2S_DMACR_TDE_ENABLE, >> > I2S_DMACR_TDE_ENABLE); >> > >> > regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_START | >> > I2S_XFER_RXS_START); >> > + I2S_XFER_TXS_START, >> > + I2S_XFER_TXS_START); >> > >> > i2s->tx_start = true; >> > } else { >> > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev >> > *i2s, int on) >> > regmap_update_bits(i2s->regmap, I2S_DMACR, >> >I2S_DMACR_TDE_ENABLE, >> > I2S_DMACR_TDE_DISABLE); >> > >> > - if (!i2s->rx_start) { >> > - regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | >> > - I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_STOP | >> > - I2S_XFER_RXS_STOP); >> > + regmap_update_bits(i2s->regmap, I2S_XFER, >> > + I2S_XFER_TXS_START, >> > + I2S_XFER_TXS_STOP); >> > >> > - regmap_update_bits(i2s->regmap, I2S_CLR, >> > - I2S_CLR_TXC | I2S_CLR_RXC, >> > - I2S_CLR_TXC | I2S_CLR_RXC); >> > + regmap_update_bits(i2s->regmap, I2S_CLR, >> > + I2S_CLR_TXC, >> > + I2S_CLR_TXC); >> > >> > - regmap_read(i2s->regmap, I2S_CLR, ); >> > + regmap_read(i2s->regmap, I2S_CLR, ); >> > >> > - /* Should wait for clear operation to finish */ >> > - while (val) { >> > - regmap_read(i2s->regmap, I2S_CLR, ); >> > - retry--; >> > - if (!retry) { >> > - dev_warn(i2s->dev, "fail to >> > clear\n"); >> > - break; >> > - } >> > + /* Should wait for clear operation to finish */ >> > + while (val & I2S_CLR_TXC) { >> > + regmap_read(i2s->regmap, I2S_CLR, ); >> > + retry--; >> > + if (!retry) { >> > + dev_warn(i2s->dev, "fail to clear\n"); >> > + break; >> > } >> > } >> > } >> > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> > *i2s, int on) >> >I2S_DMACR_RDE_ENABLE, >> > I2S_DMACR_RDE_ENABLE); >> > >> > regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_START | >> > I2S_XFER_RXS_START); >> > + I2S_XFER_RXS_START, >> > + I2S_XFER_RXS_START); >> > >> > i2s->rx_start = true; >> > } else { >> > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev >> > *i2s, int on) >> > regmap_update_bits(i2s->regmap, I2S_DMACR, >> >I2S_DMACR_RDE_ENABLE, >> > I2S_DMACR_RDE_DISABLE); >> > >> > - if (!i2s->tx_start) { >> > - regmap_update_bits(i2s->regmap, I2S_XFER, >> > - I2S_XFER_TXS_START | >> > - I2S_XFER_RXS_START, >> > - I2S_XFER_TXS_STOP | >> > -
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > 2015-12-09 11:32 GMT+01:00 John Keeping: > > If we only clear the tx/rx state when both are disabled it is not > > possible to start/stop one multiple times while the other is running. > > Since the two are independently controlled, treat them as such and > > remove the false dependency between capture and playback. > > > > Signed-off-by: John Keeping > > --- > > sound/soc/rockchip/rockchip_i2s.c | 72 > > +-- > > 1 file changed, 32 insertions(+), 40 deletions(-) > > > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > > b/sound/soc/rockchip/rockchip_i2s.c > > index 83b1b9c..acc6225 100644 > > --- a/sound/soc/rockchip/rockchip_i2s.c > > +++ b/sound/soc/rockchip/rockchip_i2s.c > > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > > int on) > >I2S_DMACR_TDE_ENABLE, > > I2S_DMACR_TDE_ENABLE); > > > > regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > > + I2S_XFER_TXS_START, > > + I2S_XFER_TXS_START); > > > > i2s->tx_start = true; > > } else { > > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > > int on) > > regmap_update_bits(i2s->regmap, I2S_DMACR, > >I2S_DMACR_TDE_ENABLE, > > I2S_DMACR_TDE_DISABLE); > > > > - if (!i2s->rx_start) { > > - regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | > > - I2S_XFER_RXS_START, > > - I2S_XFER_TXS_STOP | > > - I2S_XFER_RXS_STOP); > > + regmap_update_bits(i2s->regmap, I2S_XFER, > > + I2S_XFER_TXS_START, > > + I2S_XFER_TXS_STOP); > > > > - regmap_update_bits(i2s->regmap, I2S_CLR, > > - I2S_CLR_TXC | I2S_CLR_RXC, > > - I2S_CLR_TXC | I2S_CLR_RXC); > > + regmap_update_bits(i2s->regmap, I2S_CLR, > > + I2S_CLR_TXC, > > + I2S_CLR_TXC); > > > > - regmap_read(i2s->regmap, I2S_CLR, ); > > + regmap_read(i2s->regmap, I2S_CLR, ); > > > > - /* Should wait for clear operation to finish */ > > - while (val) { > > - regmap_read(i2s->regmap, I2S_CLR, ); > > - retry--; > > - if (!retry) { > > - dev_warn(i2s->dev, "fail to > > clear\n"); > > - break; > > - } > > + /* Should wait for clear operation to finish */ > > + while (val & I2S_CLR_TXC) { > > + regmap_read(i2s->regmap, I2S_CLR, ); > > + retry--; > > + if (!retry) { > > + dev_warn(i2s->dev, "fail to clear\n"); > > + break; > > } > > } > > } > > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > > int on) > >I2S_DMACR_RDE_ENABLE, > > I2S_DMACR_RDE_ENABLE); > > > > regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > > + I2S_XFER_RXS_START, > > + I2S_XFER_RXS_START); > > > > i2s->rx_start = true; > > } else { > > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > > *i2s, int on) > > regmap_update_bits(i2s->regmap, I2S_DMACR, > >I2S_DMACR_RDE_ENABLE, > > I2S_DMACR_RDE_DISABLE); > > > > - if (!i2s->tx_start) { > > - regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | > > - I2S_XFER_RXS_START, > > - I2S_XFER_TXS_STOP | > > - I2S_XFER_RXS_STOP); > > + regmap_update_bits(i2s->regmap, I2S_XFER, > > +
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi Enric, On Fri, Apr 29, 2016 at 04:59:27PM +0200, Enric Balletbo Serra wrote: > 2015-12-09 11:32 GMT+01:00 John Keeping : > > If we only clear the tx/rx state when both are disabled it is not > > possible to start/stop one multiple times while the other is running. > > Since the two are independently controlled, treat them as such and > > remove the false dependency between capture and playback. > > > > Signed-off-by: John Keeping > > --- > > sound/soc/rockchip/rockchip_i2s.c | 72 > > +-- > > 1 file changed, 32 insertions(+), 40 deletions(-) > > > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > > b/sound/soc/rockchip/rockchip_i2s.c > > index 83b1b9c..acc6225 100644 > > --- a/sound/soc/rockchip/rockchip_i2s.c > > +++ b/sound/soc/rockchip/rockchip_i2s.c > > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > > int on) > >I2S_DMACR_TDE_ENABLE, > > I2S_DMACR_TDE_ENABLE); > > > > regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > > + I2S_XFER_TXS_START, > > + I2S_XFER_TXS_START); > > > > i2s->tx_start = true; > > } else { > > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > > int on) > > regmap_update_bits(i2s->regmap, I2S_DMACR, > >I2S_DMACR_TDE_ENABLE, > > I2S_DMACR_TDE_DISABLE); > > > > - if (!i2s->rx_start) { > > - regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | > > - I2S_XFER_RXS_START, > > - I2S_XFER_TXS_STOP | > > - I2S_XFER_RXS_STOP); > > + regmap_update_bits(i2s->regmap, I2S_XFER, > > + I2S_XFER_TXS_START, > > + I2S_XFER_TXS_STOP); > > > > - regmap_update_bits(i2s->regmap, I2S_CLR, > > - I2S_CLR_TXC | I2S_CLR_RXC, > > - I2S_CLR_TXC | I2S_CLR_RXC); > > + regmap_update_bits(i2s->regmap, I2S_CLR, > > + I2S_CLR_TXC, > > + I2S_CLR_TXC); > > > > - regmap_read(i2s->regmap, I2S_CLR, ); > > + regmap_read(i2s->regmap, I2S_CLR, ); > > > > - /* Should wait for clear operation to finish */ > > - while (val) { > > - regmap_read(i2s->regmap, I2S_CLR, ); > > - retry--; > > - if (!retry) { > > - dev_warn(i2s->dev, "fail to > > clear\n"); > > - break; > > - } > > + /* Should wait for clear operation to finish */ > > + while (val & I2S_CLR_TXC) { > > + regmap_read(i2s->regmap, I2S_CLR, ); > > + retry--; > > + if (!retry) { > > + dev_warn(i2s->dev, "fail to clear\n"); > > + break; > > } > > } > > } > > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > > int on) > >I2S_DMACR_RDE_ENABLE, > > I2S_DMACR_RDE_ENABLE); > > > > regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > > + I2S_XFER_RXS_START, > > + I2S_XFER_RXS_START); > > > > i2s->rx_start = true; > > } else { > > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev > > *i2s, int on) > > regmap_update_bits(i2s->regmap, I2S_DMACR, > >I2S_DMACR_RDE_ENABLE, > > I2S_DMACR_RDE_DISABLE); > > > > - if (!i2s->tx_start) { > > - regmap_update_bits(i2s->regmap, I2S_XFER, > > - I2S_XFER_TXS_START | > > - I2S_XFER_RXS_START, > > - I2S_XFER_TXS_STOP | > > - I2S_XFER_RXS_STOP); > > + regmap_update_bits(i2s->regmap, I2S_XFER, > > + I2S_XFER_RXS_START, > > +
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, 2015-12-09 11:32 GMT+01:00 John Keeping: > If we only clear the tx/rx state when both are disabled it is not > possible to start/stop one multiple times while the other is running. > Since the two are independently controlled, treat them as such and > remove the false dependency between capture and playback. > > Signed-off-by: John Keeping > --- > sound/soc/rockchip/rockchip_i2s.c | 72 > +-- > 1 file changed, 32 insertions(+), 40 deletions(-) > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > b/sound/soc/rockchip/rockchip_i2s.c > index 83b1b9c..acc6225 100644 > --- a/sound/soc/rockchip/rockchip_i2s.c > +++ b/sound/soc/rockchip/rockchip_i2s.c > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int > on) >I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_START); > > i2s->tx_start = true; > } else { > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, >I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_DISABLE); > > - if (!i2s->rx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > - I2S_CLR_TXC | I2S_CLR_RXC); > + regmap_update_bits(i2s->regmap, I2S_CLR, > + I2S_CLR_TXC, > + I2S_CLR_TXC); > > - regmap_read(i2s->regmap, I2S_CLR, ); > + regmap_read(i2s->regmap, I2S_CLR, ); > > - /* Should wait for clear operation to finish */ > - while (val) { > - regmap_read(i2s->regmap, I2S_CLR, ); > - retry--; > - if (!retry) { > - dev_warn(i2s->dev, "fail to clear\n"); > - break; > - } > + /* Should wait for clear operation to finish */ > + while (val & I2S_CLR_TXC) { > + regmap_read(i2s->regmap, I2S_CLR, ); > + retry--; > + if (!retry) { > + dev_warn(i2s->dev, "fail to clear\n"); > + break; > } > } > } > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > int on) >I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_START); > > i2s->rx_start = true; > } else { > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, >I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_DISABLE); > > - if (!i2s->tx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > -
Re: [PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
Hi John, 2015-12-09 11:32 GMT+01:00 John Keeping : > If we only clear the tx/rx state when both are disabled it is not > possible to start/stop one multiple times while the other is running. > Since the two are independently controlled, treat them as such and > remove the false dependency between capture and playback. > > Signed-off-by: John Keeping > --- > sound/soc/rockchip/rockchip_i2s.c | 72 > +-- > 1 file changed, 32 insertions(+), 40 deletions(-) > > diff --git a/sound/soc/rockchip/rockchip_i2s.c > b/sound/soc/rockchip/rockchip_i2s.c > index 83b1b9c..acc6225 100644 > --- a/sound/soc/rockchip/rockchip_i2s.c > +++ b/sound/soc/rockchip/rockchip_i2s.c > @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int > on) >I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_START); > > i2s->tx_start = true; > } else { > @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, > int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, >I2S_DMACR_TDE_ENABLE, > I2S_DMACR_TDE_DISABLE); > > - if (!i2s->rx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_TXS_START, > + I2S_XFER_TXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > - I2S_CLR_TXC | I2S_CLR_RXC); > + regmap_update_bits(i2s->regmap, I2S_CLR, > + I2S_CLR_TXC, > + I2S_CLR_TXC); > > - regmap_read(i2s->regmap, I2S_CLR, ); > + regmap_read(i2s->regmap, I2S_CLR, ); > > - /* Should wait for clear operation to finish */ > - while (val) { > - regmap_read(i2s->regmap, I2S_CLR, ); > - retry--; > - if (!retry) { > - dev_warn(i2s->dev, "fail to clear\n"); > - break; > - } > + /* Should wait for clear operation to finish */ > + while (val & I2S_CLR_TXC) { > + regmap_read(i2s->regmap, I2S_CLR, ); > + retry--; > + if (!retry) { > + dev_warn(i2s->dev, "fail to clear\n"); > + break; > } > } > } > @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > int on) >I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_ENABLE); > > regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START, > - I2S_XFER_TXS_START | I2S_XFER_RXS_START); > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_START); > > i2s->rx_start = true; > } else { > @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, > int on) > regmap_update_bits(i2s->regmap, I2S_DMACR, >I2S_DMACR_RDE_ENABLE, > I2S_DMACR_RDE_DISABLE); > > - if (!i2s->tx_start) { > - regmap_update_bits(i2s->regmap, I2S_XFER, > - I2S_XFER_TXS_START | > - I2S_XFER_RXS_START, > - I2S_XFER_TXS_STOP | > - I2S_XFER_RXS_STOP); > + regmap_update_bits(i2s->regmap, I2S_XFER, > + I2S_XFER_RXS_START, > + I2S_XFER_RXS_STOP); > > - regmap_update_bits(i2s->regmap, I2S_CLR, > - I2S_CLR_TXC | I2S_CLR_RXC, > - I2S_CLR_TXC | I2S_CLR_RXC); > +
[PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping --- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_RXS_START, + I2S_XFER_RXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_RXC, + I2S_CLR_RXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap,
[PATCH 1/2] ASoC: rockchip: i2s: separate capture and playback
If we only clear the tx/rx state when both are disabled it is not possible to start/stop one multiple times while the other is running. Since the two are independently controlled, treat them as such and remove the false dependency between capture and playback. Signed-off-by: John Keeping--- sound/soc/rockchip/rockchip_i2s.c | 72 +-- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index 83b1b9c..acc6225 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -82,8 +82,8 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_TXS_START, + I2S_XFER_TXS_START); i2s->tx_start = true; } else { @@ -92,27 +92,23 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); - if (!i2s->rx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_TXS_START, + I2S_XFER_TXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_TXC, + I2S_CLR_TXC); - regmap_read(i2s->regmap, I2S_CLR, ); + regmap_read(i2s->regmap, I2S_CLR, ); - /* Should wait for clear operation to finish */ - while (val) { - regmap_read(i2s->regmap, I2S_CLR, ); - retry--; - if (!retry) { - dev_warn(i2s->dev, "fail to clear\n"); - break; - } + /* Should wait for clear operation to finish */ + while (val & I2S_CLR_TXC) { + regmap_read(i2s->regmap, I2S_CLR, ); + retry--; + if (!retry) { + dev_warn(i2s->dev, "fail to clear\n"); + break; } } } @@ -128,8 +124,8 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | I2S_XFER_RXS_START, - I2S_XFER_TXS_START | I2S_XFER_RXS_START); + I2S_XFER_RXS_START, + I2S_XFER_RXS_START); i2s->rx_start = true; } else { @@ -138,27 +134,23 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on) regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); - if (!i2s->tx_start) { - regmap_update_bits(i2s->regmap, I2S_XFER, - I2S_XFER_TXS_START | - I2S_XFER_RXS_START, - I2S_XFER_TXS_STOP | - I2S_XFER_RXS_STOP); + regmap_update_bits(i2s->regmap, I2S_XFER, + I2S_XFER_RXS_START, + I2S_XFER_RXS_STOP); - regmap_update_bits(i2s->regmap, I2S_CLR, - I2S_CLR_TXC | I2S_CLR_RXC, - I2S_CLR_TXC | I2S_CLR_RXC); + regmap_update_bits(i2s->regmap, I2S_CLR, + I2S_CLR_RXC, + I2S_CLR_RXC); - regmap_read(i2s->regmap, I2S_CLR, ); +