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 int snd_lx6464es_free(struct lx6464es *chip)
 528{
 529        dev_dbg(chip->card->dev, "->snd_lx6464es_free\n");
 530
 531        lx_irq_disable(chip);
 532
 533        if (chip->irq >= 0)
 534                free_irq(chip->irq, chip);
 535
 536        iounmap(chip->port_dsp_bar);
 537        ioport_unmap(chip->port_plx_remapped);
 538
 539        pci_release_regions(chip->pci);
 540        pci_disable_device(chip->pci);
 541
 542        kfree(chip);
 543
 544        return 0;
 545}
 546
 547static int snd_lx6464es_dev_free(struct snd_device *device)
 548{
 549        return snd_lx6464es_free(device->device_data);
 550}
 551
 552/* reset the dsp during initialization */
 553static int lx_init_xilinx_reset(struct lx6464es *chip)
 554{
 555        int i;
 556        u32 plx_reg = lx_plx_reg_read(chip, ePLX_CHIPSC);
 557
 558        dev_dbg(chip->card->dev, "->lx_init_xilinx_reset\n");
 559
 560        /* activate reset of xilinx */
 561        plx_reg &= ~CHIPSC_RESET_XILINX;
 562
 563        lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg);
 564        msleep(1);
 565
 566        lx_plx_reg_write(chip, ePLX_MBOX3, 0);
 567        msleep(1);
 568
 569        plx_reg |= CHIPSC_RESET_XILINX;
 570        lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg);
 571
 572        /* deactivate reset of xilinx */
 573        for (i = 0; i != 100; ++i) {
 574                u32 reg_mbox3;
 575                msleep(10);
 576                reg_mbox3 = lx_plx_reg_read(chip, ePLX_MBOX3);
 577                if (reg_mbox3) {
 578                        dev_dbg(chip->card->dev, "xilinx reset done\n");
 579                        dev_dbg(chip->card->dev, "xilinx took %d loops\n", i);
 580                        break;
 581                }
 582        }
 583
 584        /* todo: add some error handling? */
 585
 586        /* clear mr */
 587        lx_dsp_reg_write(chip, eReg_CSM, 0);
 588
 589        /* le xilinx ES peut ne pas etre encore pret, on attend. */
 590        msleep(600);
 591
 592        return 0;
 593}
 594
 595static int lx_init_xilinx_test(struct lx6464es *chip)
 596{
 597        u32 reg;
 598
 599        dev_dbg(chip->card->dev, "->lx_init_xilinx_test\n");
 600
 601        /* TEST if we have access to Xilinx/MicroBlaze */
 602        lx_dsp_reg_write(chip, eReg_CSM, 0);
 603
 604        reg = lx_dsp_reg_read(chip, eReg_CSM);
 605
 606        if (reg) {
 607                dev_err(chip->card->dev, "Problem: Reg_CSM %x.\n", reg);
 608
 609                /* PCI9056_SPACE0_REMAP */
 610                lx_plx_reg_write(chip, ePLX_PCICR, 1);
 611
 612                reg = lx_dsp_reg_read(chip, eReg_CSM);
 613                if (reg) {
 614                        dev_err(chip->card->dev, "Error: Reg_CSM %x.\n", reg);
 615                        return -EAGAIN; /* seems to be appropriate */
 616                }
 617        }
 618
 619        dev_dbg(chip->card->dev, "Xilinx/MicroBlaze access test successful\n");
 620
 621        return 0;
 622}
 623
 624/* initialize ethersound */
 625static int lx_init_ethersound_config(struct lx6464es *chip)
 626{
 627        int i;
 628        u32 orig_conf_es = lx_dsp_reg_read(chip, eReg_CONFES);
 629
 630        /* configure 64 io channels */
 631        u32 conf_es = (orig_conf_es & CONFES_READ_PART_MASK) |
 632                (64 << IOCR_INPUTS_OFFSET) |
 633                (64 << IOCR_OUTPUTS_OFFSET) |
 634                (FREQ_RATIO_SINGLE_MODE << FREQ_RATIO_OFFSET);
 635
 636        dev_dbg(chip->card->dev, "->lx_init_ethersound\n");
 637
 638        chip->freq_ratio = FREQ_RATIO_SINGLE_MODE;
 639
 640        /*
 641         * write it to the card !
 642         * this actually kicks the ES xilinx, the first time since poweron.
 643         * the MAC address in the Reg_ADMACESMSB Reg_ADMACESLSB registers
 644         * is not ready before this is done, and the bit 2 in Reg_CSES is set.
 645         * */
 646        lx_dsp_reg_write(chip, eReg_CONFES, conf_es);
 647
 648        for (i = 0; i != 1000; ++i) {
 649                if (lx_dsp_reg_read(chip, eReg_CSES) & 4) {
 650                        dev_dbg(chip->card->dev, "ethersound initialized after %dms\n",
 651                                   i);
 652                        goto ethersound_initialized;
 653                }
 654                msleep(1);
 655        }
 656        dev_warn(chip->card->dev,
 657                   "ethersound could not be initialized after %dms\n", i);
 658        return -ETIMEDOUT;
 659
 660 ethersound_initialized:
 661        dev_dbg(chip->card->dev, "ethersound initialized\n");
 662        return 0;
 663}
 664
 665static int lx_init_get_version_features(struct lx6464es *chip)
 666{
 667        u32 dsp_version;
 668
 669        int err;
 670
 671        dev_dbg(chip->card->dev, "->lx_init_get_version_features\n");
 672
 673        err = lx_dsp_get_version(chip, &dsp_version);
 674
 675        if (err == 0) {
 676                u32 freq;
 677
 678                dev_info(chip->card->dev, "DSP version: V%02d.%02d #%d\n",
 679                           (dsp_version>>16) & 0xff, (dsp_version>>8) & 0xff,
 680                           dsp_version & 0xff);
 681
 682                /* later: what firmware version do we expect? */
 683
 684                /* retrieve Play/Rec features */
 685                /* done here because we may have to handle alternate
 686                 * DSP files. */
 687                /* later */
 688
 689                /* init the EtherSound sample rate */
 690                err = lx_dsp_get_clock_frequency(chip, &freq);
 691                if (err == 0)
 692                        chip->board_sample_rate = freq;
 693                dev_dbg(chip->card->dev, "actual clock frequency %d\n", freq);
 694        } else {
 695                dev_err(chip->card->dev, "DSP corrupted \n");
 696                err = -EAGAIN;
 697        }
 698
 699        return err;
 700}
 701
 702static int lx_set_granularity(struct lx6464es *chip, u32 gran)
 703{
 704        int err = 0;
 705        u32 snapped_gran = MICROBLAZE_IBL_MIN;
 706
 707        dev_dbg(chip->card->dev, "->lx_set_granularity\n");
 708
 709        /* blocksize is a power of 2 */
 710        while ((snapped_gran < gran) &&
 711               (snapped_gran < MICROBLAZE_IBL_MAX)) {
 712                snapped_gran *= 2;
 713        }
 714
 715        if (snapped_gran == chip->pcm_granularity)
 716                return 0;
 717
 718        err = lx_dsp_set_granularity(chip, snapped_gran);
 719        if (err < 0) {
 720                dev_warn(chip->card->dev, "could not set granularity\n");
 721                err = -EAGAIN;
 722        }
 723
 724        if (snapped_gran != gran)
 725                dev_err(chip->card->dev, "snapped blocksize to %d\n", snapped_gran);
 726
 727        dev_dbg(chip->card->dev, "set blocksize on board %d\n", snapped_gran);
 728        chip->pcm_granularity = snapped_gran;
 729
 730        return err;
 731}
 732
 733/* initialize and test the xilinx dsp chip */
 734static int lx_init_dsp(struct lx6464es *chip)
 735{
 736        int err;
 737        int i;
 738
 739        dev_dbg(chip->card->dev, "->lx_init_dsp\n");
 740
 741        dev_dbg(chip->card->dev, "initialize board\n");
 742        err = lx_init_xilinx_reset(chip);
 743        if (err)
 744                return err;
 745
 746        dev_dbg(chip->card->dev, "testing board\n");
 747        err = lx_init_xilinx_test(chip);
 748        if (err)
 749                return err;
 750
 751        dev_dbg(chip->card->dev, "initialize ethersound configuration\n");
 752        err = lx_init_ethersound_config(chip);
 753        if (err)
 754                return err;
 755
 756        lx_irq_enable(chip);
 757
 758        /** \todo the mac address should be ready by not, but it isn't,
 759         *  so we wait for it */
 760        for (i = 0; i != 1000; ++i) {
 761                err = lx_dsp_get_mac(chip);
 762                if (err)
 763                        return err;
 764                if (chip->mac_address[0] || chip->mac_address[1] || chip->mac_address[2] ||
 765                    chip->mac_address[3] || chip->mac_address[4] || chip->mac_address[5])
 766                        goto mac_ready;
 767                msleep(1);
 768        }
 769        return -ETIMEDOUT;
 770
 771mac_ready:
 772        dev_dbg(chip->card->dev, "mac address ready read after: %dms\n", i);
 773        dev_info(chip->card->dev,
 774                 "mac address: %02X.%02X.%02X.%02X.%02X.%02X\n",
 775                   chip->mac_address[0], chip->mac_address[1], chip->mac_address[2],
 776                   chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
 777
 778        err = lx_init_get_version_features(chip);
 779        if (err)
 780                return err;
 781
 782        lx_set_granularity(chip, MICROBLAZE_IBL_DEFAULT);
 783
 784        chip->playback_mute = 0;
 785
 786        return err;
 787}
 788
 789static const struct snd_pcm_ops lx_ops_playback = {
 790        .open      = lx_pcm_open,
 791        .close     = lx_pcm_close,
 792        .prepare   = lx_pcm_prepare,
 793        .hw_params = lx_pcm_hw_params_playback,
 794        .hw_free   = lx_pcm_hw_free,
 795        .trigger   = lx_pcm_trigger,
 796        .pointer   = lx_pcm_stream_pointer,
 797};
 798
 799static const struct snd_pcm_ops lx_ops_capture = {
 800        .open      = lx_pcm_open,
 801        .close     = lx_pcm_close,
 802        .prepare   = lx_pcm_prepare,
 803        .hw_params = lx_pcm_hw_params_capture,
 804        .hw_free   = lx_pcm_hw_free,
 805        .trigger   = lx_pcm_trigger,
 806        .pointer   = lx_pcm_stream_pointer,
 807};
 808
 809static int lx_pcm_create(struct lx6464es *chip)
 810{
 811        int err;
 812        struct snd_pcm *pcm;
 813
 814        u32 size = 64 *              /* channels */
 815                3 *                  /* 24 bit samples */
 816                MAX_STREAM_BUFFER *  /* periods */
 817                MICROBLAZE_IBL_MAX * /* frames per period */
 818                2;                   /* duplex */
 819
 820        size = PAGE_ALIGN(size);
 821
 822        /* hardcoded device name & channel count */
 823        err = snd_pcm_new(chip->card, (char *)card_name, 0,
 824                          1, 1, &pcm);
 825        if (err < 0)
 826                return err;
 827
 828        pcm->private_data = chip;
 829
 830        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &lx_ops_playback);
 831        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &lx_ops_capture);
 832
 833        pcm->info_flags = 0;
 834        pcm->nonatomic = true;
 835        strcpy(pcm->name, card_name);
 836
 837        snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
 838                                       &chip->pci->dev, size, size);
 839
 840        chip->pcm = pcm;
 841        chip->capture_stream.is_capture = 1;
 842
 843        return 0;
 844}
 845
 846static int lx_control_playback_info(struct snd_kcontrol *kcontrol,
 847                                    struct snd_ctl_elem_info *uinfo)
 848{
 849        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 850        uinfo->count = 1;
 851        uinfo->value.integer.min = 0;
 852        uinfo->value.integer.max = 1;
 853        return 0;
 854}
 855
 856static int lx_control_playback_get(struct snd_kcontrol *kcontrol,
 857                                   struct snd_ctl_elem_value *ucontrol)
 858{
 859        struct lx6464es *chip = snd_kcontrol_chip(kcontrol);
 860        ucontrol->value.integer.value[0] = chip->playback_mute;
 861        return 0;
 862}
 863
 864static int lx_control_playback_put(struct snd_kcontrol *kcontrol,
 865                                   struct snd_ctl_elem_value *ucontrol)
 866{
 867        struct lx6464es *chip = snd_kcontrol_chip(kcontrol);
 868        int changed = 0;
 869        int current_value = chip->playback_mute;
 870
 871        if (current_value != ucontrol->value.integer.value[0]) {
 872                lx_level_unmute(chip, 0, !current_value);
 873                chip->playback_mute = !current_value;
 874                changed = 1;
 875        }
 876        return changed;
 877}
 878
 879static const struct snd_kcontrol_new lx_control_playback_switch = {
 880        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 881        .name = "PCM Playback Switch",
 882        .index = 0,
 883        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
 884        .private_value = 0,
 885        .info = lx_control_playback_info,
 886        .get = lx_control_playback_get,
 887        .put = lx_control_playback_put
 888};
 889
 890
 891
 892static void lx_proc_levels_read(struct snd_info_entry *entry,
 893                                struct snd_info_buffer *buffer)
 894{
 895        u32 levels[64];
 896        int err;
 897        int i, j;
 898        struct lx6464es *chip = entry->private_data;
 899
 900        snd_iprintf(buffer, "capture levels:\n");
 901        err = lx_level_peaks(chip, 1, 64, levels);
 902        if (err < 0)
 903                return;
 904
 905        for (i = 0; i != 8; ++i) {
 906                for (j = 0; j != 8; ++j)
 907                        snd_iprintf(buffer, "%08x ", levels[i*8+j]);
 908                snd_iprintf(buffer, "\n");
 909        }
 910
 911        snd_iprintf(buffer, "\nplayback levels:\n");
 912
 913        err = lx_level_peaks(chip, 0, 64, levels);
 914        if (err < 0)
 915                return;
 916
 917        for (i = 0; i != 8; ++i) {
 918                for (j = 0; j != 8; ++j)
 919                        snd_iprintf(buffer, "%08x ", levels[i*8+j]);
 920                snd_iprintf(buffer, "\n");
 921        }
 922
 923        snd_iprintf(buffer, "\n");
 924}
 925
 926static int lx_proc_create(struct snd_card *card, struct lx6464es *chip)
 927{
 928        return snd_card_ro_proc_new(card, "levels", chip, lx_proc_levels_read);
 929}
 930
 931
 932static int snd_lx6464es_create(struct snd_card *card,
 933                               struct pci_dev *pci,
 934                               struct lx6464es **rchip)
 935{
 936        struct lx6464es *chip;
 937        int err;
 938
 939        static const struct snd_device_ops ops = {
 940                .dev_free = snd_lx6464es_dev_free,
 941        };
 942
 943        dev_dbg(card->dev, "->snd_lx6464es_create\n");
 944
 945        *rchip = NULL;
 946
 947        /* enable PCI device */
 948        err = pci_enable_device(pci);
 949        if (err < 0)
 950                return err;
 951
 952        pci_set_master(pci);
 953
 954        /* check if we can restrict PCI DMA transfers to 32 bits */
 955        err = dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
 956        if (err < 0) {
 957                dev_err(card->dev,
 958                        "architecture does not support 32bit PCI busmaster DMA\n");
 959                pci_disable_device(pci);
 960                return -ENXIO;
 961        }
 962
 963        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 964        if (chip == NULL) {
 965                err = -ENOMEM;
 966                goto alloc_failed;
 967        }
 968
 969        chip->card = card;
 970        chip->pci = pci;
 971        chip->irq = -1;
 972
 973        /* initialize synchronization structs */
 974        mutex_init(&chip->lock);
 975        mutex_init(&chip->msg_lock);
 976        mutex_init(&chip->setup_mutex);
 977
 978        /* request resources */
 979        err = pci_request_regions(pci, card_name);
 980        if (err < 0)
 981                goto request_regions_failed;
 982
 983        /* plx port */
 984        chip->port_plx = pci_resource_start(pci, 1);
 985        chip->port_plx_remapped = ioport_map(chip->port_plx,
 986                                             pci_resource_len(pci, 1));
 987
 988        /* dsp port */
 989        chip->port_dsp_bar = pci_ioremap_bar(pci, 2);
 990        if (!chip->port_dsp_bar) {
 991                dev_err(card->dev, "cannot remap PCI memory region\n");
 992                err = -ENOMEM;
 993                goto remap_pci_failed;
 994        }
 995
 996        err = request_threaded_irq(pci->irq, lx_interrupt, lx_threaded_irq,
 997                                   IRQF_SHARED, KBUILD_MODNAME, chip);
 998        if (err) {
 999                dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1000                goto request_irq_failed;
1001        }
1002        chip->irq = pci->irq;
1003        card->sync_irq = chip->irq;
1004
1005        err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
1006        if (err < 0)
1007                goto device_new_failed;
1008
1009        err = lx_init_dsp(chip);
1010        if (err < 0) {
1011                dev_err(card->dev, "error during DSP initialization\n");
1012                return err;
1013        }
1014
1015        err = lx_pcm_create(chip);
1016        if (err < 0)
1017                return err;
1018
1019        err = lx_proc_create(card, chip);
1020        if (err < 0)
1021                return err;
1022
1023        err = snd_ctl_add(card, snd_ctl_new1(&lx_control_playback_switch,
1024                                             chip));
1025        if (err < 0)
1026                return err;
1027
1028        *rchip = chip;
1029        return 0;
1030
1031device_new_failed:
1032        free_irq(pci->irq, chip);
1033
1034request_irq_failed:
1035        iounmap(chip->port_dsp_bar);
1036
1037remap_pci_failed:
1038        pci_release_regions(pci);
1039
1040request_regions_failed:
1041        kfree(chip);
1042
1043alloc_failed:
1044        pci_disable_device(pci);
1045
1046        return err;
1047}
1048
1049static int snd_lx6464es_probe(struct pci_dev *pci,
1050                              const struct pci_device_id *pci_id)
1051{
1052        static int dev;
1053        struct snd_card *card;
1054        struct lx6464es *chip;
1055        int err;
1056
1057        dev_dbg(&pci->dev, "->snd_lx6464es_probe\n");
1058
1059        if (dev >= SNDRV_CARDS)
1060                return -ENODEV;
1061        if (!enable[dev]) {
1062                dev++;
1063                return -ENOENT;
1064        }
1065
1066        err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1067                           0, &card);
1068        if (err < 0)
1069                return err;
1070
1071        err = snd_lx6464es_create(card, pci, &chip);
1072        if (err < 0) {
1073                dev_err(card->dev, "error during snd_lx6464es_create\n");
1074                goto out_free;
1075        }
1076
1077        strcpy(card->driver, "LX6464ES");
1078        sprintf(card->id, "LX6464ES_%02X%02X%02X",
1079                chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
1080
1081        sprintf(card->shortname, "LX6464ES %02X.%02X.%02X.%02X.%02X.%02X",
1082                chip->mac_address[0], chip->mac_address[1], chip->mac_address[2],
1083                chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]);
1084
1085        sprintf(card->longname, "%s at 0x%lx, 0x%p, irq %i",
1086                card->shortname, chip->port_plx,
1087                chip->port_dsp_bar, chip->irq);
1088
1089        err = snd_card_register(card);
1090        if (err < 0)
1091                goto out_free;
1092
1093        dev_dbg(chip->card->dev, "initialization successful\n");
1094        pci_set_drvdata(pci, card);
1095        dev++;
1096        return 0;
1097
1098out_free:
1099        snd_card_free(card);
1100        return err;
1101
1102}
1103
1104static void snd_lx6464es_remove(struct pci_dev *pci)
1105{
1106        snd_card_free(pci_get_drvdata(pci));
1107}
1108
1109
1110static struct pci_driver lx6464es_driver = {
1111        .name =     KBUILD_MODNAME,
1112        .id_table = snd_lx6464es_ids,
1113        .probe =    snd_lx6464es_probe,
1114        .remove = snd_lx6464es_remove,
1115};
1116
1117module_pci_driver(lx6464es_driver);
1118