linux/sound/soc/codecs/adau1781.c
<<
>>
Prefs
   1/*
   2 * Driver for ADAU1381/ADAU1781 codec
   3 *
   4 * Copyright 2011-2013 Analog Devices Inc.
   5 * Author: Lars-Peter Clausen <lars@metafoo.de>
   6 *
   7 * Licensed under the GPL-2 or later.
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/init.h>
  12#include <linux/i2c.h>
  13#include <linux/spi/spi.h>
  14#include <linux/slab.h>
  15#include <sound/core.h>
  16#include <sound/pcm.h>
  17#include <sound/pcm_params.h>
  18#include <sound/soc.h>
  19#include <sound/tlv.h>
  20#include <linux/platform_data/adau17x1.h>
  21
  22#include "adau17x1.h"
  23#include "adau1781.h"
  24
  25#define ADAU1781_DMIC_BEEP_CTRL         0x4008
  26#define ADAU1781_LEFT_PGA               0x400e
  27#define ADAU1781_RIGHT_PGA              0x400f
  28#define ADAU1781_LEFT_PLAYBACK_MIXER    0x401c
  29#define ADAU1781_RIGHT_PLAYBACK_MIXER   0x401e
  30#define ADAU1781_MONO_PLAYBACK_MIXER    0x401f
  31#define ADAU1781_LEFT_LINEOUT           0x4025
  32#define ADAU1781_RIGHT_LINEOUT          0x4026
  33#define ADAU1781_SPEAKER                0x4027
  34#define ADAU1781_BEEP_ZC                0x4028
  35#define ADAU1781_DEJITTER               0x4032
  36#define ADAU1781_DIG_PWDN0              0x4080
  37#define ADAU1781_DIG_PWDN1              0x4081
  38
  39#define ADAU1781_INPUT_DIFFERNTIAL BIT(3)
  40
  41#define ADAU1381_FIRMWARE "adau1381.bin"
  42#define ADAU1781_FIRMWARE "adau1781.bin"
  43
  44static const struct reg_default adau1781_reg_defaults[] = {
  45        { ADAU1781_DMIC_BEEP_CTRL,              0x00 },
  46        { ADAU1781_LEFT_PGA,                    0xc7 },
  47        { ADAU1781_RIGHT_PGA,                   0xc7 },
  48        { ADAU1781_LEFT_PLAYBACK_MIXER,         0x00 },
  49        { ADAU1781_RIGHT_PLAYBACK_MIXER,        0x00 },
  50        { ADAU1781_MONO_PLAYBACK_MIXER,         0x00 },
  51        { ADAU1781_LEFT_LINEOUT,                0x00 },
  52        { ADAU1781_RIGHT_LINEOUT,               0x00 },
  53        { ADAU1781_SPEAKER,                     0x00 },
  54        { ADAU1781_BEEP_ZC,                     0x19 },
  55        { ADAU1781_DEJITTER,                    0x60 },
  56        { ADAU1781_DIG_PWDN1,                   0x0c },
  57        { ADAU1781_DIG_PWDN1,                   0x00 },
  58        { ADAU17X1_CLOCK_CONTROL,               0x00 },
  59        { ADAU17X1_PLL_CONTROL,                 0x00 },
  60        { ADAU17X1_REC_POWER_MGMT,              0x00 },
  61        { ADAU17X1_MICBIAS,                     0x04 },
  62        { ADAU17X1_SERIAL_PORT0,                0x00 },
  63        { ADAU17X1_SERIAL_PORT1,                0x00 },
  64        { ADAU17X1_CONVERTER0,                  0x00 },
  65        { ADAU17X1_CONVERTER1,                  0x00 },
  66        { ADAU17X1_LEFT_INPUT_DIGITAL_VOL,      0x00 },
  67        { ADAU17X1_RIGHT_INPUT_DIGITAL_VOL,     0x00 },
  68        { ADAU17X1_ADC_CONTROL,                 0x00 },
  69        { ADAU17X1_PLAY_POWER_MGMT,             0x00 },
  70        { ADAU17X1_DAC_CONTROL0,                0x00 },
  71        { ADAU17X1_DAC_CONTROL1,                0x00 },
  72        { ADAU17X1_DAC_CONTROL2,                0x00 },
  73        { ADAU17X1_SERIAL_PORT_PAD,             0x00 },
  74        { ADAU17X1_CONTROL_PORT_PAD0,           0x00 },
  75        { ADAU17X1_CONTROL_PORT_PAD1,           0x00 },
  76        { ADAU17X1_DSP_SAMPLING_RATE,           0x01 },
  77        { ADAU17X1_SERIAL_INPUT_ROUTE,          0x00 },
  78        { ADAU17X1_SERIAL_OUTPUT_ROUTE,         0x00 },
  79        { ADAU17X1_DSP_ENABLE,                  0x00 },
  80        { ADAU17X1_DSP_RUN,                     0x00 },
  81        { ADAU17X1_SERIAL_SAMPLING_RATE,        0x00 },
  82};
  83
  84static const DECLARE_TLV_DB_SCALE(adau1781_speaker_tlv, 0, 200, 0);
  85
  86static const DECLARE_TLV_DB_RANGE(adau1781_pga_tlv,
  87        0, 1, TLV_DB_SCALE_ITEM(0, 600, 0),
  88        2, 3, TLV_DB_SCALE_ITEM(1000, 400, 0),
  89        4, 4, TLV_DB_SCALE_ITEM(1700, 0, 0),
  90        5, 7, TLV_DB_SCALE_ITEM(2000, 600, 0)
  91);
  92
  93static const DECLARE_TLV_DB_RANGE(adau1781_beep_tlv,
  94        0, 1, TLV_DB_SCALE_ITEM(0, 600, 0),
  95        2, 3, TLV_DB_SCALE_ITEM(1000, 400, 0),
  96        4, 4, TLV_DB_SCALE_ITEM(-2300, 0, 0),
  97        5, 7, TLV_DB_SCALE_ITEM(2000, 600, 0)
  98);
  99
 100static const DECLARE_TLV_DB_SCALE(adau1781_sidetone_tlv, -1800, 300, 1);
 101
 102static const char * const adau1781_speaker_bias_select_text[] = {
 103        "Normal operation", "Power saving", "Enhanced performance",
 104};
 105
 106static const char * const adau1781_bias_select_text[] = {
 107        "Normal operation", "Extreme power saving", "Power saving",
 108        "Enhanced performance",
 109};
 110
 111static SOC_ENUM_SINGLE_DECL(adau1781_adc_bias_enum,
 112                ADAU17X1_REC_POWER_MGMT, 3, adau1781_bias_select_text);
 113static SOC_ENUM_SINGLE_DECL(adau1781_speaker_bias_enum,
 114                ADAU17X1_PLAY_POWER_MGMT, 6, adau1781_speaker_bias_select_text);
 115static SOC_ENUM_SINGLE_DECL(adau1781_dac_bias_enum,
 116                ADAU17X1_PLAY_POWER_MGMT, 4, adau1781_bias_select_text);
 117static SOC_ENUM_SINGLE_DECL(adau1781_playback_bias_enum,
 118                ADAU17X1_PLAY_POWER_MGMT, 2, adau1781_bias_select_text);
 119static SOC_ENUM_SINGLE_DECL(adau1781_capture_bias_enum,
 120                ADAU17X1_REC_POWER_MGMT, 1, adau1781_bias_select_text);
 121
 122static const struct snd_kcontrol_new adau1781_controls[] = {
 123        SOC_SINGLE_TLV("Beep Capture Volume", ADAU1781_DMIC_BEEP_CTRL, 0, 7, 0,
 124                adau1781_beep_tlv),
 125        SOC_DOUBLE_R_TLV("PGA Capture Volume", ADAU1781_LEFT_PGA,
 126                ADAU1781_RIGHT_PGA, 5, 7, 0, adau1781_pga_tlv),
 127        SOC_DOUBLE_R("PGA Capture Switch", ADAU1781_LEFT_PGA,
 128                ADAU1781_RIGHT_PGA, 1, 1, 0),
 129
 130        SOC_DOUBLE_R("Lineout Playback Switch", ADAU1781_LEFT_LINEOUT,
 131                ADAU1781_RIGHT_LINEOUT, 1, 1, 0),
 132        SOC_SINGLE("Beep ZC Switch", ADAU1781_BEEP_ZC, 0, 1, 0),
 133
 134        SOC_SINGLE("Mono Playback Switch", ADAU1781_MONO_PLAYBACK_MIXER,
 135                0, 1, 0),
 136        SOC_SINGLE_TLV("Mono Playback Volume", ADAU1781_SPEAKER, 6, 3, 0,
 137                adau1781_speaker_tlv),
 138
 139        SOC_ENUM("ADC Bias", adau1781_adc_bias_enum),
 140        SOC_ENUM("DAC Bias", adau1781_dac_bias_enum),
 141        SOC_ENUM("Capture Bias", adau1781_capture_bias_enum),
 142        SOC_ENUM("Playback Bias", adau1781_playback_bias_enum),
 143        SOC_ENUM("Speaker Bias", adau1781_speaker_bias_enum),
 144};
 145
 146static const struct snd_kcontrol_new adau1781_beep_mixer_controls[] = {
 147        SOC_DAPM_SINGLE("Beep Capture Switch", ADAU1781_DMIC_BEEP_CTRL,
 148                3, 1, 0),
 149};
 150
 151static const struct snd_kcontrol_new adau1781_left_mixer_controls[] = {
 152        SOC_DAPM_SINGLE_AUTODISABLE("Switch",
 153                ADAU1781_LEFT_PLAYBACK_MIXER, 5, 1, 0),
 154        SOC_DAPM_SINGLE_TLV("Beep Playback Volume",
 155                ADAU1781_LEFT_PLAYBACK_MIXER, 1, 8, 0, adau1781_sidetone_tlv),
 156};
 157
 158static const struct snd_kcontrol_new adau1781_right_mixer_controls[] = {
 159        SOC_DAPM_SINGLE_AUTODISABLE("Switch",
 160                ADAU1781_RIGHT_PLAYBACK_MIXER, 6, 1, 0),
 161        SOC_DAPM_SINGLE_TLV("Beep Playback Volume",
 162                ADAU1781_LEFT_PLAYBACK_MIXER, 1, 8, 0, adau1781_sidetone_tlv),
 163};
 164
 165static const struct snd_kcontrol_new adau1781_mono_mixer_controls[] = {
 166        SOC_DAPM_SINGLE_AUTODISABLE("Left Switch",
 167                ADAU1781_MONO_PLAYBACK_MIXER, 7, 1, 0),
 168        SOC_DAPM_SINGLE_AUTODISABLE("Right Switch",
 169                 ADAU1781_MONO_PLAYBACK_MIXER, 6, 1, 0),
 170        SOC_DAPM_SINGLE_TLV("Beep Playback Volume",
 171                ADAU1781_MONO_PLAYBACK_MIXER, 2, 8, 0, adau1781_sidetone_tlv),
 172};
 173
 174static int adau1781_dejitter_fixup(struct snd_soc_dapm_widget *w,
 175        struct snd_kcontrol *kcontrol, int event)
 176{
 177        struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 178        struct adau *adau = snd_soc_codec_get_drvdata(codec);
 179
 180        /* After any power changes have been made the dejitter circuit
 181         * has to be reinitialized. */
 182        regmap_write(adau->regmap, ADAU1781_DEJITTER, 0);
 183        if (!adau->master)
 184                regmap_write(adau->regmap, ADAU1781_DEJITTER, 5);
 185
 186        return 0;
 187}
 188
 189static const struct snd_soc_dapm_widget adau1781_dapm_widgets[] = {
 190        SND_SOC_DAPM_PGA("Left PGA", ADAU1781_LEFT_PGA, 0, 0, NULL, 0),
 191        SND_SOC_DAPM_PGA("Right PGA", ADAU1781_RIGHT_PGA, 0, 0, NULL, 0),
 192
 193        SND_SOC_DAPM_OUT_DRV("Speaker", ADAU1781_SPEAKER, 0, 0, NULL, 0),
 194
 195        SOC_MIXER_NAMED_CTL_ARRAY("Beep Mixer", ADAU17X1_MICBIAS, 4, 0,
 196                adau1781_beep_mixer_controls),
 197
 198        SOC_MIXER_ARRAY("Left Lineout Mixer", SND_SOC_NOPM, 0, 0,
 199                adau1781_left_mixer_controls),
 200        SOC_MIXER_ARRAY("Right Lineout Mixer", SND_SOC_NOPM, 0, 0,
 201                adau1781_right_mixer_controls),
 202        SOC_MIXER_ARRAY("Mono Mixer", SND_SOC_NOPM, 0, 0,
 203                adau1781_mono_mixer_controls),
 204
 205        SND_SOC_DAPM_SUPPLY("Serial Input Routing", ADAU1781_DIG_PWDN0,
 206                2, 0, NULL, 0),
 207        SND_SOC_DAPM_SUPPLY("Serial Output Routing", ADAU1781_DIG_PWDN0,
 208                3, 0, NULL, 0),
 209        SND_SOC_DAPM_SUPPLY("Clock Domain Transfer", ADAU1781_DIG_PWDN0,
 210                5, 0, NULL, 0),
 211        SND_SOC_DAPM_SUPPLY("Serial Ports", ADAU1781_DIG_PWDN0, 4, 0, NULL, 0),
 212        SND_SOC_DAPM_SUPPLY("ADC Engine", ADAU1781_DIG_PWDN0, 7, 0, NULL, 0),
 213        SND_SOC_DAPM_SUPPLY("DAC Engine", ADAU1781_DIG_PWDN1, 0, 0, NULL, 0),
 214        SND_SOC_DAPM_SUPPLY("Digital Mic", ADAU1781_DIG_PWDN1, 1, 0, NULL, 0),
 215
 216        SND_SOC_DAPM_SUPPLY("Sound Engine", ADAU1781_DIG_PWDN0, 0, 0, NULL, 0),
 217        SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, ADAU1781_DIG_PWDN0, 1, 0, NULL, 0),
 218
 219        SND_SOC_DAPM_SUPPLY("Zero Crossing Detector", ADAU1781_DIG_PWDN1, 2, 0,
 220                NULL, 0),
 221
 222        SND_SOC_DAPM_POST("Dejitter fixup", adau1781_dejitter_fixup),
 223
 224        SND_SOC_DAPM_INPUT("BEEP"),
 225
 226        SND_SOC_DAPM_OUTPUT("AOUTL"),
 227        SND_SOC_DAPM_OUTPUT("AOUTR"),
 228        SND_SOC_DAPM_OUTPUT("SP"),
 229        SND_SOC_DAPM_INPUT("LMIC"),
 230        SND_SOC_DAPM_INPUT("RMIC"),
 231};
 232
 233static const struct snd_soc_dapm_route adau1781_dapm_routes[] = {
 234        { "Left Lineout Mixer", NULL, "Left Playback Enable" },
 235        { "Right Lineout Mixer", NULL, "Right Playback Enable" },
 236
 237        { "Left Lineout Mixer", "Beep Playback Volume", "Beep Mixer" },
 238        { "Left Lineout Mixer", "Switch", "Left DAC" },
 239
 240        { "Right Lineout Mixer", "Beep Playback Volume", "Beep Mixer" },
 241        { "Right Lineout Mixer", "Switch", "Right DAC" },
 242
 243        { "Mono Mixer", "Beep Playback Volume", "Beep Mixer" },
 244        { "Mono Mixer", "Right Switch", "Right DAC" },
 245        { "Mono Mixer", "Left Switch", "Left DAC" },
 246        { "Speaker", NULL, "Mono Mixer" },
 247
 248        { "Mono Mixer", NULL, "SYSCLK" },
 249        { "Left Lineout Mixer", NULL, "SYSCLK" },
 250        { "Left Lineout Mixer", NULL, "SYSCLK" },
 251
 252        { "Beep Mixer", "Beep Capture Switch", "BEEP" },
 253        { "Beep Mixer", NULL, "Zero Crossing Detector" },
 254
 255        { "Left DAC", NULL, "DAC Engine" },
 256        { "Right DAC", NULL, "DAC Engine" },
 257
 258        { "Sound Engine", NULL, "SYSCLK" },
 259        { "DSP", NULL, "Sound Engine" },
 260
 261        { "Left Decimator", NULL, "ADC Engine" },
 262        { "Right Decimator", NULL, "ADC Engine" },
 263
 264        { "AIFCLK", NULL, "SYSCLK" },
 265
 266        { "Playback", NULL, "Serial Input Routing" },
 267        { "Playback", NULL, "Serial Ports" },
 268        { "Playback", NULL, "Clock Domain Transfer" },
 269        { "Capture", NULL, "Serial Output Routing" },
 270        { "Capture", NULL, "Serial Ports" },
 271        { "Capture", NULL, "Clock Domain Transfer" },
 272
 273        { "AOUTL", NULL, "Left Lineout Mixer" },
 274        { "AOUTR", NULL, "Right Lineout Mixer" },
 275        { "SP", NULL, "Speaker" },
 276};
 277
 278static const struct snd_soc_dapm_route adau1781_adc_dapm_routes[] = {
 279        { "Left PGA", NULL, "LMIC" },
 280        { "Right PGA", NULL, "RMIC" },
 281
 282        { "Left Decimator", NULL, "Left PGA" },
 283        { "Right Decimator", NULL, "Right PGA" },
 284};
 285
 286static const char * const adau1781_dmic_select_text[] = {
 287        "DMIC1", "DMIC2",
 288};
 289
 290static SOC_ENUM_SINGLE_VIRT_DECL(adau1781_dmic_select_enum,
 291        adau1781_dmic_select_text);
 292
 293static const struct snd_kcontrol_new adau1781_dmic_mux =
 294        SOC_DAPM_ENUM("DMIC Select", adau1781_dmic_select_enum);
 295
 296static const struct snd_soc_dapm_widget adau1781_dmic_dapm_widgets[] = {
 297        SND_SOC_DAPM_MUX("DMIC Select", SND_SOC_NOPM, 0, 0, &adau1781_dmic_mux),
 298
 299        SND_SOC_DAPM_ADC("DMIC1", NULL, ADAU1781_DMIC_BEEP_CTRL, 4, 0),
 300        SND_SOC_DAPM_ADC("DMIC2", NULL, ADAU1781_DMIC_BEEP_CTRL, 5, 0),
 301};
 302
 303static const struct snd_soc_dapm_route adau1781_dmic_dapm_routes[] = {
 304        { "DMIC1", NULL, "LMIC" },
 305        { "DMIC2", NULL, "RMIC" },
 306
 307        { "DMIC1", NULL, "Digital Mic" },
 308        { "DMIC2", NULL, "Digital Mic" },
 309
 310        { "DMIC Select", "DMIC1", "DMIC1" },
 311        { "DMIC Select", "DMIC2", "DMIC2" },
 312
 313        { "Left Decimator", NULL, "DMIC Select" },
 314        { "Right Decimator", NULL, "DMIC Select" },
 315};
 316
 317static int adau1781_set_bias_level(struct snd_soc_codec *codec,
 318                enum snd_soc_bias_level level)
 319{
 320        struct adau *adau = snd_soc_codec_get_drvdata(codec);
 321
 322        switch (level) {
 323        case SND_SOC_BIAS_ON:
 324                break;
 325        case SND_SOC_BIAS_PREPARE:
 326                break;
 327        case SND_SOC_BIAS_STANDBY:
 328                regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
 329                        ADAU17X1_CLOCK_CONTROL_SYSCLK_EN,
 330                        ADAU17X1_CLOCK_CONTROL_SYSCLK_EN);
 331
 332                /* Precharge */
 333                regmap_update_bits(adau->regmap, ADAU1781_DIG_PWDN1, 0x8, 0x8);
 334                break;
 335        case SND_SOC_BIAS_OFF:
 336                regmap_update_bits(adau->regmap, ADAU1781_DIG_PWDN1, 0xc, 0x0);
 337                regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
 338                        ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, 0);
 339                break;
 340        }
 341
 342        return 0;
 343}
 344
 345static bool adau1781_readable_register(struct device *dev, unsigned int reg)
 346{
 347        switch (reg) {
 348        case ADAU1781_DMIC_BEEP_CTRL:
 349        case ADAU1781_LEFT_PGA:
 350        case ADAU1781_RIGHT_PGA:
 351        case ADAU1781_LEFT_PLAYBACK_MIXER:
 352        case ADAU1781_RIGHT_PLAYBACK_MIXER:
 353        case ADAU1781_MONO_PLAYBACK_MIXER:
 354        case ADAU1781_LEFT_LINEOUT:
 355        case ADAU1781_RIGHT_LINEOUT:
 356        case ADAU1781_SPEAKER:
 357        case ADAU1781_BEEP_ZC:
 358        case ADAU1781_DEJITTER:
 359        case ADAU1781_DIG_PWDN0:
 360        case ADAU1781_DIG_PWDN1:
 361                return true;
 362        default:
 363                break;
 364        }
 365
 366        return adau17x1_readable_register(dev, reg);
 367}
 368
 369static int adau1781_set_input_mode(struct adau *adau, unsigned int reg,
 370        bool differential)
 371{
 372        unsigned int val;
 373
 374        if (differential)
 375                val = ADAU1781_INPUT_DIFFERNTIAL;
 376        else
 377                val = 0;
 378
 379        return regmap_update_bits(adau->regmap, reg,
 380                ADAU1781_INPUT_DIFFERNTIAL, val);
 381}
 382
 383static int adau1781_codec_probe(struct snd_soc_codec *codec)
 384{
 385        struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
 386        struct adau1781_platform_data *pdata = dev_get_platdata(codec->dev);
 387        struct adau *adau = snd_soc_codec_get_drvdata(codec);
 388        int ret;
 389
 390        ret = adau17x1_add_widgets(codec);
 391        if (ret)
 392                return ret;
 393
 394        if (pdata) {
 395                ret = adau1781_set_input_mode(adau, ADAU1781_LEFT_PGA,
 396                        pdata->left_input_differential);
 397                if (ret)
 398                        return ret;
 399                ret = adau1781_set_input_mode(adau, ADAU1781_RIGHT_PGA,
 400                        pdata->right_input_differential);
 401                if (ret)
 402                        return ret;
 403        }
 404
 405        if (pdata && pdata->use_dmic) {
 406                ret = snd_soc_dapm_new_controls(dapm,
 407                        adau1781_dmic_dapm_widgets,
 408                        ARRAY_SIZE(adau1781_dmic_dapm_widgets));
 409                if (ret)
 410                        return ret;
 411                ret = snd_soc_dapm_add_routes(dapm, adau1781_dmic_dapm_routes,
 412                        ARRAY_SIZE(adau1781_dmic_dapm_routes));
 413                if (ret)
 414                        return ret;
 415        } else {
 416                ret = snd_soc_dapm_add_routes(dapm, adau1781_adc_dapm_routes,
 417                        ARRAY_SIZE(adau1781_adc_dapm_routes));
 418                if (ret)
 419                        return ret;
 420        }
 421
 422        ret = adau17x1_add_routes(codec);
 423        if (ret < 0)
 424                return ret;
 425
 426        return 0;
 427}
 428
 429static const struct snd_soc_codec_driver adau1781_codec_driver = {
 430        .probe = adau1781_codec_probe,
 431        .resume = adau17x1_resume,
 432        .set_bias_level = adau1781_set_bias_level,
 433        .suspend_bias_off = true,
 434
 435        .component_driver = {
 436                .controls               = adau1781_controls,
 437                .num_controls           = ARRAY_SIZE(adau1781_controls),
 438                .dapm_widgets           = adau1781_dapm_widgets,
 439                .num_dapm_widgets       = ARRAY_SIZE(adau1781_dapm_widgets),
 440                .dapm_routes            = adau1781_dapm_routes,
 441                .num_dapm_routes        = ARRAY_SIZE(adau1781_dapm_routes),
 442        },
 443};
 444
 445#define ADAU1781_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
 446        SNDRV_PCM_FMTBIT_S32_LE)
 447
 448static struct snd_soc_dai_driver adau1781_dai_driver = {
 449        .name = "adau-hifi",
 450        .playback = {
 451                .stream_name = "Playback",
 452                .channels_min = 2,
 453                .channels_max = 8,
 454                .rates = SNDRV_PCM_RATE_8000_96000,
 455                .formats = ADAU1781_FORMATS,
 456        },
 457        .capture = {
 458                .stream_name = "Capture",
 459                .channels_min = 2,
 460                .channels_max = 8,
 461                .rates = SNDRV_PCM_RATE_8000_96000,
 462                .formats = ADAU1781_FORMATS,
 463        },
 464        .ops = &adau17x1_dai_ops,
 465};
 466
 467const struct regmap_config adau1781_regmap_config = {
 468        .val_bits               = 8,
 469        .reg_bits               = 16,
 470        .max_register           = 0x40f8,
 471        .reg_defaults           = adau1781_reg_defaults,
 472        .num_reg_defaults       = ARRAY_SIZE(adau1781_reg_defaults),
 473        .readable_reg           = adau1781_readable_register,
 474        .volatile_reg           = adau17x1_volatile_register,
 475        .precious_reg           = adau17x1_precious_register,
 476        .cache_type             = REGCACHE_RBTREE,
 477};
 478EXPORT_SYMBOL_GPL(adau1781_regmap_config);
 479
 480int adau1781_probe(struct device *dev, struct regmap *regmap,
 481        enum adau17x1_type type, void (*switch_mode)(struct device *dev))
 482{
 483        const char *firmware_name;
 484        int ret;
 485
 486        switch (type) {
 487        case ADAU1381:
 488                firmware_name = ADAU1381_FIRMWARE;
 489                break;
 490        case ADAU1781:
 491                firmware_name = ADAU1781_FIRMWARE;
 492                break;
 493        default:
 494                return -EINVAL;
 495        }
 496
 497        ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name);
 498        if (ret)
 499                return ret;
 500
 501        return snd_soc_register_codec(dev, &adau1781_codec_driver,
 502                &adau1781_dai_driver, 1);
 503}
 504EXPORT_SYMBOL_GPL(adau1781_probe);
 505
 506MODULE_DESCRIPTION("ASoC ADAU1381/ADAU1781 driver");
 507MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
 508MODULE_LICENSE("GPL");
 509