linux/sound/aoa/codecs/tas.c
<<
>>
Prefs
   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);
 947