da732x.c (dab2310d9d90eded48625c5382c6a60389bf8ca9) da732x.c (d4179c1deafd216b9358f76f5f399220cb8451ab)
1/*
2 * da732x.c --- Dialog DA732X ALSA SoC Audio Driver
3 *
4 * Copyright (C) 2012 Dialog Semiconductor GmbH
5 *
6 * Author: Michal Hajduk <Michal.Hajduk@diasemi.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 1254 unchanged lines hidden (view full) ---

1263 .channels_max = 2,
1264 .rates = DA732X_RATES,
1265 .formats = DA732X_FORMATS,
1266 },
1267 .ops = &da732x_dai2_ops,
1268 },
1269};
1270
1/*
2 * da732x.c --- Dialog DA732X ALSA SoC Audio Driver
3 *
4 * Copyright (C) 2012 Dialog Semiconductor GmbH
5 *
6 * Author: Michal Hajduk <Michal.Hajduk@diasemi.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 1254 unchanged lines hidden (view full) ---

1263 .channels_max = 2,
1264 .rates = DA732X_RATES,
1265 .formats = DA732X_FORMATS,
1266 },
1267 .ops = &da732x_dai2_ops,
1268 },
1269};
1270
1271static bool da732x_volatile(struct device *dev, unsigned int reg)
1272{
1273 switch (reg) {
1274 case DA732X_REG_HPL_DAC_OFF_CNTL:
1275 case DA732X_REG_HPR_DAC_OFF_CNTL:
1276 return true;
1277 default:
1278 return false;
1279 }
1280}
1281
1282static const struct regmap_config da732x_regmap = {
1283 .reg_bits = 8,
1284 .val_bits = 8,
1285
1286 .max_register = DA732X_MAX_REG,
1271static const struct regmap_config da732x_regmap = {
1272 .reg_bits = 8,
1273 .val_bits = 8,
1274
1275 .max_register = DA732X_MAX_REG,
1287 .volatile_reg = da732x_volatile,
1288 .reg_defaults = da732x_reg_cache,
1289 .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache),
1290 .cache_type = REGCACHE_RBTREE,
1291};
1292
1293
1294static void da732x_dac_offset_adjust(struct snd_soc_codec *codec)
1295{

--- 12 unchanged lines hidden (view full) ---

1308 snd_soc_write(codec, DA732X_REG_HPR_DAC_OFF_CNTL,
1309 DA732X_HP_DAC_OFF_CALIBRATION |
1310 DA732X_HP_DAC_OFF_SCALE_STEPS);
1311
1312 /* Wait for voltage stabilization */
1313 msleep(DA732X_WAIT_FOR_STABILIZATION);
1314
1315 /* Check DAC offset sign */
1276 .reg_defaults = da732x_reg_cache,
1277 .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache),
1278 .cache_type = REGCACHE_RBTREE,
1279};
1280
1281
1282static void da732x_dac_offset_adjust(struct snd_soc_codec *codec)
1283{

--- 12 unchanged lines hidden (view full) ---

1296 snd_soc_write(codec, DA732X_REG_HPR_DAC_OFF_CNTL,
1297 DA732X_HP_DAC_OFF_CALIBRATION |
1298 DA732X_HP_DAC_OFF_SCALE_STEPS);
1299
1300 /* Wait for voltage stabilization */
1301 msleep(DA732X_WAIT_FOR_STABILIZATION);
1302
1303 /* Check DAC offset sign */
1316 sign[DA732X_HPL_DAC] = (codec->hw_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) &
1304 sign[DA732X_HPL_DAC] = (snd_soc_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) &
1317 DA732X_HP_DAC_OFF_CNTL_COMPO);
1305 DA732X_HP_DAC_OFF_CNTL_COMPO);
1318 sign[DA732X_HPR_DAC] = (codec->hw_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) &
1306 sign[DA732X_HPR_DAC] = (snd_soc_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) &
1319 DA732X_HP_DAC_OFF_CNTL_COMPO);
1320
1321 /* Binary search DAC offset values (both channels at once) */
1322 offset[DA732X_HPL_DAC] = sign[DA732X_HPL_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
1323 offset[DA732X_HPR_DAC] = sign[DA732X_HPR_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
1324
1325 do {
1326 offset[DA732X_HPL_DAC] |= step;
1327 offset[DA732X_HPR_DAC] |= step;
1328 snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET,
1329 ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK);
1330 snd_soc_write(codec, DA732X_REG_HPR_DAC_OFFSET,
1331 ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK);
1332
1333 msleep(DA732X_WAIT_FOR_STABILIZATION);
1334
1307 DA732X_HP_DAC_OFF_CNTL_COMPO);
1308
1309 /* Binary search DAC offset values (both channels at once) */
1310 offset[DA732X_HPL_DAC] = sign[DA732X_HPL_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
1311 offset[DA732X_HPR_DAC] = sign[DA732X_HPR_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
1312
1313 do {
1314 offset[DA732X_HPL_DAC] |= step;
1315 offset[DA732X_HPR_DAC] |= step;
1316 snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET,
1317 ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK);
1318 snd_soc_write(codec, DA732X_REG_HPR_DAC_OFFSET,
1319 ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK);
1320
1321 msleep(DA732X_WAIT_FOR_STABILIZATION);
1322
1335 if ((codec->hw_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) &
1323 if ((snd_soc_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) &
1336 DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPL_DAC])
1337 offset[DA732X_HPL_DAC] &= ~step;
1324 DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPL_DAC])
1325 offset[DA732X_HPL_DAC] &= ~step;
1338 if ((codec->hw_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) &
1326 if ((snd_soc_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) &
1339 DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPR_DAC])
1340 offset[DA732X_HPR_DAC] &= ~step;
1341
1342 step >>= 1;
1343 } while (step);
1344
1345 /* Write final DAC offsets to registers */
1346 snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET,

--- 24 unchanged lines hidden (view full) ---

1371 DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
1372 snd_soc_write(codec, DA732X_REG_HPR,
1373 DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
1374
1375 /* Wait for voltage stabilization */
1376 msleep(DA732X_WAIT_FOR_STABILIZATION);
1377
1378 /* Check output offset sign */
1327 DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPR_DAC])
1328 offset[DA732X_HPR_DAC] &= ~step;
1329
1330 step >>= 1;
1331 } while (step);
1332
1333 /* Write final DAC offsets to registers */
1334 snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET,

--- 24 unchanged lines hidden (view full) ---

1359 DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
1360 snd_soc_write(codec, DA732X_REG_HPR,
1361 DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
1362
1363 /* Wait for voltage stabilization */
1364 msleep(DA732X_WAIT_FOR_STABILIZATION);
1365
1366 /* Check output offset sign */
1379 sign[DA732X_HPL_AMP] = codec->hw_read(codec, DA732X_REG_HPL) &
1367 sign[DA732X_HPL_AMP] = snd_soc_read(codec, DA732X_REG_HPL) &
1380 DA732X_HP_OUT_COMPO;
1368 DA732X_HP_OUT_COMPO;
1381 sign[DA732X_HPR_AMP] = codec->hw_read(codec, DA732X_REG_HPR) &
1369 sign[DA732X_HPR_AMP] = snd_soc_read(codec, DA732X_REG_HPR) &
1382 DA732X_HP_OUT_COMPO;
1383
1384 snd_soc_write(codec, DA732X_REG_HPL, DA732X_HP_OUT_COMP |
1385 (sign[DA732X_HPL_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
1386 DA732X_HP_OUT_EN);
1387 snd_soc_write(codec, DA732X_REG_HPR, DA732X_HP_OUT_COMP |
1388 (sign[DA732X_HPR_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
1389 DA732X_HP_OUT_EN);

--- 4 unchanged lines hidden (view full) ---

1394 offset[DA732X_HPR_AMP] |= step;
1395 snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET,
1396 offset[DA732X_HPL_AMP]);
1397 snd_soc_write(codec, DA732X_REG_HPR_OUT_OFFSET,
1398 offset[DA732X_HPR_AMP]);
1399
1400 msleep(DA732X_WAIT_FOR_STABILIZATION);
1401
1370 DA732X_HP_OUT_COMPO;
1371
1372 snd_soc_write(codec, DA732X_REG_HPL, DA732X_HP_OUT_COMP |
1373 (sign[DA732X_HPL_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
1374 DA732X_HP_OUT_EN);
1375 snd_soc_write(codec, DA732X_REG_HPR, DA732X_HP_OUT_COMP |
1376 (sign[DA732X_HPR_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
1377 DA732X_HP_OUT_EN);

--- 4 unchanged lines hidden (view full) ---

1382 offset[DA732X_HPR_AMP] |= step;
1383 snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET,
1384 offset[DA732X_HPL_AMP]);
1385 snd_soc_write(codec, DA732X_REG_HPR_OUT_OFFSET,
1386 offset[DA732X_HPR_AMP]);
1387
1388 msleep(DA732X_WAIT_FOR_STABILIZATION);
1389
1402 if ((codec->hw_read(codec, DA732X_REG_HPL) &
1390 if ((snd_soc_read(codec, DA732X_REG_HPL) &
1403 DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPL_AMP])
1404 offset[DA732X_HPL_AMP] &= ~step;
1391 DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPL_AMP])
1392 offset[DA732X_HPL_AMP] &= ~step;
1405 if ((codec->hw_read(codec, DA732X_REG_HPR) &
1393 if ((snd_soc_read(codec, DA732X_REG_HPR) &
1406 DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPR_AMP])
1407 offset[DA732X_HPR_AMP] &= ~step;
1408
1409 step >>= 1;
1410 } while (step);
1411
1412 /* Write final DAC offsets to registers */
1413 snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]);

--- 226 unchanged lines hidden ---
1394 DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPR_AMP])
1395 offset[DA732X_HPR_AMP] &= ~step;
1396
1397 step >>= 1;
1398 } while (step);
1399
1400 /* Write final DAC offsets to registers */
1401 snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]);

--- 226 unchanged lines hidden ---