Skip to content

Commit

Permalink
ASoC: tlv320aic31xx: Add overflow detection support
Browse files Browse the repository at this point in the history
Similar to short circuit detection, when the ADC/DAC is saturated and
overflows poor audio quality can result and should be reported to the
user. This device support Automatic Dynamic Range Compression (DRC)
to reduce this but it is not enabled currently in this driver.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Andrew F. Davis authored and Mark Brown committed Sep 4, 2018
1 parent e03546d commit 18d545b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
34 changes: 32 additions & 2 deletions sound/soc/codecs/tlv320aic31xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1409,7 +1409,7 @@ static irqreturn_t aic31xx_irq(int irq, void *data)
if (value)
handled = true;
else
goto exit;
goto read_overflow;

if (value & AIC31XX_HPLSCDETECT)
dev_err(dev, "Short circuit on Left output is detected\n");
Expand All @@ -1419,6 +1419,35 @@ static irqreturn_t aic31xx_irq(int irq, void *data)
AIC31XX_HPRSCDETECT))
dev_err(dev, "Unknown DAC interrupt flags: 0x%08x\n", value);

read_overflow:
ret = regmap_read(aic31xx->regmap, AIC31XX_OFFLAG, &value);
if (ret) {
dev_err(dev, "Failed to read overflow flag: %d\n", ret);
goto exit;
}

if (value)
handled = true;
else
goto exit;

if (value & AIC31XX_DAC_OF_LEFT)
dev_warn(dev, "Left-channel DAC overflow has occurred\n");
if (value & AIC31XX_DAC_OF_RIGHT)
dev_warn(dev, "Right-channel DAC overflow has occurred\n");
if (value & AIC31XX_DAC_OF_SHIFTER)
dev_warn(dev, "DAC barrel shifter overflow has occurred\n");
if (value & AIC31XX_ADC_OF)
dev_warn(dev, "ADC overflow has occurred\n");
if (value & AIC31XX_ADC_OF_SHIFTER)
dev_warn(dev, "ADC barrel shifter overflow has occurred\n");
if (value & ~(AIC31XX_DAC_OF_LEFT |
AIC31XX_DAC_OF_RIGHT |
AIC31XX_DAC_OF_SHIFTER |
AIC31XX_ADC_OF |
AIC31XX_ADC_OF_SHIFTER))
dev_warn(dev, "Unknown overflow interrupt flags: 0x%08x\n", value);

exit:
if (handled)
return IRQ_HANDLED;
Expand Down Expand Up @@ -1499,7 +1528,8 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c,
AIC31XX_GPIO1_FUNC_SHIFT);

regmap_write(aic31xx->regmap, AIC31XX_INT1CTRL,
AIC31XX_SC);
AIC31XX_SC |
AIC31XX_ENGINE);

ret = devm_request_threaded_irq(aic31xx->dev, aic31xx->irq,
NULL, aic31xx_irq,
Expand Down
7 changes: 7 additions & 0 deletions sound/soc/codecs/tlv320aic31xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,13 @@ struct aic31xx_pdata {
#define AIC31XX_HPRDRVPWRSTATUS_MASK BIT(1)
#define AIC31XX_SPRDRVPWRSTATUS_MASK BIT(0)

/* AIC31XX_OFFLAG */
#define AIC31XX_DAC_OF_LEFT BIT(7)
#define AIC31XX_DAC_OF_RIGHT BIT(6)
#define AIC31XX_DAC_OF_SHIFTER BIT(5)
#define AIC31XX_ADC_OF BIT(3)
#define AIC31XX_ADC_OF_SHIFTER BIT(1)

/* AIC31XX_INTRDACFLAG */
#define AIC31XX_HPLSCDETECT BIT(7)
#define AIC31XX_HPRSCDETECT BIT(6)
Expand Down

0 comments on commit 18d545b

Please sign in to comment.