cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lx6464es.c (26538B)


      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);