Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Mar 24-27, 2025, special US time zones
Register
Loading...
   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		goto error;
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		goto error;
1040
1041	dev_dbg(chip->card->dev, "initialization successful\n");
1042	pci_set_drvdata(pci, card);
1043	dev++;
1044	return 0;
1045
1046 error:
1047	snd_card_free(card);
1048	return err;
1049}
1050
1051static struct pci_driver lx6464es_driver = {
1052	.name =     KBUILD_MODNAME,
1053	.id_table = snd_lx6464es_ids,
1054	.probe =    snd_lx6464es_probe,
1055};
1056
1057module_pci_driver(lx6464es_driver);