linux/sound/ppc/snd_ps3.c
<<
>>
Prefs
   1/*
   2 * Audio support for PS3
   3 * Copyright (C) 2007 Sony Computer Entertainment Inc.
   4 * All rights reserved.
   5 * Copyright 2006, 2007 Sony Corporation
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License
   9 * as published by the Free Software Foundation; version 2 of the Licence.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19 */
  20
  21#include <linux/init.h>
  22#include <linux/slab.h>
  23#include <linux/io.h>
  24#include <linux/interrupt.h>
  25#include <sound/core.h>
  26#include <sound/initval.h>
  27#include <sound/pcm.h>
  28#include <sound/asound.h>
  29#include <sound/memalloc.h>
  30#include <sound/pcm_params.h>
  31#include <sound/control.h>
  32#include <linux/dmapool.h>
  33#include <linux/dma-mapping.h>
  34#include <asm/firmware.h>
  35#include <asm/dma.h>
  36#include <asm/lv1call.h>
  37#include <asm/ps3.h>
  38#include <asm/ps3av.h>
  39
  40#include "snd_ps3_reg.h"
  41#include "snd_ps3.h"
  42
  43MODULE_LICENSE("GPL v2");
  44MODULE_DESCRIPTION("PS3 sound driver");
  45MODULE_AUTHOR("Sony Computer Entertainment Inc.");
  46
  47/* module  entries */
  48static int __init snd_ps3_init(void);
  49static void __exit snd_ps3_exit(void);
  50
  51/* ALSA snd driver ops */
  52static int snd_ps3_pcm_open(struct snd_pcm_substream *substream);
  53static int snd_ps3_pcm_close(struct snd_pcm_substream *substream);
  54static int snd_ps3_pcm_prepare(struct snd_pcm_substream *substream);
  55static int snd_ps3_pcm_trigger(struct snd_pcm_substream *substream,
  56                                 int cmd);
  57static snd_pcm_uframes_t snd_ps3_pcm_pointer(struct snd_pcm_substream
  58                                             *substream);
  59static int snd_ps3_pcm_hw_params(struct snd_pcm_substream *substream,
  60                                 struct snd_pcm_hw_params *hw_params);
  61static int snd_ps3_pcm_hw_free(struct snd_pcm_substream *substream);
  62
  63
  64/* ps3_system_bus_driver entries */
  65static int __init snd_ps3_driver_probe(struct ps3_system_bus_device *dev);
  66static int snd_ps3_driver_remove(struct ps3_system_bus_device *dev);
  67
  68/* address setup */
  69static int snd_ps3_map_mmio(void);
  70static void snd_ps3_unmap_mmio(void);
  71static int snd_ps3_allocate_irq(void);
  72static void snd_ps3_free_irq(void);
  73static void snd_ps3_audio_set_base_addr(uint64_t ioaddr_start);
  74
  75/* interrupt handler */
  76static irqreturn_t snd_ps3_interrupt(int irq, void *dev_id);
  77
  78
  79/* set sampling rate/format */
  80static int snd_ps3_set_avsetting(struct snd_pcm_substream *substream);
  81/* take effect parameter change */
  82static int snd_ps3_change_avsetting(struct snd_ps3_card_info *card);
  83/* initialize avsetting and take it effect */
  84static int snd_ps3_init_avsetting(struct snd_ps3_card_info *card);
  85/* setup dma */
  86static int snd_ps3_program_dma(struct snd_ps3_card_info *card,
  87                               enum snd_ps3_dma_filltype filltype);
  88static void snd_ps3_wait_for_dma_stop(struct snd_ps3_card_info *card);
  89
  90static dma_addr_t v_to_bus(struct snd_ps3_card_info *, void  *vaddr, int ch);
  91
  92
  93module_init(snd_ps3_init);
  94module_exit(snd_ps3_exit);
  95
  96/*
  97 * global
  98 */
  99static struct snd_ps3_card_info the_card;
 100
 101static int snd_ps3_start_delay = CONFIG_SND_PS3_DEFAULT_START_DELAY;
 102
 103module_param_named(start_delay, snd_ps3_start_delay, uint, 0644);
 104MODULE_PARM_DESC(start_delay, "time to insert silent data in milisec");
 105
 106static int index = SNDRV_DEFAULT_IDX1;
 107static char *id = SNDRV_DEFAULT_STR1;
 108
 109module_param(index, int, 0444);
 110MODULE_PARM_DESC(index, "Index value for PS3 soundchip.");
 111module_param(id, charp, 0444);
 112MODULE_PARM_DESC(id, "ID string for PS3 soundchip.");
 113
 114
 115/*
 116 * PS3 audio register access
 117 */
 118static inline u32 read_reg(unsigned int reg)
 119{
 120        return in_be32(the_card.mapped_mmio_vaddr + reg);
 121}
 122static inline void write_reg(unsigned int reg, u32 val)
 123{
 124        out_be32(the_card.mapped_mmio_vaddr + reg, val);
 125}
 126static inline void update_reg(unsigned int reg, u32 or_val)
 127{
 128        u32 newval = read_reg(reg) | or_val;
 129        write_reg(reg, newval);
 130}
 131static inline void update_mask_reg(unsigned int reg, u32 mask, u32 or_val)
 132{
 133        u32 newval = (read_reg(reg) & mask) | or_val;
 134        write_reg(reg, newval);
 135}
 136
 137/*
 138 * ALSA defs
 139 */
 140const static struct snd_pcm_hardware snd_ps3_pcm_hw = {
 141        .info = (SNDRV_PCM_INFO_MMAP |
 142                 SNDRV_PCM_INFO_NONINTERLEAVED |
 143                 SNDRV_PCM_INFO_MMAP_VALID),
 144        .formats = (SNDRV_PCM_FMTBIT_S16_BE |
 145                    SNDRV_PCM_FMTBIT_S24_BE),
 146        .rates = (SNDRV_PCM_RATE_44100 |
 147                  SNDRV_PCM_RATE_48000 |
 148                  SNDRV_PCM_RATE_88200 |
 149                  SNDRV_PCM_RATE_96000),
 150        .rate_min = 44100,
 151        .rate_max = 96000,
 152
 153        .channels_min = 2, /* stereo only */
 154        .channels_max = 2,
 155
 156        .buffer_bytes_max = PS3_AUDIO_FIFO_SIZE * 64,
 157
 158        /* interrupt by four stages */
 159        .period_bytes_min = PS3_AUDIO_FIFO_STAGE_SIZE * 4,
 160        .period_bytes_max = PS3_AUDIO_FIFO_STAGE_SIZE * 4,
 161
 162        .periods_min = 16,
 163        .periods_max = 32, /* buffer_size_max/ period_bytes_max */
 164
 165        .fifo_size = PS3_AUDIO_FIFO_SIZE
 166};
 167
 168static struct snd_pcm_ops snd_ps3_pcm_spdif_ops =
 169{
 170        .open = snd_ps3_pcm_open,
 171        .close = snd_ps3_pcm_close,
 172        .prepare = snd_ps3_pcm_prepare,
 173        .ioctl = snd_pcm_lib_ioctl,
 174        .trigger = snd_ps3_pcm_trigger,
 175        .pointer = snd_ps3_pcm_pointer,
 176        .hw_params = snd_ps3_pcm_hw_params,
 177        .hw_free = snd_ps3_pcm_hw_free
 178};
 179
 180static int snd_ps3_verify_dma_stop(struct snd_ps3_card_info *card,
 181                                   int count, int force_stop)
 182{
 183        int dma_ch, done, retries, stop_forced = 0;
 184        uint32_t status;
 185
 186        for (dma_ch = 0; dma_ch < 8; dma_ch ++) {
 187                retries = count;
 188                do {
 189                        status = read_reg(PS3_AUDIO_KICK(dma_ch)) &
 190                                PS3_AUDIO_KICK_STATUS_MASK;
 191                        switch (status) {
 192                        case PS3_AUDIO_KICK_STATUS_DONE:
 193                        case PS3_AUDIO_KICK_STATUS_NOTIFY:
 194                        case PS3_AUDIO_KICK_STATUS_CLEAR:
 195                        case PS3_AUDIO_KICK_STATUS_ERROR:
 196                                done = 1;
 197                                break;
 198                        default:
 199                                done = 0;
 200                                udelay(10);
 201                        }
 202                } while (!done && --retries);
 203                if (!retries && force_stop) {
 204                        pr_info("%s: DMA ch %d is not stopped.",
 205                                __func__, dma_ch);
 206                        /* last resort. force to stop dma.
 207                         *  NOTE: this cause DMA done interrupts
 208                         */
 209                        update_reg(PS3_AUDIO_CONFIG, PS3_AUDIO_CONFIG_CLEAR);
 210                        stop_forced = 1;
 211                }
 212        }
 213        return stop_forced;
 214}
 215
 216/*
 217 * wait for all dma is done.
 218 * NOTE: caller should reset card->running before call.
 219 *       If not, the interrupt handler will re-start DMA,
 220 *       then DMA is never stopped.
 221 */
 222static void snd_ps3_wait_for_dma_stop(struct snd_ps3_card_info *card)
 223{
 224        int stop_forced;
 225        /*
 226         * wait for the last dma is done
 227         */
 228
 229        /*
 230         * expected maximum DMA done time is 5.7ms + something (DMA itself).
 231         * 5.7ms is from 16bit/sample 2ch 44.1Khz; the time next
 232         * DMA kick event would occur.
 233         */
 234        stop_forced = snd_ps3_verify_dma_stop(card, 700, 1);
 235
 236        /*
 237         * clear outstanding interrupts.
 238         */
 239        update_reg(PS3_AUDIO_INTR_0, 0);
 240        update_reg(PS3_AUDIO_AX_IS, 0);
 241
 242        /*
 243         *revert CLEAR bit since it will not reset automatically after DMA stop
 244         */
 245        if (stop_forced)
 246                update_mask_reg(PS3_AUDIO_CONFIG, ~PS3_AUDIO_CONFIG_CLEAR, 0);
 247        /* ensure the hardware sees changes */
 248        wmb();
 249}
 250
 251static void snd_ps3_kick_dma(struct snd_ps3_card_info *card)
 252{
 253
 254        update_reg(PS3_AUDIO_KICK(0), PS3_AUDIO_KICK_REQUEST);
 255        /* ensure the hardware sees the change */
 256        wmb();
 257}
 258
 259/*
 260 * convert virtual addr to ioif bus addr.
 261 */
 262static dma_addr_t v_to_bus(struct snd_ps3_card_info *card,
 263                           void * paddr,
 264                           int ch)
 265{
 266        return card->dma_start_bus_addr[ch] +
 267                (paddr - card->dma_start_vaddr[ch]);
 268};
 269
 270
 271/*
 272 * increment ring buffer pointer.
 273 * NOTE: caller must hold write spinlock
 274 */
 275static void snd_ps3_bump_buffer(struct snd_ps3_card_info *card,
 276                                enum snd_ps3_ch ch, size_t byte_count,
 277                                int stage)
 278{
 279        if (!stage)
 280                card->dma_last_transfer_vaddr[ch] =
 281                        card->dma_next_transfer_vaddr[ch];
 282        card->dma_next_transfer_vaddr[ch] += byte_count;
 283        if ((card->dma_start_vaddr[ch] + (card->dma_buffer_size / 2)) <=
 284            card->dma_next_transfer_vaddr[ch]) {
 285                card->dma_next_transfer_vaddr[ch] = card->dma_start_vaddr[ch];
 286        }
 287}
 288/*
 289 * setup dmac to send data to audio and attenuate samples on the ring buffer
 290 */
 291static int snd_ps3_program_dma(struct snd_ps3_card_info *card,
 292                               enum snd_ps3_dma_filltype filltype)
 293{
 294        /* this dmac does not support over 4G */
 295        uint32_t dma_addr;
 296        int fill_stages, dma_ch, stage;
 297        enum snd_ps3_ch ch;
 298        uint32_t ch0_kick_event = 0; /* initialize to mute gcc */
 299        void *start_vaddr;
 300        unsigned long irqsave;
 301        int silent = 0;
 302
 303        switch (filltype) {
 304        case SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL:
 305                silent = 1;
 306                /* intentionally fall thru */
 307        case SND_PS3_DMA_FILLTYPE_FIRSTFILL:
 308                ch0_kick_event = PS3_AUDIO_KICK_EVENT_ALWAYS;
 309                break;
 310
 311        case SND_PS3_DMA_FILLTYPE_SILENT_RUNNING:
 312                silent = 1;
 313                /* intentionally fall thru */
 314        case SND_PS3_DMA_FILLTYPE_RUNNING:
 315                ch0_kick_event = PS3_AUDIO_KICK_EVENT_SERIALOUT0_EMPTY;
 316                break;
 317        }
 318
 319        snd_ps3_verify_dma_stop(card, 700, 0);
 320        fill_stages = 4;
 321        spin_lock_irqsave(&card->dma_lock, irqsave);
 322        for (ch = 0; ch < 2; ch++) {
 323                start_vaddr = card->dma_next_transfer_vaddr[0];
 324                for (stage = 0; stage < fill_stages; stage ++) {
 325                        dma_ch = stage * 2 + ch;
 326                        if (silent)
 327                                dma_addr = card->null_buffer_start_dma_addr;
 328                        else
 329                                dma_addr =
 330                                v_to_bus(card,
 331                                         card->dma_next_transfer_vaddr[ch],
 332                                         ch);
 333
 334                        write_reg(PS3_AUDIO_SOURCE(dma_ch),
 335                                  (PS3_AUDIO_SOURCE_TARGET_SYSTEM_MEMORY |
 336                                   dma_addr));
 337
 338                        /* dst: fixed to 3wire#0 */
 339                        if (ch == 0)
 340                                write_reg(PS3_AUDIO_DEST(dma_ch),
 341                                          (PS3_AUDIO_DEST_TARGET_AUDIOFIFO |
 342                                           PS3_AUDIO_AO_3W_LDATA(0)));
 343                        else
 344                                write_reg(PS3_AUDIO_DEST(dma_ch),
 345                                          (PS3_AUDIO_DEST_TARGET_AUDIOFIFO |
 346                                           PS3_AUDIO_AO_3W_RDATA(0)));
 347
 348                        /* count always 1 DMA block (1/2 stage = 128 bytes) */
 349                        write_reg(PS3_AUDIO_DMASIZE(dma_ch), 0);
 350                        /* bump pointer if needed */
 351                        if (!silent)
 352                                snd_ps3_bump_buffer(card, ch,
 353                                                    PS3_AUDIO_DMAC_BLOCK_SIZE,
 354                                                    stage);
 355
 356                        /* kick event  */
 357                        if (dma_ch == 0)
 358                                write_reg(PS3_AUDIO_KICK(dma_ch),
 359                                          ch0_kick_event);
 360                        else
 361                                write_reg(PS3_AUDIO_KICK(dma_ch),
 362                                          PS3_AUDIO_KICK_EVENT_AUDIO_DMA(dma_ch
 363                                                                         - 1) |
 364                                          PS3_AUDIO_KICK_REQUEST);
 365                }
 366        }
 367        /* ensure the hardware sees the change */
 368        wmb();
 369        spin_unlock_irqrestore(&card->dma_lock, irqsave);
 370
 371        return 0;
 372}
 373
 374/*
 375 * audio mute on/off
 376 * mute_on : 0 output enabled
 377 *           1 mute
 378 */
 379static int snd_ps3_mute(int mute_on)
 380{
 381        return ps3av_audio_mute(mute_on);
 382}
 383
 384/*
 385 * PCM operators
 386 */
 387static int snd_ps3_pcm_open(struct snd_pcm_substream *substream)
 388{
 389        struct snd_pcm_runtime *runtime = substream->runtime;
 390        struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
 391        int pcm_index;
 392
 393        pcm_index = substream->pcm->device;
 394        /* to retrieve substream/runtime in interrupt handler */
 395        card->substream = substream;
 396
 397        runtime->hw = snd_ps3_pcm_hw;
 398
 399        card->start_delay = snd_ps3_start_delay;
 400
 401        /* mute off */
 402        snd_ps3_mute(0); /* this function sleep */
 403
 404        snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
 405                                   PS3_AUDIO_FIFO_STAGE_SIZE * 4 * 2);
 406        return 0;
 407};
 408
 409static int snd_ps3_pcm_hw_params(struct snd_pcm_substream *substream,
 410                                 struct snd_pcm_hw_params *hw_params)
 411{
 412        size_t size;
 413
 414        /* alloc transport buffer */
 415        size = params_buffer_bytes(hw_params);
 416        snd_pcm_lib_malloc_pages(substream, size);
 417        return 0;
 418};
 419
 420static int snd_ps3_delay_to_bytes(struct snd_pcm_substream *substream,
 421                                  unsigned int delay_ms)
 422{
 423        int ret;
 424        int rate ;
 425
 426        rate = substream->runtime->rate;
 427        ret = snd_pcm_format_size(substream->runtime->format,
 428                                  rate * delay_ms / 1000)
 429                * substream->runtime->channels;
 430
 431        pr_debug(KERN_ERR "%s: time=%d rate=%d bytes=%ld, frames=%d, ret=%d\n",
 432                 __func__,
 433                 delay_ms,
 434                 rate,
 435                 snd_pcm_format_size(substream->runtime->format, rate),
 436                 rate * delay_ms / 1000,
 437                 ret);
 438
 439        return ret;
 440};
 441
 442static int snd_ps3_pcm_prepare(struct snd_pcm_substream *substream)
 443{
 444        struct snd_pcm_runtime *runtime = substream->runtime;
 445        struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
 446        unsigned long irqsave;
 447
 448        if (!snd_ps3_set_avsetting(substream)) {
 449                /* some parameter changed */
 450                write_reg(PS3_AUDIO_AX_IE,
 451                          PS3_AUDIO_AX_IE_ASOBEIE(0) |
 452                          PS3_AUDIO_AX_IE_ASOBUIE(0));
 453                /*
 454                 * let SPDIF device re-lock with SPDIF signal,
 455                 * start with some silence
 456                 */
 457                card->silent = snd_ps3_delay_to_bytes(substream,
 458                                                      card->start_delay) /
 459                        (PS3_AUDIO_FIFO_STAGE_SIZE * 4); /* every 4 times */
 460        }
 461
 462        /* restart ring buffer pointer */
 463        spin_lock_irqsave(&card->dma_lock, irqsave);
 464        {
 465                card->dma_buffer_size = runtime->dma_bytes;
 466
 467                card->dma_last_transfer_vaddr[SND_PS3_CH_L] =
 468                        card->dma_next_transfer_vaddr[SND_PS3_CH_L] =
 469                        card->dma_start_vaddr[SND_PS3_CH_L] =
 470                        runtime->dma_area;
 471                card->dma_start_bus_addr[SND_PS3_CH_L] = runtime->dma_addr;
 472
 473                card->dma_last_transfer_vaddr[SND_PS3_CH_R] =
 474                        card->dma_next_transfer_vaddr[SND_PS3_CH_R] =
 475                        card->dma_start_vaddr[SND_PS3_CH_R] =
 476                        runtime->dma_area + (runtime->dma_bytes / 2);
 477                card->dma_start_bus_addr[SND_PS3_CH_R] =
 478                        runtime->dma_addr + (runtime->dma_bytes / 2);
 479
 480                pr_debug("%s: vaddr=%p bus=%#lx\n", __func__,
 481                         card->dma_start_vaddr[SND_PS3_CH_L],
 482                         card->dma_start_bus_addr[SND_PS3_CH_L]);
 483
 484        }
 485        spin_unlock_irqrestore(&card->dma_lock, irqsave);
 486
 487        /* ensure the hardware sees the change */
 488        mb();
 489
 490        return 0;
 491};
 492
 493static int snd_ps3_pcm_trigger(struct snd_pcm_substream *substream,
 494                               int cmd)
 495{
 496        struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
 497        int ret = 0;
 498
 499        switch (cmd) {
 500        case SNDRV_PCM_TRIGGER_START:
 501                /* clear outstanding interrupts  */
 502                update_reg(PS3_AUDIO_AX_IS, 0);
 503
 504                spin_lock(&card->dma_lock);
 505                {
 506                        card->running = 1;
 507                }
 508                spin_unlock(&card->dma_lock);
 509
 510                snd_ps3_program_dma(card,
 511                                    SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
 512                snd_ps3_kick_dma(card);
 513                while (read_reg(PS3_AUDIO_KICK(7)) &
 514                       PS3_AUDIO_KICK_STATUS_MASK) {
 515                        udelay(1);
 516                }
 517                snd_ps3_program_dma(card, SND_PS3_DMA_FILLTYPE_SILENT_RUNNING);
 518                snd_ps3_kick_dma(card);
 519                break;
 520
 521        case SNDRV_PCM_TRIGGER_STOP:
 522                spin_lock(&card->dma_lock);
 523                {
 524                        card->running = 0;
 525                }
 526                spin_unlock(&card->dma_lock);
 527                snd_ps3_wait_for_dma_stop(card);
 528                break;
 529        default:
 530                break;
 531
 532        }
 533
 534        return ret;
 535};
 536
 537/*
 538 * report current pointer
 539 */
 540static snd_pcm_uframes_t snd_ps3_pcm_pointer(
 541        struct snd_pcm_substream *substream)
 542{
 543        struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
 544        size_t bytes;
 545        snd_pcm_uframes_t ret;
 546
 547        spin_lock(&card->dma_lock);
 548        {
 549                bytes = (size_t)(card->dma_last_transfer_vaddr[SND_PS3_CH_L] -
 550                                 card->dma_start_vaddr[SND_PS3_CH_L]);
 551        }
 552        spin_unlock(&card->dma_lock);
 553
 554        ret = bytes_to_frames(substream->runtime, bytes * 2);
 555
 556        return ret;
 557};
 558
 559static int snd_ps3_pcm_hw_free(struct snd_pcm_substream *substream)
 560{
 561        int ret;
 562        ret = snd_pcm_lib_free_pages(substream);
 563        return ret;
 564};
 565
 566static int snd_ps3_pcm_close(struct snd_pcm_substream *substream)
 567{
 568        /* mute on */
 569        snd_ps3_mute(1);
 570        return 0;
 571};
 572
 573static void snd_ps3_audio_fixup(struct snd_ps3_card_info *card)
 574{
 575        /*
 576         * avsetting driver seems to never change the followings
 577         * so, init them here once
 578         */
 579
 580        /* no dma interrupt needed */
 581        write_reg(PS3_AUDIO_INTR_EN_0, 0);
 582
 583        /* use every 4 buffer empty interrupt */
 584        update_mask_reg(PS3_AUDIO_AX_IC,
 585                        PS3_AUDIO_AX_IC_AASOIMD_MASK,
 586                        PS3_AUDIO_AX_IC_AASOIMD_EVERY4);
 587
 588        /* enable 3wire clocks */
 589        update_mask_reg(PS3_AUDIO_AO_3WMCTRL,
 590                        ~(PS3_AUDIO_AO_3WMCTRL_ASOBCLKD_DISABLED |
 591                          PS3_AUDIO_AO_3WMCTRL_ASOLRCKD_DISABLED),
 592                        0);
 593        update_reg(PS3_AUDIO_AO_3WMCTRL,
 594                   PS3_AUDIO_AO_3WMCTRL_ASOPLRCK_DEFAULT);
 595}
 596
 597/*
 598 * av setting
 599 * NOTE: calling this function may generate audio interrupt.
 600 */
 601static int snd_ps3_change_avsetting(struct snd_ps3_card_info *card)
 602{
 603        int ret, retries, i;
 604        pr_debug("%s: start\n", __func__);
 605
 606        ret = ps3av_set_audio_mode(card->avs.avs_audio_ch,
 607                                  card->avs.avs_audio_rate,
 608                                  card->avs.avs_audio_width,
 609                                  card->avs.avs_audio_format,
 610                                  card->avs.avs_audio_source);
 611        /*
 612         * Reset the following unwanted settings:
 613         */
 614
 615        /* disable all 3wire buffers */
 616        update_mask_reg(PS3_AUDIO_AO_3WMCTRL,
 617                        ~(PS3_AUDIO_AO_3WMCTRL_ASOEN(0) |
 618                          PS3_AUDIO_AO_3WMCTRL_ASOEN(1) |
 619                          PS3_AUDIO_AO_3WMCTRL_ASOEN(2) |
 620                          PS3_AUDIO_AO_3WMCTRL_ASOEN(3)),
 621                        0);
 622        wmb();  /* ensure the hardware sees the change */
 623        /* wait for actually stopped */
 624        retries = 1000;
 625        while ((read_reg(PS3_AUDIO_AO_3WMCTRL) &
 626                (PS3_AUDIO_AO_3WMCTRL_ASORUN(0) |
 627                 PS3_AUDIO_AO_3WMCTRL_ASORUN(1) |
 628                 PS3_AUDIO_AO_3WMCTRL_ASORUN(2) |
 629                 PS3_AUDIO_AO_3WMCTRL_ASORUN(3))) &&
 630               --retries) {
 631                udelay(1);
 632        }
 633
 634        /* reset buffer pointer */
 635        for (i = 0; i < 4; i++) {
 636                update_reg(PS3_AUDIO_AO_3WCTRL(i),
 637                           PS3_AUDIO_AO_3WCTRL_ASOBRST_RESET);
 638                udelay(10);
 639        }
 640        wmb(); /* ensure the hardware actually start resetting */
 641
 642        /* enable 3wire#0 buffer */
 643        update_reg(PS3_AUDIO_AO_3WMCTRL, PS3_AUDIO_AO_3WMCTRL_ASOEN(0));
 644
 645
 646        /* In 24bit mode,ALSA inserts a zero byte at first byte of per sample */
 647        update_mask_reg(PS3_AUDIO_AO_3WCTRL(0),
 648                        ~PS3_AUDIO_AO_3WCTRL_ASODF,
 649                        PS3_AUDIO_AO_3WCTRL_ASODF_LSB);
 650        update_mask_reg(PS3_AUDIO_AO_SPDCTRL(0),
 651                        ~PS3_AUDIO_AO_SPDCTRL_SPODF,
 652                        PS3_AUDIO_AO_SPDCTRL_SPODF_LSB);
 653        /* ensure all the setting above is written back to register */
 654        wmb();
 655        /* avsetting driver altered AX_IE, caller must reset it if you want */
 656        pr_debug("%s: end\n", __func__);
 657        return ret;
 658}
 659
 660static int snd_ps3_init_avsetting(struct snd_ps3_card_info *card)
 661{
 662        int ret;
 663        pr_debug("%s: start\n", __func__);
 664        card->avs.avs_audio_ch = PS3AV_CMD_AUDIO_NUM_OF_CH_2;
 665        card->avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
 666        card->avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
 667        card->avs.avs_audio_format = PS3AV_CMD_AUDIO_FORMAT_PCM;
 668        card->avs.avs_audio_source = PS3AV_CMD_AUDIO_SOURCE_SERIAL;
 669
 670        ret = snd_ps3_change_avsetting(card);
 671
 672        snd_ps3_audio_fixup(card);
 673
 674        /* to start to generate SPDIF signal, fill data */
 675        snd_ps3_program_dma(card, SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
 676        snd_ps3_kick_dma(card);
 677        pr_debug("%s: end\n", __func__);
 678        return ret;
 679}
 680
 681/*
 682 *  set sampling rate according to the substream
 683 */
 684static int snd_ps3_set_avsetting(struct snd_pcm_substream *substream)
 685{
 686        struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
 687        struct snd_ps3_avsetting_info avs;
 688
 689        avs = card->avs;
 690
 691        pr_debug("%s: called freq=%d width=%d\n", __func__,
 692                 substream->runtime->rate,
 693                 snd_pcm_format_width(substream->runtime->format));
 694
 695        pr_debug("%s: before freq=%d width=%d\n", __func__,
 696                 card->avs.avs_audio_rate, card->avs.avs_audio_width);
 697
 698        /* sample rate */
 699        switch (substream->runtime->rate) {
 700        case 44100:
 701                avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_44K;
 702                break;
 703        case 48000:
 704                avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
 705                break;
 706        case 88200:
 707                avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_88K;
 708                break;
 709        case 96000:
 710                avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_96K;
 711                break;
 712        default:
 713                pr_info("%s: invalid rate %d\n", __func__,
 714                        substream->runtime->rate);
 715                return 1;
 716        }
 717
 718        /* width */
 719        switch (snd_pcm_format_width(substream->runtime->format)) {
 720        case 16:
 721                avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
 722                break;
 723        case 24:
 724                avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_24;
 725                break;
 726        default:
 727                pr_info("%s: invalid width %d\n", __func__,
 728                        snd_pcm_format_width(substream->runtime->format));
 729                return 1;
 730        }
 731
 732        if ((card->avs.avs_audio_width != avs.avs_audio_width) ||
 733            (card->avs.avs_audio_rate != avs.avs_audio_rate)) {
 734                card->avs = avs;
 735                snd_ps3_change_avsetting(card);
 736
 737                pr_debug("%s: after freq=%d width=%d\n", __func__,
 738                         card->avs.avs_audio_rate, card->avs.avs_audio_width);
 739
 740                return 0;
 741        } else
 742                return 1;
 743}
 744
 745
 746
 747static int snd_ps3_map_mmio(void)
 748{
 749        the_card.mapped_mmio_vaddr =
 750                ioremap(the_card.ps3_dev->m_region->bus_addr,
 751                        the_card.ps3_dev->m_region->len);
 752
 753        if (!the_card.mapped_mmio_vaddr) {
 754                pr_info("%s: ioremap 0 failed p=%#lx l=%#lx \n",
 755                       __func__, the_card.ps3_dev->m_region->lpar_addr,
 756                       the_card.ps3_dev->m_region->len);
 757                return -ENXIO;
 758        }
 759
 760        return 0;
 761};
 762
 763static void snd_ps3_unmap_mmio(void)
 764{
 765        iounmap(the_card.mapped_mmio_vaddr);
 766        the_card.mapped_mmio_vaddr = NULL;
 767}
 768
 769static int snd_ps3_allocate_irq(void)
 770{
 771        int ret;
 772        u64 lpar_addr, lpar_size;
 773        u64 __iomem *mapped;
 774
 775        /* FIXME: move this to device_init (H/W probe) */
 776
 777        /* get irq outlet */
 778        ret = lv1_gpu_device_map(1, &lpar_addr, &lpar_size);
 779        if (ret) {
 780                pr_info("%s: device map 1 failed %d\n", __func__,
 781                        ret);
 782                return -ENXIO;
 783        }
 784
 785        mapped = ioremap(lpar_addr, lpar_size);
 786        if (!mapped) {
 787                pr_info("%s: ioremap 1 failed \n", __func__);
 788                return -ENXIO;
 789        }
 790
 791        the_card.audio_irq_outlet = in_be64(mapped);
 792
 793        iounmap(mapped);
 794        ret = lv1_gpu_device_unmap(1);
 795        if (ret)
 796                pr_info("%s: unmap 1 failed\n", __func__);
 797
 798        /* irq */
 799        ret = ps3_irq_plug_setup(PS3_BINDING_CPU_ANY,
 800                                 the_card.audio_irq_outlet,
 801                                 &the_card.irq_no);
 802        if (ret) {
 803                pr_info("%s:ps3_alloc_irq failed (%d)\n", __func__, ret);
 804                return ret;
 805        }
 806
 807        ret = request_irq(the_card.irq_no, snd_ps3_interrupt, IRQF_DISABLED,
 808                          SND_PS3_DRIVER_NAME, &the_card);
 809        if (ret) {
 810                pr_info("%s: request_irq failed (%d)\n", __func__, ret);
 811                goto cleanup_irq;
 812        }
 813
 814        return 0;
 815
 816 cleanup_irq:
 817        ps3_irq_plug_destroy(the_card.irq_no);
 818        return ret;
 819};
 820
 821static void snd_ps3_free_irq(void)
 822{
 823        free_irq(the_card.irq_no, &the_card);
 824        ps3_irq_plug_destroy(the_card.irq_no);
 825}
 826
 827static void snd_ps3_audio_set_base_addr(uint64_t ioaddr_start)
 828{
 829        uint64_t val;
 830        int ret;
 831
 832        val = (ioaddr_start & (0x0fUL << 32)) >> (32 - 20) |
 833                (0x03UL << 24) |
 834                (0x0fUL << 12) |
 835                (PS3_AUDIO_IOID);
 836
 837        ret = lv1_gpu_attribute(0x100, 0x007, val, 0, 0);
 838        if (ret)
 839                pr_info("%s: gpu_attribute failed %d\n", __func__,
 840                        ret);
 841}
 842
 843static int __init snd_ps3_driver_probe(struct ps3_system_bus_device *dev)
 844{
 845        int ret;
 846        u64 lpar_addr, lpar_size;
 847
 848        BUG_ON(!firmware_has_feature(FW_FEATURE_PS3_LV1));
 849        BUG_ON(dev->match_id != PS3_MATCH_ID_SOUND);
 850
 851        the_card.ps3_dev = dev;
 852
 853        ret = ps3_open_hv_device(dev);
 854
 855        if (ret)
 856                return -ENXIO;
 857
 858        /* setup MMIO */
 859        ret = lv1_gpu_device_map(2, &lpar_addr, &lpar_size);
 860        if (ret) {
 861                pr_info("%s: device map 2 failed %d\n", __func__, ret);
 862                goto clean_open;
 863        }
 864        ps3_mmio_region_init(dev, dev->m_region, lpar_addr, lpar_size,
 865                PAGE_SHIFT);
 866
 867        ret = snd_ps3_map_mmio();
 868        if (ret)
 869                goto clean_dev_map;
 870
 871        /* setup DMA area */
 872        ps3_dma_region_init(dev, dev->d_region,
 873                            PAGE_SHIFT, /* use system page size */
 874                            0, /* dma type; not used */
 875                            NULL,
 876                            _ALIGN_UP(SND_PS3_DMA_REGION_SIZE, PAGE_SIZE));
 877        dev->d_region->ioid = PS3_AUDIO_IOID;
 878
 879        ret = ps3_dma_region_create(dev->d_region);
 880        if (ret) {
 881                pr_info("%s: region_create\n", __func__);
 882                goto clean_mmio;
 883        }
 884
 885        snd_ps3_audio_set_base_addr(dev->d_region->bus_addr);
 886
 887        /* CONFIG_SND_PS3_DEFAULT_START_DELAY */
 888        the_card.start_delay = snd_ps3_start_delay;
 889
 890        /* irq */
 891        if (snd_ps3_allocate_irq()) {
 892                ret = -ENXIO;
 893                goto clean_dma_region;
 894        }
 895
 896        /* create card instance */
 897        the_card.card = snd_card_new(index, id, THIS_MODULE, 0);
 898        if (!the_card.card) {
 899                ret = -ENXIO;
 900                goto clean_irq;
 901        }
 902
 903        strcpy(the_card.card->driver, "PS3");
 904        strcpy(the_card.card->shortname, "PS3");
 905        strcpy(the_card.card->longname, "PS3 sound");
 906        /* create PCM devices instance */
 907        /* NOTE:this driver works assuming pcm:substream = 1:1 */
 908        ret = snd_pcm_new(the_card.card,
 909                          "SPDIF",
 910                          0, /* instance index, will be stored pcm.device*/
 911                          1, /* output substream */
 912                          0, /* input substream */
 913                          &(the_card.pcm));
 914        if (ret)
 915                goto clean_card;
 916
 917        the_card.pcm->private_data = &the_card;
 918        strcpy(the_card.pcm->name, "SPDIF");
 919
 920        /* set pcm ops */
 921        snd_pcm_set_ops(the_card.pcm, SNDRV_PCM_STREAM_PLAYBACK,
 922                        &snd_ps3_pcm_spdif_ops);
 923
 924        the_card.pcm->info_flags = SNDRV_PCM_INFO_NONINTERLEAVED;
 925        /* pre-alloc PCM DMA buffer*/
 926        ret = snd_pcm_lib_preallocate_pages_for_all(the_card.pcm,
 927                                        SNDRV_DMA_TYPE_DEV,
 928                                        &dev->core,
 929                                        SND_PS3_PCM_PREALLOC_SIZE,
 930                                        SND_PS3_PCM_PREALLOC_SIZE);
 931        if (ret < 0) {
 932                pr_info("%s: prealloc failed\n", __func__);
 933                goto clean_card;
 934        }
 935
 936        /*
 937         * allocate null buffer
 938         * its size should be lager than PS3_AUDIO_FIFO_STAGE_SIZE * 2
 939         * PAGE_SIZE is enogh
 940         */
 941        if (!(the_card.null_buffer_start_vaddr =
 942              dma_alloc_coherent(&the_card.ps3_dev->core,
 943                                 PAGE_SIZE,
 944                                 &the_card.null_buffer_start_dma_addr,
 945                                 GFP_KERNEL))) {
 946                pr_info("%s: nullbuffer alloc failed\n", __func__);
 947                goto clean_preallocate;
 948        }
 949        pr_debug("%s: null vaddr=%p dma=%#lx\n", __func__,
 950                 the_card.null_buffer_start_vaddr,
 951                 the_card.null_buffer_start_dma_addr);
 952        /* set default sample rate/word width */
 953        snd_ps3_init_avsetting(&the_card);
 954
 955        /* register the card */
 956        snd_card_set_dev(the_card.card, &dev->core);
 957        ret = snd_card_register(the_card.card);
 958        if (ret < 0)
 959                goto clean_dma_map;
 960
 961        pr_info("%s started. start_delay=%dms\n",
 962                the_card.card->longname, the_card.start_delay);
 963        return 0;
 964
 965clean_dma_map:
 966        dma_free_coherent(&the_card.ps3_dev->core,
 967                          PAGE_SIZE,
 968                          the_card.null_buffer_start_vaddr,
 969                          the_card.null_buffer_start_dma_addr);
 970clean_preallocate:
 971        snd_pcm_lib_preallocate_free_for_all(the_card.pcm);
 972clean_card:
 973        snd_card_free(the_card.card);
 974clean_irq:
 975        snd_ps3_free_irq();
 976clean_dma_region:
 977        ps3_dma_region_free(dev->d_region);
 978clean_mmio:
 979        snd_ps3_unmap_mmio();
 980clean_dev_map:
 981        lv1_gpu_device_unmap(2);
 982clean_open:
 983        ps3_close_hv_device(dev);
 984        /*
 985         * there is no destructor function to pcm.
 986         * midlayer automatically releases if the card removed
 987         */
 988        return ret;
 989}; /* snd_ps3_probe */
 990
 991/* called when module removal */
 992static int snd_ps3_driver_remove(struct ps3_system_bus_device *dev)
 993{
 994        int ret;
 995        pr_info("%s:start id=%d\n", __func__,  dev->match_id);
 996        if (dev->match_id != PS3_MATCH_ID_SOUND)
 997                return -ENXIO;
 998
 999        /*
1000         * ctl and preallocate buffer will be freed in
1001         * snd_card_free
1002         */
1003        ret = snd_card_free(the_card.card);
1004        if (ret)
1005                pr_info("%s: ctl freecard=%d\n", __func__, ret);
1006
1007        dma_free_coherent(&dev->core,
1008                          PAGE_SIZE,
1009                          the_card.null_buffer_start_vaddr,
1010                          the_card.null_buffer_start_dma_addr);
1011
1012        ps3_dma_region_free(dev->d_region);
1013
1014        snd_ps3_free_irq();
1015        snd_ps3_unmap_mmio();
1016
1017        lv1_gpu_device_unmap(2);
1018        ps3_close_hv_device(dev);
1019        pr_info("%s:end id=%d\n", __func__, dev->match_id);
1020        return 0;
1021} /* snd_ps3_remove */
1022
1023static struct ps3_system_bus_driver snd_ps3_bus_driver_info = {
1024        .match_id = PS3_MATCH_ID_SOUND,
1025        .probe = snd_ps3_driver_probe,
1026        .remove = snd_ps3_driver_remove,
1027        .shutdown = snd_ps3_driver_remove,
1028        .core = {
1029                .name = SND_PS3_DRIVER_NAME,
1030                .owner = THIS_MODULE,
1031        },
1032};
1033
1034
1035/*
1036 * Interrupt handler
1037 */
1038static irqreturn_t snd_ps3_interrupt(int irq, void *dev_id)
1039{
1040
1041        uint32_t port_intr;
1042        int underflow_occured = 0;
1043        struct snd_ps3_card_info *card = dev_id;
1044
1045        if (!card->running) {
1046                update_reg(PS3_AUDIO_AX_IS, 0);
1047                update_reg(PS3_AUDIO_INTR_0, 0);
1048                return IRQ_HANDLED;
1049        }
1050
1051        port_intr = read_reg(PS3_AUDIO_AX_IS);
1052        /*
1053         *serial buffer empty detected (every 4 times),
1054         *program next dma and kick it
1055         */
1056        if (port_intr & PS3_AUDIO_AX_IE_ASOBEIE(0)) {
1057                write_reg(PS3_AUDIO_AX_IS, PS3_AUDIO_AX_IE_ASOBEIE(0));
1058                if (port_intr & PS3_AUDIO_AX_IE_ASOBUIE(0)) {
1059                        write_reg(PS3_AUDIO_AX_IS, port_intr);
1060                        underflow_occured = 1;
1061                }
1062                if (card->silent) {
1063                        /* we are still in silent time */
1064                        snd_ps3_program_dma(card,
1065                                (underflow_occured) ?
1066                                SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL :
1067                                SND_PS3_DMA_FILLTYPE_SILENT_RUNNING);
1068                        snd_ps3_kick_dma(card);
1069                        card->silent --;
1070                } else {
1071                        snd_ps3_program_dma(card,
1072                                (underflow_occured) ?
1073                                SND_PS3_DMA_FILLTYPE_FIRSTFILL :
1074                                SND_PS3_DMA_FILLTYPE_RUNNING);
1075                        snd_ps3_kick_dma(card);
1076                        snd_pcm_period_elapsed(card->substream);
1077                }
1078        } else if (port_intr & PS3_AUDIO_AX_IE_ASOBUIE(0)) {
1079                write_reg(PS3_AUDIO_AX_IS, PS3_AUDIO_AX_IE_ASOBUIE(0));
1080                /*
1081                 * serial out underflow, but buffer empty not detected.
1082                 * in this case, fill fifo with 0 to recover.  After
1083                 * filling dummy data, serial automatically start to
1084                 * consume them and then will generate normal buffer
1085                 * empty interrupts.
1086                 * If both buffer underflow and buffer empty are occured,
1087                 * it is better to do nomal data transfer than empty one
1088                 */
1089                snd_ps3_program_dma(card,
1090                                    SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
1091                snd_ps3_kick_dma(card);
1092                snd_ps3_program_dma(card,
1093                                    SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
1094                snd_ps3_kick_dma(card);
1095        }
1096        /* clear interrupt cause */
1097        return IRQ_HANDLED;
1098};
1099
1100/*
1101 * module/subsystem initialize/terminate
1102 */
1103static int __init snd_ps3_init(void)
1104{
1105        int ret;
1106
1107        if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
1108                return -ENXIO;
1109
1110        memset(&the_card, 0, sizeof(the_card));
1111        spin_lock_init(&the_card.dma_lock);
1112
1113        /* register systembus DRIVER, this calls our probe() func */
1114        ret = ps3_system_bus_driver_register(&snd_ps3_bus_driver_info);
1115
1116        return ret;
1117}
1118
1119static void __exit snd_ps3_exit(void)
1120{
1121        ps3_system_bus_driver_unregister(&snd_ps3_bus_driver_info);
1122}
1123
1124MODULE_ALIAS(PS3_MODULE_ALIAS_SOUND);
1125
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.