root/sound/atmel/ac97c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. atmel_ac97c_playback_open
  2. atmel_ac97c_capture_open
  3. atmel_ac97c_playback_close
  4. atmel_ac97c_capture_close
  5. atmel_ac97c_playback_hw_params
  6. atmel_ac97c_capture_hw_params
  7. atmel_ac97c_playback_prepare
  8. atmel_ac97c_capture_prepare
  9. atmel_ac97c_playback_trigger
  10. atmel_ac97c_capture_trigger
  11. atmel_ac97c_playback_pointer
  12. atmel_ac97c_capture_pointer
  13. atmel_ac97c_interrupt
  14. atmel_ac97c_pcm_new
  15. atmel_ac97c_mixer_new
  16. atmel_ac97c_write
  17. atmel_ac97c_read
  18. atmel_ac97c_reset
  19. atmel_ac97c_probe
  20. atmel_ac97c_suspend
  21. atmel_ac97c_resume
  22. atmel_ac97c_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Driver for Atmel AC97C
   4  *
   5  * Copyright (C) 2005-2009 Atmel Corporation
   6  */
   7 #include <linux/clk.h>
   8 #include <linux/delay.h>
   9 #include <linux/bitmap.h>
  10 #include <linux/device.h>
  11 #include <linux/atmel_pdc.h>
  12 #include <linux/gpio/consumer.h>
  13 #include <linux/init.h>
  14 #include <linux/interrupt.h>
  15 #include <linux/module.h>
  16 #include <linux/platform_device.h>
  17 #include <linux/mutex.h>
  18 #include <linux/types.h>
  19 #include <linux/io.h>
  20 #include <linux/of.h>
  21 #include <linux/of_device.h>
  22 
  23 #include <sound/core.h>
  24 #include <sound/initval.h>
  25 #include <sound/pcm.h>
  26 #include <sound/pcm_params.h>
  27 #include <sound/ac97_codec.h>
  28 #include <sound/memalloc.h>
  29 
  30 #include "ac97c.h"
  31 
  32 /* Serialize access to opened variable */
  33 static DEFINE_MUTEX(opened_mutex);
  34 
  35 struct atmel_ac97c {
  36         struct clk                      *pclk;
  37         struct platform_device          *pdev;
  38 
  39         struct snd_pcm_substream        *playback_substream;
  40         struct snd_pcm_substream        *capture_substream;
  41         struct snd_card                 *card;
  42         struct snd_pcm                  *pcm;
  43         struct snd_ac97                 *ac97;
  44         struct snd_ac97_bus             *ac97_bus;
  45 
  46         u64                             cur_format;
  47         unsigned int                    cur_rate;
  48         int                             playback_period, capture_period;
  49         /* Serialize access to opened variable */
  50         spinlock_t                      lock;
  51         void __iomem                    *regs;
  52         int                             irq;
  53         int                             opened;
  54         struct gpio_desc                *reset_pin;
  55 };
  56 
  57 #define get_chip(card) ((struct atmel_ac97c *)(card)->private_data)
  58 
  59 #define ac97c_writel(chip, reg, val)                    \
  60         __raw_writel((val), (chip)->regs + AC97C_##reg)
  61 #define ac97c_readl(chip, reg)                          \
  62         __raw_readl((chip)->regs + AC97C_##reg)
  63 
  64 static const struct snd_pcm_hardware atmel_ac97c_hw = {
  65         .info                   = (SNDRV_PCM_INFO_MMAP
  66                                   | SNDRV_PCM_INFO_MMAP_VALID
  67                                   | SNDRV_PCM_INFO_INTERLEAVED
  68                                   | SNDRV_PCM_INFO_BLOCK_TRANSFER
  69                                   | SNDRV_PCM_INFO_JOINT_DUPLEX
  70                                   | SNDRV_PCM_INFO_RESUME
  71                                   | SNDRV_PCM_INFO_PAUSE),
  72         .formats                = (SNDRV_PCM_FMTBIT_S16_BE
  73                                   | SNDRV_PCM_FMTBIT_S16_LE),
  74         .rates                  = (SNDRV_PCM_RATE_CONTINUOUS),
  75         .rate_min               = 4000,
  76         .rate_max               = 48000,
  77         .channels_min           = 1,
  78         .channels_max           = 2,
  79         .buffer_bytes_max       = 2 * 2 * 64 * 2048,
  80         .period_bytes_min       = 4096,
  81         .period_bytes_max       = 4096,
  82         .periods_min            = 6,
  83         .periods_max            = 64,
  84 };
  85 
  86 static int atmel_ac97c_playback_open(struct snd_pcm_substream *substream)
  87 {
  88         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
  89         struct snd_pcm_runtime *runtime = substream->runtime;
  90 
  91         mutex_lock(&opened_mutex);
  92         chip->opened++;
  93         runtime->hw = atmel_ac97c_hw;
  94         if (chip->cur_rate) {
  95                 runtime->hw.rate_min = chip->cur_rate;
  96                 runtime->hw.rate_max = chip->cur_rate;
  97         }
  98         if (chip->cur_format)
  99                 runtime->hw.formats = pcm_format_to_bits(chip->cur_format);
 100         mutex_unlock(&opened_mutex);
 101         chip->playback_substream = substream;
 102         return 0;
 103 }
 104 
 105 static int atmel_ac97c_capture_open(struct snd_pcm_substream *substream)
 106 {
 107         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 108         struct snd_pcm_runtime *runtime = substream->runtime;
 109 
 110         mutex_lock(&opened_mutex);
 111         chip->opened++;
 112         runtime->hw = atmel_ac97c_hw;
 113         if (chip->cur_rate) {
 114                 runtime->hw.rate_min = chip->cur_rate;
 115                 runtime->hw.rate_max = chip->cur_rate;
 116         }
 117         if (chip->cur_format)
 118                 runtime->hw.formats = pcm_format_to_bits(chip->cur_format);
 119         mutex_unlock(&opened_mutex);
 120         chip->capture_substream = substream;
 121         return 0;
 122 }
 123 
 124 static int atmel_ac97c_playback_close(struct snd_pcm_substream *substream)
 125 {
 126         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 127 
 128         mutex_lock(&opened_mutex);
 129         chip->opened--;
 130         if (!chip->opened) {
 131                 chip->cur_rate = 0;
 132                 chip->cur_format = 0;
 133         }
 134         mutex_unlock(&opened_mutex);
 135 
 136         chip->playback_substream = NULL;
 137 
 138         return 0;
 139 }
 140 
 141 static int atmel_ac97c_capture_close(struct snd_pcm_substream *substream)
 142 {
 143         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 144 
 145         mutex_lock(&opened_mutex);
 146         chip->opened--;
 147         if (!chip->opened) {
 148                 chip->cur_rate = 0;
 149                 chip->cur_format = 0;
 150         }
 151         mutex_unlock(&opened_mutex);
 152 
 153         chip->capture_substream = NULL;
 154 
 155         return 0;
 156 }
 157 
 158 static int atmel_ac97c_playback_hw_params(struct snd_pcm_substream *substream,
 159                 struct snd_pcm_hw_params *hw_params)
 160 {
 161         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 162         int retval;
 163 
 164         retval = snd_pcm_lib_malloc_pages(substream,
 165                                         params_buffer_bytes(hw_params));
 166         if (retval < 0)
 167                 return retval;
 168 
 169         /* Set restrictions to params. */
 170         mutex_lock(&opened_mutex);
 171         chip->cur_rate = params_rate(hw_params);
 172         chip->cur_format = params_format(hw_params);
 173         mutex_unlock(&opened_mutex);
 174 
 175         return retval;
 176 }
 177 
 178 static int atmel_ac97c_capture_hw_params(struct snd_pcm_substream *substream,
 179                 struct snd_pcm_hw_params *hw_params)
 180 {
 181         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 182         int retval;
 183 
 184         retval = snd_pcm_lib_malloc_pages(substream,
 185                                         params_buffer_bytes(hw_params));
 186         if (retval < 0)
 187                 return retval;
 188 
 189         /* Set restrictions to params. */
 190         mutex_lock(&opened_mutex);
 191         chip->cur_rate = params_rate(hw_params);
 192         chip->cur_format = params_format(hw_params);
 193         mutex_unlock(&opened_mutex);
 194 
 195         return retval;
 196 }
 197 
 198 static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
 199 {
 200         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 201         struct snd_pcm_runtime *runtime = substream->runtime;
 202         int block_size = frames_to_bytes(runtime, runtime->period_size);
 203         unsigned long word = ac97c_readl(chip, OCA);
 204         int retval;
 205 
 206         chip->playback_period = 0;
 207         word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
 208 
 209         /* assign channels to AC97C channel A */
 210         switch (runtime->channels) {
 211         case 1:
 212                 word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
 213                 break;
 214         case 2:
 215                 word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
 216                         | AC97C_CH_ASSIGN(PCM_RIGHT, A);
 217                 break;
 218         default:
 219                 /* TODO: support more than two channels */
 220                 return -EINVAL;
 221         }
 222         ac97c_writel(chip, OCA, word);
 223 
 224         /* configure sample format and size */
 225         word = ac97c_readl(chip, CAMR);
 226         if (chip->opened <= 1)
 227                 word = AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
 228         else
 229                 word |= AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
 230 
 231         switch (runtime->format) {
 232         case SNDRV_PCM_FORMAT_S16_LE:
 233                 break;
 234         case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
 235                 word &= ~(AC97C_CMR_CEM_LITTLE);
 236                 break;
 237         default:
 238                 word = ac97c_readl(chip, OCA);
 239                 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
 240                 ac97c_writel(chip, OCA, word);
 241                 return -EINVAL;
 242         }
 243 
 244         /* Enable underrun interrupt on channel A */
 245         word |= AC97C_CSR_UNRUN;
 246 
 247         ac97c_writel(chip, CAMR, word);
 248 
 249         /* Enable channel A event interrupt */
 250         word = ac97c_readl(chip, IMR);
 251         word |= AC97C_SR_CAEVT;
 252         ac97c_writel(chip, IER, word);
 253 
 254         /* set variable rate if needed */
 255         if (runtime->rate != 48000) {
 256                 word = ac97c_readl(chip, MR);
 257                 word |= AC97C_MR_VRA;
 258                 ac97c_writel(chip, MR, word);
 259         } else {
 260                 word = ac97c_readl(chip, MR);
 261                 word &= ~(AC97C_MR_VRA);
 262                 ac97c_writel(chip, MR, word);
 263         }
 264 
 265         retval = snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE,
 266                         runtime->rate);
 267         if (retval)
 268                 dev_dbg(&chip->pdev->dev, "could not set rate %d Hz\n",
 269                                 runtime->rate);
 270 
 271         /* Initialize and start the PDC */
 272         writel(runtime->dma_addr, chip->regs + ATMEL_PDC_TPR);
 273         writel(block_size / 2, chip->regs + ATMEL_PDC_TCR);
 274         writel(runtime->dma_addr + block_size, chip->regs + ATMEL_PDC_TNPR);
 275         writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR);
 276 
 277         return retval;
 278 }
 279 
 280 static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
 281 {
 282         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 283         struct snd_pcm_runtime *runtime = substream->runtime;
 284         int block_size = frames_to_bytes(runtime, runtime->period_size);
 285         unsigned long word = ac97c_readl(chip, ICA);
 286         int retval;
 287 
 288         chip->capture_period = 0;
 289         word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
 290 
 291         /* assign channels to AC97C channel A */
 292         switch (runtime->channels) {
 293         case 1:
 294                 word |= AC97C_CH_ASSIGN(PCM_LEFT, A);
 295                 break;
 296         case 2:
 297                 word |= AC97C_CH_ASSIGN(PCM_LEFT, A)
 298                         | AC97C_CH_ASSIGN(PCM_RIGHT, A);
 299                 break;
 300         default:
 301                 /* TODO: support more than two channels */
 302                 return -EINVAL;
 303         }
 304         ac97c_writel(chip, ICA, word);
 305 
 306         /* configure sample format and size */
 307         word = ac97c_readl(chip, CAMR);
 308         if (chip->opened <= 1)
 309                 word = AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
 310         else
 311                 word |= AC97C_CMR_DMAEN | AC97C_CMR_SIZE_16;
 312 
 313         switch (runtime->format) {
 314         case SNDRV_PCM_FORMAT_S16_LE:
 315                 break;
 316         case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
 317                 word &= ~(AC97C_CMR_CEM_LITTLE);
 318                 break;
 319         default:
 320                 word = ac97c_readl(chip, ICA);
 321                 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
 322                 ac97c_writel(chip, ICA, word);
 323                 return -EINVAL;
 324         }
 325 
 326         /* Enable overrun interrupt on channel A */
 327         word |= AC97C_CSR_OVRUN;
 328 
 329         ac97c_writel(chip, CAMR, word);
 330 
 331         /* Enable channel A event interrupt */
 332         word = ac97c_readl(chip, IMR);
 333         word |= AC97C_SR_CAEVT;
 334         ac97c_writel(chip, IER, word);
 335 
 336         /* set variable rate if needed */
 337         if (runtime->rate != 48000) {
 338                 word = ac97c_readl(chip, MR);
 339                 word |= AC97C_MR_VRA;
 340                 ac97c_writel(chip, MR, word);
 341         } else {
 342                 word = ac97c_readl(chip, MR);
 343                 word &= ~(AC97C_MR_VRA);
 344                 ac97c_writel(chip, MR, word);
 345         }
 346 
 347         retval = snd_ac97_set_rate(chip->ac97, AC97_PCM_LR_ADC_RATE,
 348                         runtime->rate);
 349         if (retval)
 350                 dev_dbg(&chip->pdev->dev, "could not set rate %d Hz\n",
 351                                 runtime->rate);
 352 
 353         /* Initialize and start the PDC */
 354         writel(runtime->dma_addr, chip->regs + ATMEL_PDC_RPR);
 355         writel(block_size / 2, chip->regs + ATMEL_PDC_RCR);
 356         writel(runtime->dma_addr + block_size, chip->regs + ATMEL_PDC_RNPR);
 357         writel(block_size / 2, chip->regs + ATMEL_PDC_RNCR);
 358 
 359         return retval;
 360 }
 361 
 362 static int
 363 atmel_ac97c_playback_trigger(struct snd_pcm_substream *substream, int cmd)
 364 {
 365         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 366         unsigned long camr, ptcr = 0;
 367 
 368         camr = ac97c_readl(chip, CAMR);
 369 
 370         switch (cmd) {
 371         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: /* fall through */
 372         case SNDRV_PCM_TRIGGER_RESUME: /* fall through */
 373         case SNDRV_PCM_TRIGGER_START:
 374                 ptcr = ATMEL_PDC_TXTEN;
 375                 camr |= AC97C_CMR_CENA | AC97C_CSR_ENDTX;
 376                 break;
 377         case SNDRV_PCM_TRIGGER_PAUSE_PUSH: /* fall through */
 378         case SNDRV_PCM_TRIGGER_SUSPEND: /* fall through */
 379         case SNDRV_PCM_TRIGGER_STOP:
 380                 ptcr |= ATMEL_PDC_TXTDIS;
 381                 if (chip->opened <= 1)
 382                         camr &= ~AC97C_CMR_CENA;
 383                 break;
 384         default:
 385                 return -EINVAL;
 386         }
 387 
 388         ac97c_writel(chip, CAMR, camr);
 389         writel(ptcr, chip->regs + ATMEL_PDC_PTCR);
 390         return 0;
 391 }
 392 
 393 static int
 394 atmel_ac97c_capture_trigger(struct snd_pcm_substream *substream, int cmd)
 395 {
 396         struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
 397         unsigned long camr, ptcr = 0;
 398 
 399         camr = ac97c_readl(chip, CAMR);
 400         ptcr = readl(chip->regs + ATMEL_PDC_PTSR);
 401 
 402         switch (cmd) {
 403         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: /* fall through */
 404         case SNDRV_PCM_TRIGGER_RESUME: /* fall through */
 405         case SNDRV_PCM_TRIGGER_START:
 406                 ptcr = ATMEL_PDC_RXTEN;
 407                 camr |= AC97C_CMR_CENA | AC97C_CSR_ENDRX;
 408                 break;
 409         case SNDRV_PCM_TRIGGER_PAUSE_PUSH: /* fall through */
 410         case SNDRV_PCM_TRIGGER_SUSPEND: /* fall through */
 411         case SNDRV_PCM_TRIGGER_STOP:
 412                 ptcr |= ATMEL_PDC_RXTDIS;
 413                 if (chip->opened <= 1)
 414                         camr &= ~AC97C_CMR_CENA;
 415                 break;
 416         default:
 417                 return -EINVAL;
 418         }
 419 
 420         ac97c_writel(chip, CAMR, camr);
 421         writel(ptcr, chip->regs + ATMEL_PDC_PTCR);
 422         return 0;
 423 }
 424 
 425 static snd_pcm_uframes_t
 426 atmel_ac97c_playback_pointer(struct snd_pcm_substream *substream)
 427 {
 428         struct atmel_ac97c      *chip = snd_pcm_substream_chip(substream);
 429         struct snd_pcm_runtime  *runtime = substream->runtime;
 430         snd_pcm_uframes_t       frames;
 431         unsigned long           bytes;
 432 
 433         bytes = readl(chip->regs + ATMEL_PDC_TPR);
 434         bytes -= runtime->dma_addr;
 435 
 436         frames = bytes_to_frames(runtime, bytes);
 437         if (frames >= runtime->buffer_size)
 438                 frames -= runtime->buffer_size;
 439         return frames;
 440 }
 441 
 442 static snd_pcm_uframes_t
 443 atmel_ac97c_capture_pointer(struct snd_pcm_substream *substream)
 444 {
 445         struct atmel_ac97c      *chip = snd_pcm_substream_chip(substream);
 446         struct snd_pcm_runtime  *runtime = substream->runtime;
 447         snd_pcm_uframes_t       frames;
 448         unsigned long           bytes;
 449 
 450         bytes = readl(chip->regs + ATMEL_PDC_RPR);
 451         bytes -= runtime->dma_addr;
 452 
 453         frames = bytes_to_frames(runtime, bytes);
 454         if (frames >= runtime->buffer_size)
 455                 frames -= runtime->buffer_size;
 456         return frames;
 457 }
 458 
 459 static const struct snd_pcm_ops atmel_ac97_playback_ops = {
 460         .open           = atmel_ac97c_playback_open,
 461         .close          = atmel_ac97c_playback_close,
 462         .ioctl          = snd_pcm_lib_ioctl,
 463         .hw_params      = atmel_ac97c_playback_hw_params,
 464         .hw_free        = snd_pcm_lib_free_pages,
 465         .prepare        = atmel_ac97c_playback_prepare,
 466         .trigger        = atmel_ac97c_playback_trigger,
 467         .pointer        = atmel_ac97c_playback_pointer,
 468 };
 469 
 470 static const struct snd_pcm_ops atmel_ac97_capture_ops = {
 471         .open           = atmel_ac97c_capture_open,
 472         .close          = atmel_ac97c_capture_close,
 473         .ioctl          = snd_pcm_lib_ioctl,
 474         .hw_params      = atmel_ac97c_capture_hw_params,
 475         .hw_free        = snd_pcm_lib_free_pages,
 476         .prepare        = atmel_ac97c_capture_prepare,
 477         .trigger        = atmel_ac97c_capture_trigger,
 478         .pointer        = atmel_ac97c_capture_pointer,
 479 };
 480 
 481 static irqreturn_t atmel_ac97c_interrupt(int irq, void *dev)
 482 {
 483         struct atmel_ac97c      *chip  = (struct atmel_ac97c *)dev;
 484         irqreturn_t             retval = IRQ_NONE;
 485         u32                     sr     = ac97c_readl(chip, SR);
 486         u32                     casr   = ac97c_readl(chip, CASR);
 487         u32                     cosr   = ac97c_readl(chip, COSR);
 488         u32                     camr   = ac97c_readl(chip, CAMR);
 489 
 490         if (sr & AC97C_SR_CAEVT) {
 491                 struct snd_pcm_runtime *runtime;
 492                 int offset, next_period, block_size;
 493                 dev_dbg(&chip->pdev->dev, "channel A event%s%s%s%s%s%s\n",
 494                                 casr & AC97C_CSR_OVRUN   ? " OVRUN"   : "",
 495                                 casr & AC97C_CSR_RXRDY   ? " RXRDY"   : "",
 496                                 casr & AC97C_CSR_UNRUN   ? " UNRUN"   : "",
 497                                 casr & AC97C_CSR_TXEMPTY ? " TXEMPTY" : "",
 498                                 casr & AC97C_CSR_TXRDY   ? " TXRDY"   : "",
 499                                 !casr                    ? " NONE"    : "");
 500                 if ((casr & camr) & AC97C_CSR_ENDTX) {
 501                         runtime = chip->playback_substream->runtime;
 502                         block_size = frames_to_bytes(runtime, runtime->period_size);
 503                         chip->playback_period++;
 504 
 505                         if (chip->playback_period == runtime->periods)
 506                                 chip->playback_period = 0;
 507                         next_period = chip->playback_period + 1;
 508                         if (next_period == runtime->periods)
 509                                 next_period = 0;
 510 
 511                         offset = block_size * next_period;
 512 
 513                         writel(runtime->dma_addr + offset, chip->regs + ATMEL_PDC_TNPR);
 514                         writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR);
 515 
 516                         snd_pcm_period_elapsed(chip->playback_substream);
 517                 }
 518                 if ((casr & camr) & AC97C_CSR_ENDRX) {
 519                         runtime = chip->capture_substream->runtime;
 520                         block_size = frames_to_bytes(runtime, runtime->period_size);
 521                         chip->capture_period++;
 522 
 523                         if (chip->capture_period == runtime->periods)
 524                                 chip->capture_period = 0;
 525                         next_period = chip->capture_period + 1;
 526                         if (next_period == runtime->periods)
 527                                 next_period = 0;
 528 
 529                         offset = block_size * next_period;
 530 
 531                         writel(runtime->dma_addr + offset, chip->regs + ATMEL_PDC_RNPR);
 532                         writel(block_size / 2, chip->regs + ATMEL_PDC_RNCR);
 533                         snd_pcm_period_elapsed(chip->capture_substream);
 534                 }
 535                 retval = IRQ_HANDLED;
 536         }
 537 
 538         if (sr & AC97C_SR_COEVT) {
 539                 dev_info(&chip->pdev->dev, "codec channel event%s%s%s%s%s\n",
 540                                 cosr & AC97C_CSR_OVRUN   ? " OVRUN"   : "",
 541                                 cosr & AC97C_CSR_RXRDY   ? " RXRDY"   : "",
 542                                 cosr & AC97C_CSR_TXEMPTY ? " TXEMPTY" : "",
 543                                 cosr & AC97C_CSR_TXRDY   ? " TXRDY"   : "",
 544                                 !cosr                    ? " NONE"    : "");
 545                 retval = IRQ_HANDLED;
 546         }
 547 
 548         if (retval == IRQ_NONE) {
 549                 dev_err(&chip->pdev->dev, "spurious interrupt sr 0x%08x "
 550                                 "casr 0x%08x cosr 0x%08x\n", sr, casr, cosr);
 551         }
 552 
 553         return retval;
 554 }
 555 
 556 static const struct ac97_pcm at91_ac97_pcm_defs[] = {
 557         /* Playback */
 558         {
 559                 .exclusive = 1,
 560                 .r = { {
 561                         .slots = ((1 << AC97_SLOT_PCM_LEFT)
 562                                   | (1 << AC97_SLOT_PCM_RIGHT)),
 563                 } },
 564         },
 565         /* PCM in */
 566         {
 567                 .stream = 1,
 568                 .exclusive = 1,
 569                 .r = { {
 570                         .slots = ((1 << AC97_SLOT_PCM_LEFT)
 571                                         | (1 << AC97_SLOT_PCM_RIGHT)),
 572                 } }
 573         },
 574         /* Mic in */
 575         {
 576                 .stream = 1,
 577                 .exclusive = 1,
 578                 .r = { {
 579                         .slots = (1<<AC97_SLOT_MIC),
 580                 } }
 581         },
 582 };
 583 
 584 static int atmel_ac97c_pcm_new(struct atmel_ac97c *chip)
 585 {
 586         struct snd_pcm          *pcm;
 587         struct snd_pcm_hardware hw = atmel_ac97c_hw;
 588         int                     retval;
 589 
 590         retval = snd_ac97_pcm_assign(chip->ac97_bus,
 591                                      ARRAY_SIZE(at91_ac97_pcm_defs),
 592                                      at91_ac97_pcm_defs);
 593         if (retval)
 594                 return retval;
 595 
 596         retval = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 1, &pcm);
 597         if (retval)
 598                 return retval;
 599 
 600         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &atmel_ac97_capture_ops);
 601         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &atmel_ac97_playback_ops);
 602 
 603         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 604                         &chip->pdev->dev, hw.periods_min * hw.period_bytes_min,
 605                         hw.buffer_bytes_max);
 606 
 607         pcm->private_data = chip;
 608         pcm->info_flags = 0;
 609         strcpy(pcm->name, chip->card->shortname);
 610         chip->pcm = pcm;
 611 
 612         return 0;
 613 }
 614 
 615 static int atmel_ac97c_mixer_new(struct atmel_ac97c *chip)
 616 {
 617         struct snd_ac97_template template;
 618         memset(&template, 0, sizeof(template));
 619         template.private_data = chip;
 620         return snd_ac97_mixer(chip->ac97_bus, &template, &chip->ac97);
 621 }
 622 
 623 static void atmel_ac97c_write(struct snd_ac97 *ac97, unsigned short reg,
 624                 unsigned short val)
 625 {
 626         struct atmel_ac97c *chip = get_chip(ac97);
 627         unsigned long word;
 628         int timeout = 40;
 629 
 630         word = (reg & 0x7f) << 16 | val;
 631 
 632         do {
 633                 if (ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) {
 634                         ac97c_writel(chip, COTHR, word);
 635                         return;
 636                 }
 637                 udelay(1);
 638         } while (--timeout);
 639 
 640         dev_dbg(&chip->pdev->dev, "codec write timeout\n");
 641 }
 642 
 643 static unsigned short atmel_ac97c_read(struct snd_ac97 *ac97,
 644                 unsigned short reg)
 645 {
 646         struct atmel_ac97c *chip = get_chip(ac97);
 647         unsigned long word;
 648         int timeout = 40;
 649         int write = 10;
 650 
 651         word = (0x80 | (reg & 0x7f)) << 16;
 652 
 653         if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0)
 654                 ac97c_readl(chip, CORHR);
 655 
 656 retry_write:
 657         timeout = 40;
 658 
 659         do {
 660                 if ((ac97c_readl(chip, COSR) & AC97C_CSR_TXRDY) != 0) {
 661                         ac97c_writel(chip, COTHR, word);
 662                         goto read_reg;
 663                 }
 664                 udelay(10);
 665         } while (--timeout);
 666 
 667         if (!--write)
 668                 goto timed_out;
 669         goto retry_write;
 670 
 671 read_reg:
 672         do {
 673                 if ((ac97c_readl(chip, COSR) & AC97C_CSR_RXRDY) != 0) {
 674                         unsigned short val = ac97c_readl(chip, CORHR);
 675                         return val;
 676                 }
 677                 udelay(10);
 678         } while (--timeout);
 679 
 680         if (!--write)
 681                 goto timed_out;
 682         goto retry_write;
 683 
 684 timed_out:
 685         dev_dbg(&chip->pdev->dev, "codec read timeout\n");
 686         return 0xffff;
 687 }
 688 
 689 static void atmel_ac97c_reset(struct atmel_ac97c *chip)
 690 {
 691         ac97c_writel(chip, MR,   0);
 692         ac97c_writel(chip, MR,   AC97C_MR_ENA);
 693         ac97c_writel(chip, CAMR, 0);
 694         ac97c_writel(chip, COMR, 0);
 695 
 696         if (!IS_ERR(chip->reset_pin)) {
 697                 gpiod_set_value(chip->reset_pin, 0);
 698                 /* AC97 v2.2 specifications says minimum 1 us. */
 699                 udelay(2);
 700                 gpiod_set_value(chip->reset_pin, 1);
 701         } else {
 702                 ac97c_writel(chip, MR, AC97C_MR_WRST | AC97C_MR_ENA);
 703                 udelay(2);
 704                 ac97c_writel(chip, MR, AC97C_MR_ENA);
 705         }
 706 }
 707 
 708 static const struct of_device_id atmel_ac97c_dt_ids[] = {
 709         { .compatible = "atmel,at91sam9263-ac97c", },
 710         { }
 711 };
 712 MODULE_DEVICE_TABLE(of, atmel_ac97c_dt_ids);
 713 
 714 static int atmel_ac97c_probe(struct platform_device *pdev)
 715 {
 716         struct device                   *dev = &pdev->dev;
 717         struct snd_card                 *card;
 718         struct atmel_ac97c              *chip;
 719         struct resource                 *regs;
 720         struct clk                      *pclk;
 721         static struct snd_ac97_bus_ops  ops = {
 722                 .write  = atmel_ac97c_write,
 723                 .read   = atmel_ac97c_read,
 724         };
 725         int                             retval;
 726         int                             irq;
 727 
 728         regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 729         if (!regs) {
 730                 dev_dbg(&pdev->dev, "no memory resource\n");
 731                 return -ENXIO;
 732         }
 733 
 734         irq = platform_get_irq(pdev, 0);
 735         if (irq < 0) {
 736                 dev_dbg(&pdev->dev, "could not get irq: %d\n", irq);
 737                 return irq;
 738         }
 739 
 740         pclk = clk_get(&pdev->dev, "ac97_clk");
 741         if (IS_ERR(pclk)) {
 742                 dev_dbg(&pdev->dev, "no peripheral clock\n");
 743                 return PTR_ERR(pclk);
 744         }
 745         retval = clk_prepare_enable(pclk);
 746         if (retval)
 747                 goto err_prepare_enable;
 748 
 749         retval = snd_card_new(&pdev->dev, SNDRV_DEFAULT_IDX1,
 750                               SNDRV_DEFAULT_STR1, THIS_MODULE,
 751                               sizeof(struct atmel_ac97c), &card);
 752         if (retval) {
 753                 dev_dbg(&pdev->dev, "could not create sound card device\n");
 754                 goto err_snd_card_new;
 755         }
 756 
 757         chip = get_chip(card);
 758 
 759         retval = request_irq(irq, atmel_ac97c_interrupt, 0, "AC97C", chip);
 760         if (retval) {
 761                 dev_dbg(&pdev->dev, "unable to request irq %d\n", irq);
 762                 goto err_request_irq;
 763         }
 764         chip->irq = irq;
 765 
 766         spin_lock_init(&chip->lock);
 767 
 768         strcpy(card->driver, "Atmel AC97C");
 769         strcpy(card->shortname, "Atmel AC97C");
 770         sprintf(card->longname, "Atmel AC97 controller");
 771 
 772         chip->card = card;
 773         chip->pclk = pclk;
 774         chip->pdev = pdev;
 775         chip->regs = ioremap(regs->start, resource_size(regs));
 776 
 777         if (!chip->regs) {
 778                 dev_dbg(&pdev->dev, "could not remap register memory\n");
 779                 retval = -ENOMEM;
 780                 goto err_ioremap;
 781         }
 782 
 783         chip->reset_pin = devm_gpiod_get_index(dev, "ac97", 2, GPIOD_OUT_HIGH);
 784         if (IS_ERR(chip->reset_pin))
 785                 dev_dbg(dev, "reset pin not available\n");
 786 
 787         atmel_ac97c_reset(chip);
 788 
 789         /* Enable overrun interrupt from codec channel */
 790         ac97c_writel(chip, COMR, AC97C_CSR_OVRUN);
 791         ac97c_writel(chip, IER, ac97c_readl(chip, IMR) | AC97C_SR_COEVT);
 792 
 793         retval = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus);
 794         if (retval) {
 795                 dev_dbg(&pdev->dev, "could not register on ac97 bus\n");
 796                 goto err_ac97_bus;
 797         }
 798 
 799         retval = atmel_ac97c_mixer_new(chip);
 800         if (retval) {
 801                 dev_dbg(&pdev->dev, "could not register ac97 mixer\n");
 802                 goto err_ac97_bus;
 803         }
 804 
 805         retval = atmel_ac97c_pcm_new(chip);
 806         if (retval) {
 807                 dev_dbg(&pdev->dev, "could not register ac97 pcm device\n");
 808                 goto err_ac97_bus;
 809         }
 810 
 811         retval = snd_card_register(card);
 812         if (retval) {
 813                 dev_dbg(&pdev->dev, "could not register sound card\n");
 814                 goto err_ac97_bus;
 815         }
 816 
 817         platform_set_drvdata(pdev, card);
 818 
 819         dev_info(&pdev->dev, "Atmel AC97 controller at 0x%p, irq = %d\n",
 820                         chip->regs, irq);
 821 
 822         return 0;
 823 
 824 err_ac97_bus:
 825         iounmap(chip->regs);
 826 err_ioremap:
 827         free_irq(irq, chip);
 828 err_request_irq:
 829         snd_card_free(card);
 830 err_snd_card_new:
 831         clk_disable_unprepare(pclk);
 832 err_prepare_enable:
 833         clk_put(pclk);
 834         return retval;
 835 }
 836 
 837 #ifdef CONFIG_PM_SLEEP
 838 static int atmel_ac97c_suspend(struct device *pdev)
 839 {
 840         struct snd_card *card = dev_get_drvdata(pdev);
 841         struct atmel_ac97c *chip = card->private_data;
 842 
 843         clk_disable_unprepare(chip->pclk);
 844         return 0;
 845 }
 846 
 847 static int atmel_ac97c_resume(struct device *pdev)
 848 {
 849         struct snd_card *card = dev_get_drvdata(pdev);
 850         struct atmel_ac97c *chip = card->private_data;
 851         int ret = clk_prepare_enable(chip->pclk);
 852 
 853         return ret;
 854 }
 855 
 856 static SIMPLE_DEV_PM_OPS(atmel_ac97c_pm, atmel_ac97c_suspend, atmel_ac97c_resume);
 857 #define ATMEL_AC97C_PM_OPS      &atmel_ac97c_pm
 858 #else
 859 #define ATMEL_AC97C_PM_OPS      NULL
 860 #endif
 861 
 862 static int atmel_ac97c_remove(struct platform_device *pdev)
 863 {
 864         struct snd_card *card = platform_get_drvdata(pdev);
 865         struct atmel_ac97c *chip = get_chip(card);
 866 
 867         ac97c_writel(chip, CAMR, 0);
 868         ac97c_writel(chip, COMR, 0);
 869         ac97c_writel(chip, MR,   0);
 870 
 871         clk_disable_unprepare(chip->pclk);
 872         clk_put(chip->pclk);
 873         iounmap(chip->regs);
 874         free_irq(chip->irq, chip);
 875 
 876         snd_card_free(card);
 877 
 878         return 0;
 879 }
 880 
 881 static struct platform_driver atmel_ac97c_driver = {
 882         .probe          = atmel_ac97c_probe,
 883         .remove         = atmel_ac97c_remove,
 884         .driver         = {
 885                 .name   = "atmel_ac97c",
 886                 .pm     = ATMEL_AC97C_PM_OPS,
 887                 .of_match_table = atmel_ac97c_dt_ids,
 888         },
 889 };
 890 module_platform_driver(atmel_ac97c_driver);
 891 
 892 MODULE_LICENSE("GPL");
 893 MODULE_DESCRIPTION("Driver for Atmel AC97 controller");
 894 MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");

/* [<][>][^][v][top][bottom][index][help] */