linux/sound/soc/davinci/davinci-mcasp.c
<<
>>
Prefs
   1/*
   2 * ALSA SoC McASP Audio Layer for TI DAVINCI processor
   3 *
   4 * Multi-channel Audio Serial Port Driver
   5 *
   6 * Author: Nirmal Pandey <n-pandey@ti.com>,
   7 *         Suresh Rajashekara <suresh.r@ti.com>
   8 *         Steve Chen <schen@.mvista.com>
   9 *
  10 * Copyright:   (C) 2009 MontaVista Software, Inc., <source@mvista.com>
  11 * Copyright:   (C) 2009  Texas Instruments, India
  12 *
  13 * This program is free software; you can redistribute it and/or modify
  14 * it under the terms of the GNU General Public License version 2 as
  15 * published by the Free Software Foundation.
  16 */
  17
  18#include <linux/init.h>
  19#include <linux/module.h>
  20#include <linux/device.h>
  21#include <linux/slab.h>
  22#include <linux/delay.h>
  23#include <linux/io.h>
  24#include <linux/clk.h>
  25#include <linux/pm_runtime.h>
  26#include <linux/of.h>
  27#include <linux/of_platform.h>
  28#include <linux/of_device.h>
  29
  30#include <sound/asoundef.h>
  31#include <sound/core.h>
  32#include <sound/pcm.h>
  33#include <sound/pcm_params.h>
  34#include <sound/initval.h>
  35#include <sound/soc.h>
  36#include <sound/dmaengine_pcm.h>
  37#include <sound/omap-pcm.h>
  38
  39#include "davinci-pcm.h"
  40#include "edma-pcm.h"
  41#include "davinci-mcasp.h"
  42
  43#define MCASP_MAX_AFIFO_DEPTH   64
  44
  45static u32 context_regs[] = {
  46        DAVINCI_MCASP_TXFMCTL_REG,
  47        DAVINCI_MCASP_RXFMCTL_REG,
  48        DAVINCI_MCASP_TXFMT_REG,
  49        DAVINCI_MCASP_RXFMT_REG,
  50        DAVINCI_MCASP_ACLKXCTL_REG,
  51        DAVINCI_MCASP_ACLKRCTL_REG,
  52        DAVINCI_MCASP_AHCLKXCTL_REG,
  53        DAVINCI_MCASP_AHCLKRCTL_REG,
  54        DAVINCI_MCASP_PDIR_REG,
  55        DAVINCI_MCASP_RXMASK_REG,
  56        DAVINCI_MCASP_TXMASK_REG,
  57        DAVINCI_MCASP_RXTDM_REG,
  58        DAVINCI_MCASP_TXTDM_REG,
  59};
  60
  61struct davinci_mcasp_context {
  62        u32     config_regs[ARRAY_SIZE(context_regs)];
  63        u32     afifo_regs[2]; /* for read/write fifo control registers */
  64        u32     *xrsr_regs; /* for serializer configuration */
  65};
  66
  67struct davinci_mcasp {
  68        struct davinci_pcm_dma_params dma_params[2];
  69        struct snd_dmaengine_dai_dma_data dma_data[2];
  70        void __iomem *base;
  71        u32 fifo_base;
  72        struct device *dev;
  73
  74        /* McASP specific data */
  75        int     tdm_slots;
  76        u8      op_mode;
  77        u8      num_serializer;
  78        u8      *serial_dir;
  79        u8      version;
  80        u8      bclk_div;
  81        u16     bclk_lrclk_ratio;
  82        int     streams;
  83
  84        int     sysclk_freq;
  85        bool    bclk_master;
  86
  87        /* McASP FIFO related */
  88        u8      txnumevt;
  89        u8      rxnumevt;
  90
  91        bool    dat_port;
  92
  93#ifdef CONFIG_PM_SLEEP
  94        struct davinci_mcasp_context context;
  95#endif
  96};
  97
  98static inline void mcasp_set_bits(struct davinci_mcasp *mcasp, u32 offset,
  99                                  u32 val)
 100{
 101        void __iomem *reg = mcasp->base + offset;
 102        __raw_writel(__raw_readl(reg) | val, reg);
 103}
 104
 105static inline void mcasp_clr_bits(struct davinci_mcasp *mcasp, u32 offset,
 106                                  u32 val)
 107{
 108        void __iomem *reg = mcasp->base + offset;
 109        __raw_writel((__raw_readl(reg) & ~(val)), reg);
 110}
 111
 112static inline void mcasp_mod_bits(struct davinci_mcasp *mcasp, u32 offset,
 113                                  u32 val, u32 mask)
 114{
 115        void __iomem *reg = mcasp->base + offset;
 116        __raw_writel((__raw_readl(reg) & ~mask) | val, reg);
 117}
 118
 119static inline void mcasp_set_reg(struct davinci_mcasp *mcasp, u32 offset,
 120                                 u32 val)
 121{
 122        __raw_writel(val, mcasp->base + offset);
 123}
 124
 125static inline u32 mcasp_get_reg(struct davinci_mcasp *mcasp, u32 offset)
 126{
 127        return (u32)__raw_readl(mcasp->base + offset);
 128}
 129
 130static void mcasp_set_ctl_reg(struct davinci_mcasp *mcasp, u32 ctl_reg, u32 val)
 131{
 132        int i = 0;
 133
 134        mcasp_set_bits(mcasp, ctl_reg, val);
 135
 136        /* programming GBLCTL needs to read back from GBLCTL and verfiy */
 137        /* loop count is to avoid the lock-up */
 138        for (i = 0; i < 1000; i++) {
 139                if ((mcasp_get_reg(mcasp, ctl_reg) & val) == val)
 140                        break;
 141        }
 142
 143        if (i == 1000 && ((mcasp_get_reg(mcasp, ctl_reg) & val) != val))
 144                printk(KERN_ERR "GBLCTL write error\n");
 145}
 146
 147static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
 148{
 149        u32 rxfmctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG);
 150        u32 aclkxctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG);
 151
 152        return !(aclkxctl & TX_ASYNC) && rxfmctl & AFSRE;
 153}
 154
 155static void mcasp_start_rx(struct davinci_mcasp *mcasp)
 156{
 157        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
 158        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
 159
 160        /*
 161         * When ASYNC == 0 the transmit and receive sections operate
 162         * synchronously from the transmit clock and frame sync. We need to make
 163         * sure that the TX signlas are enabled when starting reception.
 164         */
 165        if (mcasp_is_synchronous(mcasp)) {
 166                mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
 167                mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
 168        }
 169
 170        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
 171        mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
 172
 173        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
 174        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
 175        mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
 176
 177        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
 178        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
 179
 180        if (mcasp_is_synchronous(mcasp))
 181                mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
 182}
 183
 184static void mcasp_start_tx(struct davinci_mcasp *mcasp)
 185{
 186        u8 offset = 0, i;
 187        u32 cnt;
 188
 189        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
 190        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
 191        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
 192        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
 193
 194        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
 195        mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
 196        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
 197        for (i = 0; i < mcasp->num_serializer; i++) {
 198                if (mcasp->serial_dir[i] == TX_MODE) {
 199                        offset = i;
 200                        break;
 201                }
 202        }
 203
 204        /* wait for TX ready */
 205        cnt = 0;
 206        while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(offset)) &
 207                 TXSTATE) && (cnt < 100000))
 208                cnt++;
 209
 210        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
 211}
 212
 213static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
 214{
 215        u32 reg;
 216
 217        mcasp->streams++;
 218
 219        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 220                if (mcasp->txnumevt) {  /* enable FIFO */
 221                        reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
 222                        mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
 223                        mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
 224                }
 225                mcasp_start_tx(mcasp);
 226        } else {
 227                if (mcasp->rxnumevt) {  /* enable FIFO */
 228                        reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
 229                        mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
 230                        mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
 231                }
 232                mcasp_start_rx(mcasp);
 233        }
 234}
 235
 236static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
 237{
 238        /*
 239         * In synchronous mode stop the TX clocks if no other stream is
 240         * running
 241         */
 242        if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
 243                mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0);
 244
 245        mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0);
 246        mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
 247}
 248
 249static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
 250{
 251        u32 val = 0;
 252
 253        /*
 254         * In synchronous mode keep TX clocks running if the capture stream is
 255         * still running.
 256         */
 257        if (mcasp_is_synchronous(mcasp) && mcasp->streams)
 258                val =  TXHCLKRST | TXCLKRST | TXFSRST;
 259
 260        mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val);
 261        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
 262}
 263
 264static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
 265{
 266        u32 reg;
 267
 268        mcasp->streams--;
 269
 270        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 271                if (mcasp->txnumevt) {  /* disable FIFO */
 272                        reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
 273                        mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
 274                }
 275                mcasp_stop_tx(mcasp);
 276        } else {
 277                if (mcasp->rxnumevt) {  /* disable FIFO */
 278                        reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
 279                        mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
 280                }
 281                mcasp_stop_rx(mcasp);
 282        }
 283}
 284
 285static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
 286                                         unsigned int fmt)
 287{
 288        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
 289        int ret = 0;
 290        u32 data_delay;
 291        bool fs_pol_rising;
 292        bool inv_fs = false;
 293
 294        pm_runtime_get_sync(mcasp->dev);
 295        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 296        case SND_SOC_DAIFMT_DSP_A:
 297                mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 298                mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 299                /* 1st data bit occur one ACLK cycle after the frame sync */
 300                data_delay = 1;
 301                break;
 302        case SND_SOC_DAIFMT_DSP_B:
 303        case SND_SOC_DAIFMT_AC97:
 304                mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 305                mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 306                /* No delay after FS */
 307                data_delay = 0;
 308                break;
 309        case SND_SOC_DAIFMT_I2S:
 310                /* configure a full-word SYNC pulse (LRCLK) */
 311                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 312                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 313                /* 1st data bit occur one ACLK cycle after the frame sync */
 314                data_delay = 1;
 315                /* FS need to be inverted */
 316                inv_fs = true;
 317                break;
 318        case SND_SOC_DAIFMT_LEFT_J:
 319                /* configure a full-word SYNC pulse (LRCLK) */
 320                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 321                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 322                /* No delay after FS */
 323                data_delay = 0;
 324                break;
 325        default:
 326                ret = -EINVAL;
 327                goto out;
 328        }
 329
 330        mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
 331                       FSXDLY(3));
 332        mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(data_delay),
 333                       FSRDLY(3));
 334
 335        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 336        case SND_SOC_DAIFMT_CBS_CFS:
 337                /* codec is clock and frame slave */
 338                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 339                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 340
 341                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 342                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 343
 344                mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
 345                mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
 346                mcasp->bclk_master = 1;
 347                break;
 348        case SND_SOC_DAIFMT_CBM_CFS:
 349                /* codec is clock master and frame slave */
 350                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 351                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 352
 353                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 354                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 355
 356                mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
 357                mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
 358                mcasp->bclk_master = 0;
 359                break;
 360        case SND_SOC_DAIFMT_CBM_CFM:
 361                /* codec is clock and frame master */
 362                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 363                mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 364
 365                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 366                mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 367
 368                mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
 369                               ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
 370                mcasp->bclk_master = 0;
 371                break;
 372        default:
 373                ret = -EINVAL;
 374                goto out;
 375        }
 376
 377        switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 378        case SND_SOC_DAIFMT_IB_NF:
 379                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 380                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 381                fs_pol_rising = true;
 382                break;
 383        case SND_SOC_DAIFMT_NB_IF:
 384                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 385                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 386                fs_pol_rising = false;
 387                break;
 388        case SND_SOC_DAIFMT_IB_IF:
 389                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 390                mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 391                fs_pol_rising = false;
 392                break;
 393        case SND_SOC_DAIFMT_NB_NF:
 394                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 395                mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 396                fs_pol_rising = true;
 397                break;
 398        default:
 399                ret = -EINVAL;
 400                goto out;
 401        }
 402
 403        if (inv_fs)
 404                fs_pol_rising = !fs_pol_rising;
 405
 406        if (fs_pol_rising) {
 407                mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 408                mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 409        } else {
 410                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 411                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 412        }
 413out:
 414        pm_runtime_put_sync(mcasp->dev);
 415        return ret;
 416}
 417
 418static int __davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
 419                                      int div, bool explicit)
 420{
 421        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
 422
 423        switch (div_id) {
 424        case 0:         /* MCLK divider */
 425                mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
 426                               AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
 427                mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
 428                               AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
 429                break;
 430
 431        case 1:         /* BCLK divider */
 432                mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG,
 433                               ACLKXDIV(div - 1), ACLKXDIV_MASK);
 434                mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
 435                               ACLKRDIV(div - 1), ACLKRDIV_MASK);
 436                if (explicit)
 437                        mcasp->bclk_div = div;
 438                break;
 439
 440        case 2:         /* BCLK/LRCLK ratio */
 441                mcasp->bclk_lrclk_ratio = div;
 442                break;
 443
 444        default:
 445                return -EINVAL;
 446        }
 447
 448        return 0;
 449}
 450
 451static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
 452                                    int div)
 453{
 454        return __davinci_mcasp_set_clkdiv(dai, div_id, div, 1);
 455}
 456
 457static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
 458                                    unsigned int freq, int dir)
 459{
 460        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
 461
 462        if (dir == SND_SOC_CLOCK_OUT) {
 463                mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
 464                mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
 465                mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
 466        } else {
 467                mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
 468                mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
 469                mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
 470        }
 471
 472        mcasp->sysclk_freq = freq;
 473
 474        return 0;
 475}
 476
 477static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
 478                                       int word_length)
 479{
 480        u32 fmt;
 481        u32 tx_rotate = (word_length / 4) & 0x7;
 482        u32 mask = (1ULL << word_length) - 1;
 483        /*
 484         * For captured data we should not rotate, inversion and masking is
 485         * enoguh to get the data to the right position:
 486         * Format         data from bus         after reverse (XRBUF)
 487         * S16_LE:      |LSB|MSB|xxx|xxx|       |xxx|xxx|MSB|LSB|
 488         * S24_3LE:     |LSB|DAT|MSB|xxx|       |xxx|MSB|DAT|LSB|
 489         * S24_LE:      |LSB|DAT|MSB|xxx|       |xxx|MSB|DAT|LSB|
 490         * S32_LE:      |LSB|DAT|DAT|MSB|       |MSB|DAT|DAT|LSB|
 491         */
 492        u32 rx_rotate = 0;
 493
 494        /*
 495         * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
 496         * callback, take it into account here. That allows us to for example
 497         * send 32 bits per channel to the codec, while only 16 of them carry
 498         * audio payload.
 499         * The clock ratio is given for a full period of data (for I2S format
 500         * both left and right channels), so it has to be divided by number of
 501         * tdm-slots (for I2S - divided by 2).
 502         */
 503        if (mcasp->bclk_lrclk_ratio)
 504                word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
 505
 506        /* mapping of the XSSZ bit-field as described in the datasheet */
 507        fmt = (word_length >> 1) - 1;
 508
 509        if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
 510                mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXSSZ(fmt),
 511                               RXSSZ(0x0F));
 512                mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(fmt),
 513                               TXSSZ(0x0F));
 514                mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate),
 515                               TXROT(7));
 516                mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate),
 517                               RXROT(7));
 518                mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask);
 519        }
 520
 521        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
 522
 523        return 0;
 524}
 525
 526static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
 527                                 int period_words, int channels)
 528{
 529        struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[stream];
 530        struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream];
 531        int i;
 532        u8 tx_ser = 0;
 533        u8 rx_ser = 0;
 534        u8 slots = mcasp->tdm_slots;
 535        u8 max_active_serializers = (channels + slots - 1) / slots;
 536        int active_serializers, numevt, n;
 537        u32 reg;
 538        /* Default configuration */
 539        if (mcasp->version < MCASP_VERSION_3)
 540                mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
 541
 542        /* All PINS as McASP */
 543        mcasp_set_reg(mcasp, DAVINCI_MCASP_PFUNC_REG, 0x00000000);
 544
 545        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 546                mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
 547                mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
 548        } else {
 549                mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
 550                mcasp_clr_bits(mcasp, DAVINCI_MCASP_REVTCTL_REG, RXDATADMADIS);
 551        }
 552
 553        for (i = 0; i < mcasp->num_serializer; i++) {
 554                mcasp_set_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
 555                               mcasp->serial_dir[i]);
 556                if (mcasp->serial_dir[i] == TX_MODE &&
 557                                        tx_ser < max_active_serializers) {
 558                        mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
 559                        tx_ser++;
 560                } else if (mcasp->serial_dir[i] == RX_MODE &&
 561                                        rx_ser < max_active_serializers) {
 562                        mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
 563                        rx_ser++;
 564                } else {
 565                        mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
 566                                       SRMOD_INACTIVE, SRMOD_MASK);
 567                }
 568        }
 569
 570        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 571                active_serializers = tx_ser;
 572                numevt = mcasp->txnumevt;
 573                reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
 574        } else {
 575                active_serializers = rx_ser;
 576                numevt = mcasp->rxnumevt;
 577                reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
 578        }
 579
 580        if (active_serializers < max_active_serializers) {
 581                dev_warn(mcasp->dev, "stream has more channels (%d) than are "
 582                         "enabled in mcasp (%d)\n", channels,
 583                         active_serializers * slots);
 584                return -EINVAL;
 585        }
 586
 587        /* AFIFO is not in use */
 588        if (!numevt) {
 589                /* Configure the burst size for platform drivers */
 590                if (active_serializers > 1) {
 591                        /*
 592                         * If more than one serializers are in use we have one
 593                         * DMA request to provide data for all serializers.
 594                         * For example if three serializers are enabled the DMA
 595                         * need to transfer three words per DMA request.
 596                         */
 597                        dma_params->fifo_level = active_serializers;
 598                        dma_data->maxburst = active_serializers;
 599                } else {
 600                        dma_params->fifo_level = 0;
 601                        dma_data->maxburst = 0;
 602                }
 603                return 0;
 604        }
 605
 606        if (period_words % active_serializers) {
 607                dev_err(mcasp->dev, "Invalid combination of period words and "
 608                        "active serializers: %d, %d\n", period_words,
 609                        active_serializers);
 610                return -EINVAL;
 611        }
 612
 613        /*
 614         * Calculate the optimal AFIFO depth for platform side:
 615         * The number of words for numevt need to be in steps of active
 616         * serializers.
 617         */
 618        n = numevt % active_serializers;
 619        if (n)
 620                numevt += (active_serializers - n);
 621        while (period_words % numevt && numevt > 0)
 622                numevt -= active_serializers;
 623        if (numevt <= 0)
 624                numevt = active_serializers;
 625
 626        mcasp_mod_bits(mcasp, reg, active_serializers, NUMDMA_MASK);
 627        mcasp_mod_bits(mcasp, reg, NUMEVT(numevt), NUMEVT_MASK);
 628
 629        /* Configure the burst size for platform drivers */
 630        if (numevt == 1)
 631                numevt = 0;
 632        dma_params->fifo_level = numevt;
 633        dma_data->maxburst = numevt;
 634
 635        return 0;
 636}
 637
 638static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream)
 639{
 640        int i, active_slots;
 641        u32 mask = 0;
 642        u32 busel = 0;
 643
 644        if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) {
 645                dev_err(mcasp->dev, "tdm slot %d not supported\n",
 646                        mcasp->tdm_slots);
 647                return -EINVAL;
 648        }
 649
 650        active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
 651        for (i = 0; i < active_slots; i++)
 652                mask |= (1 << i);
 653
 654        mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
 655
 656        if (!mcasp->dat_port)
 657                busel = TXSEL;
 658
 659        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask);
 660        mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD);
 661        mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG,
 662                       FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF));
 663
 664        mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask);
 665        mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD);
 666        mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG,
 667                       FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
 668
 669        return 0;
 670}
 671
 672/* S/PDIF */
 673static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp,
 674                              unsigned int rate)
 675{
 676        u32 cs_value = 0;
 677        u8 *cs_bytes = (u8*) &cs_value;
 678
 679        /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
 680           and LSB first */
 681        mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
 682
 683        /* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
 684        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE | FSXMOD(0x180));
 685
 686        /* Set the TX tdm : for all the slots */
 687        mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
 688
 689        /* Set the TX clock controls : div = 1 and internal */
 690        mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE | TX_ASYNC);
 691
 692        mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
 693
 694        /* Only 44100 and 48000 are valid, both have the same setting */
 695        mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
 696
 697        /* Enable the DIT */
 698        mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
 699
 700        /* Set S/PDIF channel status bits */
 701        cs_bytes[0] = IEC958_AES0_CON_NOT_COPYRIGHT;
 702        cs_bytes[1] = IEC958_AES1_CON_PCM_CODER;
 703
 704        switch (rate) {
 705        case 22050:
 706                cs_bytes[3] |= IEC958_AES3_CON_FS_22050;
 707                break;
 708        case 24000:
 709                cs_bytes[3] |= IEC958_AES3_CON_FS_24000;
 710                break;
 711        case 32000:
 712                cs_bytes[3] |= IEC958_AES3_CON_FS_32000;
 713                break;
 714        case 44100:
 715                cs_bytes[3] |= IEC958_AES3_CON_FS_44100;
 716                break;
 717        case 48000:
 718                cs_bytes[3] |= IEC958_AES3_CON_FS_48000;
 719                break;
 720        case 88200:
 721                cs_bytes[3] |= IEC958_AES3_CON_FS_88200;
 722                break;
 723        case 96000:
 724                cs_bytes[3] |= IEC958_AES3_CON_FS_96000;
 725                break;
 726        case 176400:
 727                cs_bytes[3] |= IEC958_AES3_CON_FS_176400;
 728                break;
 729        case 192000:
 730                cs_bytes[3] |= IEC958_AES3_CON_FS_192000;
 731                break;
 732        default:
 733                printk(KERN_WARNING "unsupported sampling rate: %d\n", rate);
 734                return -EINVAL;
 735        }
 736
 737        mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, cs_value);
 738        mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, cs_value);
 739
 740        return 0;
 741}
 742
 743static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
 744                                        struct snd_pcm_hw_params *params,
 745                                        struct snd_soc_dai *cpu_dai)
 746{
 747        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
 748        struct davinci_pcm_dma_params *dma_params =
 749                                        &mcasp->dma_params[substream->stream];
 750        int word_length;
 751        int channels = params_channels(params);
 752        int period_size = params_period_size(params);
 753        int ret;
 754
 755        /*
 756         * If mcasp is BCLK master, and a BCLK divider was not provided by
 757         * the machine driver, we need to calculate the ratio.
 758         */
 759        if (mcasp->bclk_master && mcasp->bclk_div == 0 && mcasp->sysclk_freq) {
 760                unsigned int bclk_freq = snd_soc_params_to_bclk(params);
 761                unsigned int div = mcasp->sysclk_freq / bclk_freq;
 762                if (mcasp->sysclk_freq % bclk_freq != 0) {
 763                        if (((mcasp->sysclk_freq / div) - bclk_freq) >
 764                            (bclk_freq - (mcasp->sysclk_freq / (div+1))))
 765                                div++;
 766                        dev_warn(mcasp->dev,
 767                                 "Inaccurate BCLK: %u Hz / %u != %u Hz\n",
 768                                 mcasp->sysclk_freq, div, bclk_freq);
 769                }
 770                __davinci_mcasp_set_clkdiv(cpu_dai, 1, div, 0);
 771        }
 772
 773        ret = mcasp_common_hw_param(mcasp, substream->stream,
 774                                    period_size * channels, channels);
 775        if (ret)
 776                return ret;
 777
 778        if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
 779                ret = mcasp_dit_hw_param(mcasp, params_rate(params));
 780        else
 781                ret = mcasp_i2s_hw_param(mcasp, substream->stream);
 782
 783        if (ret)
 784                return ret;
 785
 786        switch (params_format(params)) {
 787        case SNDRV_PCM_FORMAT_U8:
 788        case SNDRV_PCM_FORMAT_S8:
 789                dma_params->data_type = 1;
 790                word_length = 8;
 791                break;
 792
 793        case SNDRV_PCM_FORMAT_U16_LE:
 794        case SNDRV_PCM_FORMAT_S16_LE:
 795                dma_params->data_type = 2;
 796                word_length = 16;
 797                break;
 798
 799        case SNDRV_PCM_FORMAT_U24_3LE:
 800        case SNDRV_PCM_FORMAT_S24_3LE:
 801                dma_params->data_type = 3;
 802                word_length = 24;
 803                break;
 804
 805        case SNDRV_PCM_FORMAT_U24_LE:
 806        case SNDRV_PCM_FORMAT_S24_LE:
 807                dma_params->data_type = 4;
 808                word_length = 24;
 809                break;
 810
 811        case SNDRV_PCM_FORMAT_U32_LE:
 812        case SNDRV_PCM_FORMAT_S32_LE:
 813                dma_params->data_type = 4;
 814                word_length = 32;
 815                break;
 816
 817        default:
 818                printk(KERN_WARNING "davinci-mcasp: unsupported PCM format");
 819                return -EINVAL;
 820        }
 821
 822        if (mcasp->version == MCASP_VERSION_2 && !dma_params->fifo_level)
 823                dma_params->acnt = 4;
 824        else
 825                dma_params->acnt = dma_params->data_type;
 826
 827        davinci_config_channel_size(mcasp, word_length);
 828
 829        return 0;
 830}
 831
 832static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
 833                                     int cmd, struct snd_soc_dai *cpu_dai)
 834{
 835        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
 836        int ret = 0;
 837
 838        switch (cmd) {
 839        case SNDRV_PCM_TRIGGER_RESUME:
 840        case SNDRV_PCM_TRIGGER_START:
 841        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 842                davinci_mcasp_start(mcasp, substream->stream);
 843                break;
 844        case SNDRV_PCM_TRIGGER_SUSPEND:
 845        case SNDRV_PCM_TRIGGER_STOP:
 846        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 847                davinci_mcasp_stop(mcasp, substream->stream);
 848                break;
 849
 850        default:
 851                ret = -EINVAL;
 852        }
 853
 854        return ret;
 855}
 856
 857static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
 858        .trigger        = davinci_mcasp_trigger,
 859        .hw_params      = davinci_mcasp_hw_params,
 860        .set_fmt        = davinci_mcasp_set_dai_fmt,
 861        .set_clkdiv     = davinci_mcasp_set_clkdiv,
 862        .set_sysclk     = davinci_mcasp_set_sysclk,
 863};
 864
 865static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai)
 866{
 867        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
 868
 869        if (mcasp->version >= MCASP_VERSION_3) {
 870                /* Using dmaengine PCM */
 871                dai->playback_dma_data =
 872                                &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
 873                dai->capture_dma_data =
 874                                &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
 875        } else {
 876                /* Using davinci-pcm */
 877                dai->playback_dma_data = mcasp->dma_params;
 878                dai->capture_dma_data = mcasp->dma_params;
 879        }
 880
 881        return 0;
 882}
 883
 884#ifdef CONFIG_PM_SLEEP
 885static int davinci_mcasp_suspend(struct snd_soc_dai *dai)
 886{
 887        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
 888        struct davinci_mcasp_context *context = &mcasp->context;
 889        u32 reg;
 890        int i;
 891
 892        for (i = 0; i < ARRAY_SIZE(context_regs); i++)
 893                context->config_regs[i] = mcasp_get_reg(mcasp, context_regs[i]);
 894
 895        if (mcasp->txnumevt) {
 896                reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
 897                context->afifo_regs[0] = mcasp_get_reg(mcasp, reg);
 898        }
 899        if (mcasp->rxnumevt) {
 900                reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
 901                context->afifo_regs[1] = mcasp_get_reg(mcasp, reg);
 902        }
 903
 904        for (i = 0; i < mcasp->num_serializer; i++)
 905                context->xrsr_regs[i] = mcasp_get_reg(mcasp,
 906                                                DAVINCI_MCASP_XRSRCTL_REG(i));
 907
 908        return 0;
 909}
 910
 911static int davinci_mcasp_resume(struct snd_soc_dai *dai)
 912{
 913        struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
 914        struct davinci_mcasp_context *context = &mcasp->context;
 915        u32 reg;
 916        int i;
 917
 918        for (i = 0; i < ARRAY_SIZE(context_regs); i++)
 919                mcasp_set_reg(mcasp, context_regs[i], context->config_regs[i]);
 920
 921        if (mcasp->txnumevt) {
 922                reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
 923                mcasp_set_reg(mcasp, reg, context->afifo_regs[0]);
 924        }
 925        if (mcasp->rxnumevt) {
 926                reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
 927                mcasp_set_reg(mcasp, reg, context->afifo_regs[1]);
 928        }
 929
 930        for (i = 0; i < mcasp->num_serializer; i++)
 931                mcasp_set_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
 932                              context->xrsr_regs[i]);
 933
 934        return 0;
 935}
 936#else
 937#define davinci_mcasp_suspend NULL
 938#define davinci_mcasp_resume NULL
 939#endif
 940
 941#define DAVINCI_MCASP_RATES     SNDRV_PCM_RATE_8000_192000
 942
 943#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
 944                                SNDRV_PCM_FMTBIT_U8 | \
 945                                SNDRV_PCM_FMTBIT_S16_LE | \
 946                                SNDRV_PCM_FMTBIT_U16_LE | \
 947                                SNDRV_PCM_FMTBIT_S24_LE | \
 948                                SNDRV_PCM_FMTBIT_U24_LE | \
 949                                SNDRV_PCM_FMTBIT_S24_3LE | \
 950                                SNDRV_PCM_FMTBIT_U24_3LE | \
 951                                SNDRV_PCM_FMTBIT_S32_LE | \
 952                                SNDRV_PCM_FMTBIT_U32_LE)
 953
 954static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
 955        {
 956                .name           = "davinci-mcasp.0",
 957                .probe          = davinci_mcasp_dai_probe,
 958                .suspend        = davinci_mcasp_suspend,
 959                .resume         = davinci_mcasp_resume,
 960                .playback       = {
 961                        .channels_min   = 2,
 962                        .channels_max   = 32 * 16,
 963                        .rates          = DAVINCI_MCASP_RATES,
 964                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 965                },
 966                .capture        = {
 967                        .channels_min   = 2,
 968                        .channels_max   = 32 * 16,
 969                        .rates          = DAVINCI_MCASP_RATES,
 970                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 971                },
 972                .ops            = &davinci_mcasp_dai_ops,
 973
 974        },
 975        {
 976                .name           = "davinci-mcasp.1",
 977                .probe          = davinci_mcasp_dai_probe,
 978                .playback       = {
 979                        .channels_min   = 1,
 980                        .channels_max   = 384,
 981                        .rates          = DAVINCI_MCASP_RATES,
 982                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 983                },
 984                .ops            = &davinci_mcasp_dai_ops,
 985        },
 986
 987};
 988
 989static const struct snd_soc_component_driver davinci_mcasp_component = {
 990        .name           = "davinci-mcasp",
 991};
 992
 993/* Some HW specific values and defaults. The rest is filled in from DT. */
 994static struct davinci_mcasp_pdata dm646x_mcasp_pdata = {
 995        .tx_dma_offset = 0x400,
 996        .rx_dma_offset = 0x400,
 997        .asp_chan_q = EVENTQ_0,
 998        .version = MCASP_VERSION_1,
 999};
1000
1001static struct davinci_mcasp_pdata da830_mcasp_pdata = {
1002        .tx_dma_offset = 0x2000,
1003        .rx_dma_offset = 0x2000,
1004        .asp_chan_q = EVENTQ_0,
1005        .version = MCASP_VERSION_2,
1006};
1007
1008static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
1009        .tx_dma_offset = 0,
1010        .rx_dma_offset = 0,
1011        .asp_chan_q = EVENTQ_0,
1012        .version = MCASP_VERSION_3,
1013};
1014
1015static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
1016        .tx_dma_offset = 0x200,
1017        .rx_dma_offset = 0x284,
1018        .asp_chan_q = EVENTQ_0,
1019        .version = MCASP_VERSION_4,
1020};
1021
1022static const struct of_device_id mcasp_dt_ids[] = {
1023        {
1024                .compatible = "ti,dm646x-mcasp-audio",
1025                .data = &dm646x_mcasp_pdata,
1026        },
1027        {
1028                .compatible = "ti,da830-mcasp-audio",
1029                .data = &da830_mcasp_pdata,
1030        },
1031        {
1032                .compatible = "ti,am33xx-mcasp-audio",
1033                .data = &am33xx_mcasp_pdata,
1034        },
1035        {
1036                .compatible = "ti,dra7-mcasp-audio",
1037                .data = &dra7_mcasp_pdata,
1038        },
1039        { /* sentinel */ }
1040};
1041MODULE_DEVICE_TABLE(of, mcasp_dt_ids);
1042
1043static int mcasp_reparent_fck(struct platform_device *pdev)
1044{
1045        struct device_node *node = pdev->dev.of_node;
1046        struct clk *gfclk, *parent_clk;
1047        const char *parent_name;
1048        int ret;
1049
1050        if (!node)
1051                return 0;
1052
1053        parent_name = of_get_property(node, "fck_parent", NULL);
1054        if (!parent_name)
1055                return 0;
1056
1057        gfclk = clk_get(&pdev->dev, "fck");
1058        if (IS_ERR(gfclk)) {
1059                dev_err(&pdev->dev, "failed to get fck\n");
1060                return PTR_ERR(gfclk);
1061        }
1062
1063        parent_clk = clk_get(NULL, parent_name);
1064        if (IS_ERR(parent_clk)) {
1065                dev_err(&pdev->dev, "failed to get parent clock\n");
1066                ret = PTR_ERR(parent_clk);
1067                goto err1;
1068        }
1069
1070        ret = clk_set_parent(gfclk, parent_clk);
1071        if (ret) {
1072                dev_err(&pdev->dev, "failed to reparent fck\n");
1073                goto err2;
1074        }
1075
1076err2:
1077        clk_put(parent_clk);
1078err1:
1079        clk_put(gfclk);
1080        return ret;
1081}
1082
1083static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
1084                                                struct platform_device *pdev)
1085{
1086        struct device_node *np = pdev->dev.of_node;
1087        struct davinci_mcasp_pdata *pdata = NULL;
1088        const struct of_device_id *match =
1089                        of_match_device(mcasp_dt_ids, &pdev->dev);
1090        struct of_phandle_args dma_spec;
1091
1092        const u32 *of_serial_dir32;
1093        u32 val;
1094        int i, ret = 0;
1095
1096        if (pdev->dev.platform_data) {
1097                pdata = pdev->dev.platform_data;
1098                return pdata;
1099        } else if (match) {
1100                pdata = (struct davinci_mcasp_pdata*) match->data;
1101        } else {
1102                /* control shouldn't reach here. something is wrong */
1103                ret = -EINVAL;
1104                goto nodata;
1105        }
1106
1107        ret = of_property_read_u32(np, "op-mode", &val);
1108        if (ret >= 0)
1109                pdata->op_mode = val;
1110
1111        ret = of_property_read_u32(np, "tdm-slots", &val);
1112        if (ret >= 0) {
1113                if (val < 2 || val > 32) {
1114                        dev_err(&pdev->dev,
1115                                "tdm-slots must be in rage [2-32]\n");
1116                        ret = -EINVAL;
1117                        goto nodata;
1118                }
1119
1120                pdata->tdm_slots = val;
1121        }
1122
1123        of_serial_dir32 = of_get_property(np, "serial-dir", &val);
1124        val /= sizeof(u32);
1125        if (of_serial_dir32) {
1126                u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
1127                                                 (sizeof(*of_serial_dir) * val),
1128                                                 GFP_KERNEL);
1129                if (!of_serial_dir) {
1130                        ret = -ENOMEM;
1131                        goto nodata;
1132                }
1133
1134                for (i = 0; i < val; i++)
1135                        of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);
1136
1137                pdata->num_serializer = val;
1138                pdata->serial_dir = of_serial_dir;
1139        }
1140
1141        ret = of_property_match_string(np, "dma-names", "tx");
1142        if (ret < 0)
1143                goto nodata;
1144
1145        ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
1146                                         &dma_spec);
1147        if (ret < 0)
1148                goto nodata;
1149
1150        pdata->tx_dma_channel = dma_spec.args[0];
1151
1152        ret = of_property_match_string(np, "dma-names", "rx");
1153        if (ret < 0)
1154                goto nodata;
1155
1156        ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
1157                                         &dma_spec);
1158        if (ret < 0)
1159                goto nodata;
1160
1161        pdata->rx_dma_channel = dma_spec.args[0];
1162
1163        ret = of_property_read_u32(np, "tx-num-evt", &val);
1164        if (ret >= 0)
1165                pdata->txnumevt = val;
1166
1167        ret = of_property_read_u32(np, "rx-num-evt", &val);
1168        if (ret >= 0)
1169                pdata->rxnumevt = val;
1170
1171        ret = of_property_read_u32(np, "sram-size-playback", &val);
1172        if (ret >= 0)
1173                pdata->sram_size_playback = val;
1174
1175        ret = of_property_read_u32(np, "sram-size-capture", &val);
1176        if (ret >= 0)
1177                pdata->sram_size_capture = val;
1178
1179        return  pdata;
1180
1181nodata:
1182        if (ret < 0) {
1183                dev_err(&pdev->dev, "Error populating platform data, err %d\n",
1184                        ret);
1185                pdata = NULL;
1186        }
1187        return  pdata;
1188}
1189
1190static int davinci_mcasp_probe(struct platform_device *pdev)
1191{
1192        struct davinci_pcm_dma_params *dma_params;
1193        struct snd_dmaengine_dai_dma_data *dma_data;
1194        struct resource *mem, *ioarea, *res, *dat;
1195        struct davinci_mcasp_pdata *pdata;
1196        struct davinci_mcasp *mcasp;
1197        int ret;
1198
1199        if (!pdev->dev.platform_data && !pdev->dev.of_node) {
1200                dev_err(&pdev->dev, "No platform data supplied\n");
1201                return -EINVAL;
1202        }
1203
1204        mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
1205                           GFP_KERNEL);
1206        if (!mcasp)
1207                return  -ENOMEM;
1208
1209        pdata = davinci_mcasp_set_pdata_from_of(pdev);
1210        if (!pdata) {
1211                dev_err(&pdev->dev, "no platform data\n");
1212                return -EINVAL;
1213        }
1214
1215        mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
1216        if (!mem) {
1217                dev_warn(mcasp->dev,
1218                         "\"mpu\" mem resource not found, using index 0\n");
1219                mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1220                if (!mem) {
1221                        dev_err(&pdev->dev, "no mem resource?\n");
1222                        return -ENODEV;
1223                }
1224        }
1225
1226        ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1227                        resource_size(mem), pdev->name);
1228        if (!ioarea) {
1229                dev_err(&pdev->dev, "Audio region already claimed\n");
1230                return -EBUSY;
1231        }
1232
1233        pm_runtime_enable(&pdev->dev);
1234
1235        ret = pm_runtime_get_sync(&pdev->dev);
1236        if (IS_ERR_VALUE(ret)) {
1237                dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
1238                return ret;
1239        }
1240
1241        mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
1242        if (!mcasp->base) {
1243                dev_err(&pdev->dev, "ioremap failed\n");
1244                ret = -ENOMEM;
1245                goto err;
1246        }
1247
1248        mcasp->op_mode = pdata->op_mode;
1249        mcasp->tdm_slots = pdata->tdm_slots;
1250        mcasp->num_serializer = pdata->num_serializer;
1251#ifdef CONFIG_PM_SLEEP
1252        mcasp->context.xrsr_regs = devm_kzalloc(&pdev->dev,
1253                                        sizeof(u32) * mcasp->num_serializer,
1254                                        GFP_KERNEL);
1255#endif
1256        mcasp->serial_dir = pdata->serial_dir;
1257        mcasp->version = pdata->version;
1258        mcasp->txnumevt = pdata->txnumevt;
1259        mcasp->rxnumevt = pdata->rxnumevt;
1260
1261        mcasp->dev = &pdev->dev;
1262
1263        dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1264        if (dat)
1265                mcasp->dat_port = true;
1266
1267        dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1268        dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
1269        dma_params->asp_chan_q = pdata->asp_chan_q;
1270        dma_params->ram_chan_q = pdata->ram_chan_q;
1271        dma_params->sram_pool = pdata->sram_pool;
1272        dma_params->sram_size = pdata->sram_size_playback;
1273        if (dat)
1274                dma_params->dma_addr = dat->start;
1275        else
1276                dma_params->dma_addr = mem->start + pdata->tx_dma_offset;
1277
1278        /* Unconditional dmaengine stuff */
1279        dma_data->addr = dma_params->dma_addr;
1280
1281        res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1282        if (res)
1283                dma_params->channel = res->start;
1284        else
1285                dma_params->channel = pdata->tx_dma_channel;
1286
1287        /* dmaengine filter data for DT and non-DT boot */
1288        if (pdev->dev.of_node)
1289                dma_data->filter_data = "tx";
1290        else
1291                dma_data->filter_data = &dma_params->channel;
1292
1293        dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1294        dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
1295        dma_params->asp_chan_q = pdata->asp_chan_q;
1296        dma_params->ram_chan_q = pdata->ram_chan_q;
1297        dma_params->sram_pool = pdata->sram_pool;
1298        dma_params->sram_size = pdata->sram_size_capture;
1299        if (dat)
1300                dma_params->dma_addr = dat->start;
1301        else
1302                dma_params->dma_addr = mem->start + pdata->rx_dma_offset;
1303
1304        /* Unconditional dmaengine stuff */
1305        dma_data->addr = dma_params->dma_addr;
1306
1307        if (mcasp->version < MCASP_VERSION_3) {
1308                mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
1309                /* dma_params->dma_addr is pointing to the data port address */
1310                mcasp->dat_port = true;
1311        } else {
1312                mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
1313        }
1314
1315        res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1316        if (res)
1317                dma_params->channel = res->start;
1318        else
1319                dma_params->channel = pdata->rx_dma_channel;
1320
1321        /* dmaengine filter data for DT and non-DT boot */
1322        if (pdev->dev.of_node)
1323                dma_data->filter_data = "rx";
1324        else
1325                dma_data->filter_data = &dma_params->channel;
1326
1327        dev_set_drvdata(&pdev->dev, mcasp);
1328
1329        mcasp_reparent_fck(pdev);
1330
1331        ret = devm_snd_soc_register_component(&pdev->dev,
1332                                        &davinci_mcasp_component,
1333                                        &davinci_mcasp_dai[pdata->op_mode], 1);
1334
1335        if (ret != 0)
1336                goto err;
1337
1338        switch (mcasp->version) {
1339#if IS_BUILTIN(CONFIG_SND_DAVINCI_SOC) || \
1340        (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
1341         IS_MODULE(CONFIG_SND_DAVINCI_SOC))
1342        case MCASP_VERSION_1:
1343        case MCASP_VERSION_2:
1344                ret = davinci_soc_platform_register(&pdev->dev);
1345                break;
1346#endif
1347#if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \
1348        (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
1349         IS_MODULE(CONFIG_SND_EDMA_SOC))
1350        case MCASP_VERSION_3:
1351                ret = edma_pcm_platform_register(&pdev->dev);
1352                break;
1353#endif
1354#if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \
1355        (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
1356         IS_MODULE(CONFIG_SND_OMAP_SOC))
1357        case MCASP_VERSION_4:
1358                ret = omap_pcm_platform_register(&pdev->dev);
1359                break;
1360#endif
1361        default:
1362                dev_err(&pdev->dev, "Invalid McASP version: %d\n",
1363                        mcasp->version);
1364                ret = -EINVAL;
1365                break;
1366        }
1367
1368        if (ret) {
1369                dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
1370                goto err;
1371        }
1372
1373        return 0;
1374
1375err:
1376        pm_runtime_put_sync(&pdev->dev);
1377        pm_runtime_disable(&pdev->dev);
1378        return ret;
1379}
1380
1381static int davinci_mcasp_remove(struct platform_device *pdev)
1382{
1383        pm_runtime_put_sync(&pdev->dev);
1384        pm_runtime_disable(&pdev->dev);
1385
1386        return 0;
1387}
1388
1389static struct platform_driver davinci_mcasp_driver = {
1390        .probe          = davinci_mcasp_probe,
1391        .remove         = davinci_mcasp_remove,
1392        .driver         = {
1393                .name   = "davinci-mcasp",
1394                .owner  = THIS_MODULE,
1395                .of_match_table = mcasp_dt_ids,
1396        },
1397};
1398
1399module_platform_driver(davinci_mcasp_driver);
1400
1401MODULE_AUTHOR("Steve Chen");
1402MODULE_DESCRIPTION("TI DAVINCI McASP SoC Interface");
1403MODULE_LICENSE("GPL");
1404