linux/sound/soc/codecs/rt274.c
<<
>>
Prefs
   1/*
   2 * rt274.c  --  RT274 ALSA SoC audio codec driver
   3 *
   4 * Copyright 2017 Realtek Semiconductor Corp.
   5 * Author: Bard Liao <bardliao@realtek.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#include <linux/module.h>
  13#include <linux/moduleparam.h>
  14#include <linux/init.h>
  15#include <linux/delay.h>
  16#include <linux/pm.h>
  17#include <linux/i2c.h>
  18#include <linux/platform_device.h>
  19#include <linux/spi/spi.h>
  20#include <linux/dmi.h>
  21#include <linux/acpi.h>
  22#include <sound/core.h>
  23#include <sound/pcm.h>
  24#include <sound/pcm_params.h>
  25#include <sound/soc.h>
  26#include <sound/soc-dapm.h>
  27#include <sound/initval.h>
  28#include <sound/tlv.h>
  29#include <sound/jack.h>
  30#include <linux/workqueue.h>
  31
  32#include "rl6347a.h"
  33#include "rt274.h"
  34
  35#define RT274_VENDOR_ID 0x10ec0274
  36
  37struct rt274_priv {
  38        struct reg_default *index_cache;
  39        int index_cache_size;
  40        struct regmap *regmap;
  41        struct snd_soc_component *component;
  42        struct i2c_client *i2c;
  43        struct snd_soc_jack *jack;
  44        struct delayed_work jack_detect_work;
  45        int sys_clk;
  46        int clk_id;
  47        int fs;
  48        bool master;
  49};
  50
  51static const struct reg_default rt274_index_def[] = {
  52        { 0x00, 0x1004 },
  53        { 0x01, 0xaaaa },
  54        { 0x02, 0x88aa },
  55        { 0x03, 0x0002 },
  56        { 0x04, 0xaa09 },
  57        { 0x05, 0x0700 },
  58        { 0x06, 0x6110 },
  59        { 0x07, 0x0200 },
  60        { 0x08, 0xa807 },
  61        { 0x09, 0x0021 },
  62        { 0x0a, 0x7770 },
  63        { 0x0b, 0x7770 },
  64        { 0x0c, 0x002b },
  65        { 0x0d, 0x2420 },
  66        { 0x0e, 0x65c0 },
  67        { 0x0f, 0x7770 },
  68        { 0x10, 0x0420 },
  69        { 0x11, 0x7418 },
  70        { 0x12, 0x6bd0 },
  71        { 0x13, 0x645f },
  72        { 0x14, 0x0400 },
  73        { 0x15, 0x8ccc },
  74        { 0x16, 0x4c50 },
  75        { 0x17, 0xff00 },
  76        { 0x18, 0x0003 },
  77        { 0x19, 0x2c11 },
  78        { 0x1a, 0x830b },
  79        { 0x1b, 0x4e4b },
  80        { 0x1c, 0x0000 },
  81        { 0x1d, 0x0000 },
  82        { 0x1e, 0x0000 },
  83        { 0x1f, 0x0000 },
  84        { 0x20, 0x51ff },
  85        { 0x21, 0x8000 },
  86        { 0x22, 0x8f00 },
  87        { 0x23, 0x88f4 },
  88        { 0x24, 0x0000 },
  89        { 0x25, 0x0000 },
  90        { 0x26, 0x0000 },
  91        { 0x27, 0x0000 },
  92        { 0x28, 0x0000 },
  93        { 0x29, 0x3000 },
  94        { 0x2a, 0x0000 },
  95        { 0x2b, 0x0000 },
  96        { 0x2c, 0x0f00 },
  97        { 0x2d, 0x100f },
  98        { 0x2e, 0x2902 },
  99        { 0x2f, 0xe280 },
 100        { 0x30, 0x1000 },
 101        { 0x31, 0x8400 },
 102        { 0x32, 0x5aaa },
 103        { 0x33, 0x8420 },
 104        { 0x34, 0xa20c },
 105        { 0x35, 0x096a },
 106        { 0x36, 0x5757 },
 107        { 0x37, 0xfe05 },
 108        { 0x38, 0x4901 },
 109        { 0x39, 0x110a },
 110        { 0x3a, 0x0010 },
 111        { 0x3b, 0x60d9 },
 112        { 0x3c, 0xf214 },
 113        { 0x3d, 0xc2ba },
 114        { 0x3e, 0xa928 },
 115        { 0x3f, 0x0000 },
 116        { 0x40, 0x9800 },
 117        { 0x41, 0x0000 },
 118        { 0x42, 0x2000 },
 119        { 0x43, 0x3d90 },
 120        { 0x44, 0x4900 },
 121        { 0x45, 0x5289 },
 122        { 0x46, 0x0004 },
 123        { 0x47, 0xa47a },
 124        { 0x48, 0xd049 },
 125        { 0x49, 0x0049 },
 126        { 0x4a, 0xa83b },
 127        { 0x4b, 0x0777 },
 128        { 0x4c, 0x065c },
 129        { 0x4d, 0x7fff },
 130        { 0x4e, 0x7fff },
 131        { 0x4f, 0x0000 },
 132        { 0x50, 0x0000 },
 133        { 0x51, 0x0000 },
 134        { 0x52, 0xbf5f },
 135        { 0x53, 0x3320 },
 136        { 0x54, 0xcc00 },
 137        { 0x55, 0x0000 },
 138        { 0x56, 0x3f00 },
 139        { 0x57, 0x0000 },
 140        { 0x58, 0x0000 },
 141        { 0x59, 0x0000 },
 142        { 0x5a, 0x1300 },
 143        { 0x5b, 0x005f },
 144        { 0x5c, 0x0000 },
 145        { 0x5d, 0x1001 },
 146        { 0x5e, 0x1000 },
 147        { 0x5f, 0x0000 },
 148        { 0x60, 0x5554 },
 149        { 0x61, 0xffc0 },
 150        { 0x62, 0xa000 },
 151        { 0x63, 0xd010 },
 152        { 0x64, 0x0000 },
 153        { 0x65, 0x3fb1 },
 154        { 0x66, 0x1881 },
 155        { 0x67, 0xc810 },
 156        { 0x68, 0x2000 },
 157        { 0x69, 0xfff0 },
 158        { 0x6a, 0x0300 },
 159        { 0x6b, 0x5060 },
 160        { 0x6c, 0x0000 },
 161        { 0x6d, 0x0000 },
 162        { 0x6e, 0x0c25 },
 163        { 0x6f, 0x0c0b },
 164        { 0x70, 0x8000 },
 165        { 0x71, 0x4008 },
 166        { 0x72, 0x0000 },
 167        { 0x73, 0x0800 },
 168        { 0x74, 0xa28f },
 169        { 0x75, 0xa050 },
 170        { 0x76, 0x7fe8 },
 171        { 0x77, 0xdb8c },
 172        { 0x78, 0x0000 },
 173        { 0x79, 0x0000 },
 174        { 0x7a, 0x2a96 },
 175        { 0x7b, 0x800f },
 176        { 0x7c, 0x0200 },
 177        { 0x7d, 0x1600 },
 178        { 0x7e, 0x0000 },
 179        { 0x7f, 0x0000 },
 180};
 181#define INDEX_CACHE_SIZE ARRAY_SIZE(rt274_index_def)
 182
 183static const struct reg_default rt274_reg[] = {
 184        { 0x00170500, 0x00000400 },
 185        { 0x00220000, 0x00000031 },
 186        { 0x00239000, 0x00000057 },
 187        { 0x0023a000, 0x00000057 },
 188        { 0x00270500, 0x00000400 },
 189        { 0x00370500, 0x00000400 },
 190        { 0x00870500, 0x00000400 },
 191        { 0x00920000, 0x00000031 },
 192        { 0x00935000, 0x00000097 },
 193        { 0x00936000, 0x00000097 },
 194        { 0x00970500, 0x00000400 },
 195        { 0x00b37000, 0x00000400 },
 196        { 0x00b37200, 0x00000400 },
 197        { 0x00b37300, 0x00000400 },
 198        { 0x00c37000, 0x00000400 },
 199        { 0x00c37100, 0x00000400 },
 200        { 0x01270500, 0x00000400 },
 201        { 0x01370500, 0x00000400 },
 202        { 0x01371f00, 0x411111f0 },
 203        { 0x01937000, 0x00000000 },
 204        { 0x01970500, 0x00000400 },
 205        { 0x02050000, 0x0000001b },
 206        { 0x02139000, 0x00000080 },
 207        { 0x0213a000, 0x00000080 },
 208        { 0x02170100, 0x00000001 },
 209        { 0x02170500, 0x00000400 },
 210        { 0x02170700, 0x00000000 },
 211        { 0x02270100, 0x00000000 },
 212        { 0x02370100, 0x00000000 },
 213        { 0x01970700, 0x00000020 },
 214        { 0x00830000, 0x00000097 },
 215        { 0x00930000, 0x00000097 },
 216        { 0x01270700, 0x00000000 },
 217};
 218
 219static bool rt274_volatile_register(struct device *dev, unsigned int reg)
 220{
 221        switch (reg) {
 222        case 0 ... 0xff:
 223        case RT274_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID):
 224        case RT274_GET_HP_SENSE:
 225        case RT274_GET_MIC_SENSE:
 226        case RT274_PROC_COEF:
 227        case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE, RT274_MIC, 0):
 228        case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE, RT274_HP_OUT, 0):
 229        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_DAC_OUT0, 0):
 230        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_DAC_OUT1, 0):
 231        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_ADC_IN1, 0):
 232        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_ADC_IN2, 0):
 233        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DAC_OUT0, 0):
 234        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DAC_OUT1, 0):
 235        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_ADC_IN1, 0):
 236        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_ADC_IN2, 0):
 237        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DMIC1, 0):
 238        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DMIC2, 0):
 239        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_MIC, 0):
 240        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_LINE1, 0):
 241        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_LINE2, 0):
 242        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_HP_OUT, 0):
 243        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_HP_OUT, 0):
 244        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_MIXER_IN1, 0):
 245        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_MIXER_IN2, 0):
 246        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_DMIC1, 0):
 247        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_DMIC2, 0):
 248        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_MIC, 0):
 249        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_LINE1, 0):
 250        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_LINE2, 0):
 251        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_HP_OUT, 0):
 252        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_HP_OUT, 0):
 253        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_MIC, 0):
 254        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_INLINE_CMD, 0):
 255                return true;
 256        default:
 257                return false;
 258        }
 259
 260
 261}
 262
 263static bool rt274_readable_register(struct device *dev, unsigned int reg)
 264{
 265        switch (reg) {
 266        case 0 ... 0xff:
 267        case RT274_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID):
 268        case RT274_GET_HP_SENSE:
 269        case RT274_GET_MIC_SENSE:
 270        case RT274_SET_AUDIO_POWER:
 271        case RT274_SET_HPO_POWER:
 272        case RT274_SET_DMIC1_POWER:
 273        case RT274_LOUT_MUX:
 274        case RT274_HPO_MUX:
 275        case RT274_ADC0_MUX:
 276        case RT274_ADC1_MUX:
 277        case RT274_SET_MIC:
 278        case RT274_SET_PIN_HPO:
 279        case RT274_SET_PIN_LOUT3:
 280        case RT274_SET_PIN_DMIC1:
 281        case RT274_SET_AMP_GAIN_HPO:
 282        case RT274_SET_DMIC2_DEFAULT:
 283        case RT274_DAC0L_GAIN:
 284        case RT274_DAC0R_GAIN:
 285        case RT274_DAC1L_GAIN:
 286        case RT274_DAC1R_GAIN:
 287        case RT274_ADCL_GAIN:
 288        case RT274_ADCR_GAIN:
 289        case RT274_MIC_GAIN:
 290        case RT274_HPOL_GAIN:
 291        case RT274_HPOR_GAIN:
 292        case RT274_LOUTL_GAIN:
 293        case RT274_LOUTR_GAIN:
 294        case RT274_DAC_FORMAT:
 295        case RT274_ADC_FORMAT:
 296        case RT274_COEF_INDEX:
 297        case RT274_PROC_COEF:
 298        case RT274_SET_AMP_GAIN_ADC_IN1:
 299        case RT274_SET_AMP_GAIN_ADC_IN2:
 300        case RT274_SET_POWER(RT274_DAC_OUT0):
 301        case RT274_SET_POWER(RT274_DAC_OUT1):
 302        case RT274_SET_POWER(RT274_ADC_IN1):
 303        case RT274_SET_POWER(RT274_ADC_IN2):
 304        case RT274_SET_POWER(RT274_DMIC2):
 305        case RT274_SET_POWER(RT274_MIC):
 306        case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE, RT274_MIC, 0):
 307        case VERB_CMD(AC_VERB_GET_EAPD_BTLENABLE, RT274_HP_OUT, 0):
 308        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_DAC_OUT0, 0):
 309        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_DAC_OUT1, 0):
 310        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_ADC_IN1, 0):
 311        case VERB_CMD(AC_VERB_GET_STREAM_FORMAT, RT274_ADC_IN2, 0):
 312        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DAC_OUT0, 0):
 313        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DAC_OUT1, 0):
 314        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_ADC_IN1, 0):
 315        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_ADC_IN2, 0):
 316        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DMIC1, 0):
 317        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_DMIC2, 0):
 318        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_MIC, 0):
 319        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_LINE1, 0):
 320        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_LINE2, 0):
 321        case VERB_CMD(AC_VERB_GET_AMP_GAIN_MUTE, RT274_HP_OUT, 0):
 322        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_HP_OUT, 0):
 323        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_MIXER_IN1, 0):
 324        case VERB_CMD(AC_VERB_GET_CONNECT_SEL, RT274_MIXER_IN2, 0):
 325        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_DMIC1, 0):
 326        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_DMIC2, 0):
 327        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_MIC, 0):
 328        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_LINE1, 0):
 329        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_LINE2, 0):
 330        case VERB_CMD(AC_VERB_GET_PIN_WIDGET_CONTROL, RT274_HP_OUT, 0):
 331        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_HP_OUT, 0):
 332        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_MIC, 0):
 333        case VERB_CMD(AC_VERB_GET_UNSOLICITED_RESPONSE, RT274_INLINE_CMD, 0):
 334                return true;
 335        default:
 336                return false;
 337        }
 338}
 339
 340#ifdef CONFIG_PM
 341static void rt274_index_sync(struct snd_soc_component *component)
 342{
 343        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 344        int i;
 345
 346        for (i = 0; i < INDEX_CACHE_SIZE; i++) {
 347                snd_soc_component_write(component, rt274->index_cache[i].reg,
 348                                  rt274->index_cache[i].def);
 349        }
 350}
 351#endif
 352
 353static int rt274_jack_detect(struct rt274_priv *rt274, bool *hp, bool *mic)
 354{
 355        unsigned int buf;
 356
 357        *hp = false;
 358        *mic = false;
 359
 360        if (!rt274->component)
 361                return -EINVAL;
 362
 363        regmap_read(rt274->regmap, RT274_GET_HP_SENSE, &buf);
 364        *hp = buf & 0x80000000;
 365        regmap_read(rt274->regmap, RT274_GET_MIC_SENSE, &buf);
 366        *mic = buf & 0x80000000;
 367
 368        pr_debug("*hp = %d *mic = %d\n", *hp, *mic);
 369
 370        return 0;
 371}
 372
 373static void rt274_jack_detect_work(struct work_struct *work)
 374{
 375        struct rt274_priv *rt274 =
 376                container_of(work, struct rt274_priv, jack_detect_work.work);
 377        int status = 0;
 378        bool hp = false;
 379        bool mic = false;
 380
 381        if (rt274_jack_detect(rt274, &hp, &mic) < 0)
 382                return;
 383
 384        if (hp == true)
 385                status |= SND_JACK_HEADPHONE;
 386
 387        if (mic == true)
 388                status |= SND_JACK_MICROPHONE;
 389
 390        snd_soc_jack_report(rt274->jack, status,
 391                SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
 392}
 393
 394static irqreturn_t rt274_irq(int irq, void *data);
 395
 396static int rt274_mic_detect(struct snd_soc_component *component,
 397        struct snd_soc_jack *jack,  void *data)
 398{
 399        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 400
 401        if (jack == NULL) {
 402                /* Disable jack detection */
 403                regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
 404                                        RT274_IRQ_EN, RT274_IRQ_DIS);
 405
 406                return 0;
 407        }
 408        rt274->jack = jack;
 409
 410        regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
 411                                RT274_IRQ_EN, RT274_IRQ_EN);
 412
 413        /* Send an initial report */
 414        rt274_irq(0, rt274);
 415
 416        return 0;
 417}
 418
 419static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6350, 50, 0);
 420static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
 421
 422static const struct snd_kcontrol_new rt274_snd_controls[] = {
 423        SOC_DOUBLE_R_TLV("DAC0 Playback Volume", RT274_DAC0L_GAIN,
 424                         RT274_DAC0R_GAIN, 0, 0x7f, 0, out_vol_tlv),
 425        SOC_DOUBLE_R_TLV("DAC1 Playback Volume", RT274_DAC1L_GAIN,
 426                         RT274_DAC1R_GAIN, 0, 0x7f, 0, out_vol_tlv),
 427        SOC_DOUBLE_R_TLV("ADC0 Capture Volume", RT274_ADCL_GAIN,
 428                            RT274_ADCR_GAIN, 0, 0x7f, 0, out_vol_tlv),
 429        SOC_DOUBLE_R("ADC0 Capture Switch", RT274_ADCL_GAIN,
 430                            RT274_ADCR_GAIN, RT274_MUTE_SFT, 1, 1),
 431        SOC_SINGLE_TLV("AMIC Volume", RT274_MIC_GAIN,
 432                            0, 0x3, 0, mic_vol_tlv),
 433};
 434
 435static const struct snd_kcontrol_new hpol_enable_control =
 436        SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_HPOL_GAIN,
 437                        RT274_MUTE_SFT, 1, 1);
 438
 439static const struct snd_kcontrol_new hpor_enable_control =
 440        SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_HPOR_GAIN,
 441                        RT274_MUTE_SFT, 1, 1);
 442
 443static const struct snd_kcontrol_new loutl_enable_control =
 444        SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_LOUTL_GAIN,
 445                        RT274_MUTE_SFT, 1, 1);
 446
 447static const struct snd_kcontrol_new loutr_enable_control =
 448        SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT274_LOUTR_GAIN,
 449                        RT274_MUTE_SFT, 1, 1);
 450
 451/* ADC0 source */
 452static const char * const rt274_adc_src[] = {
 453        "Mic", "Line1", "Line2", "Dmic"
 454};
 455
 456static SOC_ENUM_SINGLE_DECL(
 457        rt274_adc0_enum, RT274_ADC0_MUX, RT274_ADC_SEL_SFT,
 458        rt274_adc_src);
 459
 460static const struct snd_kcontrol_new rt274_adc0_mux =
 461        SOC_DAPM_ENUM("ADC 0 source", rt274_adc0_enum);
 462
 463static SOC_ENUM_SINGLE_DECL(
 464        rt274_adc1_enum, RT274_ADC1_MUX, RT274_ADC_SEL_SFT,
 465        rt274_adc_src);
 466
 467static const struct snd_kcontrol_new rt274_adc1_mux =
 468        SOC_DAPM_ENUM("ADC 1 source", rt274_adc1_enum);
 469
 470static const char * const rt274_dac_src[] = {
 471        "DAC OUT0", "DAC OUT1"
 472};
 473/* HP-OUT source */
 474static SOC_ENUM_SINGLE_DECL(rt274_hpo_enum, RT274_HPO_MUX,
 475                                0, rt274_dac_src);
 476
 477static const struct snd_kcontrol_new rt274_hpo_mux =
 478SOC_DAPM_ENUM("HPO source", rt274_hpo_enum);
 479
 480/* Line out source */
 481static SOC_ENUM_SINGLE_DECL(rt274_lout_enum, RT274_LOUT_MUX,
 482                                0, rt274_dac_src);
 483
 484static const struct snd_kcontrol_new rt274_lout_mux =
 485SOC_DAPM_ENUM("LOUT source", rt274_lout_enum);
 486
 487static const struct snd_soc_dapm_widget rt274_dapm_widgets[] = {
 488        /* Input Lines */
 489        SND_SOC_DAPM_INPUT("DMIC1 Pin"),
 490        SND_SOC_DAPM_INPUT("DMIC2 Pin"),
 491        SND_SOC_DAPM_INPUT("MIC"),
 492        SND_SOC_DAPM_INPUT("LINE1"),
 493        SND_SOC_DAPM_INPUT("LINE2"),
 494
 495        /* DMIC */
 496        SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
 497        SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
 498
 499        /* ADCs */
 500        SND_SOC_DAPM_ADC("ADC 0", NULL, RT274_SET_STREAMID_ADC1, 4, 0),
 501        SND_SOC_DAPM_ADC("ADC 1", NULL, RT274_SET_STREAMID_ADC2, 4, 0),
 502
 503        /* ADC Mux */
 504        SND_SOC_DAPM_MUX("ADC 0 Mux", SND_SOC_NOPM, 0, 0,
 505                &rt274_adc0_mux),
 506        SND_SOC_DAPM_MUX("ADC 1 Mux", SND_SOC_NOPM, 0, 0,
 507                &rt274_adc1_mux),
 508
 509        /* Audio Interface */
 510        SND_SOC_DAPM_AIF_IN("AIF1RXL", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
 511        SND_SOC_DAPM_AIF_IN("AIF1RXR", "AIF1 Playback", 1, SND_SOC_NOPM, 0, 0),
 512        SND_SOC_DAPM_AIF_OUT("AIF1TXL", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
 513        SND_SOC_DAPM_AIF_OUT("AIF1TXR", "AIF1 Capture", 1, SND_SOC_NOPM, 0, 0),
 514        SND_SOC_DAPM_AIF_IN("AIF2RXL", "AIF1 Playback", 2, SND_SOC_NOPM, 0, 0),
 515        SND_SOC_DAPM_AIF_IN("AIF2RXR", "AIF1 Playback", 3, SND_SOC_NOPM, 0, 0),
 516        SND_SOC_DAPM_AIF_OUT("AIF2TXL", "AIF1 Capture", 2, SND_SOC_NOPM, 0, 0),
 517        SND_SOC_DAPM_AIF_OUT("AIF2TXR", "AIF1 Capture", 3, SND_SOC_NOPM, 0, 0),
 518
 519        /* Output Side */
 520        /* DACs */
 521        SND_SOC_DAPM_DAC("DAC 0", NULL, RT274_SET_STREAMID_DAC0, 4, 0),
 522        SND_SOC_DAPM_DAC("DAC 1", NULL, RT274_SET_STREAMID_DAC1, 4, 0),
 523
 524        /* Output Mux */
 525        SND_SOC_DAPM_MUX("HPO Mux", SND_SOC_NOPM, 0, 0, &rt274_hpo_mux),
 526        SND_SOC_DAPM_MUX("LOUT Mux", SND_SOC_NOPM, 0, 0, &rt274_lout_mux),
 527
 528        SND_SOC_DAPM_SUPPLY("HP Power", RT274_SET_PIN_HPO,
 529                RT274_SET_PIN_SFT, 0, NULL, 0),
 530        SND_SOC_DAPM_SUPPLY("LOUT Power", RT274_SET_PIN_LOUT3,
 531                RT274_SET_PIN_SFT, 0, NULL, 0),
 532
 533        /* Output Mixer */
 534        SND_SOC_DAPM_PGA("DAC OUT0", SND_SOC_NOPM, 0, 0,
 535                        NULL, 0),
 536        SND_SOC_DAPM_PGA("DAC OUT1", SND_SOC_NOPM, 0, 0,
 537                        NULL, 0),
 538
 539        /* Output Pga */
 540        SND_SOC_DAPM_SWITCH("LOUT L", SND_SOC_NOPM, 0, 0,
 541                &loutl_enable_control),
 542        SND_SOC_DAPM_SWITCH("LOUT R", SND_SOC_NOPM, 0, 0,
 543                &loutr_enable_control),
 544        SND_SOC_DAPM_SWITCH("HPO L", SND_SOC_NOPM, 0, 0,
 545                &hpol_enable_control),
 546        SND_SOC_DAPM_SWITCH("HPO R", SND_SOC_NOPM, 0, 0,
 547                &hpor_enable_control),
 548
 549        /* Output Lines */
 550        SND_SOC_DAPM_OUTPUT("HPO Pin"),
 551        SND_SOC_DAPM_OUTPUT("SPDIF"),
 552        SND_SOC_DAPM_OUTPUT("LINE3"),
 553};
 554
 555static const struct snd_soc_dapm_route rt274_dapm_routes[] = {
 556        {"DMIC1", NULL, "DMIC1 Pin"},
 557        {"DMIC2", NULL, "DMIC2 Pin"},
 558
 559        {"ADC 0 Mux", "Mic", "MIC"},
 560        {"ADC 0 Mux", "Dmic", "DMIC1"},
 561        {"ADC 0 Mux", "Line1", "LINE1"},
 562        {"ADC 0 Mux", "Line2", "LINE2"},
 563        {"ADC 1 Mux", "Mic", "MIC"},
 564        {"ADC 1 Mux", "Dmic", "DMIC2"},
 565        {"ADC 1 Mux", "Line1", "LINE1"},
 566        {"ADC 1 Mux", "Line2", "LINE2"},
 567
 568        {"ADC 0", NULL, "ADC 0 Mux"},
 569        {"ADC 1", NULL, "ADC 1 Mux"},
 570
 571        {"AIF1TXL", NULL, "ADC 0"},
 572        {"AIF1TXR", NULL, "ADC 0"},
 573        {"AIF2TXL", NULL, "ADC 1"},
 574        {"AIF2TXR", NULL, "ADC 1"},
 575
 576        {"DAC 0", NULL, "AIF1RXL"},
 577        {"DAC 0", NULL, "AIF1RXR"},
 578        {"DAC 1", NULL, "AIF2RXL"},
 579        {"DAC 1", NULL, "AIF2RXR"},
 580
 581        {"DAC OUT0", NULL, "DAC 0"},
 582
 583        {"DAC OUT1", NULL, "DAC 1"},
 584
 585        {"LOUT Mux", "DAC OUT0", "DAC OUT0"},
 586        {"LOUT Mux", "DAC OUT1", "DAC OUT1"},
 587
 588        {"LOUT L", "Switch", "LOUT Mux"},
 589        {"LOUT R", "Switch", "LOUT Mux"},
 590        {"LOUT L", NULL, "LOUT Power"},
 591        {"LOUT R", NULL, "LOUT Power"},
 592
 593        {"LINE3", NULL, "LOUT L"},
 594        {"LINE3", NULL, "LOUT R"},
 595
 596        {"HPO Mux", "DAC OUT0", "DAC OUT0"},
 597        {"HPO Mux", "DAC OUT1", "DAC OUT1"},
 598
 599        {"HPO L", "Switch", "HPO Mux"},
 600        {"HPO R", "Switch", "HPO Mux"},
 601        {"HPO L", NULL, "HP Power"},
 602        {"HPO R", NULL, "HP Power"},
 603
 604        {"HPO Pin", NULL, "HPO L"},
 605        {"HPO Pin", NULL, "HPO R"},
 606};
 607
 608static int rt274_hw_params(struct snd_pcm_substream *substream,
 609                            struct snd_pcm_hw_params *params,
 610                            struct snd_soc_dai *dai)
 611{
 612        struct snd_soc_component *component = dai->component;
 613        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 614        unsigned int val = 0;
 615        int d_len_code = 0, c_len_code = 0;
 616
 617        switch (params_rate(params)) {
 618        /* bit 14 0:48K 1:44.1K */
 619        case 44100:
 620        case 48000:
 621                break;
 622        default:
 623                dev_err(component->dev, "Unsupported sample rate %d\n",
 624                                        params_rate(params));
 625                return -EINVAL;
 626        }
 627        switch (rt274->sys_clk) {
 628        case 12288000:
 629        case 24576000:
 630                if (params_rate(params) != 48000) {
 631                        dev_err(component->dev, "Sys_clk is not matched (%d %d)\n",
 632                                        params_rate(params), rt274->sys_clk);
 633                        return -EINVAL;
 634                }
 635                break;
 636        case 11289600:
 637        case 22579200:
 638                if (params_rate(params) != 44100) {
 639                        dev_err(component->dev, "Sys_clk is not matched (%d %d)\n",
 640                                        params_rate(params), rt274->sys_clk);
 641                        return -EINVAL;
 642                }
 643                break;
 644        }
 645
 646        if (params_channels(params) <= 16) {
 647                /* bit 3:0 Number of Channel */
 648                val |= (params_channels(params) - 1);
 649        } else {
 650                dev_err(component->dev, "Unsupported channels %d\n",
 651                                        params_channels(params));
 652                return -EINVAL;
 653        }
 654
 655        switch (params_width(params)) {
 656        /* bit 6:4 Bits per Sample */
 657        case 16:
 658                d_len_code = 0;
 659                c_len_code = 0;
 660                val |= (0x1 << 4);
 661                break;
 662        case 32:
 663                d_len_code = 2;
 664                c_len_code = 3;
 665                val |= (0x4 << 4);
 666                break;
 667        case 20:
 668                d_len_code = 1;
 669                c_len_code = 1;
 670                val |= (0x2 << 4);
 671                break;
 672        case 24:
 673                d_len_code = 2;
 674                c_len_code = 2;
 675                val |= (0x3 << 4);
 676                break;
 677        case 8:
 678                d_len_code = 3;
 679                c_len_code = 0;
 680                break;
 681        default:
 682                return -EINVAL;
 683        }
 684
 685        if (rt274->master)
 686                c_len_code = 0x3;
 687
 688        snd_soc_component_update_bits(component,
 689                RT274_I2S_CTRL1, 0xc018, d_len_code << 3 | c_len_code << 14);
 690        dev_dbg(component->dev, "format val = 0x%x\n", val);
 691
 692        snd_soc_component_update_bits(component, RT274_DAC_FORMAT, 0x407f, val);
 693        snd_soc_component_update_bits(component, RT274_ADC_FORMAT, 0x407f, val);
 694
 695        return 0;
 696}
 697
 698static int rt274_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 699{
 700        struct snd_soc_component *component = dai->component;
 701        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 702
 703        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 704        case SND_SOC_DAIFMT_CBM_CFM:
 705                snd_soc_component_update_bits(component,
 706                        RT274_I2S_CTRL1, RT274_I2S_MODE_MASK, RT274_I2S_MODE_M);
 707                rt274->master = true;
 708                break;
 709        case SND_SOC_DAIFMT_CBS_CFS:
 710                snd_soc_component_update_bits(component,
 711                        RT274_I2S_CTRL1, RT274_I2S_MODE_MASK, RT274_I2S_MODE_S);
 712                rt274->master = false;
 713                break;
 714        default:
 715                return -EINVAL;
 716        }
 717
 718        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 719        case SND_SOC_DAIFMT_I2S:
 720                snd_soc_component_update_bits(component, RT274_I2S_CTRL1,
 721                                        RT274_I2S_FMT_MASK, RT274_I2S_FMT_I2S);
 722                break;
 723        case SND_SOC_DAIFMT_LEFT_J:
 724                snd_soc_component_update_bits(component, RT274_I2S_CTRL1,
 725                                        RT274_I2S_FMT_MASK, RT274_I2S_FMT_LJ);
 726                break;
 727        case SND_SOC_DAIFMT_DSP_A:
 728                snd_soc_component_update_bits(component, RT274_I2S_CTRL1,
 729                                        RT274_I2S_FMT_MASK, RT274_I2S_FMT_PCMA);
 730                break;
 731        case SND_SOC_DAIFMT_DSP_B:
 732                snd_soc_component_update_bits(component, RT274_I2S_CTRL1,
 733                                        RT274_I2S_FMT_MASK, RT274_I2S_FMT_PCMB);
 734                break;
 735        default:
 736                return -EINVAL;
 737        }
 738        /* bit 15 Stream Type 0:PCM 1:Non-PCM */
 739        snd_soc_component_update_bits(component, RT274_DAC_FORMAT, 0x8000, 0);
 740        snd_soc_component_update_bits(component, RT274_ADC_FORMAT, 0x8000, 0);
 741
 742        return 0;
 743}
 744
 745static int rt274_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
 746                        unsigned int freq_in, unsigned int freq_out)
 747{
 748        struct snd_soc_component *component = dai->component;
 749        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 750
 751        switch (source) {
 752        case RT274_PLL2_S_MCLK:
 753                snd_soc_component_update_bits(component, RT274_PLL2_CTRL,
 754                                RT274_PLL2_SRC_MASK, RT274_PLL2_SRC_MCLK);
 755                break;
 756        default:
 757                dev_warn(component->dev, "invalid pll source, use BCLK\n");
 758                /* fall through */
 759        case RT274_PLL2_S_BCLK:
 760                snd_soc_component_update_bits(component, RT274_PLL2_CTRL,
 761                                RT274_PLL2_SRC_MASK, RT274_PLL2_SRC_BCLK);
 762                break;
 763        }
 764
 765        if (source == RT274_PLL2_S_BCLK) {
 766                snd_soc_component_update_bits(component, RT274_MCLK_CTRL,
 767                                (0x3 << 12), (0x3 << 12));
 768                switch (rt274->fs) {
 769                case 50:
 770                        snd_soc_component_write(component, 0x7a, 0xaab6);
 771                        snd_soc_component_write(component, 0x7b, 0x0301);
 772                        snd_soc_component_write(component, 0x7c, 0x04fe);
 773                        break;
 774                case 64:
 775                        snd_soc_component_write(component, 0x7a, 0xaa96);
 776                        snd_soc_component_write(component, 0x7b, 0x8003);
 777                        snd_soc_component_write(component, 0x7c, 0x081e);
 778                        break;
 779                case 128:
 780                        snd_soc_component_write(component, 0x7a, 0xaa96);
 781                        snd_soc_component_write(component, 0x7b, 0x8003);
 782                        snd_soc_component_write(component, 0x7c, 0x080e);
 783                        break;
 784                default:
 785                        dev_warn(component->dev, "invalid freq_in, assume 4.8M\n");
 786                        /* fall through */
 787                case 100:
 788                        snd_soc_component_write(component, 0x7a, 0xaab6);
 789                        snd_soc_component_write(component, 0x7b, 0x0301);
 790                        snd_soc_component_write(component, 0x7c, 0x047e);
 791                        break;
 792                }
 793        }
 794
 795        return 0;
 796}
 797
 798static int rt274_set_dai_sysclk(struct snd_soc_dai *dai,
 799                                int clk_id, unsigned int freq, int dir)
 800{
 801        struct snd_soc_component *component = dai->component;
 802        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 803        unsigned int clk_src, mclk_en;
 804
 805        dev_dbg(component->dev, "%s freq=%d\n", __func__, freq);
 806
 807        switch (clk_id) {
 808        case RT274_SCLK_S_MCLK:
 809                mclk_en = RT274_MCLK_MODE_EN;
 810                clk_src = RT274_CLK_SRC_MCLK;
 811                break;
 812        case RT274_SCLK_S_PLL1:
 813                mclk_en = RT274_MCLK_MODE_DIS;
 814                clk_src = RT274_CLK_SRC_MCLK;
 815                break;
 816        case RT274_SCLK_S_PLL2:
 817                mclk_en = RT274_MCLK_MODE_EN;
 818                clk_src = RT274_CLK_SRC_PLL2;
 819                break;
 820        default:
 821                mclk_en = RT274_MCLK_MODE_DIS;
 822                clk_src = RT274_CLK_SRC_MCLK;
 823                dev_warn(component->dev, "invalid sysclk source, use PLL1\n");
 824                break;
 825        }
 826        snd_soc_component_update_bits(component, RT274_MCLK_CTRL,
 827                        RT274_MCLK_MODE_MASK, mclk_en);
 828        snd_soc_component_update_bits(component, RT274_CLK_CTRL,
 829                        RT274_CLK_SRC_MASK, clk_src);
 830
 831        switch (freq) {
 832        case 19200000:
 833                if (clk_id == RT274_SCLK_S_MCLK) {
 834                        dev_err(component->dev, "Should not use MCLK\n");
 835                        return -EINVAL;
 836                }
 837                snd_soc_component_update_bits(component,
 838                        RT274_I2S_CTRL2, 0x40, 0x40);
 839                break;
 840        case 24000000:
 841                if (clk_id == RT274_SCLK_S_MCLK) {
 842                        dev_err(component->dev, "Should not use MCLK\n");
 843                        return -EINVAL;
 844                }
 845                snd_soc_component_update_bits(component,
 846                        RT274_I2S_CTRL2, 0x40, 0x0);
 847                break;
 848        case 12288000:
 849        case 11289600:
 850                snd_soc_component_update_bits(component,
 851                        RT274_MCLK_CTRL, 0x1fcf, 0x0008);
 852                break;
 853        case 24576000:
 854        case 22579200:
 855                snd_soc_component_update_bits(component,
 856                        RT274_MCLK_CTRL, 0x1fcf, 0x1543);
 857                break;
 858        default:
 859                dev_err(component->dev, "Unsupported system clock\n");
 860                return -EINVAL;
 861        }
 862
 863        rt274->sys_clk = freq;
 864        rt274->clk_id = clk_id;
 865
 866        return 0;
 867}
 868
 869static int rt274_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
 870{
 871        struct snd_soc_component *component = dai->component;
 872        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 873
 874        dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio);
 875        rt274->fs = ratio;
 876        if ((ratio / 50) == 0)
 877                snd_soc_component_update_bits(component,
 878                        RT274_I2S_CTRL1, 0x1000, 0x1000);
 879        else
 880                snd_soc_component_update_bits(component,
 881                        RT274_I2S_CTRL1, 0x1000, 0x0);
 882
 883
 884        return 0;
 885}
 886
 887static int rt274_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 888                        unsigned int rx_mask, int slots, int slot_width)
 889
 890{
 891        struct snd_soc_component *component = dai->component;
 892
 893        if (rx_mask || tx_mask) {
 894                snd_soc_component_update_bits(component,
 895                        RT274_I2S_CTRL1, RT274_TDM_EN, RT274_TDM_EN);
 896        } else {
 897                snd_soc_component_update_bits(component,
 898                        RT274_I2S_CTRL1, RT274_TDM_EN, RT274_TDM_DIS);
 899                return 0;
 900        }
 901
 902        switch (slots) {
 903        case 4:
 904                snd_soc_component_update_bits(component,
 905                        RT274_I2S_CTRL1, RT274_TDM_CH_NUM, RT274_TDM_4CH);
 906                break;
 907        case 2:
 908                snd_soc_component_update_bits(component,
 909                        RT274_I2S_CTRL1, RT274_TDM_CH_NUM, RT274_TDM_2CH);
 910                break;
 911        default:
 912                dev_err(component->dev,
 913                        "Support 2 or 4 slots TDM only\n");
 914                return -EINVAL;
 915        }
 916
 917        return 0;
 918}
 919
 920static int rt274_set_bias_level(struct snd_soc_component *component,
 921                                 enum snd_soc_bias_level level)
 922{
 923        switch (level) {
 924        case SND_SOC_BIAS_PREPARE:
 925                if (SND_SOC_BIAS_STANDBY ==
 926                        snd_soc_component_get_bias_level(component)) {
 927                        snd_soc_component_write(component,
 928                                RT274_SET_AUDIO_POWER, AC_PWRST_D0);
 929                }
 930                break;
 931
 932        case SND_SOC_BIAS_STANDBY:
 933                snd_soc_component_write(component,
 934                        RT274_SET_AUDIO_POWER, AC_PWRST_D3);
 935                break;
 936
 937        default:
 938                break;
 939        }
 940
 941        return 0;
 942}
 943
 944static irqreturn_t rt274_irq(int irq, void *data)
 945{
 946        struct rt274_priv *rt274 = data;
 947        bool hp = false;
 948        bool mic = false;
 949        int ret, status = 0;
 950
 951        /* Clear IRQ */
 952        regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
 953                                RT274_IRQ_CLR, RT274_IRQ_CLR);
 954
 955        ret = rt274_jack_detect(rt274, &hp, &mic);
 956
 957        if (ret == 0) {
 958                if (hp == true)
 959                        status |= SND_JACK_HEADPHONE;
 960
 961                if (mic == true)
 962                        status |= SND_JACK_MICROPHONE;
 963
 964                snd_soc_jack_report(rt274->jack, status,
 965                        SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
 966
 967                pm_wakeup_event(&rt274->i2c->dev, 300);
 968        }
 969
 970        return IRQ_HANDLED;
 971}
 972
 973static int rt274_probe(struct snd_soc_component *component)
 974{
 975        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 976
 977        rt274->component = component;
 978
 979        if (rt274->i2c->irq) {
 980                INIT_DELAYED_WORK(&rt274->jack_detect_work,
 981                                        rt274_jack_detect_work);
 982                schedule_delayed_work(&rt274->jack_detect_work,
 983                                        msecs_to_jiffies(1250));
 984        }
 985
 986        return 0;
 987}
 988
 989static void rt274_remove(struct snd_soc_component *component)
 990{
 991        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
 992
 993        cancel_delayed_work_sync(&rt274->jack_detect_work);
 994}
 995
 996#ifdef CONFIG_PM
 997static int rt274_suspend(struct snd_soc_component *component)
 998{
 999        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
1000
1001        regcache_cache_only(rt274->regmap, true);
1002        regcache_mark_dirty(rt274->regmap);
1003
1004        return 0;
1005}
1006
1007static int rt274_resume(struct snd_soc_component *component)
1008{
1009        struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component);
1010
1011        regcache_cache_only(rt274->regmap, false);
1012        rt274_index_sync(component);
1013        regcache_sync(rt274->regmap);
1014
1015        return 0;
1016}
1017#else
1018#define rt274_suspend NULL
1019#define rt274_resume NULL
1020#endif
1021
1022#define RT274_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1023#define RT274_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1024                        SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1025
1026static const struct snd_soc_dai_ops rt274_aif_dai_ops = {
1027        .hw_params = rt274_hw_params,
1028        .set_fmt = rt274_set_dai_fmt,
1029        .set_sysclk = rt274_set_dai_sysclk,
1030        .set_pll = rt274_set_dai_pll,
1031        .set_bclk_ratio = rt274_set_bclk_ratio,
1032        .set_tdm_slot = rt274_set_tdm_slot,
1033};
1034
1035static struct snd_soc_dai_driver rt274_dai[] = {
1036        {
1037                .name = "rt274-aif1",
1038                .id = RT274_AIF1,
1039                .playback = {
1040                        .stream_name = "AIF1 Playback",
1041                        .channels_min = 1,
1042                        .channels_max = 2,
1043                        .rates = RT274_STEREO_RATES,
1044                        .formats = RT274_FORMATS,
1045                },
1046                .capture = {
1047                        .stream_name = "AIF1 Capture",
1048                        .channels_min = 1,
1049                        .channels_max = 2,
1050                        .rates = RT274_STEREO_RATES,
1051                        .formats = RT274_FORMATS,
1052                },
1053                .ops = &rt274_aif_dai_ops,
1054                .symmetric_rates = 1,
1055        },
1056};
1057
1058static const struct snd_soc_component_driver soc_component_dev_rt274 = {
1059        .probe                  = rt274_probe,
1060        .remove                 = rt274_remove,
1061        .suspend                = rt274_suspend,
1062        .resume                 = rt274_resume,
1063        .set_bias_level         = rt274_set_bias_level,
1064        .set_jack               = rt274_mic_detect,
1065        .controls               = rt274_snd_controls,
1066        .num_controls           = ARRAY_SIZE(rt274_snd_controls),
1067        .dapm_widgets           = rt274_dapm_widgets,
1068        .num_dapm_widgets       = ARRAY_SIZE(rt274_dapm_widgets),
1069        .dapm_routes            = rt274_dapm_routes,
1070        .num_dapm_routes        = ARRAY_SIZE(rt274_dapm_routes),
1071        .use_pmdown_time        = 1,
1072        .endianness             = 1,
1073        .non_legacy_dai_naming  = 1,
1074};
1075
1076static const struct regmap_config rt274_regmap = {
1077        .reg_bits = 32,
1078        .val_bits = 32,
1079        .max_register = 0x05bfffff,
1080        .volatile_reg = rt274_volatile_register,
1081        .readable_reg = rt274_readable_register,
1082        .reg_write = rl6347a_hw_write,
1083        .reg_read = rl6347a_hw_read,
1084        .cache_type = REGCACHE_RBTREE,
1085        .reg_defaults = rt274_reg,
1086        .num_reg_defaults = ARRAY_SIZE(rt274_reg),
1087};
1088
1089#ifdef CONFIG_OF
1090static const struct of_device_id rt274_of_match[] = {
1091        {.compatible = "realtek,rt274"},
1092        {},
1093};
1094MODULE_DEVICE_TABLE(of, rt274_of_match);
1095#endif
1096
1097static const struct i2c_device_id rt274_i2c_id[] = {
1098        {"rt274", 0},
1099        {}
1100};
1101MODULE_DEVICE_TABLE(i2c, rt274_i2c_id);
1102
1103static const struct acpi_device_id rt274_acpi_match[] = {
1104        { "10EC0274", 0 },
1105        { "INT34C2", 0 },
1106        {},
1107};
1108MODULE_DEVICE_TABLE(acpi, rt274_acpi_match);
1109
1110static int rt274_i2c_probe(struct i2c_client *i2c,
1111                           const struct i2c_device_id *id)
1112{
1113        struct rt274_priv *rt274;
1114
1115        int ret;
1116        unsigned int val;
1117
1118        rt274 = devm_kzalloc(&i2c->dev, sizeof(*rt274),
1119                                GFP_KERNEL);
1120        if (rt274 == NULL)
1121                return -ENOMEM;
1122
1123        rt274->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt274_regmap);
1124        if (IS_ERR(rt274->regmap)) {
1125                ret = PTR_ERR(rt274->regmap);
1126                dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
1127                        ret);
1128                return ret;
1129        }
1130
1131        regmap_read(rt274->regmap,
1132                RT274_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &val);
1133        if (val != RT274_VENDOR_ID) {
1134                dev_err(&i2c->dev,
1135                        "Device with ID register %#x is not rt274\n", val);
1136                return -ENODEV;
1137        }
1138
1139        rt274->index_cache = devm_kmemdup(&i2c->dev, rt274_index_def,
1140                                          sizeof(rt274_index_def), GFP_KERNEL);
1141        if (!rt274->index_cache)
1142                return -ENOMEM;
1143
1144        rt274->index_cache_size = INDEX_CACHE_SIZE;
1145        rt274->i2c = i2c;
1146        i2c_set_clientdata(i2c, rt274);
1147
1148        /* reset codec */
1149        regmap_write(rt274->regmap, RT274_RESET, 0);
1150        regmap_update_bits(rt274->regmap, 0x1a, 0x4000, 0x4000);
1151
1152        /* Set Pad PDB is floating */
1153        regmap_update_bits(rt274->regmap, RT274_PAD_CTRL12, 0x3, 0x0);
1154        regmap_write(rt274->regmap, RT274_COEF5b_INDEX, 0x01);
1155        regmap_write(rt274->regmap, RT274_COEF5b_COEF, 0x8540);
1156        regmap_update_bits(rt274->regmap, 0x6f, 0x0100, 0x0100);
1157        /* Combo jack auto detect */
1158        regmap_write(rt274->regmap, 0x4a, 0x201b);
1159        /* Aux mode off */
1160        regmap_update_bits(rt274->regmap, 0x6f, 0x3000, 0x2000);
1161        /* HP DC Calibration */
1162        regmap_update_bits(rt274->regmap, 0x6f, 0xf, 0x0);
1163        /* Set NID=58h.Index 00h [15]= 1b; */
1164        regmap_write(rt274->regmap, RT274_COEF58_INDEX, 0x00);
1165        regmap_write(rt274->regmap, RT274_COEF58_COEF, 0xb888);
1166        msleep(500);
1167        regmap_update_bits(rt274->regmap, 0x6f, 0xf, 0xb);
1168        regmap_write(rt274->regmap, RT274_COEF58_INDEX, 0x00);
1169        regmap_write(rt274->regmap, RT274_COEF58_COEF, 0x3888);
1170        /* Set pin widget */
1171        regmap_write(rt274->regmap, RT274_SET_PIN_HPO, 0x40);
1172        regmap_write(rt274->regmap, RT274_SET_PIN_LOUT3, 0x40);
1173        regmap_write(rt274->regmap, RT274_SET_MIC, 0x20);
1174        regmap_write(rt274->regmap, RT274_SET_PIN_DMIC1, 0x20);
1175
1176        regmap_update_bits(rt274->regmap, RT274_I2S_CTRL2, 0xc004, 0x4004);
1177        regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
1178                                RT274_GPI2_SEL_MASK, RT274_GPI2_SEL_DMIC_CLK);
1179
1180        /* jack detection */
1181        regmap_write(rt274->regmap, RT274_UNSOLICITED_HP_OUT, 0x81);
1182        regmap_write(rt274->regmap, RT274_UNSOLICITED_MIC, 0x82);
1183
1184        if (rt274->i2c->irq) {
1185                ret = request_threaded_irq(rt274->i2c->irq, NULL, rt274_irq,
1186                        IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "rt274", rt274);
1187                if (ret != 0) {
1188                        dev_err(&i2c->dev,
1189                                "Failed to reguest IRQ: %d\n", ret);
1190                        return ret;
1191                }
1192        }
1193
1194        ret = devm_snd_soc_register_component(&i2c->dev,
1195                                     &soc_component_dev_rt274,
1196                                     rt274_dai, ARRAY_SIZE(rt274_dai));
1197
1198        return ret;
1199}
1200
1201static int rt274_i2c_remove(struct i2c_client *i2c)
1202{
1203        struct rt274_priv *rt274 = i2c_get_clientdata(i2c);
1204
1205        if (i2c->irq)
1206                free_irq(i2c->irq, rt274);
1207
1208        return 0;
1209}
1210
1211
1212static struct i2c_driver rt274_i2c_driver = {
1213        .driver = {
1214                   .name = "rt274",
1215                   .acpi_match_table = ACPI_PTR(rt274_acpi_match),
1216#ifdef CONFIG_OF
1217                   .of_match_table = of_match_ptr(rt274_of_match),
1218#endif
1219                   },
1220        .probe = rt274_i2c_probe,
1221        .remove = rt274_i2c_remove,
1222        .id_table = rt274_i2c_id,
1223};
1224
1225module_i2c_driver(rt274_i2c_driver);
1226
1227MODULE_DESCRIPTION("ASoC RT274 driver");
1228MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1229MODULE_LICENSE("GPL v2");
1230