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 21 MODULE_AUTHOR("Tim Blechmann"); 22 MODULE_LICENSE("GPL"); 23 MODULE_DESCRIPTION("digigram lx6464es"); 24 25 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; 26 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; 27 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; 28 29 module_param_array(index, int, NULL, 0444); 30 MODULE_PARM_DESC(index, "Index value for Digigram LX6464ES interface."); 31 module_param_array(id, charp, NULL, 0444); 32 MODULE_PARM_DESC(id, "ID string for Digigram LX6464ES interface."); 33 module_param_array(enable, bool, NULL, 0444); 34 MODULE_PARM_DESC(enable, "Enable/disable specific Digigram LX6464ES soundcards."); 35 36 static const char card_name[] = "LX6464ES"; 37 38 39 #define PCI_DEVICE_ID_PLX_LX6464ES PCI_DEVICE_ID_PLX_9056 40 41 static 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 61 MODULE_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 */ 70 static 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 92 static int lx_set_granularity(struct lx6464es *chip, u32 gran); 93 94 95 static 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 122 static 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 154 static 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 185 static 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 202 static 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 guard(mutex)(&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 return err; 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 return err; 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 return err; 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 252 runtime->private_data = chip; 253 254 dev_dbg(chip->card->dev, "<-lx_pcm_open, %d\n", err); 255 return err; 256 } 257 258 static int lx_pcm_close(struct snd_pcm_substream *substream) 259 { 260 dev_dbg(substream->pcm->card->dev, "->lx_pcm_close\n"); 261 return 0; 262 } 263 264 static snd_pcm_uframes_t lx_pcm_stream_pointer(struct snd_pcm_substream 265 *substream) 266 { 267 struct lx6464es *chip = snd_pcm_substream_chip(substream); 268 snd_pcm_uframes_t pos; 269 int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); 270 271 struct lx_stream *lx_stream = is_capture ? &chip->capture_stream : 272 &chip->playback_stream; 273 274 dev_dbg(chip->card->dev, "->lx_pcm_stream_pointer\n"); 275 276 guard(mutex)(&chip->lock); 277 pos = lx_stream->frame_pos * substream->runtime->period_size; 278 279 dev_dbg(chip->card->dev, "stream_pointer at %ld\n", pos); 280 return pos; 281 } 282 283 static int lx_pcm_prepare(struct snd_pcm_substream *substream) 284 { 285 struct lx6464es *chip = snd_pcm_substream_chip(substream); 286 int err = 0; 287 const int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); 288 289 dev_dbg(chip->card->dev, "->lx_pcm_prepare\n"); 290 291 guard(mutex)(&chip->setup_mutex); 292 293 if (chip->hardware_running[is_capture]) { 294 err = lx_hardware_stop(chip, substream); 295 if (err < 0) { 296 dev_err(chip->card->dev, "failed to stop hardware. " 297 "Error code %d\n", err); 298 return err; 299 } 300 301 err = lx_hardware_close(chip, substream); 302 if (err < 0) { 303 dev_err(chip->card->dev, "failed to close hardware. " 304 "Error code %d\n", err); 305 return err; 306 } 307 } 308 309 dev_dbg(chip->card->dev, "opening hardware\n"); 310 err = lx_hardware_open(chip, substream); 311 if (err < 0) { 312 dev_err(chip->card->dev, "failed to open hardware. " 313 "Error code %d\n", err); 314 return err; 315 } 316 317 err = lx_hardware_start(chip, substream); 318 if (err < 0) { 319 dev_err(chip->card->dev, "failed to start hardware. " 320 "Error code %d\n", err); 321 return err; 322 } 323 324 chip->hardware_running[is_capture] = 1; 325 326 if (chip->board_sample_rate != substream->runtime->rate) { 327 if (!err) 328 chip->board_sample_rate = substream->runtime->rate; 329 } 330 331 return err; 332 } 333 334 static int lx_pcm_hw_params(struct snd_pcm_substream *substream, 335 struct snd_pcm_hw_params *hw_params, int is_capture) 336 { 337 struct lx6464es *chip = snd_pcm_substream_chip(substream); 338 339 dev_dbg(chip->card->dev, "->lx_pcm_hw_params\n"); 340 341 guard(mutex)(&chip->setup_mutex); 342 343 if (is_capture) 344 chip->capture_stream.stream = substream; 345 else 346 chip->playback_stream.stream = substream; 347 348 return 0; 349 } 350 351 static int lx_pcm_hw_params_playback(struct snd_pcm_substream *substream, 352 struct snd_pcm_hw_params *hw_params) 353 { 354 return lx_pcm_hw_params(substream, hw_params, 0); 355 } 356 357 static int lx_pcm_hw_params_capture(struct snd_pcm_substream *substream, 358 struct snd_pcm_hw_params *hw_params) 359 { 360 return lx_pcm_hw_params(substream, hw_params, 1); 361 } 362 363 static int lx_pcm_hw_free(struct snd_pcm_substream *substream) 364 { 365 struct lx6464es *chip = snd_pcm_substream_chip(substream); 366 int err = 0; 367 int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); 368 369 dev_dbg(chip->card->dev, "->lx_pcm_hw_free\n"); 370 guard(mutex)(&chip->setup_mutex); 371 372 if (chip->hardware_running[is_capture]) { 373 err = lx_hardware_stop(chip, substream); 374 if (err < 0) { 375 dev_err(chip->card->dev, "failed to stop hardware. " 376 "Error code %d\n", err); 377 return err; 378 } 379 380 err = lx_hardware_close(chip, substream); 381 if (err < 0) { 382 dev_err(chip->card->dev, "failed to close hardware. " 383 "Error code %d\n", err); 384 return err; 385 } 386 387 chip->hardware_running[is_capture] = 0; 388 } 389 390 if (is_capture) 391 chip->capture_stream.stream = NULL; 392 else 393 chip->playback_stream.stream = NULL; 394 395 return 0; 396 } 397 398 static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream) 399 { 400 struct snd_pcm_substream *substream = lx_stream->stream; 401 const unsigned int is_capture = lx_stream->is_capture; 402 403 int err; 404 405 const u32 channels = substream->runtime->channels; 406 const u32 bytes_per_frame = channels * 3; 407 const u32 period_size = substream->runtime->period_size; 408 const u32 periods = substream->runtime->periods; 409 const u32 period_bytes = period_size * bytes_per_frame; 410 411 dma_addr_t buf = substream->dma_buffer.addr; 412 int i; 413 414 u32 needed, freed; 415 u32 size_array[5]; 416 417 for (i = 0; i != periods; ++i) { 418 u32 buffer_index = 0; 419 420 err = lx_buffer_ask(chip, 0, is_capture, &needed, &freed, 421 size_array); 422 dev_dbg(chip->card->dev, "starting: needed %d, freed %d\n", 423 needed, freed); 424 425 err = lx_buffer_give(chip, 0, is_capture, period_bytes, 426 lower_32_bits(buf), upper_32_bits(buf), 427 &buffer_index); 428 429 dev_dbg(chip->card->dev, "starting: buffer index %x on 0x%lx (%d bytes)\n", 430 buffer_index, (unsigned long)buf, period_bytes); 431 buf += period_bytes; 432 } 433 434 err = lx_buffer_ask(chip, 0, is_capture, &needed, &freed, size_array); 435 dev_dbg(chip->card->dev, "starting: needed %d, freed %d\n", needed, freed); 436 437 dev_dbg(chip->card->dev, "starting: starting stream\n"); 438 err = lx_stream_start(chip, 0, is_capture); 439 if (err < 0) 440 dev_err(chip->card->dev, "couldn't start stream\n"); 441 else 442 lx_stream->status = LX_STREAM_STATUS_RUNNING; 443 444 lx_stream->frame_pos = 0; 445 } 446 447 static void lx_trigger_stop(struct lx6464es *chip, struct lx_stream *lx_stream) 448 { 449 const unsigned int is_capture = lx_stream->is_capture; 450 int err; 451 452 dev_dbg(chip->card->dev, "stopping: stopping stream\n"); 453 err = lx_stream_stop(chip, 0, is_capture); 454 if (err < 0) 455 dev_err(chip->card->dev, "couldn't stop stream\n"); 456 else 457 lx_stream->status = LX_STREAM_STATUS_FREE; 458 459 } 460 461 static void lx_trigger_dispatch_stream(struct lx6464es *chip, 462 struct lx_stream *lx_stream) 463 { 464 switch (lx_stream->status) { 465 case LX_STREAM_STATUS_SCHEDULE_RUN: 466 lx_trigger_start(chip, lx_stream); 467 break; 468 469 case LX_STREAM_STATUS_SCHEDULE_STOP: 470 lx_trigger_stop(chip, lx_stream); 471 break; 472 473 default: 474 break; 475 } 476 } 477 478 static int lx_pcm_trigger_dispatch(struct lx6464es *chip, 479 struct lx_stream *lx_stream, int cmd) 480 { 481 guard(mutex)(&chip->lock); 482 switch (cmd) { 483 case SNDRV_PCM_TRIGGER_START: 484 lx_stream->status = LX_STREAM_STATUS_SCHEDULE_RUN; 485 break; 486 487 case SNDRV_PCM_TRIGGER_STOP: 488 lx_stream->status = LX_STREAM_STATUS_SCHEDULE_STOP; 489 break; 490 491 default: 492 return -EINVAL; 493 } 494 495 lx_trigger_dispatch_stream(chip, &chip->capture_stream); 496 lx_trigger_dispatch_stream(chip, &chip->playback_stream); 497 498 return 0; 499 } 500 501 502 static int lx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 503 { 504 struct lx6464es *chip = snd_pcm_substream_chip(substream); 505 const int is_capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); 506 struct lx_stream *stream = is_capture ? &chip->capture_stream : 507 &chip->playback_stream; 508 509 dev_dbg(chip->card->dev, "->lx_pcm_trigger\n"); 510 511 return lx_pcm_trigger_dispatch(chip, stream, cmd); 512 } 513 514 static void snd_lx6464es_free(struct snd_card *card) 515 { 516 struct lx6464es *chip = card->private_data; 517 518 lx_irq_disable(chip); 519 } 520 521 /* reset the dsp during initialization */ 522 static int lx_init_xilinx_reset(struct lx6464es *chip) 523 { 524 int i; 525 u32 plx_reg = lx_plx_reg_read(chip, ePLX_CHIPSC); 526 527 dev_dbg(chip->card->dev, "->lx_init_xilinx_reset\n"); 528 529 /* activate reset of xilinx */ 530 plx_reg &= ~CHIPSC_RESET_XILINX; 531 532 lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg); 533 msleep(1); 534 535 lx_plx_reg_write(chip, ePLX_MBOX3, 0); 536 msleep(1); 537 538 plx_reg |= CHIPSC_RESET_XILINX; 539 lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg); 540 541 /* deactivate reset of xilinx */ 542 for (i = 0; i != 100; ++i) { 543 u32 reg_mbox3; 544 msleep(10); 545 reg_mbox3 = lx_plx_reg_read(chip, ePLX_MBOX3); 546 if (reg_mbox3) { 547 dev_dbg(chip->card->dev, "xilinx reset done\n"); 548 dev_dbg(chip->card->dev, "xilinx took %d loops\n", i); 549 break; 550 } 551 } 552 553 /* todo: add some error handling? */ 554 555 /* clear mr */ 556 lx_dsp_reg_write(chip, eReg_CSM, 0); 557 558 /* le xilinx ES peut ne pas etre encore pret, on attend. */ 559 msleep(600); 560 561 return 0; 562 } 563 564 static int lx_init_xilinx_test(struct lx6464es *chip) 565 { 566 u32 reg; 567 568 dev_dbg(chip->card->dev, "->lx_init_xilinx_test\n"); 569 570 /* TEST if we have access to Xilinx/MicroBlaze */ 571 lx_dsp_reg_write(chip, eReg_CSM, 0); 572 573 reg = lx_dsp_reg_read(chip, eReg_CSM); 574 575 if (reg) { 576 dev_err(chip->card->dev, "Problem: Reg_CSM %x.\n", reg); 577 578 /* PCI9056_SPACE0_REMAP */ 579 lx_plx_reg_write(chip, ePLX_PCICR, 1); 580 581 reg = lx_dsp_reg_read(chip, eReg_CSM); 582 if (reg) { 583 dev_err(chip->card->dev, "Error: Reg_CSM %x.\n", reg); 584 return -EAGAIN; /* seems to be appropriate */ 585 } 586 } 587 588 dev_dbg(chip->card->dev, "Xilinx/MicroBlaze access test successful\n"); 589 590 return 0; 591 } 592 593 /* initialize ethersound */ 594 static int lx_init_ethersound_config(struct lx6464es *chip) 595 { 596 int i; 597 u32 orig_conf_es = lx_dsp_reg_read(chip, eReg_CONFES); 598 599 /* configure 64 io channels */ 600 u32 conf_es = (orig_conf_es & CONFES_READ_PART_MASK) | 601 (64 << IOCR_INPUTS_OFFSET) | 602 (64 << IOCR_OUTPUTS_OFFSET) | 603 (FREQ_RATIO_SINGLE_MODE << FREQ_RATIO_OFFSET); 604 605 dev_dbg(chip->card->dev, "->lx_init_ethersound\n"); 606 607 chip->freq_ratio = FREQ_RATIO_SINGLE_MODE; 608 609 /* 610 * write it to the card ! 611 * this actually kicks the ES xilinx, the first time since poweron. 612 * the MAC address in the Reg_ADMACESMSB Reg_ADMACESLSB registers 613 * is not ready before this is done, and the bit 2 in Reg_CSES is set. 614 * */ 615 lx_dsp_reg_write(chip, eReg_CONFES, conf_es); 616 617 for (i = 0; i != 1000; ++i) { 618 if (lx_dsp_reg_read(chip, eReg_CSES) & 4) { 619 dev_dbg(chip->card->dev, "ethersound initialized after %dms\n", 620 i); 621 goto ethersound_initialized; 622 } 623 msleep(1); 624 } 625 dev_warn(chip->card->dev, 626 "ethersound could not be initialized after %dms\n", i); 627 return -ETIMEDOUT; 628 629 ethersound_initialized: 630 dev_dbg(chip->card->dev, "ethersound initialized\n"); 631 return 0; 632 } 633 634 static int lx_init_get_version_features(struct lx6464es *chip) 635 { 636 u32 dsp_version; 637 638 int err; 639 640 dev_dbg(chip->card->dev, "->lx_init_get_version_features\n"); 641 642 err = lx_dsp_get_version(chip, &dsp_version); 643 644 if (err == 0) { 645 u32 freq; 646 647 dev_info(chip->card->dev, "DSP version: V%02d.%02d #%d\n", 648 (dsp_version>>16) & 0xff, (dsp_version>>8) & 0xff, 649 dsp_version & 0xff); 650 651 /* later: what firmware version do we expect? */ 652 653 /* retrieve Play/Rec features */ 654 /* done here because we may have to handle alternate 655 * DSP files. */ 656 /* later */ 657 658 /* init the EtherSound sample rate */ 659 err = lx_dsp_get_clock_frequency(chip, &freq); 660 if (err == 0) 661 chip->board_sample_rate = freq; 662 dev_dbg(chip->card->dev, "actual clock frequency %d\n", freq); 663 } else { 664 dev_err(chip->card->dev, "DSP corrupted \n"); 665 err = -EAGAIN; 666 } 667 668 return err; 669 } 670 671 static int lx_set_granularity(struct lx6464es *chip, u32 gran) 672 { 673 int err = 0; 674 u32 snapped_gran = MICROBLAZE_IBL_MIN; 675 676 dev_dbg(chip->card->dev, "->lx_set_granularity\n"); 677 678 /* blocksize is a power of 2 */ 679 while ((snapped_gran < gran) && 680 (snapped_gran < MICROBLAZE_IBL_MAX)) { 681 snapped_gran *= 2; 682 } 683 684 if (snapped_gran == chip->pcm_granularity) 685 return 0; 686 687 err = lx_dsp_set_granularity(chip, snapped_gran); 688 if (err < 0) { 689 dev_warn(chip->card->dev, "could not set granularity\n"); 690 err = -EAGAIN; 691 } 692 693 if (snapped_gran != gran) 694 dev_err(chip->card->dev, "snapped blocksize to %d\n", snapped_gran); 695 696 dev_dbg(chip->card->dev, "set blocksize on board %d\n", snapped_gran); 697 chip->pcm_granularity = snapped_gran; 698 699 return err; 700 } 701 702 /* initialize and test the xilinx dsp chip */ 703 static int lx_init_dsp(struct lx6464es *chip) 704 { 705 int err; 706 int i; 707 708 dev_dbg(chip->card->dev, "->lx_init_dsp\n"); 709 710 dev_dbg(chip->card->dev, "initialize board\n"); 711 err = lx_init_xilinx_reset(chip); 712 if (err) 713 return err; 714 715 dev_dbg(chip->card->dev, "testing board\n"); 716 err = lx_init_xilinx_test(chip); 717 if (err) 718 return err; 719 720 dev_dbg(chip->card->dev, "initialize ethersound configuration\n"); 721 err = lx_init_ethersound_config(chip); 722 if (err) 723 return err; 724 725 lx_irq_enable(chip); 726 727 /** \todo the mac address should be ready by not, but it isn't, 728 * so we wait for it */ 729 for (i = 0; i != 1000; ++i) { 730 err = lx_dsp_get_mac(chip); 731 if (err) 732 return err; 733 if (chip->mac_address[0] || chip->mac_address[1] || chip->mac_address[2] || 734 chip->mac_address[3] || chip->mac_address[4] || chip->mac_address[5]) 735 goto mac_ready; 736 msleep(1); 737 } 738 return -ETIMEDOUT; 739 740 mac_ready: 741 dev_dbg(chip->card->dev, "mac address ready read after: %dms\n", i); 742 dev_info(chip->card->dev, 743 "mac address: %02X.%02X.%02X.%02X.%02X.%02X\n", 744 chip->mac_address[0], chip->mac_address[1], chip->mac_address[2], 745 chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]); 746 747 err = lx_init_get_version_features(chip); 748 if (err) 749 return err; 750 751 lx_set_granularity(chip, MICROBLAZE_IBL_DEFAULT); 752 753 chip->playback_mute = 0; 754 755 return err; 756 } 757 758 static const struct snd_pcm_ops lx_ops_playback = { 759 .open = lx_pcm_open, 760 .close = lx_pcm_close, 761 .prepare = lx_pcm_prepare, 762 .hw_params = lx_pcm_hw_params_playback, 763 .hw_free = lx_pcm_hw_free, 764 .trigger = lx_pcm_trigger, 765 .pointer = lx_pcm_stream_pointer, 766 }; 767 768 static const struct snd_pcm_ops lx_ops_capture = { 769 .open = lx_pcm_open, 770 .close = lx_pcm_close, 771 .prepare = lx_pcm_prepare, 772 .hw_params = lx_pcm_hw_params_capture, 773 .hw_free = lx_pcm_hw_free, 774 .trigger = lx_pcm_trigger, 775 .pointer = lx_pcm_stream_pointer, 776 }; 777 778 static int lx_pcm_create(struct lx6464es *chip) 779 { 780 int err; 781 struct snd_pcm *pcm; 782 783 u32 size = 64 * /* channels */ 784 3 * /* 24 bit samples */ 785 MAX_STREAM_BUFFER * /* periods */ 786 MICROBLAZE_IBL_MAX * /* frames per period */ 787 2; /* duplex */ 788 789 size = PAGE_ALIGN(size); 790 791 /* hardcoded device name & channel count */ 792 err = snd_pcm_new(chip->card, (char *)card_name, 0, 793 1, 1, &pcm); 794 if (err < 0) 795 return err; 796 797 pcm->private_data = chip; 798 799 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &lx_ops_playback); 800 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &lx_ops_capture); 801 802 pcm->info_flags = 0; 803 pcm->nonatomic = true; 804 strscpy(pcm->name, card_name); 805 806 snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, 807 &chip->pci->dev, size, size); 808 809 chip->pcm = pcm; 810 chip->capture_stream.is_capture = 1; 811 812 return 0; 813 } 814 815 static int lx_control_playback_info(struct snd_kcontrol *kcontrol, 816 struct snd_ctl_elem_info *uinfo) 817 { 818 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 819 uinfo->count = 1; 820 uinfo->value.integer.min = 0; 821 uinfo->value.integer.max = 1; 822 return 0; 823 } 824 825 static int lx_control_playback_get(struct snd_kcontrol *kcontrol, 826 struct snd_ctl_elem_value *ucontrol) 827 { 828 struct lx6464es *chip = snd_kcontrol_chip(kcontrol); 829 ucontrol->value.integer.value[0] = chip->playback_mute; 830 return 0; 831 } 832 833 static int lx_control_playback_put(struct snd_kcontrol *kcontrol, 834 struct snd_ctl_elem_value *ucontrol) 835 { 836 struct lx6464es *chip = snd_kcontrol_chip(kcontrol); 837 int changed = 0; 838 int current_value = chip->playback_mute; 839 840 if (current_value != ucontrol->value.integer.value[0]) { 841 lx_level_unmute(chip, 0, !current_value); 842 chip->playback_mute = !current_value; 843 changed = 1; 844 } 845 return changed; 846 } 847 848 static const struct snd_kcontrol_new lx_control_playback_switch = { 849 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 850 .name = "PCM Playback Switch", 851 .index = 0, 852 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 853 .private_value = 0, 854 .info = lx_control_playback_info, 855 .get = lx_control_playback_get, 856 .put = lx_control_playback_put 857 }; 858 859 860 861 static void lx_proc_levels_read(struct snd_info_entry *entry, 862 struct snd_info_buffer *buffer) 863 { 864 u32 levels[64]; 865 int err; 866 int i, j; 867 struct lx6464es *chip = entry->private_data; 868 869 snd_iprintf(buffer, "capture levels:\n"); 870 err = lx_level_peaks(chip, 1, 64, levels); 871 if (err < 0) 872 return; 873 874 for (i = 0; i != 8; ++i) { 875 for (j = 0; j != 8; ++j) 876 snd_iprintf(buffer, "%08x ", levels[i*8+j]); 877 snd_iprintf(buffer, "\n"); 878 } 879 880 snd_iprintf(buffer, "\nplayback levels:\n"); 881 882 err = lx_level_peaks(chip, 0, 64, levels); 883 if (err < 0) 884 return; 885 886 for (i = 0; i != 8; ++i) { 887 for (j = 0; j != 8; ++j) 888 snd_iprintf(buffer, "%08x ", levels[i*8+j]); 889 snd_iprintf(buffer, "\n"); 890 } 891 892 snd_iprintf(buffer, "\n"); 893 } 894 895 static int lx_proc_create(struct snd_card *card, struct lx6464es *chip) 896 { 897 return snd_card_ro_proc_new(card, "levels", chip, lx_proc_levels_read); 898 } 899 900 901 static int snd_lx6464es_create(struct snd_card *card, 902 struct pci_dev *pci) 903 { 904 struct lx6464es *chip = card->private_data; 905 int err; 906 907 dev_dbg(card->dev, "->snd_lx6464es_create\n"); 908 909 /* enable PCI device */ 910 err = pcim_enable_device(pci); 911 if (err < 0) 912 return err; 913 914 pci_set_master(pci); 915 916 /* check if we can restrict PCI DMA transfers to 32 bits */ 917 err = dma_set_mask(&pci->dev, DMA_BIT_MASK(32)); 918 if (err < 0) { 919 dev_err(card->dev, 920 "architecture does not support 32bit PCI busmaster DMA\n"); 921 return -ENXIO; 922 } 923 924 chip->card = card; 925 chip->pci = pci; 926 chip->irq = -1; 927 928 /* initialize synchronization structs */ 929 mutex_init(&chip->lock); 930 mutex_init(&chip->msg_lock); 931 mutex_init(&chip->setup_mutex); 932 933 /* request resources */ 934 err = pcim_request_all_regions(pci, card_name); 935 if (err < 0) 936 return err; 937 938 /* plx port */ 939 chip->port_plx = pci_resource_start(pci, 1); 940 chip->port_plx_remapped = devm_ioport_map(&pci->dev, chip->port_plx, 941 pci_resource_len(pci, 1)); 942 if (!chip->port_plx_remapped) 943 return -ENOMEM; 944 945 /* dsp port */ 946 chip->port_dsp_bar = pcim_iomap(pci, 2, 0); 947 if (!chip->port_dsp_bar) 948 return -ENOMEM; 949 950 err = devm_request_threaded_irq(&pci->dev, pci->irq, lx_interrupt, 951 lx_threaded_irq, IRQF_SHARED, 952 KBUILD_MODNAME, chip); 953 if (err) { 954 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 955 return err; 956 } 957 chip->irq = pci->irq; 958 card->sync_irq = chip->irq; 959 card->private_free = snd_lx6464es_free; 960 961 err = lx_init_dsp(chip); 962 if (err < 0) { 963 dev_err(card->dev, "error during DSP initialization\n"); 964 return err; 965 } 966 967 err = lx_pcm_create(chip); 968 if (err < 0) 969 return err; 970 971 err = lx_proc_create(card, chip); 972 if (err < 0) 973 return err; 974 975 err = snd_ctl_add(card, snd_ctl_new1(&lx_control_playback_switch, 976 chip)); 977 if (err < 0) 978 return err; 979 980 return 0; 981 } 982 983 static int snd_lx6464es_probe(struct pci_dev *pci, 984 const struct pci_device_id *pci_id) 985 { 986 static int dev; 987 struct snd_card *card; 988 struct lx6464es *chip; 989 int err; 990 991 dev_dbg(&pci->dev, "->snd_lx6464es_probe\n"); 992 993 if (dev >= SNDRV_CARDS) 994 return -ENODEV; 995 if (!enable[dev]) { 996 dev++; 997 return -ENOENT; 998 } 999 1000 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 1001 sizeof(*chip), &card); 1002 if (err < 0) 1003 return err; 1004 chip = card->private_data; 1005 1006 err = snd_lx6464es_create(card, pci); 1007 if (err < 0) { 1008 dev_err(card->dev, "error during snd_lx6464es_create\n"); 1009 goto error; 1010 } 1011 1012 strscpy(card->driver, "LX6464ES"); 1013 sprintf(card->id, "LX6464ES_%02X%02X%02X", 1014 chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]); 1015 1016 sprintf(card->shortname, "LX6464ES %02X.%02X.%02X.%02X.%02X.%02X", 1017 chip->mac_address[0], chip->mac_address[1], chip->mac_address[2], 1018 chip->mac_address[3], chip->mac_address[4], chip->mac_address[5]); 1019 1020 sprintf(card->longname, "%s at 0x%lx, 0x%p, irq %i", 1021 card->shortname, chip->port_plx, 1022 chip->port_dsp_bar, chip->irq); 1023 1024 err = snd_card_register(card); 1025 if (err < 0) 1026 goto error; 1027 1028 dev_dbg(chip->card->dev, "initialization successful\n"); 1029 pci_set_drvdata(pci, card); 1030 dev++; 1031 return 0; 1032 1033 error: 1034 snd_card_free(card); 1035 return err; 1036 } 1037 1038 static struct pci_driver lx6464es_driver = { 1039 .name = KBUILD_MODNAME, 1040 .id_table = snd_lx6464es_ids, 1041 .probe = snd_lx6464es_probe, 1042 }; 1043 1044 module_pci_driver(lx6464es_driver); 1045