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 --- |