linux/sound/pci/lx6464es/lx6464es.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* -*- linux-c -*- *
   3 *
   4 * ALSA driver for the digigram lx6464es interface
   5 *
   6 * Copyright (c) 2008, 2009 Tim Blechmann <tim@klingt.org>
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/init.h>
  11#include <linux/pci.h>
  12#include <linux/delay.h>
  13#include <linux/slab.h>
  14
  15#include <sound/initval.h>
  16#include <sound/control.h>
  17#include <sound/info.h>
  18
  19#include "lx6464es.h"
  20
  21MODULE_AUTHOR("Tim Blechmann");
  22MODULE_LICENSE("GPL");
  23MODULE_DESCRIPTION("digigram lx6464es");
  24
  25static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
  26static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
  27static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
  28
  29module_param_array(index, int, NULL, 0444);
  30MODULE_PARM_DESC(index, "Index value for Digigram LX6464ES interface.");
  31module_param_array(id, charp, NULL, 0444);
  32MODULE_PARM_DESC(id, "ID string for  Digigram LX6464ES interface.");
  33module_param_array(enable, bool, NULL, 0444);
  34MODULE_PARM_DESC(enable, "Enable/disable specific Digigram LX6464ES soundcards.");
  35
  36static const char card_name[] = "LX6464ES";
  37
  38
  39#define PCI_DEVICE_ID_PLX_LX6464ES              PCI_DEVICE_ID_PLX_9056
  40
  41static const struct pci_device_id snd_lx6464es_ids[] = {
  42        { PCI_DEVICE_SUB(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_LX6464ES,
  43                         PCI_VENDOR_ID_DIGIGRAM,
  44                         PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_SERIAL_SUBSYSTEM),
  45        },                      /* LX6464ES */
  46        { PCI_DEVICE_SUB(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_LX6464ES,
  47                         PCI_VENDOR_ID_DIGIGRAM,
  48                         PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_CAE_SERIAL_SUBSYSTEM),
  49        },                      /* LX6464ES-CAE */
  50        { PCI_DEVICE_SUB(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_LX6464ES,
  51                         PCI_VENDOR_ID_DIGIGRAM,
  52                         PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ESE_SERIAL_SUBSYSTEM),
  53        },                      /* LX6464ESe */
  54        { PCI_DEVICE_SUB(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_LX6464ES,
  55                         PCI_VENDOR_ID_DIGIGRAM,
  56                         PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ESE_CAE_SERIAL_SUBSYSTEM),
  57        },                      /* LX6464ESe-CAE */
  58        { 0, },
  59};
  60
  61MODULE_DEVICE_TABLE(pci, snd_lx6464es_ids);
  62
  63
  64
  65/* PGO pour USERo dans le registre pci_0x06/loc_0xEC */
  66#define CHIPSC_RESET_XILINX (1L<<16)
  67
  68
  69/* alsa callbacks */
  70static const struct snd_pcm_hardware lx_caps = {
  71        .info             = (SNDRV_PCM_INFO_MMAP |
  72                             SNDRV_PCM_INFO_INTERLEAVED |
  73                             SNDRV_PCM_INFO_MMAP_VALID |
  74                             SNDRV_PCM_INFO_SYNC_START),
  75        .formats          = (SNDRV_PCM_FMTBIT_S16_LE |
  76                             SNDRV_PCM_FMTBIT_S16_BE |
  77                             SNDRV_PCM_FMTBIT_S24_3LE |
  78                             SNDRV_PCM_FMTBIT_S24_3BE),
  79        .rates            = (SNDRV_PCM_RATE_CONTINUOUS |
  80                             SNDRV_PCM_RATE_8000_192000),
  81        .rate_min         = 8000,
  82        .rate_max         = 192000,
  83        .channels_min     = 2,
  84        .channels_max     = 64,
  85        .buffer_bytes_max = 64*2*3*MICROBLAZE_IBL_MAX*MAX_STREAM_BUFFER,
  86        .period_bytes_min = (2*2*MICROBLAZE_IBL_MIN*2),
  87        .period_bytes_max = (4*64*MICROBLAZE_IBL_MAX*MAX_STREAM_BUFFER),
  88        .periods_min      = 2,
  89        .periods_max      = MAX_STREAM_BUFFER,
  90};
  91
  92static int lx_set_granularity(struct lx6464es *chip, u32 gran);
  93
  94
  95static int lx_hardware_open(struct lx6464es *chip,
  96                            struct snd_pcm_substream *substream)
  97{
  98        int err = 0;
  99        struct snd_pcm_runtime *runtime = substream->runtime;
 100        int channels = runtime->channels;
 101        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 102
 103        snd_pcm_uframes_t period_size = runtime->period_size;
 104
 105        dev_dbg(chip->card->dev, "allocating pipe for %d channels\n", channels);
 106        err = lx_pipe_allocate(chip, 0, is_capture, channels);
 107        if (err < 0) {
 108                dev_err(chip->card->dev, LXP "allocating pipe failed\n");
 109                return err;
 110        }
 111
 112        err = lx_set_granularity(chip, period_size);
 113        if (err < 0) {
 114                dev_err(chip->card->dev, "setting granularity to %ld failed\n",
 115                           period_size);
 116                return err;
 117        }
 118
 119        return 0;
 120}
 121
 122static int lx_hardware_start(struct lx6464es *chip,
 123                             struct snd_pcm_substream *substream)
 124{
 125        int err = 0;
 126        struct snd_pcm_runtime *runtime = substream->runtime;
 127        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 128
 129        dev_dbg(chip->card->dev, "setting stream format\n");
 130        err = lx_stream_set_format(chip, runtime, 0, is_capture);
 131        if (err < 0) {
 132                dev_err(chip->card->dev, "setting stream format failed\n");
 133                return err;
 134        }
 135
 136        dev_dbg(chip->card->dev, "starting pipe\n");
 137        err = lx_pipe_start(chip, 0, is_capture);
 138        if (err < 0) {
 139                dev_err(chip->card->dev, "starting pipe failed\n");
 140                return err;
 141        }
 142
 143        dev_dbg(chip->card->dev, "waiting for pipe to start\n");
 144        err = lx_pipe_wait_for_start(chip, 0, is_capture);
 145        if (err < 0) {
 146                dev_err(chip->card->dev, "waiting for pipe failed\n");
 147                return err;
 148        }
 149
 150        return err;
 151}
 152
 153
 154static int lx_hardware_stop(struct lx6464es *chip,
 155                            struct snd_pcm_substream *substream)
 156{
 157        int err = 0;
 158        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 159
 160        dev_dbg(chip->card->dev, "pausing pipe\n");
 161        err = lx_pipe_pause(chip, 0, is_capture);
 162        if (err < 0) {
 163                dev_err(chip->card->dev, "pausing pipe failed\n");
 164                return err;
 165        }
 166
 167        dev_dbg(chip->card->dev, "waiting for pipe to become idle\n");
 168        err = lx_pipe_wait_for_idle(chip, 0, is_capture);
 169        if (err < 0) {
 170                dev_err(chip->card->dev, "waiting for pipe failed\n");
 171                return err;
 172        }
 173
 174        dev_dbg(chip->card->dev, "stopping pipe\n");
 175        err = lx_pipe_stop(chip, 0, is_capture);
 176        if (err < 0) {
 177                dev_err(chip->card->dev, "stopping pipe failed\n");
 178                return err;
 179        }
 180
 181        return err;
 182}
 183
 184
 185static int lx_hardware_close(struct lx6464es *chip,
 186                             struct snd_pcm_substream *substream)
 187{
 188        int err = 0;
 189        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 190
 191        dev_dbg(chip->card->dev, "releasing pipe\n");
 192        err = lx_pipe_release(chip, 0, is_capture);
 193        if (err < 0) {
 194                dev_err(chip->card->dev, "releasing pipe failed\n");
 195                return err;
 196        }
 197
 198        return err;
 199}
 200
 201
 202static int lx_pcm_open(struct snd_pcm_substream *substream)
 203{
 204        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 205        struct snd_pcm_runtime *runtime = substream->runtime;
 206        int err = 0;
 207        int board_rate;
 208
 209        dev_dbg(chip->card->dev, "->lx_pcm_open\n");
 210        mutex_lock(&chip->setup_mutex);
 211
 212        /* copy the struct snd_pcm_hardware struct */
 213        runtime->hw = lx_caps;
 214
 215#if 0
 216        /* buffer-size should better be multiple of period-size */
 217        err = snd_pcm_hw_constraint_integer(runtime,
 218                                            SNDRV_PCM_HW_PARAM_PERIODS);
 219        if (err < 0) {
 220                dev_warn(chip->card->dev, "could not constrain periods\n");
 221                goto exit;
 222        }
 223#endif
 224
 225        /* the clock rate cannot be changed */
 226        board_rate = chip->board_sample_rate;
 227        err = snd_pcm_hw_constraint_single(runtime, SNDRV_PCM_HW_PARAM_RATE,
 228                                           board_rate);
 229
 230        if (err < 0) {
 231                dev_warn(chip->card->dev, "could not constrain periods\n");
 232                goto exit;
 233        }
 234
 235        /* constrain period size */
 236        err = snd_pcm_hw_constraint_minmax(runtime,
 237                                           SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
 238                                           MICROBLAZE_IBL_MIN,
 239                                           MICROBLAZE_IBL_MAX);
 240        if (err < 0) {
 241                dev_warn(chip->card->dev,
 242                           "could not constrain period size\n");
 243                goto exit;
 244        }
 245
 246        snd_pcm_hw_constraint_step(runtime, 0,
 247                                   SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);
 248
 249        snd_pcm_set_sync(substream);
 250        err = 0;
 251
 252exit:
 253        runtime->private_data = chip;
 254
 255        mutex_unlock(&chip->setup_mutex);
 256        dev_dbg(chip->card->dev, "<-lx_pcm_open, %d\n", err);
 257        return err;
 258}
 259
 260static int lx_pcm_close(struct snd_pcm_substream *substream)
 261{
 262        dev_dbg(substream->pcm->card->dev, "->lx_pcm_close\n");
 263        return 0;
 264}
 265
 266static snd_pcm_uframes_t lx_pcm_stream_pointer(struct snd_pcm_substream
 267                                               *substream)
 268{
 269        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 270        snd_pcm_uframes_t pos;
 271        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 272
 273        struct lx_stream *lx_stream = is_capture ? &chip->capture_stream :
 274                &chip->playback_stream;
 275
 276        dev_dbg(chip->card->dev, "->lx_pcm_stream_pointer\n");
 277
 278        mutex_lock(&chip->lock);
 279        pos = lx_stream->frame_pos * substream->runtime->period_size;
 280        mutex_unlock(&chip->lock);
 281
 282        dev_dbg(chip->card->dev, "stream_pointer at %ld\n", pos);
 283        return pos;
 284}
 285
 286static int lx_pcm_prepare(struct snd_pcm_substream *substream)
 287{
 288        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 289        int err = 0;
 290        const int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 291
 292        dev_dbg(chip->card->dev, "->lx_pcm_prepare\n");
 293
 294        mutex_lock(&chip->setup_mutex);
 295
 296        if (chip->hardware_running[is_capture]) {
 297                err = lx_hardware_stop(chip, substream);
 298                if (err < 0) {
 299                        dev_err(chip->card->dev, "failed to stop hardware. "
 300                                   "Error code %d\n", err);
 301                        goto exit;
 302                }
 303
 304                err = lx_hardware_close(chip, substream);
 305                if (err < 0) {
 306                        dev_err(chip->card->dev, "failed to close hardware. "
 307                                   "Error code %d\n", err);
 308                        goto exit;
 309                }
 310        }
 311
 312        dev_dbg(chip->card->dev, "opening hardware\n");
 313        err = lx_hardware_open(chip, substream);
 314        if (err < 0) {
 315                dev_err(chip->card->dev, "failed to open hardware. "
 316                           "Error code %d\n", err);
 317                goto exit;
 318        }
 319
 320        err = lx_hardware_start(chip, substream);
 321        if (err < 0) {
 322                dev_err(chip->card->dev, "failed to start hardware. "
 323                           "Error code %d\n", err);
 324                goto exit;
 325        }
 326
 327        chip->hardware_running[is_capture] = 1;
 328
 329        if (chip->board_sample_rate != substream->runtime->rate) {
 330                if (!err)
 331                        chip->board_sample_rate = substream->runtime->rate;
 332        }
 333
 334exit:
 335        mutex_unlock(&chip->setup_mutex);
 336        return err;
 337}
 338
 339static int lx_pcm_hw_params(struct snd_pcm_substream *substream,
 340                            struct snd_pcm_hw_params *hw_params, int is_capture)
 341{
 342        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 343
 344        dev_dbg(chip->card->dev, "->lx_pcm_hw_params\n");
 345
 346        mutex_lock(&chip->setup_mutex);
 347
 348        if (is_capture)
 349                chip->capture_stream.stream = substream;
 350        else
 351                chip->playback_stream.stream = substream;
 352
 353        mutex_unlock(&chip->setup_mutex);
 354        return 0;
 355}
 356
 357static int lx_pcm_hw_params_playback(struct snd_pcm_substream *substream,
 358                                 struct snd_pcm_hw_params *hw_params)
 359{
 360        return lx_pcm_hw_params(substream, hw_params, 0);
 361}
 362
 363static int lx_pcm_hw_params_capture(struct snd_pcm_substream *substream,
 364                                 struct snd_pcm_hw_params *hw_params)
 365{
 366        return lx_pcm_hw_params(substream, hw_params, 1);
 367}
 368
 369static int lx_pcm_hw_free(struct snd_pcm_substream *substream)
 370{
 371        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 372        int err = 0;
 373        int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 374
 375        dev_dbg(chip->card->dev, "->lx_pcm_hw_free\n");
 376        mutex_lock(&chip->setup_mutex);
 377
 378        if (chip->hardware_running[is_capture]) {
 379                err = lx_hardware_stop(chip, substream);
 380                if (err < 0) {
 381                        dev_err(chip->card->dev, "failed to stop hardware. "
 382                                   "Error code %d\n", err);
 383                        goto exit;
 384                }
 385
 386                err = lx_hardware_close(chip, substream);
 387                if (err < 0) {
 388                        dev_err(chip->card->dev, "failed to close hardware. "
 389                                   "Error code %d\n", err);
 390                        goto exit;
 391                }
 392
 393                chip->hardware_running[is_capture] = 0;
 394        }
 395
 396        if (is_capture)
 397                chip->capture_stream.stream = NULL;
 398        else
 399                chip->playback_stream.stream = NULL;
 400
 401exit:
 402        mutex_unlock(&chip->setup_mutex);
 403        return err;
 404}
 405
 406static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream)
 407{
 408        struct snd_pcm_substream *substream = lx_stream->stream;
 409        const unsigned int is_capture = lx_stream->is_capture;
 410
 411        int err;
 412
 413        const u32 channels = substream->runtime->channels;
 414        const u32 bytes_per_frame = channels * 3;
 415        const u32 period_size = substream->runtime->period_size;
 416        const u32 periods = substream->runtime->periods;
 417        const u32 period_bytes = period_size * bytes_per_frame;
 418
 419        dma_addr_t buf = substream->dma_buffer.addr;
 420        int i;
 421
 422        u32 needed, freed;
 423        u32 size_array[5];
 424
 425        for (i = 0; i != periods; ++i) {
 426                u32 buffer_index = 0;
 427
 428                err = lx_buffer_ask(chip, 0, is_capture, &needed, &freed,
 429                                    size_array);
 430                dev_dbg(chip->card->dev, "starting: needed %d, freed %d\n",
 431                            needed, freed);
 432
 433                err = lx_buffer_give(chip, 0, is_capture, period_bytes,
 434                                     lower_32_bits(buf), upper_32_bits(buf),
 435                                     &buffer_index);
 436
 437                dev_dbg(chip->card->dev, "starting: buffer index %x on 0x%lx (%d bytes)\n",
 438                            buffer_index, (unsigned long)buf, period_bytes);
 439                buf += period_bytes;
 440        }
 441
 442        err = lx_buffer_ask(chip, 0, is_capture, &needed, &freed, size_array);
 443        dev_dbg(chip->card->dev, "starting: needed %d, freed %d\n", needed, freed);
 444
 445        dev_dbg(chip->card->dev, "starting: starting stream\n");
 446        err = lx_stream_start(chip, 0, is_capture);
 447        if (err < 0)
 448                dev_err(chip->card->dev, "couldn't start stream\n");
 449        else
 450                lx_stream->status = LX_STREAM_STATUS_RUNNING;
 451
 452        lx_stream->frame_pos = 0;
 453}
 454
 455static void lx_trigger_stop(struct lx6464es *chip, struct lx_stream *lx_stream)
 456{
 457        const unsigned int is_capture = lx_stream->is_capture;
 458        int err;
 459
 460        dev_dbg(chip->card->dev, "stopping: stopping stream\n");
 461        err = lx_stream_stop(chip, 0, is_capture);
 462        if (err < 0)
 463                dev_err(chip->card->dev, "couldn't stop stream\n");
 464        else
 465                lx_stream->status = LX_STREAM_STATUS_FREE;
 466
 467}
 468
 469static void lx_trigger_dispatch_stream(struct lx6464es *chip,
 470                                       struct lx_stream *lx_stream)
 471{
 472        switch (lx_stream->status) {
 473        case LX_STREAM_STATUS_SCHEDULE_RUN:
 474                lx_trigger_start(chip, lx_stream);
 475                break;
 476
 477        case LX_STREAM_STATUS_SCHEDULE_STOP:
 478                lx_trigger_stop(chip, lx_stream);
 479                break;
 480
 481        default:
 482                break;
 483        }
 484}
 485
 486static int lx_pcm_trigger_dispatch(struct lx6464es *chip,
 487                                   struct lx_stream *lx_stream, int cmd)
 488{
 489        int err = 0;
 490
 491        mutex_lock(&chip->lock);
 492        switch (cmd) {
 493        case SNDRV_PCM_TRIGGER_START:
 494                lx_stream->status = LX_STREAM_STATUS_SCHEDULE_RUN;
 495                break;
 496
 497        case SNDRV_PCM_TRIGGER_STOP:
 498                lx_stream->status = LX_STREAM_STATUS_SCHEDULE_STOP;
 499                break;
 500
 501        default:
 502                err = -EINVAL;
 503                goto exit;
 504        }
 505
 506        lx_trigger_dispatch_stream(chip, &chip->capture_stream);
 507        lx_trigger_dispatch_stream(chip, &chip->playback_stream);
 508
 509exit:
 510        mutex_unlock(&chip->lock);
 511        return err;
 512}
 513
 514
 515static int lx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
 516{
 517        struct lx6464es *chip = snd_pcm_substream_chip(substream);
 518        const int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
 519        struct lx_stream *stream = is_capture ? &chip->capture_stream :
 520                &chip->playback_stream;
 521
 522        dev_dbg(chip->card->dev, "->lx_pcm_trigger\n");
 523
 524        return lx_pcm_trigger_dispatch(chip, stream, cmd);
 525}
 526
 527static void snd_lx6464es_free(struct snd_card *card)
 528{
 529        struct lx6464es *chip = card->private_data;
 530
 531        lx_irq_disable(chip);
 532}
 533
 534/* reset the dsp during initialization */
 535static int lx_init_xilinx_reset(struct lx6464es *chip)
 536{
 537        int i;
 538        u32 plx_reg = lx_plx_reg_read(chip, ePLX_CHIPSC);
 539
 540        dev_dbg(chip->card->dev, "->lx_init_xilinx_reset\n");
 541
 542        /* activate reset of xilinx */
 543        plx_reg &= ~CHIPSC_RESET_XILINX;
 544
 545        lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg);
 546        msleep(1);
 547
 548        lx_plx_reg_write(chip, ePLX_MBOX3, 0);
 549        msleep(1);
 550
 551        plx_reg |= CHIPSC_RESET_XILINX;
 552        lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg);
 553
 554        /* deactivate reset of xilinx */
 555        for (i = 0; i != 100; ++i) {
 556                u32 reg_mbox3;
 557                msleep(10);
 558                reg_mbox3 = lx_plx_reg_read(chip, ePLX_MBOX3);
 559                if (reg_mbox3) {
 560                        dev_dbg(chip->card->dev, "xilinx reset done\n");
 561                        dev_dbg(chip->card->dev, "xilinx took %d loops\n", i);
 562                        break;
 563                }
 564        }
 565
 566        /* todo: add some error handling? */
 567
 568        /* clear mr */
 569        lx_dsp_reg_write(chip, eReg_CSM, 0);
 570
 571        /* le xilinx ES peut ne pas etre encore pret, on attend. */
 572        msleep(600);
 573
 574        return 0;
 575}
 576
 577static int lx_init_xilinx_test(struct lx6464es *chip)
 578{
 579        u32 reg;
 580
 581        dev_dbg(chip->card->dev, "->lx_init_xilinx_test\n");
 582
 583        /* TEST if we have access to Xilinx/MicroBlaze */
 584        lx_dsp_reg_write(chip, eReg_CSM, 0);
 585
 586        reg = lx_dsp_reg_read(chip, eReg_CSM);
 587
 588        if (reg) {
 589                dev_err(chip->card->dev, "Problem: Reg_CSM %x.\n", reg);
 590
 591                /* PCI9056_SPACE0_REMAP */
 592                lx_plx_reg_write(chip, ePLX_PCICR, 1);
 593
 594                reg = lx_dsp_reg_read(chip, eReg_CSM);
 595                if (reg) {
 596                        dev_err(chip->card->dev, "Error: Reg_CSM %x.\n", reg);
 597                        return -EAGAIN; /* seems to be appropriate */
 598                }
 599        }
 600
 601        dev_dbg(chip->card->dev, "Xilinx/MicroBlaze access test successful\n");
 602
 603        return 0;
 604}
 605
 606/* initialize ethersound */
 607static int lx_init_ethersound_config(struct lx6464es *chip)
 608{
 609        int i;
 610        u32 orig_conf_es = lx_dsp_reg_read(chip, eReg_CONFES);
 611
 612        /* configure 64 io channels */
 613        u32 conf_es = (orig_conf_es & CONFES_READ_PART_MASK) |
 614                (64 << IOCR_INPUTS_OFFSET) |
 615                (64 << IOCR_OUTPUTS_OFFSET) |
 616                (FREQ_RATIO_SINGLE_MODE << FREQ_RATIO_OFFSET);
 617
 618        dev_dbg(chip->card->dev, "->lx_init_ethersound\n");
 619
 620        chip->freq_ratio = FREQ_RATIO_SINGLE_MODE;
 621
 622        /*
 623         * write it to the card !
 624         * this actually kicks the ES xilinx, the first time since poweron.
 625         * the MAC address in the Reg_ADMACESMSB Reg_ADMACESLSB registers
 626         * is not ready before this is done, and the bit 2 in Reg_CSES is set.
 627         * */
 628        lx_dsp_reg_write(chip, eReg_CONFES, conf_es);
 629
 630        for (i = 0; i != 1000; ++i) {
 631                if (lx_dsp_reg_read(chip, eReg_CSES) & 4) {
 632                        dev_dbg(chip->card->dev, "ethersound initialized after %dms\n",
 633                                   i);
 634                        goto ethersound_initialized;
 635                }
 636                msleep(1);
 637        }
 638        dev_warn(chip->card->dev,
 639                   "ethersound could not be initialized after %dms\n", i);
 640        return -ETIMEDOUT;
 641
 642 ethersound_initialized:
 643        dev_dbg(chip->card->dev, "ethersound initialized\n");
 644        return 0;
 645}
 646
 647static int lx_init_get_version_features(struct lx6464es *chip)
 648{
 649        u32 dsp_version;
 650
 651        int err;
 652
 653        dev_dbg(chip->card->dev, "->lx_init_get_version_features\n");
 654
 655        err = lx_dsp_get_version(chip, &dsp_version);
 656
 657        if (err == 0) {
 658                u32 freq;
 659
 660                dev_info(chip->card->dev, "DSP version: V%02d.%02d #%d\n",
 661                           (dsp_version>>16) & 0xff, (dsp_version>>8) & 0xff,
 662                           dsp_version & 0xff);
 663
 664                /* later: what firmware version do we expect? */
 665
 666                /* retrieve Play/Rec features */
 667                /* done here because we may have to handle alternate
 668                 * DSP files. */
 669                /* later */
 670
 671                /* init the EtherSound sample rate */
 672                err = lx_dsp_get_clock_frequency(chip, &freq);
 673                if (err == 0)
 674                        chip->board_sample_rate = freq;
 675                dev_dbg(chip->card->dev, "actual clock frequency %d\n", freq);
 676        } else {
 677                dev_err(chip->card->dev, "DSP corrupted \n");
 678                err = -EAGAIN;
 679        }
 680
 681        return err;
 682}
 683
 684static int lx_set_granularity(struct lx6464es *chip, u32 gran)
 685{
 686        int err = 0;
 687        u32 snapped_gran = MICROBLAZE_IBL_MIN;
 688
 689        dev_dbg(chip->card->dev, "->lx_set_granularity\n");
 690
 691        /* blocksize is a power of 2 */
 692        while ((snapped_gran < gran) &&
 693               (snapped_gran < MICROBLAZE_IBL_MAX)) {
 694                snapped_gran *= 2;
 695        }
 696
 697        if (snapped_gran == chip->pcm_granularity)
 698                return 0;
 699
 700        err = lx_dsp_set_granularity(chip, snapped_gran);
 701        if (err < 0) {
 702                dev_warn(chip->card->dev, "could not set granularity\n");
 703                err = -EAGAIN;
 704        }
 705
 706        if (snapped_gran != gran)
 707                dev_err(chip->card->dev, "snapped blocksize to %d\n", snapped_gran);
 708
 709        dev_dbg(chip->card->dev, "set blocksize on board %d\n", snapped_gran);
 710        chip->pcm_granularity = snapped_gran;
 711
 712        return err;
 713}
 714
 715/* initialize and test the xilinx dsp chip */
 716static int lx_init_dsp(struct lx6464es *chip)
 717{
 718        int err;
 719        int i;
 720
 721        dev_dbg(chip->card->dev, "->lx_init_dsp\n");
 722
 723        dev_dbg(chip->card->dev, "initialize board\n");
 724        err = lx_init_xilinx_reset(chip);
 725        if (err)
 726                return err;
 727
 728        dev_dbg(chip->card->dev, "testing board\n");
 729        err = lx_init_xilinx_test(chip);
 730        if (err)
 731                return err;
 732
 733        dev_dbg(chip->card->dev, "initialize ethersound configuration\n");
 734        err = lx_init_ethersound_config(chip);
 735        if (err)
 736                return err;
 737
 738        lx_irq_enable(chip);
 739
 740        /** \todo the mac address should be ready by not, but it isn't,
 741         *  so we wait for it */
 742        for (i = 0; i != 1000; ++i) {
 743                err = lx_dsp_get_mac(chip);
 744                if (err)
 745                        return err;
 746                if (chip->mac_address[0] || chip->mac_address[1] || chip->mac_address[2] ||
 747                    chip->mac_address[3] || chip->mac_address[4] || chip->mac_address[5])
 748                        goto mac_ready;
 749                msleep(1);
 750        }
 751        return -ETIMEDOUT;
 752
 753mac_ready:
 754        dev_dbg(chip->card->dev, "mac address ready read after: %dms\n", i);
 755        dev_info(chip->card->dev,
 756                 "mac address: %02X.%02X.%02X.%02X.%02X.%02X\n",
 757                   chip->mac_address[0], chip->mac_address[1], chip->mac_address[2],
 758                   chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
 759
 760        err = lx_init_get_version_features(chip);
 761        if (err)
 762                return err;
 763
 764        lx_set_granularity(chip, MICROBLAZE_IBL_DEFAULT);
 765
 766        chip->playback_mute = 0;
 767
 768        return err;
 769}
 770
 771static const struct snd_pcm_ops lx_ops_playback = {
 772        .open      = lx_pcm_open,
 773        .close     = lx_pcm_close,
 774        .prepare   = lx_pcm_prepare,
 775        .hw_params = lx_pcm_hw_params_playback,
 776        .hw_free   = lx_pcm_hw_free,
 777        .trigger   = lx_pcm_trigger,
 778        .pointer   = lx_pcm_stream_pointer,
 779};
 780
 781static const struct snd_pcm_ops lx_ops_capture = {
 782        .open      = lx_pcm_open,
 783        .close     = lx_pcm_close,
 784        .prepare   = lx_pcm_prepare,
 785        .hw_params = lx_pcm_hw_params_capture,
 786        .hw_free   = lx_pcm_hw_free,
 787        .trigger   = lx_pcm_trigger,
 788        .pointer   = lx_pcm_stream_pointer,
 789};
 790
 791static int lx_pcm_create(struct lx6464es *chip)
 792{
 793        int err;
 794        struct snd_pcm *pcm;
 795
 796        u32 size = 64 *              /* channels */
 797                3 *                  /* 24 bit samples */
 798                MAX_STREAM_BUFFER *  /* periods */
 799                MICROBLAZE_IBL_MAX * /* frames per period */
 800                2;                   /* duplex */
 801
 802        size = PAGE_ALIGN(size);
 803
 804        /* hardcoded device name & channel count */
 805        err = snd_pcm_new(chip->card, (char *)card_name, 0,
 806                          1, 1, &pcm);
 807        if (err < 0)
 808                return err;
 809
 810        pcm->private_data = chip;
 811
 812        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &lx_ops_playback);
 813        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &lx_ops_capture);
 814
 815        pcm->info_flags = 0;
 816        pcm->nonatomic = true;
 817        strcpy(pcm->name, card_name);
 818
 819        snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
 820                                       &chip->pci->dev, size, size);
 821
 822        chip->pcm = pcm;
 823        chip->capture_stream.is_capture = 1;
 824
 825        return 0;
 826}
 827
 828static int lx_control_playback_info(struct snd_kcontrol *kcontrol,
 829                                    struct snd_ctl_elem_info *uinfo)
 830{
 831        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 832        uinfo->count = 1;
 833        uinfo->value.integer.min = 0;
 834        uinfo->value.integer.max = 1;
 835        return 0;
 836}
 837
 838static int lx_control_playback_get(struct snd_kcontrol *kcontrol,
 839                                   struct snd_ctl_elem_value *ucontrol)
 840{
 841        struct lx6464es *chip = snd_kcontrol_chip(kcontrol);
 842        ucontrol->value.integer.value[0] = chip->playback_mute;
 843        return 0;
 844}
 845
 846static int lx_control_playback_put(struct snd_kcontrol *kcontrol,
 847                                   struct snd_ctl_elem_value *ucontrol)
 848{
 849        struct lx6464es *chip = snd_kcontrol_chip(kcontrol);
 850        int changed = 0;
 851        int current_value = chip->playback_mute;
 852
 853        if (current_value != ucontrol->value.integer.value[0]) {
 854                lx_level_unmute(chip, 0, !current_value);
 855                chip->playback_mute = !current_value;
 856                changed = 1;
 857        }
 858        return changed;
 859}
 860
 861static const struct snd_kcontrol_new lx_control_playback_switch = {
 862        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 863        .name = "PCM Playback Switch",
 864        .index = 0,
 865        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
 866        .private_value = 0,
 867        .info = lx_control_playback_info,
 868        .get = lx_control_playback_get,
 869        .put = lx_control_playback_put
 870};
 871
 872
 873
 874static void lx_proc_levels_read(struct snd_info_entry *entry,
 875                                struct snd_info_buffer *buffer)
 876{
 877        u32 levels[64];
 878        int err;
 879        int i, j;
 880        struct lx6464es *chip = entry->private_data;
 881
 882        snd_iprintf(buffer, "capture levels:\n");
 883        err = lx_level_peaks(chip, 1, 64, levels);
 884        if (err < 0)
 885                return;
 886
 887        for (i = 0; i != 8; ++i) {
 888                for (j = 0; j != 8; ++j)
 889                        snd_iprintf(buffer, "%08x ", levels[i*8+j]);
 890                snd_iprintf(buffer, "\n");
 891        }
 892
 893        snd_iprintf(buffer, "\nplayback levels:\n");
 894
 895        err = lx_level_peaks(chip, 0, 64, levels);
 896        if (err < 0)
 897                return;
 898
 899        for (i = 0; i != 8; ++i) {
 900                for (j = 0; j != 8; ++j)
 901                        snd_iprintf(buffer, "%08x ", levels[i*8+j]);
 902                snd_iprintf(buffer, "\n");
 903        }
 904
 905        snd_iprintf(buffer, "\n");
 906}
 907
 908static int lx_proc_create(struct snd_card *card, struct lx6464es *chip)
 909{
 910        return snd_card_ro_proc_new(card, "levels", chip, lx_proc_levels_read);
 911}
 912
 913
 914static int snd_lx6464es_create(struct snd_card *card,
 915                               struct pci_dev *pci)
 916{
 917        struct lx6464es *chip = card->private_data;
 918        int err;
 919
 920        dev_dbg(card->dev, "->snd_lx6464es_create\n");
 921
 922        /* enable PCI device */
 923        err = pcim_enable_device(pci);
 924        if (err < 0)
 925                return err;
 926
 927        pci_set_master(pci);
 928
 929        /* check if we can restrict PCI DMA transfers to 32 bits */
 930        err = dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
 931        if (err < 0) {
 932                dev_err(card->dev,
 933                        "architecture does not support 32bit PCI busmaster DMA\n");
 934                return -ENXIO;
 935        }
 936
 937        chip->card = card;
 938        chip->pci = pci;
 939        chip->irq = -1;
 940
 941        /* initialize synchronization structs */
 942        mutex_init(&chip->lock);
 943        mutex_init(&chip->msg_lock);
 944        mutex_init(&chip->setup_mutex);
 945
 946        /* request resources */
 947        err = pci_request_regions(pci, card_name);
 948        if (err < 0)
 949                return err;
 950
 951        /* plx port */
 952        chip->port_plx = pci_resource_start(pci, 1);
 953        chip->port_plx_remapped = devm_ioport_map(&pci->dev, chip->port_plx,
 954                                                  pci_resource_len(pci, 1));
 955        if (!chip->port_plx_remapped)
 956                return -ENOMEM;
 957
 958        /* dsp port */
 959        chip->port_dsp_bar = pcim_iomap(pci, 2, 0);
 960        if (!chip->port_dsp_bar)
 961                return -ENOMEM;
 962
 963        err = devm_request_threaded_irq(&pci->dev, pci->irq, lx_interrupt,
 964                                        lx_threaded_irq, IRQF_SHARED,
 965                                        KBUILD_MODNAME, chip);
 966        if (err) {
 967                dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
 968                return err;
 969        }
 970        chip->irq = pci->irq;
 971        card->sync_irq = chip->irq;
 972        card->private_free = snd_lx6464es_free;
 973
 974        err = lx_init_dsp(chip);
 975        if (err < 0) {
 976                dev_err(card->dev, "error during DSP initialization\n");
 977                return err;
 978        }
 979
 980        err = lx_pcm_create(chip);
 981        if (err < 0)
 982                return err;
 983
 984        err = lx_proc_create(card, chip);
 985        if (err < 0)
 986                return err;
 987
 988        err = snd_ctl_add(card, snd_ctl_new1(&lx_control_playback_switch,
 989                                             chip));
 990        if (err < 0)
 991                return err;
 992
 993        return 0;
 994}
 995
 996static int snd_lx6464es_probe(struct pci_dev *pci,
 997                              const struct pci_device_id *pci_id)
 998{
 999        static int dev;
1000        struct snd_card *card;
1001        struct lx6464es *chip;
1002        int err;
1003
1004        dev_dbg(&pci->dev, "->snd_lx6464es_probe\n");
1005
1006        if (dev >= SNDRV_CARDS)
1007                return -ENODEV;
1008        if (!enable[dev]) {
1009                dev++;
1010                return -ENOENT;
1011        }
1012
1013        err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1014                                sizeof(*chip), &card);
1015        if (err < 0)
1016                return err;
1017        chip = card->private_data;
1018
1019        err = snd_lx6464es_create(card, pci);
1020        if (err < 0) {
1021                dev_err(card->dev, "error during snd_lx6464es_create\n");
1022                return err;
1023        }
1024
1025        strcpy(card->driver, "LX6464ES");
1026        sprintf(card->id, "LX6464ES_%02X%02X%02X",
1027                chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
1028
1029        sprintf(card->shortname, "LX6464ES %02X.%02X.%02X.%02X.%02X.%02X",
1030                chip->mac_address[0], chip->mac_address[1], chip->mac_address[2],
1031                chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
1032
1033        sprintf(card->longname, "%s at 0x%lx, 0x%p, irq %i",
1034                card->shortname, chip->port_plx,
1035                chip->port_dsp_bar, chip->irq);
1036
1037        err = snd_card_register(card);
1038        if (err < 0)
1039                return err;
1040
1041        dev_dbg(chip->card->dev, "initialization successful\n");
1042        pci_set_drvdata(pci, card);
1043        dev++;
1044        return 0;
1045}
1046
1047static struct pci_driver lx6464es_driver = {
1048        .name =     KBUILD_MODNAME,
1049        .id_table = snd_lx6464es_ids,
1050        .probe =    snd_lx6464es_probe,
1051};
1052
1053module_pci_driver(lx6464es_driver);
1054