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/pm_runtime.h>
  25#include <linux/of.h>
  26#include <linux/of_platform.h>
  27#include <linux/of_device.h>
  28
  29#include <sound/core.h>
  30#include <sound/pcm.h>
  31#include <sound/pcm_params.h>
  32#include <sound/initval.h>
  33#include <sound/soc.h>
  34
  35#include "davinci-pcm.h"
  36#include "davinci-mcasp.h"
  37
  38/*
  39 * McASP register definitions
  40 */
  41#define DAVINCI_MCASP_PID_REG           0x00
  42#define DAVINCI_MCASP_PWREMUMGT_REG     0x04
  43
  44#define DAVINCI_MCASP_PFUNC_REG         0x10
  45#define DAVINCI_MCASP_PDIR_REG          0x14
  46#define DAVINCI_MCASP_PDOUT_REG         0x18
  47#define DAVINCI_MCASP_PDSET_REG         0x1c
  48
  49#define DAVINCI_MCASP_PDCLR_REG         0x20
  50
  51#define DAVINCI_MCASP_TLGC_REG          0x30
  52#define DAVINCI_MCASP_TLMR_REG          0x34
  53
  54#define DAVINCI_MCASP_GBLCTL_REG        0x44
  55#define DAVINCI_MCASP_AMUTE_REG         0x48
  56#define DAVINCI_MCASP_LBCTL_REG         0x4c
  57
  58#define DAVINCI_MCASP_TXDITCTL_REG      0x50
  59
  60#define DAVINCI_MCASP_GBLCTLR_REG       0x60
  61#define DAVINCI_MCASP_RXMASK_REG        0x64
  62#define DAVINCI_MCASP_RXFMT_REG         0x68
  63#define DAVINCI_MCASP_RXFMCTL_REG       0x6c
  64
  65#define DAVINCI_MCASP_ACLKRCTL_REG      0x70
  66#define DAVINCI_MCASP_AHCLKRCTL_REG     0x74
  67#define DAVINCI_MCASP_RXTDM_REG         0x78
  68#define DAVINCI_MCASP_EVTCTLR_REG       0x7c
  69
  70#define DAVINCI_MCASP_RXSTAT_REG        0x80
  71#define DAVINCI_MCASP_RXTDMSLOT_REG     0x84
  72#define DAVINCI_MCASP_RXCLKCHK_REG      0x88
  73#define DAVINCI_MCASP_REVTCTL_REG       0x8c
  74
  75#define DAVINCI_MCASP_GBLCTLX_REG       0xa0
  76#define DAVINCI_MCASP_TXMASK_REG        0xa4
  77#define DAVINCI_MCASP_TXFMT_REG         0xa8
  78#define DAVINCI_MCASP_TXFMCTL_REG       0xac
  79
  80#define DAVINCI_MCASP_ACLKXCTL_REG      0xb0
  81#define DAVINCI_MCASP_AHCLKXCTL_REG     0xb4
  82#define DAVINCI_MCASP_TXTDM_REG         0xb8
  83#define DAVINCI_MCASP_EVTCTLX_REG       0xbc
  84
  85#define DAVINCI_MCASP_TXSTAT_REG        0xc0
  86#define DAVINCI_MCASP_TXTDMSLOT_REG     0xc4
  87#define DAVINCI_MCASP_TXCLKCHK_REG      0xc8
  88#define DAVINCI_MCASP_XEVTCTL_REG       0xcc
  89
  90/* Left(even TDM Slot) Channel Status Register File */
  91#define DAVINCI_MCASP_DITCSRA_REG       0x100
  92/* Right(odd TDM slot) Channel Status Register File */
  93#define DAVINCI_MCASP_DITCSRB_REG       0x118
  94/* Left(even TDM slot) User Data Register File */
  95#define DAVINCI_MCASP_DITUDRA_REG       0x130
  96/* Right(odd TDM Slot) User Data Register File */
  97#define DAVINCI_MCASP_DITUDRB_REG       0x148
  98
  99/* Serializer n Control Register */
 100#define DAVINCI_MCASP_XRSRCTL_BASE_REG  0x180
 101#define DAVINCI_MCASP_XRSRCTL_REG(n)    (DAVINCI_MCASP_XRSRCTL_BASE_REG + \
 102                                                (n << 2))
 103
 104/* Transmit Buffer for Serializer n */
 105#define DAVINCI_MCASP_TXBUF_REG         0x200
 106/* Receive Buffer for Serializer n */
 107#define DAVINCI_MCASP_RXBUF_REG         0x280
 108
 109/* McASP FIFO Registers */
 110#define DAVINCI_MCASP_WFIFOCTL          (0x1010)
 111#define DAVINCI_MCASP_WFIFOSTS          (0x1014)
 112#define DAVINCI_MCASP_RFIFOCTL          (0x1018)
 113#define DAVINCI_MCASP_RFIFOSTS          (0x101C)
 114#define MCASP_VER3_WFIFOCTL             (0x1000)
 115#define MCASP_VER3_WFIFOSTS             (0x1004)
 116#define MCASP_VER3_RFIFOCTL             (0x1008)
 117#define MCASP_VER3_RFIFOSTS             (0x100C)
 118
 119/*
 120 * DAVINCI_MCASP_PWREMUMGT_REG - Power Down and Emulation Management
 121 *     Register Bits
 122 */
 123#define MCASP_FREE      BIT(0)
 124#define MCASP_SOFT      BIT(1)
 125
 126/*
 127 * DAVINCI_MCASP_PFUNC_REG - Pin Function / GPIO Enable Register Bits
 128 */
 129#define AXR(n)          (1<<n)
 130#define PFUNC_AMUTE     BIT(25)
 131#define ACLKX           BIT(26)
 132#define AHCLKX          BIT(27)
 133#define AFSX            BIT(28)
 134#define ACLKR           BIT(29)
 135#define AHCLKR          BIT(30)
 136#define AFSR            BIT(31)
 137
 138/*
 139 * DAVINCI_MCASP_PDIR_REG - Pin Direction Register Bits
 140 */
 141#define AXR(n)          (1<<n)
 142#define PDIR_AMUTE      BIT(25)
 143#define ACLKX           BIT(26)
 144#define AHCLKX          BIT(27)
 145#define AFSX            BIT(28)
 146#define ACLKR           BIT(29)
 147#define AHCLKR          BIT(30)
 148#define AFSR            BIT(31)
 149
 150/*
 151 * DAVINCI_MCASP_TXDITCTL_REG - Transmit DIT Control Register Bits
 152 */
 153#define DITEN   BIT(0)  /* Transmit DIT mode enable/disable */
 154#define VA      BIT(2)
 155#define VB      BIT(3)
 156
 157/*
 158 * DAVINCI_MCASP_TXFMT_REG - Transmit Bitstream Format Register Bits
 159 */
 160#define TXROT(val)      (val)
 161#define TXSEL           BIT(3)
 162#define TXSSZ(val)      (val<<4)
 163#define TXPBIT(val)     (val<<8)
 164#define TXPAD(val)      (val<<13)
 165#define TXORD           BIT(15)
 166#define FSXDLY(val)     (val<<16)
 167
 168/*
 169 * DAVINCI_MCASP_RXFMT_REG - Receive Bitstream Format Register Bits
 170 */
 171#define RXROT(val)      (val)
 172#define RXSEL           BIT(3)
 173#define RXSSZ(val)      (val<<4)
 174#define RXPBIT(val)     (val<<8)
 175#define RXPAD(val)      (val<<13)
 176#define RXORD           BIT(15)
 177#define FSRDLY(val)     (val<<16)
 178
 179/*
 180 * DAVINCI_MCASP_TXFMCTL_REG -  Transmit Frame Control Register Bits
 181 */
 182#define FSXPOL          BIT(0)
 183#define AFSXE           BIT(1)
 184#define FSXDUR          BIT(4)
 185#define FSXMOD(val)     (val<<7)
 186
 187/*
 188 * DAVINCI_MCASP_RXFMCTL_REG - Receive Frame Control Register Bits
 189 */
 190#define FSRPOL          BIT(0)
 191#define AFSRE           BIT(1)
 192#define FSRDUR          BIT(4)
 193#define FSRMOD(val)     (val<<7)
 194
 195/*
 196 * DAVINCI_MCASP_ACLKXCTL_REG - Transmit Clock Control Register Bits
 197 */
 198#define ACLKXDIV(val)   (val)
 199#define ACLKXE          BIT(5)
 200#define TX_ASYNC        BIT(6)
 201#define ACLKXPOL        BIT(7)
 202#define ACLKXDIV_MASK   0x1f
 203
 204/*
 205 * DAVINCI_MCASP_ACLKRCTL_REG Receive Clock Control Register Bits
 206 */
 207#define ACLKRDIV(val)   (val)
 208#define ACLKRE          BIT(5)
 209#define RX_ASYNC        BIT(6)
 210#define ACLKRPOL        BIT(7)
 211#define ACLKRDIV_MASK   0x1f
 212
 213/*
 214 * DAVINCI_MCASP_AHCLKXCTL_REG - High Frequency Transmit Clock Control
 215 *     Register Bits
 216 */
 217#define AHCLKXDIV(val)  (val)
 218#define AHCLKXPOL       BIT(14)
 219#define AHCLKXE         BIT(15)
 220#define AHCLKXDIV_MASK  0xfff
 221
 222/*
 223 * DAVINCI_MCASP_AHCLKRCTL_REG - High Frequency Receive Clock Control
 224 *     Register Bits
 225 */
 226#define AHCLKRDIV(val)  (val)
 227#define AHCLKRPOL       BIT(14)
 228#define AHCLKRE         BIT(15)
 229#define AHCLKRDIV_MASK  0xfff
 230
 231/*
 232 * DAVINCI_MCASP_XRSRCTL_BASE_REG -  Serializer Control Register Bits
 233 */
 234#define MODE(val)       (val)
 235#define DISMOD          (val)(val<<2)
 236#define TXSTATE         BIT(4)
 237#define RXSTATE         BIT(5)
 238
 239/*
 240 * DAVINCI_MCASP_LBCTL_REG - Loop Back Control Register Bits
 241 */
 242#define LBEN            BIT(0)
 243#define LBORD           BIT(1)
 244#define LBGENMODE(val)  (val<<2)
 245
 246/*
 247 * DAVINCI_MCASP_TXTDMSLOT_REG - Transmit TDM Slot Register configuration
 248 */
 249#define TXTDMS(n)       (1<<n)
 250
 251/*
 252 * DAVINCI_MCASP_RXTDMSLOT_REG - Receive TDM Slot Register configuration
 253 */
 254#define RXTDMS(n)       (1<<n)
 255
 256/*
 257 * DAVINCI_MCASP_GBLCTL_REG -  Global Control Register Bits
 258 */
 259#define RXCLKRST        BIT(0)  /* Receiver Clock Divider Reset */
 260#define RXHCLKRST       BIT(1)  /* Receiver High Frequency Clock Divider */
 261#define RXSERCLR        BIT(2)  /* Receiver Serializer Clear */
 262#define RXSMRST         BIT(3)  /* Receiver State Machine Reset */
 263#define RXFSRST         BIT(4)  /* Frame Sync Generator Reset */
 264#define TXCLKRST        BIT(8)  /* Transmitter Clock Divider Reset */
 265#define TXHCLKRST       BIT(9)  /* Transmitter High Frequency Clock Divider*/
 266#define TXSERCLR        BIT(10) /* Transmit Serializer Clear */
 267#define TXSMRST         BIT(11) /* Transmitter State Machine Reset */
 268#define TXFSRST         BIT(12) /* Frame Sync Generator Reset */
 269
 270/*
 271 * DAVINCI_MCASP_AMUTE_REG -  Mute Control Register Bits
 272 */
 273#define MUTENA(val)     (val)
 274#define MUTEINPOL       BIT(2)
 275#define MUTEINENA       BIT(3)
 276#define MUTEIN          BIT(4)
 277#define MUTER           BIT(5)
 278#define MUTEX           BIT(6)
 279#define MUTEFSR         BIT(7)
 280#define MUTEFSX         BIT(8)
 281#define MUTEBADCLKR     BIT(9)
 282#define MUTEBADCLKX     BIT(10)
 283#define MUTERXDMAERR    BIT(11)
 284#define MUTETXDMAERR    BIT(12)
 285
 286/*
 287 * DAVINCI_MCASP_REVTCTL_REG - Receiver DMA Event Control Register bits
 288 */
 289#define RXDATADMADIS    BIT(0)
 290
 291/*
 292 * DAVINCI_MCASP_XEVTCTL_REG - Transmitter DMA Event Control Register bits
 293 */
 294#define TXDATADMADIS    BIT(0)
 295
 296/*
 297 * DAVINCI_MCASP_W[R]FIFOCTL - Write/Read FIFO Control Register bits
 298 */
 299#define FIFO_ENABLE     BIT(16)
 300#define NUMEVT_MASK     (0xFF << 8)
 301#define NUMDMA_MASK     (0xFF)
 302
 303#define DAVINCI_MCASP_NUM_SERIALIZER    16
 304
 305static inline void mcasp_set_bits(void __iomem *reg, u32 val)
 306{
 307        __raw_writel(__raw_readl(reg) | val, reg);
 308}
 309
 310static inline void mcasp_clr_bits(void __iomem *reg, u32 val)
 311{
 312        __raw_writel((__raw_readl(reg) & ~(val)), reg);
 313}
 314
 315static inline void mcasp_mod_bits(void __iomem *reg, u32 val, u32 mask)
 316{
 317        __raw_writel((__raw_readl(reg) & ~mask) | val, reg);
 318}
 319
 320static inline void mcasp_set_reg(void __iomem *reg, u32 val)
 321{
 322        __raw_writel(val, reg);
 323}
 324
 325static inline u32 mcasp_get_reg(void __iomem *reg)
 326{
 327        return (unsigned int)__raw_readl(reg);
 328}
 329
 330static inline void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
 331{
 332        int i = 0;
 333
 334        mcasp_set_bits(regs, val);
 335
 336        /* programming GBLCTL needs to read back from GBLCTL and verfiy */
 337        /* loop count is to avoid the lock-up */
 338        for (i = 0; i < 1000; i++) {
 339                if ((mcasp_get_reg(regs) & val) == val)
 340                        break;
 341        }
 342
 343        if (i == 1000 && ((mcasp_get_reg(regs) & val) != val))
 344                printk(KERN_ERR "GBLCTL write error\n");
 345}
 346
 347static void mcasp_start_rx(struct davinci_audio_dev *dev)
 348{
 349        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
 350        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
 351        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
 352        mcasp_set_reg(dev->base + DAVINCI_MCASP_RXBUF_REG, 0);
 353
 354        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
 355        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
 356        mcasp_set_reg(dev->base + DAVINCI_MCASP_RXBUF_REG, 0);
 357
 358        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
 359        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
 360}
 361
 362static void mcasp_start_tx(struct davinci_audio_dev *dev)
 363{
 364        u8 offset = 0, i;
 365        u32 cnt;
 366
 367        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
 368        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
 369        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
 370        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);
 371
 372        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
 373        mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
 374        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);
 375        for (i = 0; i < dev->num_serializer; i++) {
 376                if (dev->serial_dir[i] == TX_MODE) {
 377                        offset = i;
 378                        break;
 379                }
 380        }
 381
 382        /* wait for TX ready */
 383        cnt = 0;
 384        while (!(mcasp_get_reg(dev->base + DAVINCI_MCASP_XRSRCTL_REG(offset)) &
 385                 TXSTATE) && (cnt < 100000))
 386                cnt++;
 387
 388        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXBUF_REG, 0);
 389}
 390
 391static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream)
 392{
 393        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 394                if (dev->txnumevt) {    /* enable FIFO */
 395                        switch (dev->version) {
 396                        case MCASP_VERSION_3:
 397                                mcasp_clr_bits(dev->base + MCASP_VER3_WFIFOCTL,
 398                                                                FIFO_ENABLE);
 399                                mcasp_set_bits(dev->base + MCASP_VER3_WFIFOCTL,
 400                                                                FIFO_ENABLE);
 401                                break;
 402                        default:
 403                                mcasp_clr_bits(dev->base +
 404                                        DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
 405                                mcasp_set_bits(dev->base +
 406                                        DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
 407                        }
 408                }
 409                mcasp_start_tx(dev);
 410        } else {
 411                if (dev->rxnumevt) {    /* enable FIFO */
 412                        switch (dev->version) {
 413                        case MCASP_VERSION_3:
 414                                mcasp_clr_bits(dev->base + MCASP_VER3_RFIFOCTL,
 415                                                                FIFO_ENABLE);
 416                                mcasp_set_bits(dev->base + MCASP_VER3_RFIFOCTL,
 417                                                                FIFO_ENABLE);
 418                                break;
 419                        default:
 420                                mcasp_clr_bits(dev->base +
 421                                        DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
 422                                mcasp_set_bits(dev->base +
 423                                        DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
 424                        }
 425                }
 426                mcasp_start_rx(dev);
 427        }
 428}
 429
 430static void mcasp_stop_rx(struct davinci_audio_dev *dev)
 431{
 432        mcasp_set_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, 0);
 433        mcasp_set_reg(dev->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
 434}
 435
 436static void mcasp_stop_tx(struct davinci_audio_dev *dev)
 437{
 438        mcasp_set_reg(dev->base + DAVINCI_MCASP_GBLCTLX_REG, 0);
 439        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
 440}
 441
 442static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream)
 443{
 444        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 445                if (dev->txnumevt) {    /* disable FIFO */
 446                        switch (dev->version) {
 447                        case MCASP_VERSION_3:
 448                                mcasp_clr_bits(dev->base + MCASP_VER3_WFIFOCTL,
 449                                                                FIFO_ENABLE);
 450                                break;
 451                        default:
 452                                mcasp_clr_bits(dev->base +
 453                                        DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
 454                        }
 455                }
 456                mcasp_stop_tx(dev);
 457        } else {
 458                if (dev->rxnumevt) {    /* disable FIFO */
 459                        switch (dev->version) {
 460                        case MCASP_VERSION_3:
 461                                mcasp_clr_bits(dev->base + MCASP_VER3_RFIFOCTL,
 462                                                                FIFO_ENABLE);
 463                        break;
 464
 465                        default:
 466                                mcasp_clr_bits(dev->base +
 467                                        DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
 468                        }
 469                }
 470                mcasp_stop_rx(dev);
 471        }
 472}
 473
 474static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
 475                                         unsigned int fmt)
 476{
 477        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
 478        void __iomem *base = dev->base;
 479
 480        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 481        case SND_SOC_DAIFMT_DSP_B:
 482        case SND_SOC_DAIFMT_AC97:
 483                mcasp_clr_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 484                mcasp_clr_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 485                break;
 486        default:
 487                /* configure a full-word SYNC pulse (LRCLK) */
 488                mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
 489                mcasp_set_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 490
 491                /* make 1st data bit occur one ACLK cycle after the frame sync */
 492                mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
 493                mcasp_set_bits(dev->base + DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
 494                break;
 495        }
 496
 497        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 498        case SND_SOC_DAIFMT_CBS_CFS:
 499                /* codec is clock and frame slave */
 500                mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 501                mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 502
 503                mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 504                mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 505
 506                mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, ACLKX | AFSX);
 507                break;
 508        case SND_SOC_DAIFMT_CBM_CFS:
 509                /* codec is clock master and frame slave */
 510                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 511                mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 512
 513                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 514                mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 515
 516                mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
 517                                ACLKX | ACLKR);
 518                mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
 519                                AFSX | AFSR);
 520                break;
 521        case SND_SOC_DAIFMT_CBM_CFM:
 522                /* codec is clock and frame master */
 523                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
 524                mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
 525
 526                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
 527                mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
 528
 529                mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
 530                                ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
 531                break;
 532
 533        default:
 534                return -EINVAL;
 535        }
 536
 537        switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 538        case SND_SOC_DAIFMT_IB_NF:
 539                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 540                mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 541
 542                mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 543                mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 544                break;
 545
 546        case SND_SOC_DAIFMT_NB_IF:
 547                mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 548                mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 549
 550                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 551                mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 552                break;
 553
 554        case SND_SOC_DAIFMT_IB_IF:
 555                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 556                mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 557
 558                mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 559                mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 560                break;
 561
 562        case SND_SOC_DAIFMT_NB_NF:
 563                mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
 564                mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
 565
 566                mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
 567                mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
 568                break;
 569
 570        default:
 571                return -EINVAL;
 572        }
 573
 574        return 0;
 575}
 576
 577static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
 578{
 579        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai);
 580
 581        switch (div_id) {
 582        case 0:         /* MCLK divider */
 583                mcasp_mod_bits(dev->base + DAVINCI_MCASP_AHCLKXCTL_REG,
 584                               AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
 585                mcasp_mod_bits(dev->base + DAVINCI_MCASP_AHCLKRCTL_REG,
 586                               AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
 587                break;
 588
 589        case 1:         /* BCLK divider */
 590                mcasp_mod_bits(dev->base + DAVINCI_MCASP_ACLKXCTL_REG,
 591                               ACLKXDIV(div - 1), ACLKXDIV_MASK);
 592                mcasp_mod_bits(dev->base + DAVINCI_MCASP_ACLKRCTL_REG,
 593                               ACLKRDIV(div - 1), ACLKRDIV_MASK);
 594                break;
 595
 596        case 2:         /* BCLK/LRCLK ratio */
 597                dev->bclk_lrclk_ratio = div;
 598                break;
 599
 600        default:
 601                return -EINVAL;
 602        }
 603
 604        return 0;
 605}
 606
 607static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
 608                                    unsigned int freq, int dir)
 609{
 610        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai);
 611
 612        if (dir == SND_SOC_CLOCK_OUT) {
 613                mcasp_set_bits(dev->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
 614                mcasp_set_bits(dev->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
 615                mcasp_set_bits(dev->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
 616        } else {
 617                mcasp_clr_bits(dev->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
 618                mcasp_clr_bits(dev->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
 619                mcasp_clr_bits(dev->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
 620        }
 621
 622        return 0;
 623}
 624
 625static int davinci_config_channel_size(struct davinci_audio_dev *dev,
 626                                       int word_length)
 627{
 628        u32 fmt;
 629        u32 tx_rotate = (word_length / 4) & 0x7;
 630        u32 rx_rotate = (32 - word_length) / 4;
 631        u32 mask = (1ULL << word_length) - 1;
 632
 633        /*
 634         * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
 635         * callback, take it into account here. That allows us to for example
 636         * send 32 bits per channel to the codec, while only 16 of them carry
 637         * audio payload.
 638         * The clock ratio is given for a full period of data (both left and
 639         * right channels), so it has to be divided by 2.
 640         */
 641        if (dev->bclk_lrclk_ratio)
 642                word_length = dev->bclk_lrclk_ratio / 2;
 643
 644        /* mapping of the XSSZ bit-field as described in the datasheet */
 645        fmt = (word_length >> 1) - 1;
 646
 647        mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMT_REG,
 648                                        RXSSZ(fmt), RXSSZ(0x0F));
 649        mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMT_REG,
 650                                        TXSSZ(fmt), TXSSZ(0x0F));
 651        mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate),
 652                                                        TXROT(7));
 653        mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate),
 654                                                        RXROT(7));
 655        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXMASK_REG, mask);
 656        mcasp_set_reg(dev->base + DAVINCI_MCASP_RXMASK_REG, mask);
 657
 658        return 0;
 659}
 660
 661static void davinci_hw_common_param(struct davinci_audio_dev *dev, int stream)
 662{
 663        int i;
 664        u8 tx_ser = 0;
 665        u8 rx_ser = 0;
 666
 667        /* Default configuration */
 668        mcasp_set_bits(dev->base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
 669
 670        /* All PINS as McASP */
 671        mcasp_set_reg(dev->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);
 672
 673        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 674                mcasp_set_reg(dev->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
 675                mcasp_clr_bits(dev->base + DAVINCI_MCASP_XEVTCTL_REG,
 676                                TXDATADMADIS);
 677        } else {
 678                mcasp_set_reg(dev->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
 679                mcasp_clr_bits(dev->base + DAVINCI_MCASP_REVTCTL_REG,
 680                                RXDATADMADIS);
 681        }
 682
 683        for (i = 0; i < dev->num_serializer; i++) {
 684                mcasp_set_bits(dev->base + DAVINCI_MCASP_XRSRCTL_REG(i),
 685                                        dev->serial_dir[i]);
 686                if (dev->serial_dir[i] == TX_MODE) {
 687                        mcasp_set_bits(dev->base + DAVINCI_MCASP_PDIR_REG,
 688                                        AXR(i));
 689                        tx_ser++;
 690                } else if (dev->serial_dir[i] == RX_MODE) {
 691                        mcasp_clr_bits(dev->base + DAVINCI_MCASP_PDIR_REG,
 692                                        AXR(i));
 693                        rx_ser++;
 694                }
 695        }
 696
 697        if (dev->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
 698                if (dev->txnumevt * tx_ser > 64)
 699                        dev->txnumevt = 1;
 700
 701                switch (dev->version) {
 702                case MCASP_VERSION_3:
 703                        mcasp_mod_bits(dev->base + MCASP_VER3_WFIFOCTL, tx_ser,
 704                                                                NUMDMA_MASK);
 705                        mcasp_mod_bits(dev->base + MCASP_VER3_WFIFOCTL,
 706                                ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK);
 707                        break;
 708                default:
 709                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL,
 710                                                        tx_ser, NUMDMA_MASK);
 711                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_WFIFOCTL,
 712                                ((dev->txnumevt * tx_ser) << 8), NUMEVT_MASK);
 713                }
 714        }
 715
 716        if (dev->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
 717                if (dev->rxnumevt * rx_ser > 64)
 718                        dev->rxnumevt = 1;
 719                switch (dev->version) {
 720                case MCASP_VERSION_3:
 721                        mcasp_mod_bits(dev->base + MCASP_VER3_RFIFOCTL, rx_ser,
 722                                                                NUMDMA_MASK);
 723                        mcasp_mod_bits(dev->base + MCASP_VER3_RFIFOCTL,
 724                                ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
 725                        break;
 726                default:
 727                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL,
 728                                                        rx_ser, NUMDMA_MASK);
 729                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_RFIFOCTL,
 730                                ((dev->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
 731                }
 732        }
 733}
 734
 735static void davinci_hw_param(struct davinci_audio_dev *dev, int stream)
 736{
 737        int i, active_slots;
 738        u32 mask = 0;
 739
 740        active_slots = (dev->tdm_slots > 31) ? 32 : dev->tdm_slots;
 741        for (i = 0; i < active_slots; i++)
 742                mask |= (1 << i);
 743
 744        mcasp_clr_bits(dev->base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
 745
 746        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 747                /* bit stream is MSB first  with no delay */
 748                /* DSP_B mode */
 749                mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask);
 750                mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD);
 751
 752                if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32))
 753                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG,
 754                                        FSXMOD(dev->tdm_slots), FSXMOD(0x1FF));
 755                else
 756                        printk(KERN_ERR "playback tdm slot %d not supported\n",
 757                                dev->tdm_slots);
 758        } else {
 759                /* bit stream is MSB first with no delay */
 760                /* DSP_B mode */
 761                mcasp_set_bits(dev->base + DAVINCI_MCASP_RXFMT_REG, RXORD);
 762                mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask);
 763
 764                if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32))
 765                        mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG,
 766                                        FSRMOD(dev->tdm_slots), FSRMOD(0x1FF));
 767                else
 768                        printk(KERN_ERR "capture tdm slot %d not supported\n",
 769                                dev->tdm_slots);
 770        }
 771}
 772
 773/* S/PDIF */
 774static void davinci_hw_dit_param(struct davinci_audio_dev *dev)
 775{
 776        /* Set the PDIR for Serialiser as output */
 777        mcasp_set_bits(dev->base + DAVINCI_MCASP_PDIR_REG, AFSX);
 778
 779        /* TXMASK for 24 bits */
 780        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXMASK_REG, 0x00FFFFFF);
 781
 782        /* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
 783           and LSB first */
 784        mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG,
 785                                                TXROT(6) | TXSSZ(15));
 786
 787        /* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
 788        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXFMCTL_REG,
 789                                                AFSXE | FSXMOD(0x180));
 790
 791        /* Set the TX tdm : for all the slots */
 792        mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
 793
 794        /* Set the TX clock controls : div = 1 and internal */
 795        mcasp_set_bits(dev->base + DAVINCI_MCASP_ACLKXCTL_REG,
 796                                                ACLKXE | TX_ASYNC);
 797
 798        mcasp_clr_bits(dev->base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
 799
 800        /* Only 44100 and 48000 are valid, both have the same setting */
 801        mcasp_set_bits(dev->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
 802
 803        /* Enable the DIT */
 804        mcasp_set_bits(dev->base + DAVINCI_MCASP_TXDITCTL_REG, DITEN);
 805}
 806
 807static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
 808                                        struct snd_pcm_hw_params *params,
 809                                        struct snd_soc_dai *cpu_dai)
 810{
 811        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
 812        struct davinci_pcm_dma_params *dma_params =
 813                                        &dev->dma_params[substream->stream];
 814        int word_length;
 815        u8 fifo_level;
 816
 817        davinci_hw_common_param(dev, substream->stream);
 818        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 819                fifo_level = dev->txnumevt;
 820        else
 821                fifo_level = dev->rxnumevt;
 822
 823        if (dev->op_mode == DAVINCI_MCASP_DIT_MODE)
 824                davinci_hw_dit_param(dev);
 825        else
 826                davinci_hw_param(dev, substream->stream);
 827
 828        switch (params_format(params)) {
 829        case SNDRV_PCM_FORMAT_U8:
 830        case SNDRV_PCM_FORMAT_S8:
 831                dma_params->data_type = 1;
 832                word_length = 8;
 833                break;
 834
 835        case SNDRV_PCM_FORMAT_U16_LE:
 836        case SNDRV_PCM_FORMAT_S16_LE:
 837                dma_params->data_type = 2;
 838                word_length = 16;
 839                break;
 840
 841        case SNDRV_PCM_FORMAT_U24_3LE:
 842        case SNDRV_PCM_FORMAT_S24_3LE:
 843                dma_params->data_type = 3;
 844                word_length = 24;
 845                break;
 846
 847        case SNDRV_PCM_FORMAT_U24_LE:
 848        case SNDRV_PCM_FORMAT_S24_LE:
 849        case SNDRV_PCM_FORMAT_U32_LE:
 850        case SNDRV_PCM_FORMAT_S32_LE:
 851                dma_params->data_type = 4;
 852                word_length = 32;
 853                break;
 854
 855        default:
 856                printk(KERN_WARNING "davinci-mcasp: unsupported PCM format");
 857                return -EINVAL;
 858        }
 859
 860        if (dev->version == MCASP_VERSION_2 && !fifo_level)
 861                dma_params->acnt = 4;
 862        else
 863                dma_params->acnt = dma_params->data_type;
 864
 865        dma_params->fifo_level = fifo_level;
 866        davinci_config_channel_size(dev, word_length);
 867
 868        return 0;
 869}
 870
 871static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
 872                                     int cmd, struct snd_soc_dai *cpu_dai)
 873{
 874        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
 875        int ret = 0;
 876
 877        switch (cmd) {
 878        case SNDRV_PCM_TRIGGER_RESUME:
 879        case SNDRV_PCM_TRIGGER_START:
 880        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 881                ret = pm_runtime_get_sync(dev->dev);
 882                if (IS_ERR_VALUE(ret))
 883                        dev_err(dev->dev, "pm_runtime_get_sync() failed\n");
 884                davinci_mcasp_start(dev, substream->stream);
 885                break;
 886
 887        case SNDRV_PCM_TRIGGER_SUSPEND:
 888                davinci_mcasp_stop(dev, substream->stream);
 889                ret = pm_runtime_put_sync(dev->dev);
 890                if (IS_ERR_VALUE(ret))
 891                        dev_err(dev->dev, "pm_runtime_put_sync() failed\n");
 892                break;
 893
 894        case SNDRV_PCM_TRIGGER_STOP:
 895        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 896                davinci_mcasp_stop(dev, substream->stream);
 897                break;
 898
 899        default:
 900                ret = -EINVAL;
 901        }
 902
 903        return ret;
 904}
 905
 906static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
 907                                 struct snd_soc_dai *dai)
 908{
 909        struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(dai);
 910
 911        snd_soc_dai_set_dma_data(dai, substream, dev->dma_params);
 912        return 0;
 913}
 914
 915static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
 916        .startup        = davinci_mcasp_startup,
 917        .trigger        = davinci_mcasp_trigger,
 918        .hw_params      = davinci_mcasp_hw_params,
 919        .set_fmt        = davinci_mcasp_set_dai_fmt,
 920        .set_clkdiv     = davinci_mcasp_set_clkdiv,
 921        .set_sysclk     = davinci_mcasp_set_sysclk,
 922};
 923
 924#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
 925                                SNDRV_PCM_FMTBIT_U8 | \
 926                                SNDRV_PCM_FMTBIT_S16_LE | \
 927                                SNDRV_PCM_FMTBIT_U16_LE | \
 928                                SNDRV_PCM_FMTBIT_S24_LE | \
 929                                SNDRV_PCM_FMTBIT_U24_LE | \
 930                                SNDRV_PCM_FMTBIT_S24_3LE | \
 931                                SNDRV_PCM_FMTBIT_U24_3LE | \
 932                                SNDRV_PCM_FMTBIT_S32_LE | \
 933                                SNDRV_PCM_FMTBIT_U32_LE)
 934
 935static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
 936        {
 937                .name           = "davinci-mcasp.0",
 938                .playback       = {
 939                        .channels_min   = 2,
 940                        .channels_max   = 2,
 941                        .rates          = DAVINCI_MCASP_RATES,
 942                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 943                },
 944                .capture        = {
 945                        .channels_min   = 2,
 946                        .channels_max   = 2,
 947                        .rates          = DAVINCI_MCASP_RATES,
 948                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 949                },
 950                .ops            = &davinci_mcasp_dai_ops,
 951
 952        },
 953        {
 954                "davinci-mcasp.1",
 955                .playback       = {
 956                        .channels_min   = 1,
 957                        .channels_max   = 384,
 958                        .rates          = DAVINCI_MCASP_RATES,
 959                        .formats        = DAVINCI_MCASP_PCM_FMTS,
 960                },
 961                .ops            = &davinci_mcasp_dai_ops,
 962        },
 963
 964};
 965
 966static const struct of_device_id mcasp_dt_ids[] = {
 967        {
 968                .compatible = "ti,dm646x-mcasp-audio",
 969                .data = (void *)MCASP_VERSION_1,
 970        },
 971        {
 972                .compatible = "ti,da830-mcasp-audio",
 973                .data = (void *)MCASP_VERSION_2,
 974        },
 975        {
 976                .compatible = "ti,omap2-mcasp-audio",
 977                .data = (void *)MCASP_VERSION_3,
 978        },
 979        { /* sentinel */ }
 980};
 981MODULE_DEVICE_TABLE(of, mcasp_dt_ids);
 982
 983static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
 984                                                struct platform_device *pdev)
 985{
 986        struct device_node *np = pdev->dev.of_node;
 987        struct snd_platform_data *pdata = NULL;
 988        const struct of_device_id *match =
 989                        of_match_device(of_match_ptr(mcasp_dt_ids), &pdev->dev);
 990
 991        const u32 *of_serial_dir32;
 992        u8 *of_serial_dir;
 993        u32 val;
 994        int i, ret = 0;
 995
 996        if (pdev->dev.platform_data) {
 997                pdata = pdev->dev.platform_data;
 998                return pdata;
 999        } else if (match) {
1000                pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1001                if (!pdata) {
1002                        ret = -ENOMEM;
1003                        goto nodata;
1004                }
1005        } else {
1006                /* control shouldn't reach here. something is wrong */
1007                ret = -EINVAL;
1008                goto nodata;
1009        }
1010
1011        if (match->data)
1012                pdata->version = (u8)((int)match->data);
1013
1014        ret = of_property_read_u32(np, "op-mode", &val);
1015        if (ret >= 0)
1016                pdata->op_mode = val;
1017
1018        ret = of_property_read_u32(np, "tdm-slots", &val);
1019        if (ret >= 0)
1020                pdata->tdm_slots = val;
1021
1022        ret = of_property_read_u32(np, "num-serializer", &val);
1023        if (ret >= 0)
1024                pdata->num_serializer = val;
1025
1026        of_serial_dir32 = of_get_property(np, "serial-dir", &val);
1027        val /= sizeof(u32);
1028        if (val != pdata->num_serializer) {
1029                dev_err(&pdev->dev,
1030                                "num-serializer(%d) != serial-dir size(%d)\n",
1031                                pdata->num_serializer, val);
1032                ret = -EINVAL;
1033                goto nodata;
1034        }
1035
1036        if (of_serial_dir32) {
1037                of_serial_dir = devm_kzalloc(&pdev->dev,
1038                                                (sizeof(*of_serial_dir) * val),
1039                                                GFP_KERNEL);
1040                if (!of_serial_dir) {
1041                        ret = -ENOMEM;
1042                        goto nodata;
1043                }
1044
1045                for (i = 0; i < pdata->num_serializer; i++)
1046                        of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);
1047
1048                pdata->serial_dir = of_serial_dir;
1049        }
1050
1051        ret = of_property_read_u32(np, "tx-num-evt", &val);
1052        if (ret >= 0)
1053                pdata->txnumevt = val;
1054
1055        ret = of_property_read_u32(np, "rx-num-evt", &val);
1056        if (ret >= 0)
1057                pdata->rxnumevt = val;
1058
1059        ret = of_property_read_u32(np, "sram-size-playback", &val);
1060        if (ret >= 0)
1061                pdata->sram_size_playback = val;
1062
1063        ret = of_property_read_u32(np, "sram-size-capture", &val);
1064        if (ret >= 0)
1065                pdata->sram_size_capture = val;
1066
1067        return  pdata;
1068
1069nodata:
1070        if (ret < 0) {
1071                dev_err(&pdev->dev, "Error populating platform data, err %d\n",
1072                        ret);
1073                pdata = NULL;
1074        }
1075        return  pdata;
1076}
1077
1078static int davinci_mcasp_probe(struct platform_device *pdev)
1079{
1080        struct davinci_pcm_dma_params *dma_data;
1081        struct resource *mem, *ioarea, *res;
1082        struct snd_platform_data *pdata;
1083        struct davinci_audio_dev *dev;
1084        int ret;
1085
1086        if (!pdev->dev.platform_data && !pdev->dev.of_node) {
1087                dev_err(&pdev->dev, "No platform data supplied\n");
1088                return -EINVAL;
1089        }
1090
1091        dev = devm_kzalloc(&pdev->dev, sizeof(struct davinci_audio_dev),
1092                           GFP_KERNEL);
1093        if (!dev)
1094                return  -ENOMEM;
1095
1096        pdata = davinci_mcasp_set_pdata_from_of(pdev);
1097        if (!pdata) {
1098                dev_err(&pdev->dev, "no platform data\n");
1099                return -EINVAL;
1100        }
1101
1102        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1103        if (!mem) {
1104                dev_err(&pdev->dev, "no mem resource?\n");
1105                return -ENODEV;
1106        }
1107
1108        ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1109                        resource_size(mem), pdev->name);
1110        if (!ioarea) {
1111                dev_err(&pdev->dev, "Audio region already claimed\n");
1112                return -EBUSY;
1113        }
1114
1115        pm_runtime_enable(&pdev->dev);
1116
1117        ret = pm_runtime_get_sync(&pdev->dev);
1118        if (IS_ERR_VALUE(ret)) {
1119                dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
1120                return ret;
1121        }
1122
1123        dev->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
1124        if (!dev->base) {
1125                dev_err(&pdev->dev, "ioremap failed\n");
1126                ret = -ENOMEM;
1127                goto err_release_clk;
1128        }
1129
1130        dev->op_mode = pdata->op_mode;
1131        dev->tdm_slots = pdata->tdm_slots;
1132        dev->num_serializer = pdata->num_serializer;
1133        dev->serial_dir = pdata->serial_dir;
1134        dev->version = pdata->version;
1135        dev->txnumevt = pdata->txnumevt;
1136        dev->rxnumevt = pdata->rxnumevt;
1137        dev->dev = &pdev->dev;
1138
1139        dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1140        dma_data->asp_chan_q = pdata->asp_chan_q;
1141        dma_data->ram_chan_q = pdata->ram_chan_q;
1142        dma_data->sram_pool = pdata->sram_pool;
1143        dma_data->sram_size = pdata->sram_size_playback;
1144        dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
1145                                                        mem->start);
1146
1147        /* first TX, then RX */
1148        res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1149        if (!res) {
1150                dev_err(&pdev->dev, "no DMA resource\n");
1151                ret = -ENODEV;
1152                goto err_release_clk;
1153        }
1154
1155        dma_data->channel = res->start;
1156
1157        dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1158        dma_data->asp_chan_q = pdata->asp_chan_q;
1159        dma_data->ram_chan_q = pdata->ram_chan_q;
1160        dma_data->sram_pool = pdata->sram_pool;
1161        dma_data->sram_size = pdata->sram_size_capture;
1162        dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
1163                                                        mem->start);
1164
1165        res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1166        if (!res) {
1167                dev_err(&pdev->dev, "no DMA resource\n");
1168                ret = -ENODEV;
1169                goto err_release_clk;
1170        }
1171
1172        dma_data->channel = res->start;
1173        dev_set_drvdata(&pdev->dev, dev);
1174        ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]);
1175
1176        if (ret != 0)
1177                goto err_release_clk;
1178
1179        ret = davinci_soc_platform_register(&pdev->dev);
1180        if (ret) {
1181                dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
1182                goto err_unregister_dai;
1183        }
1184
1185        return 0;
1186
1187err_unregister_dai:
1188        snd_soc_unregister_dai(&pdev->dev);
1189err_release_clk:
1190        pm_runtime_put_sync(&pdev->dev);
1191        pm_runtime_disable(&pdev->dev);
1192        return ret;
1193}
1194
1195static int davinci_mcasp_remove(struct platform_device *pdev)
1196{
1197
1198        snd_soc_unregister_dai(&pdev->dev);
1199        davinci_soc_platform_unregister(&pdev->dev);
1200
1201        pm_runtime_put_sync(&pdev->dev);
1202        pm_runtime_disable(&pdev->dev);
1203
1204        return 0;
1205}
1206
1207static struct platform_driver davinci_mcasp_driver = {
1208        .probe          = davinci_mcasp_probe,
1209        .remove         = davinci_mcasp_remove,
1210        .driver         = {
1211                .name   = "davinci-mcasp",
1212                .owner  = THIS_MODULE,
1213                .of_match_table = of_match_ptr(mcasp_dt_ids),
1214        },
1215};
1216
1217module_platform_driver(davinci_mcasp_driver);
1218
1219MODULE_AUTHOR("Steve Chen");
1220MODULE_DESCRIPTION("TI DAVINCI McASP SoC Interface");
1221MODULE_LICENSE("GPL");
1222
1223
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.