tas.c (24401B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Apple Onboard Audio driver for tas codec 4 * 5 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 6 * 7 * Open questions: 8 * - How to distinguish between 3004 and versions? 9 * 10 * FIXMEs: 11 * - This codec driver doesn't honour the 'connected' 12 * property of the aoa_codec struct, hence if 13 * it is used in machines where not everything is 14 * connected it will display wrong mixer elements. 15 * - Driver assumes that the microphone is always 16 * monaureal and connected to the right channel of 17 * the input. This should also be a codec-dependent 18 * flag, maybe the codec should have 3 different 19 * bits for the three different possibilities how 20 * it can be hooked up... 21 * But as long as I don't see any hardware hooked 22 * up that way... 23 * - As Apple notes in their code, the tas3004 seems 24 * to delay the right channel by one sample. You can 25 * see this when for example recording stereo in 26 * audacity, or recording the tas output via cable 27 * on another machine (use a sinus generator or so). 28 * I tried programming the BiQuads but couldn't 29 * make the delay work, maybe someone can read the 30 * datasheet and fix it. The relevant Apple comment 31 * is in AppleTAS3004Audio.cpp lines 1637 ff. Note 32 * that their comment describing how they program 33 * the filters sucks... 34 * 35 * Other things: 36 * - this should actually register *two* aoa_codec 37 * structs since it has two inputs. Then it must 38 * use the prepare callback to forbid running the 39 * secondary output on a different clock. 40 * Also, whatever bus knows how to do this must 41 * provide two soundbus_dev devices and the fabric 42 * must be able to link them correctly. 43 * 44 * I don't even know if Apple ever uses the second 45 * port on the tas3004 though, I don't think their 46 * i2s controllers can even do it. OTOH, they all 47 * derive the clocks from common clocks, so it 48 * might just be possible. The framework allows the 49 * codec to refine the transfer_info items in the 50 * usable callback, so we can simply remove the 51 * rates the second instance is not using when it 52 * actually is in use. 53 * Maybe we'll need to make the sound busses have 54 * a 'clock group id' value so the codec can 55 * determine if the two outputs can be driven at 56 * the same time. But that is likely overkill, up 57 * to the fabric to not link them up incorrectly, 58 * and up to the hardware designer to not wire 59 * them up in some weird unusable way. 60 */ 61#include <linux/i2c.h> 62#include <asm/pmac_low_i2c.h> 63#include <asm/prom.h> 64#include <linux/delay.h> 65#include <linux/module.h> 66#include <linux/mutex.h> 67#include <linux/slab.h> 68 69MODULE_AUTHOR("Johannes Berg <johannes@sipsolutions.net>"); 70MODULE_LICENSE("GPL"); 71MODULE_DESCRIPTION("tas codec driver for snd-aoa"); 72 73#include "tas.h" 74#include "tas-gain-table.h" 75#include "tas-basstreble.h" 76#include "../aoa.h" 77#include "../soundbus/soundbus.h" 78 79#define PFX "snd-aoa-codec-tas: " 80 81 82struct tas { 83 struct aoa_codec codec; 84 struct i2c_client *i2c; 85 u32 mute_l:1, mute_r:1 , 86 controls_created:1 , 87 drc_enabled:1, 88 hw_enabled:1; 89 u8 cached_volume_l, cached_volume_r; 90 u8 mixer_l[3], mixer_r[3]; 91 u8 bass, treble; 92 u8 acr; 93 int drc_range; 94 /* protects hardware access against concurrency from 95 * userspace when hitting controls and during 96 * codec init/suspend/resume */ 97 struct mutex mtx; 98}; 99 100static int tas_reset_init(struct tas *tas); 101 102static struct tas *codec_to_tas(struct aoa_codec *codec) 103{ 104 return container_of(codec, struct tas, codec); 105} 106 107static inline int tas_write_reg(struct tas *tas, u8 reg, u8 len, u8 *data) 108{ 109 if (len == 1) 110 return i2c_smbus_write_byte_data(tas->i2c, reg, *data); 111 else 112 return i2c_smbus_write_i2c_block_data(tas->i2c, reg, len, data); 113} 114 115static void tas3004_set_drc(struct tas *tas) 116{ 117 unsigned char val[6]; 118 119 if (tas->drc_enabled) 120 val[0] = 0x50; /* 3:1 above threshold */ 121 else 122 val[0] = 0x51; /* disabled */ 123 val[1] = 0x02; /* 1:1 below threshold */ 124 if (tas->drc_range > 0xef) 125 val[2] = 0xef; 126 else if (tas->drc_range < 0) 127 val[2] = 0x00; 128 else 129 val[2] = tas->drc_range; 130 val[3] = 0xb0; 131 val[4] = 0x60; 132 val[5] = 0xa0; 133 134 tas_write_reg(tas, TAS_REG_DRC, 6, val); 135} 136 137static void tas_set_treble(struct tas *tas) 138{ 139 u8 tmp; 140 141 tmp = tas3004_treble(tas->treble); 142 tas_write_reg(tas, TAS_REG_TREBLE, 1, &tmp); 143} 144 145static void tas_set_bass(struct tas *tas) 146{ 147 u8 tmp; 148 149 tmp = tas3004_bass(tas->bass); 150 tas_write_reg(tas, TAS_REG_BASS, 1, &tmp); 151} 152 153static void tas_set_volume(struct tas *tas) 154{ 155 u8 block[6]; 156 int tmp; 157 u8 left, right; 158 159 left = tas->cached_volume_l; 160 right = tas->cached_volume_r; 161 162 if (left > 177) left = 177; 163 if (right > 177) right = 177; 164 165 if (tas->mute_l) left = 0; 166 if (tas->mute_r) right = 0; 167 168 /* analysing the volume and mixer tables shows 169 * that they are similar enough when we shift 170 * the mixer table down by 4 bits. The error 171 * is miniscule, in just one item the error 172 * is 1, at a value of 0x07f17b (mixer table 173 * value is 0x07f17a) */ 174 tmp = tas_gaintable[left]; 175 block[0] = tmp>>20; 176 block[1] = tmp>>12; 177 block[2] = tmp>>4; 178 tmp = tas_gaintable[right]; 179 block[3] = tmp>>20; 180 block[4] = tmp>>12; 181 block[5] = tmp>>4; 182 tas_write_reg(tas, TAS_REG_VOL, 6, block); 183} 184 185static void tas_set_mixer(struct tas *tas) 186{ 187 u8 block[9]; 188 int tmp, i; 189 u8 val; 190 191 for (i=0;i<3;i++) { 192 val = tas->mixer_l[i]; 193 if (val > 177) val = 177; 194 tmp = tas_gaintable[val]; 195 block[3*i+0] = tmp>>16; 196 block[3*i+1] = tmp>>8; 197 block[3*i+2] = tmp; 198 } 199 tas_write_reg(tas, TAS_REG_LMIX, 9, block); 200 201 for (i=0;i<3;i++) { 202 val = tas->mixer_r[i]; 203 if (val > 177) val = 177; 204 tmp = tas_gaintable[val]; 205 block[3*i+0] = tmp>>16; 206 block[3*i+1] = tmp>>8; 207 block[3*i+2] = tmp; 208 } 209 tas_write_reg(tas, TAS_REG_RMIX, 9, block); 210} 211 212/* alsa stuff */ 213 214static int tas_dev_register(struct snd_device *dev) 215{ 216 return 0; 217} 218 219static const struct snd_device_ops ops = { 220 .dev_register = tas_dev_register, 221}; 222 223static int tas_snd_vol_info(struct snd_kcontrol *kcontrol, 224 struct snd_ctl_elem_info *uinfo) 225{ 226 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 227 uinfo->count = 2; 228 uinfo->value.integer.min = 0; 229 uinfo->value.integer.max = 177; 230 return 0; 231} 232 233static int tas_snd_vol_get(struct snd_kcontrol *kcontrol, 234 struct snd_ctl_elem_value *ucontrol) 235{ 236 struct tas *tas = snd_kcontrol_chip(kcontrol); 237 238 mutex_lock(&tas->mtx); 239 ucontrol->value.integer.value[0] = tas->cached_volume_l; 240 ucontrol->value.integer.value[1] = tas->cached_volume_r; 241 mutex_unlock(&tas->mtx); 242 return 0; 243} 244 245static int tas_snd_vol_put(struct snd_kcontrol *kcontrol, 246 struct snd_ctl_elem_value *ucontrol) 247{ 248 struct tas *tas = snd_kcontrol_chip(kcontrol); 249 250 if (ucontrol->value.integer.value[0] < 0 || 251 ucontrol->value.integer.value[0] > 177) 252 return -EINVAL; 253 if (ucontrol->value.integer.value[1] < 0 || 254 ucontrol->value.integer.value[1] > 177) 255 return -EINVAL; 256 257 mutex_lock(&tas->mtx); 258 if (tas->cached_volume_l == ucontrol->value.integer.value[0] 259 && tas->cached_volume_r == ucontrol->value.integer.value[1]) { 260 mutex_unlock(&tas->mtx); 261 return 0; 262 } 263 264 tas->cached_volume_l = ucontrol->value.integer.value[0]; 265 tas->cached_volume_r = ucontrol->value.integer.value[1]; 266 if (tas->hw_enabled) 267 tas_set_volume(tas); 268 mutex_unlock(&tas->mtx); 269 return 1; 270} 271 272static const struct snd_kcontrol_new volume_control = { 273 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 274 .name = "Master Playback Volume", 275 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 276 .info = tas_snd_vol_info, 277 .get = tas_snd_vol_get, 278 .put = tas_snd_vol_put, 279}; 280 281#define tas_snd_mute_info snd_ctl_boolean_stereo_info 282 283static int tas_snd_mute_get(struct snd_kcontrol *kcontrol, 284 struct snd_ctl_elem_value *ucontrol) 285{ 286 struct tas *tas = snd_kcontrol_chip(kcontrol); 287 288 mutex_lock(&tas->mtx); 289 ucontrol->value.integer.value[0] = !tas->mute_l; 290 ucontrol->value.integer.value[1] = !tas->mute_r; 291 mutex_unlock(&tas->mtx); 292 return 0; 293} 294 295static int tas_snd_mute_put(struct snd_kcontrol *kcontrol, 296 struct snd_ctl_elem_value *ucontrol) 297{ 298 struct tas *tas = snd_kcontrol_chip(kcontrol); 299 300 mutex_lock(&tas->mtx); 301 if (tas->mute_l == !ucontrol->value.integer.value[0] 302 && tas->mute_r == !ucontrol->value.integer.value[1]) { 303 mutex_unlock(&tas->mtx); 304 return 0; 305 } 306 307 tas->mute_l = !ucontrol->value.integer.value[0]; 308 tas->mute_r = !ucontrol->value.integer.value[1]; 309 if (tas->hw_enabled) 310 tas_set_volume(tas); 311 mutex_unlock(&tas->mtx); 312 return 1; 313} 314 315static const struct snd_kcontrol_new mute_control = { 316 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 317 .name = "Master Playback Switch", 318 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 319 .info = tas_snd_mute_info, 320 .get = tas_snd_mute_get, 321 .put = tas_snd_mute_put, 322}; 323 324static int tas_snd_mixer_info(struct snd_kcontrol *kcontrol, 325 struct snd_ctl_elem_info *uinfo) 326{ 327 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 328 uinfo->count = 2; 329 uinfo->value.integer.min = 0; 330 uinfo->value.integer.max = 177; 331 return 0; 332} 333 334static int tas_snd_mixer_get(struct snd_kcontrol *kcontrol, 335 struct snd_ctl_elem_value *ucontrol) 336{ 337 struct tas *tas = snd_kcontrol_chip(kcontrol); 338 int idx = kcontrol->private_value; 339 340 mutex_lock(&tas->mtx); 341 ucontrol->value.integer.value[0] = tas->mixer_l[idx]; 342 ucontrol->value.integer.value[1] = tas->mixer_r[idx]; 343 mutex_unlock(&tas->mtx); 344 345 return 0; 346} 347 348static int tas_snd_mixer_put(struct snd_kcontrol *kcontrol, 349 struct snd_ctl_elem_value *ucontrol) 350{ 351 struct tas *tas = snd_kcontrol_chip(kcontrol); 352 int idx = kcontrol->private_value; 353 354 mutex_lock(&tas->mtx); 355 if (tas->mixer_l[idx] == ucontrol->value.integer.value[0] 356 && tas->mixer_r[idx] == ucontrol->value.integer.value[1]) { 357 mutex_unlock(&tas->mtx); 358 return 0; 359 } 360 361 tas->mixer_l[idx] = ucontrol->value.integer.value[0]; 362 tas->mixer_r[idx] = ucontrol->value.integer.value[1]; 363 364 if (tas->hw_enabled) 365 tas_set_mixer(tas); 366 mutex_unlock(&tas->mtx); 367 return 1; 368} 369 370#define MIXER_CONTROL(n,descr,idx) \ 371static const struct snd_kcontrol_new n##_control = { \ 372 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 373 .name = descr " Playback Volume", \ 374 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 375 .info = tas_snd_mixer_info, \ 376 .get = tas_snd_mixer_get, \ 377 .put = tas_snd_mixer_put, \ 378 .private_value = idx, \ 379} 380 381MIXER_CONTROL(pcm1, "PCM", 0); 382MIXER_CONTROL(monitor, "Monitor", 2); 383 384static int tas_snd_drc_range_info(struct snd_kcontrol *kcontrol, 385 struct snd_ctl_elem_info *uinfo) 386{ 387 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 388 uinfo->count = 1; 389 uinfo->value.integer.min = 0; 390 uinfo->value.integer.max = TAS3004_DRC_MAX; 391 return 0; 392} 393 394static int tas_snd_drc_range_get(struct snd_kcontrol *kcontrol, 395 struct snd_ctl_elem_value *ucontrol) 396{ 397 struct tas *tas = snd_kcontrol_chip(kcontrol); 398 399 mutex_lock(&tas->mtx); 400 ucontrol->value.integer.value[0] = tas->drc_range; 401 mutex_unlock(&tas->mtx); 402 return 0; 403} 404 405static int tas_snd_drc_range_put(struct snd_kcontrol *kcontrol, 406 struct snd_ctl_elem_value *ucontrol) 407{ 408 struct tas *tas = snd_kcontrol_chip(kcontrol); 409 410 if (ucontrol->value.integer.value[0] < 0 || 411 ucontrol->value.integer.value[0] > TAS3004_DRC_MAX) 412 return -EINVAL; 413 414 mutex_lock(&tas->mtx); 415 if (tas->drc_range == ucontrol->value.integer.value[0]) { 416 mutex_unlock(&tas->mtx); 417 return 0; 418 } 419 420 tas->drc_range = ucontrol->value.integer.value[0]; 421 if (tas->hw_enabled) 422 tas3004_set_drc(tas); 423 mutex_unlock(&tas->mtx); 424 return 1; 425} 426 427static const struct snd_kcontrol_new drc_range_control = { 428 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 429 .name = "DRC Range", 430 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 431 .info = tas_snd_drc_range_info, 432 .get = tas_snd_drc_range_get, 433 .put = tas_snd_drc_range_put, 434}; 435 436#define tas_snd_drc_switch_info snd_ctl_boolean_mono_info 437 438static int tas_snd_drc_switch_get(struct snd_kcontrol *kcontrol, 439 struct snd_ctl_elem_value *ucontrol) 440{ 441 struct tas *tas = snd_kcontrol_chip(kcontrol); 442 443 mutex_lock(&tas->mtx); 444 ucontrol->value.integer.value[0] = tas->drc_enabled; 445 mutex_unlock(&tas->mtx); 446 return 0; 447} 448 449static int tas_snd_drc_switch_put(struct snd_kcontrol *kcontrol, 450 struct snd_ctl_elem_value *ucontrol) 451{ 452 struct tas *tas = snd_kcontrol_chip(kcontrol); 453 454 mutex_lock(&tas->mtx); 455 if (tas->drc_enabled == ucontrol->value.integer.value[0]) { 456 mutex_unlock(&tas->mtx); 457 return 0; 458 } 459 460 tas->drc_enabled = !!ucontrol->value.integer.value[0]; 461 if (tas->hw_enabled) 462 tas3004_set_drc(tas); 463 mutex_unlock(&tas->mtx); 464 return 1; 465} 466 467static const struct snd_kcontrol_new drc_switch_control = { 468 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 469 .name = "DRC Range Switch", 470 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 471 .info = tas_snd_drc_switch_info, 472 .get = tas_snd_drc_switch_get, 473 .put = tas_snd_drc_switch_put, 474}; 475 476static int tas_snd_capture_source_info(struct snd_kcontrol *kcontrol, 477 struct snd_ctl_elem_info *uinfo) 478{ 479 static const char * const texts[] = { "Line-In", "Microphone" }; 480 481 return snd_ctl_enum_info(uinfo, 1, 2, texts); 482} 483 484static int tas_snd_capture_source_get(struct snd_kcontrol *kcontrol, 485 struct snd_ctl_elem_value *ucontrol) 486{ 487 struct tas *tas = snd_kcontrol_chip(kcontrol); 488 489 mutex_lock(&tas->mtx); 490 ucontrol->value.enumerated.item[0] = !!(tas->acr & TAS_ACR_INPUT_B); 491 mutex_unlock(&tas->mtx); 492 return 0; 493} 494 495static int tas_snd_capture_source_put(struct snd_kcontrol *kcontrol, 496 struct snd_ctl_elem_value *ucontrol) 497{ 498 struct tas *tas = snd_kcontrol_chip(kcontrol); 499 int oldacr; 500 501 if (ucontrol->value.enumerated.item[0] > 1) 502 return -EINVAL; 503 mutex_lock(&tas->mtx); 504 oldacr = tas->acr; 505 506 /* 507 * Despite what the data sheet says in one place, the 508 * TAS_ACR_B_MONAUREAL bit forces mono output even when 509 * input A (line in) is selected. 510 */ 511 tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL); 512 if (ucontrol->value.enumerated.item[0]) 513 tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL | 514 TAS_ACR_B_MON_SEL_RIGHT; 515 if (oldacr == tas->acr) { 516 mutex_unlock(&tas->mtx); 517 return 0; 518 } 519 if (tas->hw_enabled) 520 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr); 521 mutex_unlock(&tas->mtx); 522 return 1; 523} 524 525static const struct snd_kcontrol_new capture_source_control = { 526 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 527 /* If we name this 'Input Source', it properly shows up in 528 * alsamixer as a selection, * but it's shown under the 529 * 'Playback' category. 530 * If I name it 'Capture Source', it shows up in strange 531 * ways (two bools of which one can be selected at a 532 * time) but at least it's shown in the 'Capture' 533 * category. 534 * I was told that this was due to backward compatibility, 535 * but I don't understand then why the mangling is *not* 536 * done when I name it "Input Source"..... 537 */ 538 .name = "Capture Source", 539 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 540 .info = tas_snd_capture_source_info, 541 .get = tas_snd_capture_source_get, 542 .put = tas_snd_capture_source_put, 543}; 544 545static int tas_snd_treble_info(struct snd_kcontrol *kcontrol, 546 struct snd_ctl_elem_info *uinfo) 547{ 548 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 549 uinfo->count = 1; 550 uinfo->value.integer.min = TAS3004_TREBLE_MIN; 551 uinfo->value.integer.max = TAS3004_TREBLE_MAX; 552 return 0; 553} 554 555static int tas_snd_treble_get(struct snd_kcontrol *kcontrol, 556 struct snd_ctl_elem_value *ucontrol) 557{ 558 struct tas *tas = snd_kcontrol_chip(kcontrol); 559 560 mutex_lock(&tas->mtx); 561 ucontrol->value.integer.value[0] = tas->treble; 562 mutex_unlock(&tas->mtx); 563 return 0; 564} 565 566static int tas_snd_treble_put(struct snd_kcontrol *kcontrol, 567 struct snd_ctl_elem_value *ucontrol) 568{ 569 struct tas *tas = snd_kcontrol_chip(kcontrol); 570 571 if (ucontrol->value.integer.value[0] < TAS3004_TREBLE_MIN || 572 ucontrol->value.integer.value[0] > TAS3004_TREBLE_MAX) 573 return -EINVAL; 574 mutex_lock(&tas->mtx); 575 if (tas->treble == ucontrol->value.integer.value[0]) { 576 mutex_unlock(&tas->mtx); 577 return 0; 578 } 579 580 tas->treble = ucontrol->value.integer.value[0]; 581 if (tas->hw_enabled) 582 tas_set_treble(tas); 583 mutex_unlock(&tas->mtx); 584 return 1; 585} 586 587static const struct snd_kcontrol_new treble_control = { 588 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 589 .name = "Treble", 590 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 591 .info = tas_snd_treble_info, 592 .get = tas_snd_treble_get, 593 .put = tas_snd_treble_put, 594}; 595 596static int tas_snd_bass_info(struct snd_kcontrol *kcontrol, 597 struct snd_ctl_elem_info *uinfo) 598{ 599 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 600 uinfo->count = 1; 601 uinfo->value.integer.min = TAS3004_BASS_MIN; 602 uinfo->value.integer.max = TAS3004_BASS_MAX; 603 return 0; 604} 605 606static int tas_snd_bass_get(struct snd_kcontrol *kcontrol, 607 struct snd_ctl_elem_value *ucontrol) 608{ 609 struct tas *tas = snd_kcontrol_chip(kcontrol); 610 611 mutex_lock(&tas->mtx); 612 ucontrol->value.integer.value[0] = tas->bass; 613 mutex_unlock(&tas->mtx); 614 return 0; 615} 616 617static int tas_snd_bass_put(struct snd_kcontrol *kcontrol, 618 struct snd_ctl_elem_value *ucontrol) 619{ 620 struct tas *tas = snd_kcontrol_chip(kcontrol); 621 622 if (ucontrol->value.integer.value[0] < TAS3004_BASS_MIN || 623 ucontrol->value.integer.value[0] > TAS3004_BASS_MAX) 624 return -EINVAL; 625 mutex_lock(&tas->mtx); 626 if (tas->bass == ucontrol->value.integer.value[0]) { 627 mutex_unlock(&tas->mtx); 628 return 0; 629 } 630 631 tas->bass = ucontrol->value.integer.value[0]; 632 if (tas->hw_enabled) 633 tas_set_bass(tas); 634 mutex_unlock(&tas->mtx); 635 return 1; 636} 637 638static const struct snd_kcontrol_new bass_control = { 639 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 640 .name = "Bass", 641 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 642 .info = tas_snd_bass_info, 643 .get = tas_snd_bass_get, 644 .put = tas_snd_bass_put, 645}; 646 647static struct transfer_info tas_transfers[] = { 648 { 649 /* input */ 650 .formats = SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S24_BE, 651 .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, 652 .transfer_in = 1, 653 }, 654 { 655 /* output */ 656 .formats = SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S24_BE, 657 .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, 658 .transfer_in = 0, 659 }, 660 {} 661}; 662 663static int tas_usable(struct codec_info_item *cii, 664 struct transfer_info *ti, 665 struct transfer_info *out) 666{ 667 return 1; 668} 669 670static int tas_reset_init(struct tas *tas) 671{ 672 u8 tmp; 673 674 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio); 675 msleep(5); 676 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0); 677 msleep(5); 678 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 1); 679 msleep(20); 680 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0); 681 msleep(10); 682 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio); 683 684 tmp = TAS_MCS_SCLK64 | TAS_MCS_SPORT_MODE_I2S | TAS_MCS_SPORT_WL_24BIT; 685 if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp)) 686 goto outerr; 687 688 tas->acr |= TAS_ACR_ANALOG_PDOWN; 689 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) 690 goto outerr; 691 692 tmp = 0; 693 if (tas_write_reg(tas, TAS_REG_MCS2, 1, &tmp)) 694 goto outerr; 695 696 tas3004_set_drc(tas); 697 698 /* Set treble & bass to 0dB */ 699 tas->treble = TAS3004_TREBLE_ZERO; 700 tas->bass = TAS3004_BASS_ZERO; 701 tas_set_treble(tas); 702 tas_set_bass(tas); 703 704 tas->acr &= ~TAS_ACR_ANALOG_PDOWN; 705 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr)) 706 goto outerr; 707 708 return 0; 709 outerr: 710 return -ENODEV; 711} 712 713static int tas_switch_clock(struct codec_info_item *cii, enum clock_switch clock) 714{ 715 struct tas *tas = cii->codec_data; 716 717 switch(clock) { 718 case CLOCK_SWITCH_PREPARE_SLAVE: 719 /* Clocks are going away, mute mute mute */ 720 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio); 721 tas->hw_enabled = 0; 722 break; 723 case CLOCK_SWITCH_SLAVE: 724 /* Clocks are back, re-init the codec */ 725 mutex_lock(&tas->mtx); 726 tas_reset_init(tas); 727 tas_set_volume(tas); 728 tas_set_mixer(tas); 729 tas->hw_enabled = 1; 730 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio); 731 mutex_unlock(&tas->mtx); 732 break; 733 default: 734 /* doesn't happen as of now */ 735 return -EINVAL; 736 } 737 return 0; 738} 739 740#ifdef CONFIG_PM 741/* we are controlled via i2c and assume that is always up 742 * If that wasn't the case, we'd have to suspend once 743 * our i2c device is suspended, and then take note of that! */ 744static int tas_suspend(struct tas *tas) 745{ 746 mutex_lock(&tas->mtx); 747 tas->hw_enabled = 0; 748 tas->acr |= TAS_ACR_ANALOG_PDOWN; 749 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr); 750 mutex_unlock(&tas->mtx); 751 return 0; 752} 753 754static int tas_resume(struct tas *tas) 755{ 756 /* reset codec */ 757 mutex_lock(&tas->mtx); 758 tas_reset_init(tas); 759 tas_set_volume(tas); 760 tas_set_mixer(tas); 761 tas->hw_enabled = 1; 762 mutex_unlock(&tas->mtx); 763 return 0; 764} 765 766static int _tas_suspend(struct codec_info_item *cii, pm_message_t state) 767{ 768 return tas_suspend(cii->codec_data); 769} 770 771static int _tas_resume(struct codec_info_item *cii) 772{ 773 return tas_resume(cii->codec_data); 774} 775#else /* CONFIG_PM */ 776#define _tas_suspend NULL 777#define _tas_resume NULL 778#endif /* CONFIG_PM */ 779 780static struct codec_info tas_codec_info = { 781 .transfers = tas_transfers, 782 /* in theory, we can drive it at 512 too... 783 * but so far the framework doesn't allow 784 * for that and I don't see much point in it. */ 785 .sysclock_factor = 256, 786 /* same here, could be 32 for just one 16 bit format */ 787 .bus_factor = 64, 788 .owner = THIS_MODULE, 789 .usable = tas_usable, 790 .switch_clock = tas_switch_clock, 791 .suspend = _tas_suspend, 792 .resume = _tas_resume, 793}; 794 795static int tas_init_codec(struct aoa_codec *codec) 796{ 797 struct tas *tas = codec_to_tas(codec); 798 int err; 799 800 if (!tas->codec.gpio || !tas->codec.gpio->methods) { 801 printk(KERN_ERR PFX "gpios not assigned!!\n"); 802 return -EINVAL; 803 } 804 805 mutex_lock(&tas->mtx); 806 if (tas_reset_init(tas)) { 807 printk(KERN_ERR PFX "tas failed to initialise\n"); 808 mutex_unlock(&tas->mtx); 809 return -ENXIO; 810 } 811 tas->hw_enabled = 1; 812 mutex_unlock(&tas->mtx); 813 814 if (tas->codec.soundbus_dev->attach_codec(tas->codec.soundbus_dev, 815 aoa_get_card(), 816 &tas_codec_info, tas)) { 817 printk(KERN_ERR PFX "error attaching tas to soundbus\n"); 818 return -ENODEV; 819 } 820 821 if (aoa_snd_device_new(SNDRV_DEV_CODEC, tas, &ops)) { 822 printk(KERN_ERR PFX "failed to create tas snd device!\n"); 823 return -ENODEV; 824 } 825 err = aoa_snd_ctl_add(snd_ctl_new1(&volume_control, tas)); 826 if (err) 827 goto error; 828 829 err = aoa_snd_ctl_add(snd_ctl_new1(&mute_control, tas)); 830 if (err) 831 goto error; 832 833 err = aoa_snd_ctl_add(snd_ctl_new1(&pcm1_control, tas)); 834 if (err) 835 goto error; 836 837 err = aoa_snd_ctl_add(snd_ctl_new1(&monitor_control, tas)); 838 if (err) 839 goto error; 840 841 err = aoa_snd_ctl_add(snd_ctl_new1(&capture_source_control, tas)); 842 if (err) 843 goto error; 844 845 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_range_control, tas)); 846 if (err) 847 goto error; 848 849 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_switch_control, tas)); 850 if (err) 851 goto error; 852 853 err = aoa_snd_ctl_add(snd_ctl_new1(&treble_control, tas)); 854 if (err) 855 goto error; 856 857 err = aoa_snd_ctl_add(snd_ctl_new1(&bass_control, tas)); 858 if (err) 859 goto error; 860 861 return 0; 862 error: 863 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas); 864 snd_device_free(aoa_get_card(), tas); 865 return err; 866} 867 868static void tas_exit_codec(struct aoa_codec *codec) 869{ 870 struct tas *tas = codec_to_tas(codec); 871 872 if (!tas->codec.soundbus_dev) 873 return; 874 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas); 875} 876 877 878static int tas_i2c_probe(struct i2c_client *client, 879 const struct i2c_device_id *id) 880{ 881 struct device_node *node = client->dev.of_node; 882 struct tas *tas; 883 884 tas = kzalloc(sizeof(struct tas), GFP_KERNEL); 885 886 if (!tas) 887 return -ENOMEM; 888 889 mutex_init(&tas->mtx); 890 tas->i2c = client; 891 i2c_set_clientdata(client, tas); 892 893 /* seems that half is a saner default */ 894 tas->drc_range = TAS3004_DRC_MAX / 2; 895 896 strscpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN); 897 tas->codec.owner = THIS_MODULE; 898 tas->codec.init = tas_init_codec; 899 tas->codec.exit = tas_exit_codec; 900 tas->codec.node = of_node_get(node); 901 902 if (aoa_codec_register(&tas->codec)) { 903 goto fail; 904 } 905 printk(KERN_DEBUG 906 "snd-aoa-codec-tas: tas found, addr 0x%02x on %pOF\n", 907 (unsigned int)client->addr, node); 908 return 0; 909 fail: 910 mutex_destroy(&tas->mtx); 911 kfree(tas); 912 return -EINVAL; 913} 914 915static int tas_i2c_remove(struct i2c_client *client) 916{ 917 struct tas *tas = i2c_get_clientdata(client); 918 u8 tmp = TAS_ACR_ANALOG_PDOWN; 919 920 aoa_codec_unregister(&tas->codec); 921 of_node_put(tas->codec.node); 922 923 /* power down codec chip */ 924 tas_write_reg(tas, TAS_REG_ACR, 1, &tmp); 925 926 mutex_destroy(&tas->mtx); 927 kfree(tas); 928 return 0; 929} 930 931static const struct i2c_device_id tas_i2c_id[] = { 932 { "MAC,tas3004", 0 }, 933 { } 934}; 935MODULE_DEVICE_TABLE(i2c,tas_i2c_id); 936 937static struct i2c_driver tas_driver = { 938 .driver = { 939 .name = "aoa_codec_tas", 940 }, 941 .probe = tas_i2c_probe, 942 .remove = tas_i2c_remove, 943 .id_table = tas_i2c_id, 944}; 945 946module_i2c_driver(tas_driver);