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