linux/sound/soc/codecs/tas6424.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * ALSA SoC Texas Instruments TAS6424 Quad-Channel Audio Amplifier
   4 *
   5 * Copyright (C) 2016-2017 Texas Instruments Incorporated - http://www.ti.com/
   6 *      Author: Andreas Dannenberg <dannenberg@ti.com>
   7 *      Andrew F. Davis <afd@ti.com>
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/errno.h>
  12#include <linux/device.h>
  13#include <linux/i2c.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/regmap.h>
  16#include <linux/slab.h>
  17#include <linux/regulator/consumer.h>
  18#include <linux/delay.h>
  19#include <linux/gpio/consumer.h>
  20
  21#include <sound/pcm.h>
  22#include <sound/pcm_params.h>
  23#include <sound/soc.h>
  24#include <sound/soc-dapm.h>
  25#include <sound/tlv.h>
  26
  27#include "tas6424.h"
  28
  29/* Define how often to check (and clear) the fault status register (in ms) */
  30#define TAS6424_FAULT_CHECK_INTERVAL 200
  31
  32static const char * const tas6424_supply_names[] = {
  33        "dvdd", /* Digital power supply. Connect to 3.3-V supply. */
  34        "vbat", /* Supply used for higher voltage analog circuits. */
  35        "pvdd", /* Class-D amp output FETs supply. */
  36};
  37#define TAS6424_NUM_SUPPLIES ARRAY_SIZE(tas6424_supply_names)
  38
  39struct tas6424_data {
  40        struct device *dev;
  41        struct regmap *regmap;
  42        struct regulator_bulk_data supplies[TAS6424_NUM_SUPPLIES];
  43        struct delayed_work fault_check_work;
  44        unsigned int last_fault1;
  45        unsigned int last_fault2;
  46        unsigned int last_warn;
  47        struct gpio_desc *standby_gpio;
  48        struct gpio_desc *mute_gpio;
  49};
  50
  51/*
  52 * DAC digital volumes. From -103.5 to 24 dB in 0.5 dB steps. Note that
  53 * setting the gain below -100 dB (register value <0x7) is effectively a MUTE
  54 * as per device datasheet.
  55 */
  56static DECLARE_TLV_DB_SCALE(dac_tlv, -10350, 50, 0);
  57
  58static const struct snd_kcontrol_new tas6424_snd_controls[] = {
  59        SOC_SINGLE_TLV("Speaker Driver CH1 Playback Volume",
  60                       TAS6424_CH1_VOL_CTRL, 0, 0xff, 0, dac_tlv),
  61        SOC_SINGLE_TLV("Speaker Driver CH2 Playback Volume",
  62                       TAS6424_CH2_VOL_CTRL, 0, 0xff, 0, dac_tlv),
  63        SOC_SINGLE_TLV("Speaker Driver CH3 Playback Volume",
  64                       TAS6424_CH3_VOL_CTRL, 0, 0xff, 0, dac_tlv),
  65        SOC_SINGLE_TLV("Speaker Driver CH4 Playback Volume",
  66                       TAS6424_CH4_VOL_CTRL, 0, 0xff, 0, dac_tlv),
  67        SOC_SINGLE_STROBE("Auto Diagnostics Switch", TAS6424_DC_DIAG_CTRL1,
  68                          TAS6424_LDGBYPASS_SHIFT, 1),
  69};
  70
  71static int tas6424_dac_event(struct snd_soc_dapm_widget *w,
  72                             struct snd_kcontrol *kcontrol, int event)
  73{
  74        struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  75        struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component);
  76
  77        dev_dbg(component->dev, "%s() event=0x%0x\n", __func__, event);
  78
  79        if (event & SND_SOC_DAPM_POST_PMU) {
  80                /* Observe codec shutdown-to-active time */
  81                msleep(12);
  82
  83                /* Turn on TAS6424 periodic fault checking/handling */
  84                tas6424->last_fault1 = 0;
  85                tas6424->last_fault2 = 0;
  86                tas6424->last_warn = 0;
  87                schedule_delayed_work(&tas6424->fault_check_work,
  88                                      msecs_to_jiffies(TAS6424_FAULT_CHECK_INTERVAL));
  89        } else if (event & SND_SOC_DAPM_PRE_PMD) {
  90                /* Disable TAS6424 periodic fault checking/handling */
  91                cancel_delayed_work_sync(&tas6424->fault_check_work);
  92        }
  93
  94        return 0;
  95}
  96
  97static const struct snd_soc_dapm_widget tas6424_dapm_widgets[] = {
  98        SND_SOC_DAPM_AIF_IN("DAC IN", "Playback", 0, SND_SOC_NOPM, 0, 0),
  99        SND_SOC_DAPM_DAC_E("DAC", NULL, SND_SOC_NOPM, 0, 0, tas6424_dac_event,
 100                           SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 101        SND_SOC_DAPM_OUTPUT("OUT")
 102};
 103
 104static const struct snd_soc_dapm_route tas6424_audio_map[] = {
 105        { "DAC", NULL, "DAC IN" },
 106        { "OUT", NULL, "DAC" },
 107};
 108
 109static int tas6424_hw_params(struct snd_pcm_substream *substream,
 110                             struct snd_pcm_hw_params *params,
 111                             struct snd_soc_dai *dai)
 112{
 113        struct snd_soc_component *component = dai->component;
 114        unsigned int rate = params_rate(params);
 115        unsigned int width = params_width(params);
 116        u8 sap_ctrl = 0;
 117
 118        dev_dbg(component->dev, "%s() rate=%u width=%u\n", __func__, rate, width);
 119
 120        switch (rate) {
 121        case 44100:
 122                sap_ctrl |= TAS6424_SAP_RATE_44100;
 123                break;
 124        case 48000:
 125                sap_ctrl |= TAS6424_SAP_RATE_48000;
 126                break;
 127        case 96000:
 128                sap_ctrl |= TAS6424_SAP_RATE_96000;
 129                break;
 130        default:
 131                dev_err(component->dev, "unsupported sample rate: %u\n", rate);
 132                return -EINVAL;
 133        }
 134
 135        switch (width) {
 136        case 16:
 137                sap_ctrl |= TAS6424_SAP_TDM_SLOT_SZ_16;
 138                break;
 139        case 24:
 140                break;
 141        default:
 142                dev_err(component->dev, "unsupported sample width: %u\n", width);
 143                return -EINVAL;
 144        }
 145
 146        snd_soc_component_update_bits(component, TAS6424_SAP_CTRL,
 147                            TAS6424_SAP_RATE_MASK |
 148                            TAS6424_SAP_TDM_SLOT_SZ_16,
 149                            sap_ctrl);
 150
 151        return 0;
 152}
 153
 154static int tas6424_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 155{
 156        struct snd_soc_component *component = dai->component;
 157        u8 serial_format = 0;
 158
 159        dev_dbg(component->dev, "%s() fmt=0x%0x\n", __func__, fmt);
 160
 161        /* clock masters */
 162        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 163        case SND_SOC_DAIFMT_CBS_CFS:
 164                break;
 165        default:
 166                dev_err(component->dev, "Invalid DAI master/slave interface\n");
 167                return -EINVAL;
 168        }
 169
 170        /* signal polarity */
 171        switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 172        case SND_SOC_DAIFMT_NB_NF:
 173                break;
 174        default:
 175                dev_err(component->dev, "Invalid DAI clock signal polarity\n");
 176                return -EINVAL;
 177        }
 178
 179        /* interface format */
 180        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 181        case SND_SOC_DAIFMT_I2S:
 182                serial_format |= TAS6424_SAP_I2S;
 183                break;
 184        case SND_SOC_DAIFMT_DSP_A:
 185                serial_format |= TAS6424_SAP_DSP;
 186                break;
 187        case SND_SOC_DAIFMT_DSP_B:
 188                /*
 189                 * We can use the fact that the TAS6424 does not care about the
 190                 * LRCLK duty cycle during TDM to receive DSP_B formatted data
 191                 * in LEFTJ mode (no delaying of the 1st data bit).
 192                 */
 193                serial_format |= TAS6424_SAP_LEFTJ;
 194                break;
 195        case SND_SOC_DAIFMT_LEFT_J:
 196                serial_format |= TAS6424_SAP_LEFTJ;
 197                break;
 198        default:
 199                dev_err(component->dev, "Invalid DAI interface format\n");
 200                return -EINVAL;
 201        }
 202
 203        snd_soc_component_update_bits(component, TAS6424_SAP_CTRL,
 204                            TAS6424_SAP_FMT_MASK, serial_format);
 205
 206        return 0;
 207}
 208
 209static int tas6424_set_dai_tdm_slot(struct snd_soc_dai *dai,
 210                                    unsigned int tx_mask, unsigned int rx_mask,
 211                                    int slots, int slot_width)
 212{
 213        struct snd_soc_component *component = dai->component;
 214        unsigned int first_slot, last_slot;
 215        bool sap_tdm_slot_last;
 216
 217        dev_dbg(component->dev, "%s() tx_mask=%d rx_mask=%d\n", __func__,
 218                tx_mask, rx_mask);
 219
 220        if (!tx_mask || !rx_mask)
 221                return 0; /* nothing needed to disable TDM mode */
 222
 223        /*
 224         * Determine the first slot and last slot that is being requested so
 225         * we'll be able to more easily enforce certain constraints as the
 226         * TAS6424's TDM interface is not fully configurable.
 227         */
 228        first_slot = __ffs(tx_mask);
 229        last_slot = __fls(rx_mask);
 230
 231        if (last_slot - first_slot != 4) {
 232                dev_err(component->dev, "tdm mask must cover 4 contiguous slots\n");
 233                return -EINVAL;
 234        }
 235
 236        switch (first_slot) {
 237        case 0:
 238                sap_tdm_slot_last = false;
 239                break;
 240        case 4:
 241                sap_tdm_slot_last = true;
 242                break;
 243        default:
 244                dev_err(component->dev, "tdm mask must start at slot 0 or 4\n");
 245                return -EINVAL;
 246        }
 247
 248        snd_soc_component_update_bits(component, TAS6424_SAP_CTRL, TAS6424_SAP_TDM_SLOT_LAST,
 249                            sap_tdm_slot_last ? TAS6424_SAP_TDM_SLOT_LAST : 0);
 250
 251        return 0;
 252}
 253
 254static int tas6424_mute(struct snd_soc_dai *dai, int mute)
 255{
 256        struct snd_soc_component *component = dai->component;
 257        struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component);
 258        unsigned int val;
 259
 260        dev_dbg(component->dev, "%s() mute=%d\n", __func__, mute);
 261
 262        if (tas6424->mute_gpio) {
 263                gpiod_set_value_cansleep(tas6424->mute_gpio, mute);
 264                return 0;
 265        }
 266
 267        if (mute)
 268                val = TAS6424_ALL_STATE_MUTE;
 269        else
 270                val = TAS6424_ALL_STATE_PLAY;
 271
 272        snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, val);
 273
 274        return 0;
 275}
 276
 277static int tas6424_power_off(struct snd_soc_component *component)
 278{
 279        struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component);
 280        int ret;
 281
 282        snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, TAS6424_ALL_STATE_HIZ);
 283
 284        regcache_cache_only(tas6424->regmap, true);
 285        regcache_mark_dirty(tas6424->regmap);
 286
 287        ret = regulator_bulk_disable(ARRAY_SIZE(tas6424->supplies),
 288                                     tas6424->supplies);
 289        if (ret < 0) {
 290                dev_err(component->dev, "failed to disable supplies: %d\n", ret);
 291                return ret;
 292        }
 293
 294        return 0;
 295}
 296
 297static int tas6424_power_on(struct snd_soc_component *component)
 298{
 299        struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component);
 300        int ret;
 301        u8 chan_states;
 302        int no_auto_diags = 0;
 303        unsigned int reg_val;
 304
 305        if (!regmap_read(tas6424->regmap, TAS6424_DC_DIAG_CTRL1, &reg_val))
 306                no_auto_diags = reg_val & TAS6424_LDGBYPASS_MASK;
 307
 308        ret = regulator_bulk_enable(ARRAY_SIZE(tas6424->supplies),
 309                                    tas6424->supplies);
 310        if (ret < 0) {
 311                dev_err(component->dev, "failed to enable supplies: %d\n", ret);
 312                return ret;
 313        }
 314
 315        regcache_cache_only(tas6424->regmap, false);
 316
 317        ret = regcache_sync(tas6424->regmap);
 318        if (ret < 0) {
 319                dev_err(component->dev, "failed to sync regcache: %d\n", ret);
 320                return ret;
 321        }
 322
 323        if (tas6424->mute_gpio) {
 324                gpiod_set_value_cansleep(tas6424->mute_gpio, 0);
 325                /*
 326                 * channels are muted via the mute pin.  Don't also mute
 327                 * them via the registers so that subsequent register
 328                 * access is not necessary to un-mute the channels
 329                 */
 330                chan_states = TAS6424_ALL_STATE_PLAY;
 331        } else {
 332                chan_states = TAS6424_ALL_STATE_MUTE;
 333        }
 334        snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, chan_states);
 335
 336        /* any time we come out of HIZ, the output channels automatically run DC
 337         * load diagnostics if autodiagnotics are enabled. wait here until this
 338         * completes.
 339         */
 340        if (!no_auto_diags)
 341                msleep(230);
 342
 343        return 0;
 344}
 345
 346static int tas6424_set_bias_level(struct snd_soc_component *component,
 347                                  enum snd_soc_bias_level level)
 348{
 349        dev_dbg(component->dev, "%s() level=%d\n", __func__, level);
 350
 351        switch (level) {
 352        case SND_SOC_BIAS_ON:
 353        case SND_SOC_BIAS_PREPARE:
 354                break;
 355        case SND_SOC_BIAS_STANDBY:
 356                if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
 357                        tas6424_power_on(component);
 358                break;
 359        case SND_SOC_BIAS_OFF:
 360                tas6424_power_off(component);
 361                break;
 362        }
 363
 364        return 0;
 365}
 366
 367static struct snd_soc_component_driver soc_codec_dev_tas6424 = {
 368        .set_bias_level         = tas6424_set_bias_level,
 369        .controls               = tas6424_snd_controls,
 370        .num_controls           = ARRAY_SIZE(tas6424_snd_controls),
 371        .dapm_widgets           = tas6424_dapm_widgets,
 372        .num_dapm_widgets       = ARRAY_SIZE(tas6424_dapm_widgets),
 373        .dapm_routes            = tas6424_audio_map,
 374        .num_dapm_routes        = ARRAY_SIZE(tas6424_audio_map),
 375        .use_pmdown_time        = 1,
 376        .endianness             = 1,
 377        .non_legacy_dai_naming  = 1,
 378};
 379
 380static struct snd_soc_dai_ops tas6424_speaker_dai_ops = {
 381        .hw_params      = tas6424_hw_params,
 382        .set_fmt        = tas6424_set_dai_fmt,
 383        .set_tdm_slot   = tas6424_set_dai_tdm_slot,
 384        .digital_mute   = tas6424_mute,
 385};
 386
 387static struct snd_soc_dai_driver tas6424_dai[] = {
 388        {
 389                .name = "tas6424-amplifier",
 390                .playback = {
 391                        .stream_name = "Playback",
 392                        .channels_min = 1,
 393                        .channels_max = 4,
 394                        .rates = TAS6424_RATES,
 395                        .formats = TAS6424_FORMATS,
 396                },
 397                .ops = &tas6424_speaker_dai_ops,
 398        },
 399};
 400
 401static void tas6424_fault_check_work(struct work_struct *work)
 402{
 403        struct tas6424_data *tas6424 = container_of(work, struct tas6424_data,
 404                                                    fault_check_work.work);
 405        struct device *dev = tas6424->dev;
 406        unsigned int reg;
 407        int ret;
 408
 409        ret = regmap_read(tas6424->regmap, TAS6424_GLOB_FAULT1, &reg);
 410        if (ret < 0) {
 411                dev_err(dev, "failed to read FAULT1 register: %d\n", ret);
 412                goto out;
 413        }
 414
 415        /*
 416         * Ignore any clock faults as there is no clean way to check for them.
 417         * We would need to start checking for those faults *after* the SAIF
 418         * stream has been setup, and stop checking *before* the stream is
 419         * stopped to avoid any false-positives. However there are no
 420         * appropriate hooks to monitor these events.
 421         */
 422        reg &= TAS6424_FAULT_PVDD_OV |
 423               TAS6424_FAULT_VBAT_OV |
 424               TAS6424_FAULT_PVDD_UV |
 425               TAS6424_FAULT_VBAT_UV;
 426
 427        if (!reg) {
 428                tas6424->last_fault1 = reg;
 429                goto check_global_fault2_reg;
 430        }
 431
 432        /*
 433         * Only flag errors once for a given occurrence. This is needed as
 434         * the TAS6424 will take time clearing the fault condition internally
 435         * during which we don't want to bombard the system with the same
 436         * error message over and over.
 437         */
 438        if ((reg & TAS6424_FAULT_PVDD_OV) && !(tas6424->last_fault1 & TAS6424_FAULT_PVDD_OV))
 439                dev_crit(dev, "experienced a PVDD overvoltage fault\n");
 440
 441        if ((reg & TAS6424_FAULT_VBAT_OV) && !(tas6424->last_fault1 & TAS6424_FAULT_VBAT_OV))
 442                dev_crit(dev, "experienced a VBAT overvoltage fault\n");
 443
 444        if ((reg & TAS6424_FAULT_PVDD_UV) && !(tas6424->last_fault1 & TAS6424_FAULT_PVDD_UV))
 445                dev_crit(dev, "experienced a PVDD undervoltage fault\n");
 446
 447        if ((reg & TAS6424_FAULT_VBAT_UV) && !(tas6424->last_fault1 & TAS6424_FAULT_VBAT_UV))
 448                dev_crit(dev, "experienced a VBAT undervoltage fault\n");
 449
 450        /* Store current fault1 value so we can detect any changes next time */
 451        tas6424->last_fault1 = reg;
 452
 453check_global_fault2_reg:
 454        ret = regmap_read(tas6424->regmap, TAS6424_GLOB_FAULT2, &reg);
 455        if (ret < 0) {
 456                dev_err(dev, "failed to read FAULT2 register: %d\n", ret);
 457                goto out;
 458        }
 459
 460        reg &= TAS6424_FAULT_OTSD |
 461               TAS6424_FAULT_OTSD_CH1 |
 462               TAS6424_FAULT_OTSD_CH2 |
 463               TAS6424_FAULT_OTSD_CH3 |
 464               TAS6424_FAULT_OTSD_CH4;
 465
 466        if (!reg) {
 467                tas6424->last_fault2 = reg;
 468                goto check_warn_reg;
 469        }
 470
 471        if ((reg & TAS6424_FAULT_OTSD) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD))
 472                dev_crit(dev, "experienced a global overtemp shutdown\n");
 473
 474        if ((reg & TAS6424_FAULT_OTSD_CH1) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD_CH1))
 475                dev_crit(dev, "experienced an overtemp shutdown on CH1\n");
 476
 477        if ((reg & TAS6424_FAULT_OTSD_CH2) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD_CH2))
 478                dev_crit(dev, "experienced an overtemp shutdown on CH2\n");
 479
 480        if ((reg & TAS6424_FAULT_OTSD_CH3) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD_CH3))
 481                dev_crit(dev, "experienced an overtemp shutdown on CH3\n");
 482
 483        if ((reg & TAS6424_FAULT_OTSD_CH4) && !(tas6424->last_fault2 & TAS6424_FAULT_OTSD_CH4))
 484                dev_crit(dev, "experienced an overtemp shutdown on CH4\n");
 485
 486        /* Store current fault2 value so we can detect any changes next time */
 487        tas6424->last_fault2 = reg;
 488
 489check_warn_reg:
 490        ret = regmap_read(tas6424->regmap, TAS6424_WARN, &reg);
 491        if (ret < 0) {
 492                dev_err(dev, "failed to read WARN register: %d\n", ret);
 493                goto out;
 494        }
 495
 496        reg &= TAS6424_WARN_VDD_UV |
 497               TAS6424_WARN_VDD_POR |
 498               TAS6424_WARN_VDD_OTW |
 499               TAS6424_WARN_VDD_OTW_CH1 |
 500               TAS6424_WARN_VDD_OTW_CH2 |
 501               TAS6424_WARN_VDD_OTW_CH3 |
 502               TAS6424_WARN_VDD_OTW_CH4;
 503
 504        if (!reg) {
 505                tas6424->last_warn = reg;
 506                goto out;
 507        }
 508
 509        if ((reg & TAS6424_WARN_VDD_UV) && !(tas6424->last_warn & TAS6424_WARN_VDD_UV))
 510                dev_warn(dev, "experienced a VDD under voltage condition\n");
 511
 512        if ((reg & TAS6424_WARN_VDD_POR) && !(tas6424->last_warn & TAS6424_WARN_VDD_POR))
 513                dev_warn(dev, "experienced a VDD POR condition\n");
 514
 515        if ((reg & TAS6424_WARN_VDD_OTW) && !(tas6424->last_warn & TAS6424_WARN_VDD_OTW))
 516                dev_warn(dev, "experienced a global overtemp warning\n");
 517
 518        if ((reg & TAS6424_WARN_VDD_OTW_CH1) && !(tas6424->last_warn & TAS6424_WARN_VDD_OTW_CH1))
 519                dev_warn(dev, "experienced an overtemp warning on CH1\n");
 520
 521        if ((reg & TAS6424_WARN_VDD_OTW_CH2) && !(tas6424->last_warn & TAS6424_WARN_VDD_OTW_CH2))
 522                dev_warn(dev, "experienced an overtemp warning on CH2\n");
 523
 524        if ((reg & TAS6424_WARN_VDD_OTW_CH3) && !(tas6424->last_warn & TAS6424_WARN_VDD_OTW_CH3))
 525                dev_warn(dev, "experienced an overtemp warning on CH3\n");
 526
 527        if ((reg & TAS6424_WARN_VDD_OTW_CH4) && !(tas6424->last_warn & TAS6424_WARN_VDD_OTW_CH4))
 528                dev_warn(dev, "experienced an overtemp warning on CH4\n");
 529
 530        /* Store current warn value so we can detect any changes next time */
 531        tas6424->last_warn = reg;
 532
 533        /* Clear any faults by toggling the CLEAR_FAULT control bit */
 534        ret = regmap_write_bits(tas6424->regmap, TAS6424_MISC_CTRL3,
 535                                TAS6424_CLEAR_FAULT, TAS6424_CLEAR_FAULT);
 536        if (ret < 0)
 537                dev_err(dev, "failed to write MISC_CTRL3 register: %d\n", ret);
 538
 539        ret = regmap_write_bits(tas6424->regmap, TAS6424_MISC_CTRL3,
 540                                TAS6424_CLEAR_FAULT, 0);
 541        if (ret < 0)
 542                dev_err(dev, "failed to write MISC_CTRL3 register: %d\n", ret);
 543
 544out:
 545        /* Schedule the next fault check at the specified interval */
 546        schedule_delayed_work(&tas6424->fault_check_work,
 547                              msecs_to_jiffies(TAS6424_FAULT_CHECK_INTERVAL));
 548}
 549
 550static const struct reg_default tas6424_reg_defaults[] = {
 551        { TAS6424_MODE_CTRL,            0x00 },
 552        { TAS6424_MISC_CTRL1,           0x32 },
 553        { TAS6424_MISC_CTRL2,           0x62 },
 554        { TAS6424_SAP_CTRL,             0x04 },
 555        { TAS6424_CH_STATE_CTRL,        0x55 },
 556        { TAS6424_CH1_VOL_CTRL,         0xcf },
 557        { TAS6424_CH2_VOL_CTRL,         0xcf },
 558        { TAS6424_CH3_VOL_CTRL,         0xcf },
 559        { TAS6424_CH4_VOL_CTRL,         0xcf },
 560        { TAS6424_DC_DIAG_CTRL1,        0x00 },
 561        { TAS6424_DC_DIAG_CTRL2,        0x11 },
 562        { TAS6424_DC_DIAG_CTRL3,        0x11 },
 563        { TAS6424_PIN_CTRL,             0xff },
 564        { TAS6424_AC_DIAG_CTRL1,        0x00 },
 565        { TAS6424_MISC_CTRL3,           0x00 },
 566        { TAS6424_CLIP_CTRL,            0x01 },
 567        { TAS6424_CLIP_WINDOW,          0x14 },
 568        { TAS6424_CLIP_WARN,            0x00 },
 569        { TAS6424_CBC_STAT,             0x00 },
 570        { TAS6424_MISC_CTRL4,           0x40 },
 571};
 572
 573static bool tas6424_is_writable_reg(struct device *dev, unsigned int reg)
 574{
 575        switch (reg) {
 576        case TAS6424_MODE_CTRL:
 577        case TAS6424_MISC_CTRL1:
 578        case TAS6424_MISC_CTRL2:
 579        case TAS6424_SAP_CTRL:
 580        case TAS6424_CH_STATE_CTRL:
 581        case TAS6424_CH1_VOL_CTRL:
 582        case TAS6424_CH2_VOL_CTRL:
 583        case TAS6424_CH3_VOL_CTRL:
 584        case TAS6424_CH4_VOL_CTRL:
 585        case TAS6424_DC_DIAG_CTRL1:
 586        case TAS6424_DC_DIAG_CTRL2:
 587        case TAS6424_DC_DIAG_CTRL3:
 588        case TAS6424_PIN_CTRL:
 589        case TAS6424_AC_DIAG_CTRL1:
 590        case TAS6424_MISC_CTRL3:
 591        case TAS6424_CLIP_CTRL:
 592        case TAS6424_CLIP_WINDOW:
 593        case TAS6424_CLIP_WARN:
 594        case TAS6424_CBC_STAT:
 595        case TAS6424_MISC_CTRL4:
 596                return true;
 597        default:
 598                return false;
 599        }
 600}
 601
 602static bool tas6424_is_volatile_reg(struct device *dev, unsigned int reg)
 603{
 604        switch (reg) {
 605        case TAS6424_DC_LOAD_DIAG_REP12:
 606        case TAS6424_DC_LOAD_DIAG_REP34:
 607        case TAS6424_DC_LOAD_DIAG_REPLO:
 608        case TAS6424_CHANNEL_STATE:
 609        case TAS6424_CHANNEL_FAULT:
 610        case TAS6424_GLOB_FAULT1:
 611        case TAS6424_GLOB_FAULT2:
 612        case TAS6424_WARN:
 613        case TAS6424_AC_LOAD_DIAG_REP1:
 614        case TAS6424_AC_LOAD_DIAG_REP2:
 615        case TAS6424_AC_LOAD_DIAG_REP3:
 616        case TAS6424_AC_LOAD_DIAG_REP4:
 617                return true;
 618        default:
 619                return false;
 620        }
 621}
 622
 623static const struct regmap_config tas6424_regmap_config = {
 624        .reg_bits = 8,
 625        .val_bits = 8,
 626
 627        .writeable_reg = tas6424_is_writable_reg,
 628        .volatile_reg = tas6424_is_volatile_reg,
 629
 630        .max_register = TAS6424_MAX,
 631        .reg_defaults = tas6424_reg_defaults,
 632        .num_reg_defaults = ARRAY_SIZE(tas6424_reg_defaults),
 633        .cache_type = REGCACHE_RBTREE,
 634};
 635
 636#if IS_ENABLED(CONFIG_OF)
 637static const struct of_device_id tas6424_of_ids[] = {
 638        { .compatible = "ti,tas6424", },
 639        { },
 640};
 641MODULE_DEVICE_TABLE(of, tas6424_of_ids);
 642#endif
 643
 644static int tas6424_i2c_probe(struct i2c_client *client,
 645                             const struct i2c_device_id *id)
 646{
 647        struct device *dev = &client->dev;
 648        struct tas6424_data *tas6424;
 649        int ret;
 650        int i;
 651
 652        tas6424 = devm_kzalloc(dev, sizeof(*tas6424), GFP_KERNEL);
 653        if (!tas6424)
 654                return -ENOMEM;
 655        dev_set_drvdata(dev, tas6424);
 656
 657        tas6424->dev = dev;
 658
 659        tas6424->regmap = devm_regmap_init_i2c(client, &tas6424_regmap_config);
 660        if (IS_ERR(tas6424->regmap)) {
 661                ret = PTR_ERR(tas6424->regmap);
 662                dev_err(dev, "unable to allocate register map: %d\n", ret);
 663                return ret;
 664        }
 665
 666        /*
 667         * Get control of the standby pin and set it LOW to take the codec
 668         * out of the stand-by mode.
 669         * Note: The actual pin polarity is taken care of in the GPIO lib
 670         * according the polarity specified in the DTS.
 671         */
 672        tas6424->standby_gpio = devm_gpiod_get_optional(dev, "standby",
 673                                                      GPIOD_OUT_LOW);
 674        if (IS_ERR(tas6424->standby_gpio)) {
 675                if (PTR_ERR(tas6424->standby_gpio) == -EPROBE_DEFER)
 676                        return -EPROBE_DEFER;
 677                dev_info(dev, "failed to get standby GPIO: %ld\n",
 678                        PTR_ERR(tas6424->standby_gpio));
 679                tas6424->standby_gpio = NULL;
 680        }
 681
 682        /*
 683         * Get control of the mute pin and set it HIGH in order to start with
 684         * all the output muted.
 685         * Note: The actual pin polarity is taken care of in the GPIO lib
 686         * according the polarity specified in the DTS.
 687         */
 688        tas6424->mute_gpio = devm_gpiod_get_optional(dev, "mute",
 689                                                      GPIOD_OUT_HIGH);
 690        if (IS_ERR(tas6424->mute_gpio)) {
 691                if (PTR_ERR(tas6424->mute_gpio) == -EPROBE_DEFER)
 692                        return -EPROBE_DEFER;
 693                dev_info(dev, "failed to get nmute GPIO: %ld\n",
 694                        PTR_ERR(tas6424->mute_gpio));
 695                tas6424->mute_gpio = NULL;
 696        }
 697
 698        for (i = 0; i < ARRAY_SIZE(tas6424->supplies); i++)
 699                tas6424->supplies[i].supply = tas6424_supply_names[i];
 700        ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(tas6424->supplies),
 701                                      tas6424->supplies);
 702        if (ret) {
 703                dev_err(dev, "unable to request supplies: %d\n", ret);
 704                return ret;
 705        }
 706
 707        ret = regulator_bulk_enable(ARRAY_SIZE(tas6424->supplies),
 708                                    tas6424->supplies);
 709        if (ret) {
 710                dev_err(dev, "unable to enable supplies: %d\n", ret);
 711                return ret;
 712        }
 713
 714        /* Reset device to establish well-defined startup state */
 715        ret = regmap_update_bits(tas6424->regmap, TAS6424_MODE_CTRL,
 716                                 TAS6424_RESET, TAS6424_RESET);
 717        if (ret) {
 718                dev_err(dev, "unable to reset device: %d\n", ret);
 719                return ret;
 720        }
 721
 722        INIT_DELAYED_WORK(&tas6424->fault_check_work, tas6424_fault_check_work);
 723
 724        ret = devm_snd_soc_register_component(dev, &soc_codec_dev_tas6424,
 725                                     tas6424_dai, ARRAY_SIZE(tas6424_dai));
 726        if (ret < 0) {
 727                dev_err(dev, "unable to register codec: %d\n", ret);
 728                return ret;
 729        }
 730
 731        return 0;
 732}
 733
 734static int tas6424_i2c_remove(struct i2c_client *client)
 735{
 736        struct device *dev = &client->dev;
 737        struct tas6424_data *tas6424 = dev_get_drvdata(dev);
 738        int ret;
 739
 740        cancel_delayed_work_sync(&tas6424->fault_check_work);
 741
 742        /* put the codec in stand-by */
 743        if (tas6424->standby_gpio)
 744                gpiod_set_value_cansleep(tas6424->standby_gpio, 1);
 745
 746        ret = regulator_bulk_disable(ARRAY_SIZE(tas6424->supplies),
 747                                     tas6424->supplies);
 748        if (ret < 0) {
 749                dev_err(dev, "unable to disable supplies: %d\n", ret);
 750                return ret;
 751        }
 752
 753        return 0;
 754}
 755
 756static const struct i2c_device_id tas6424_i2c_ids[] = {
 757        { "tas6424", 0 },
 758        { }
 759};
 760MODULE_DEVICE_TABLE(i2c, tas6424_i2c_ids);
 761
 762static struct i2c_driver tas6424_i2c_driver = {
 763        .driver = {
 764                .name = "tas6424",
 765                .of_match_table = of_match_ptr(tas6424_of_ids),
 766        },
 767        .probe = tas6424_i2c_probe,
 768        .remove = tas6424_i2c_remove,
 769        .id_table = tas6424_i2c_ids,
 770};
 771module_i2c_driver(tas6424_i2c_driver);
 772
 773MODULE_AUTHOR("Andreas Dannenberg <dannenberg@ti.com>");
 774MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
 775MODULE_DESCRIPTION("TAS6424 Audio amplifier driver");
 776MODULE_LICENSE("GPL v2");
 777