Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
On 2017-08-31 11:00, Peter Ujfalusi wrote:
In aic3x class of devices Output Common-Mode Voltage can be configured for better analog performance. The OCMV value depends on the Analog and digital domain power supply voltage configuration.
The default OCMV of 1.35V gives best performance when AVDD is around 2.7V and DVDD is 1.525V, but for higher AVDD/DVDD higher OCMV setting is recommended.
The patch gives an automatic way of guessing the best OCMV which can be overwritten by a DT parameter if needed.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com
.../devicetree/bindings/sound/tlv320aic3x.txt | 5 +++ sound/soc/codecs/tlv320aic3x.c | 45 ++++++++++++++++++++++ sound/soc/codecs/tlv320aic3x.h | 8 ++++ 3 files changed, 58 insertions(+)
diff --git a/Documentation/devicetree/bindings/sound/tlv320aic3x.txt b/Documentation/devicetree/bindings/sound/tlv320aic3x.txt +static void aic3x_configure_ocmv(struct i2c_client *client) +{
- struct device_node *np = client->dev.of_node;
- struct aic3x_priv *aic3x = i2c_get_clientdata(client);
- u32 value;
- int dvdd, avdd;
- if (np && !of_property_read_u32(np, "ai3x-ocmv", &value)) {
/* OCMV setting is forced by DT */
if (value <= 3) {
aic3x->ocmv = value;
return;
}
- }
- dvdd = regulator_get_voltage(aic3x->supplies[1].consumer);
- avdd = regulator_get_voltage(aic3x->supplies[2].consumer);
- if (avdd > 3600000 || dvdd > 1950000) {
dev_warn(&client->dev,
"Too high supply voltage(s) AVDD: %d, DVDD: %d\n",
avdd, dvdd);
- } else if (avdd == 3600000 && dvdd == 1950000) {
aic3x->ocmv = HPOUT_SC_OCMV_1_8V;
- } else if (avdd > 3300000 && dvdd > 1800000) {
aic3x->ocmv = HPOUT_SC_OCMV_1_65V;
- } else if (avdd > 3000000 && dvdd > 1650000) {
aic3x->ocmv = HPOUT_SC_OCMV_1_5V;
- } else if (avdd > 2700000 && dvdd > 1525000) {
this should have been: } else if (avdd >= 2700000 && dvdd >= 1525000) {
as AVDD 2.7V and DVDD 1.525V is the lowest supported supply voltages.
aic3x->ocmv = HPOUT_SC_OCMV_1_35V;
- } else {
dev_warn(&client->dev,
"Invalid supply voltage(s) AVDD: %d, DVDD: %d\n",
avdd, dvdd);
- }
+}
/*
- AIC3X 2 wire address can be up to 4 devices with device addresses
- 0x18, 0x19, 0x1A, 0x1B
@@ -1816,6 +1859,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, goto err_gpio; }
- aic3x_configure_ocmv(i2c);
- if (aic3x->model == AIC3X_MODEL_3007) { ret = regmap_register_patch(aic3x->regmap, aic3007_class_d, ARRAY_SIZE(aic3007_class_d));
diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h index 89fa692df206..34c35196aa0d 100644 --- a/sound/soc/codecs/tlv320aic3x.h +++ b/sound/soc/codecs/tlv320aic3x.h @@ -243,6 +243,14 @@ #define MICBIAS_LEVEL_SHIFT (6) #define MICBIAS_LEVEL_MASK (3 << 6)
+/* HPOUT_SC */ +#define HPOUT_SC_OCMV_MASK (3 << 6) +#define HPOUT_SC_OCMV_SHIFT (6) +#define HPOUT_SC_OCMV_1_35V 0 +#define HPOUT_SC_OCMV_1_5V 1 +#define HPOUT_SC_OCMV_1_65V 2 +#define HPOUT_SC_OCMV_1_8V 3
/* headset detection / button API */
/* The AIC3x supports detection of stereo headsets (GND + left + right signal)
- Péter