3 * ALSA driver for the digigram lx6464es interface
6 * Copyright (c) 2009 Tim Blechmann <tim@klingt.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; see the file COPYING. If not, write to
20 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
25 /* #define RMH_DEBUG 1 */
27 #include <linux/module.h>
28 #include <linux/pci.h>
29 #include <linux/delay.h>
34 /* low-level register access */
36 static const unsigned long dsp_port_offsets[] = {
69 static void __iomem *lx_dsp_register(struct lx6464es *chip, int port)
71 void __iomem *base_address = chip->port_dsp_bar;
72 return base_address + dsp_port_offsets[port]*4;
75 unsigned long lx_dsp_reg_read(struct lx6464es *chip, int port)
77 void __iomem *address = lx_dsp_register(chip, port);
78 return ioread32(address);
81 void lx_dsp_reg_readbuf(struct lx6464es *chip, int port, u32 *data, u32 len)
83 void __iomem *address = lx_dsp_register(chip, port);
84 memcpy_fromio(data, address, len*sizeof(u32));
88 void lx_dsp_reg_write(struct lx6464es *chip, int port, unsigned data)
90 void __iomem *address = lx_dsp_register(chip, port);
91 iowrite32(data, address);
94 void lx_dsp_reg_writebuf(struct lx6464es *chip, int port, const u32 *data,
97 void __iomem *address = lx_dsp_register(chip, port);
98 memcpy_toio(address, data, len*sizeof(u32));
102 static const unsigned long plx_port_offsets[] = {
117 static void __iomem *lx_plx_register(struct lx6464es *chip, int port)
119 void __iomem *base_address = chip->port_plx_remapped;
120 return base_address + plx_port_offsets[port];
123 unsigned long lx_plx_reg_read(struct lx6464es *chip, int port)
125 void __iomem *address = lx_plx_register(chip, port);
126 return ioread32(address);
129 void lx_plx_reg_write(struct lx6464es *chip, int port, u32 data)
131 void __iomem *address = lx_plx_register(chip, port);
132 iowrite32(data, address);
135 u32 lx_plx_mbox_read(struct lx6464es *chip, int mbox_nr)
141 index = ePLX_MBOX1; break;
143 index = ePLX_MBOX2; break;
145 index = ePLX_MBOX3; break;
147 index = ePLX_MBOX4; break;
149 index = ePLX_MBOX5; break;
151 index = ePLX_MBOX6; break;
153 index = ePLX_MBOX7; break;
154 case 0: /* reserved for HF flags */
160 return lx_plx_reg_read(chip, index);
163 int lx_plx_mbox_write(struct lx6464es *chip, int mbox_nr, u32 value)
169 index = ePLX_MBOX1; break;
171 index = ePLX_MBOX3; break;
173 index = ePLX_MBOX4; break;
175 index = ePLX_MBOX5; break;
177 index = ePLX_MBOX6; break;
179 index = ePLX_MBOX7; break;
180 case 0: /* reserved for HF flags */
181 case 2: /* reserved for Pipe States
182 * the DSP keeps an image of it */
187 lx_plx_reg_write(chip, index, value);
194 #ifdef CONFIG_SND_DEBUG
195 #define CMD_NAME(a) a
197 #define CMD_NAME(a) NULL
200 #define Reg_CSM_MR 0x00000002
201 #define Reg_CSM_MC 0x00000001
203 struct dsp_cmd_info {
204 u32 dcCodeOp; /* Op Code of the command (usually 1st 24-bits
206 u16 dcCmdLength; /* Command length in words of 24 bits.*/
207 u16 dcStatusType; /* Status type: 0 for fixed length, 1 for
209 u16 dcStatusLength; /* Status length (if fixed).*/
214 Initialization and control data for the Microblaze interface
216 the opcode field of the command set at the proper offset
218 the number of command words
220 offset in the status registers: 0 means that the return value may be
221 different from 0, and must be read
223 the number of status words (in addition to the return value)
226 static struct dsp_cmd_info dsp_commands[] =
228 { (CMD_00_INFO_DEBUG << OPCODE_OFFSET) , 1 /*custom*/
229 , 1 , 0 /**/ , CMD_NAME("INFO_DEBUG") },
230 { (CMD_01_GET_SYS_CFG << OPCODE_OFFSET) , 1 /**/
231 , 1 , 2 /**/ , CMD_NAME("GET_SYS_CFG") },
232 { (CMD_02_SET_GRANULARITY << OPCODE_OFFSET) , 1 /**/
233 , 1 , 0 /**/ , CMD_NAME("SET_GRANULARITY") },
234 { (CMD_03_SET_TIMER_IRQ << OPCODE_OFFSET) , 1 /**/
235 , 1 , 0 /**/ , CMD_NAME("SET_TIMER_IRQ") },
236 { (CMD_04_GET_EVENT << OPCODE_OFFSET) , 1 /**/
237 , 1 , 0 /*up to 10*/ , CMD_NAME("GET_EVENT") },
238 { (CMD_05_GET_PIPES << OPCODE_OFFSET) , 1 /**/
239 , 1 , 2 /*up to 4*/ , CMD_NAME("GET_PIPES") },
240 { (CMD_06_ALLOCATE_PIPE << OPCODE_OFFSET) , 1 /**/
241 , 0 , 0 /**/ , CMD_NAME("ALLOCATE_PIPE") },
242 { (CMD_07_RELEASE_PIPE << OPCODE_OFFSET) , 1 /**/
243 , 0 , 0 /**/ , CMD_NAME("RELEASE_PIPE") },
244 { (CMD_08_ASK_BUFFERS << OPCODE_OFFSET) , 1 /**/
245 , 1 , MAX_STREAM_BUFFER , CMD_NAME("ASK_BUFFERS") },
246 { (CMD_09_STOP_PIPE << OPCODE_OFFSET) , 1 /**/
247 , 0 , 0 /*up to 2*/ , CMD_NAME("STOP_PIPE") },
248 { (CMD_0A_GET_PIPE_SPL_COUNT << OPCODE_OFFSET) , 1 /**/
249 , 1 , 1 /*up to 2*/ , CMD_NAME("GET_PIPE_SPL_COUNT") },
250 { (CMD_0B_TOGGLE_PIPE_STATE << OPCODE_OFFSET) , 1 /*up to 5*/
251 , 1 , 0 /**/ , CMD_NAME("TOGGLE_PIPE_STATE") },
252 { (CMD_0C_DEF_STREAM << OPCODE_OFFSET) , 1 /*up to 4*/
253 , 1 , 0 /**/ , CMD_NAME("DEF_STREAM") },
254 { (CMD_0D_SET_MUTE << OPCODE_OFFSET) , 3 /**/
255 , 1 , 0 /**/ , CMD_NAME("SET_MUTE") },
256 { (CMD_0E_GET_STREAM_SPL_COUNT << OPCODE_OFFSET) , 1/**/
257 , 1 , 2 /**/ , CMD_NAME("GET_STREAM_SPL_COUNT") },
258 { (CMD_0F_UPDATE_BUFFER << OPCODE_OFFSET) , 3 /*up to 4*/
259 , 0 , 1 /**/ , CMD_NAME("UPDATE_BUFFER") },
260 { (CMD_10_GET_BUFFER << OPCODE_OFFSET) , 1 /**/
261 , 1 , 4 /**/ , CMD_NAME("GET_BUFFER") },
262 { (CMD_11_CANCEL_BUFFER << OPCODE_OFFSET) , 1 /**/
263 , 1 , 1 /*up to 4*/ , CMD_NAME("CANCEL_BUFFER") },
264 { (CMD_12_GET_PEAK << OPCODE_OFFSET) , 1 /**/
265 , 1 , 1 /**/ , CMD_NAME("GET_PEAK") },
266 { (CMD_13_SET_STREAM_STATE << OPCODE_OFFSET) , 1 /**/
267 , 1 , 0 /**/ , CMD_NAME("SET_STREAM_STATE") },
270 static void lx_message_init(struct lx_rmh *rmh, enum cmd_mb_opcodes cmd)
272 snd_BUG_ON(cmd >= CMD_14_INVALID);
274 rmh->cmd[0] = dsp_commands[cmd].dcCodeOp;
275 rmh->cmd_len = dsp_commands[cmd].dcCmdLength;
276 rmh->stat_len = dsp_commands[cmd].dcStatusLength;
277 rmh->dsp_stat = dsp_commands[cmd].dcStatusType;
279 memset(&rmh->cmd[1], 0, (REG_CRM_NUMBER - 1) * sizeof(u32));
281 #ifdef CONFIG_SND_DEBUG
282 memset(rmh->stat, 0, REG_CRM_NUMBER * sizeof(u32));
290 #define LXRMH "lx6464es rmh: "
291 static void lx_message_dump(struct lx_rmh *rmh)
293 u8 idx = rmh->cmd_idx;
296 snd_printk(LXRMH "command %s\n", dsp_commands[idx].dcOpName);
298 for (i = 0; i != rmh->cmd_len; ++i)
299 snd_printk(LXRMH "\tcmd[%d] %08x\n", i, rmh->cmd[i]);
301 for (i = 0; i != rmh->stat_len; ++i)
302 snd_printk(LXRMH "\tstat[%d]: %08x\n", i, rmh->stat[i]);
306 static inline void lx_message_dump(struct lx_rmh *rmh)
312 /* sleep 500 - 100 = 400 times 100us -> the timeout is >= 40 ms */
313 #define XILINX_TIMEOUT_MS 40
314 #define XILINX_POLL_NO_SLEEP 100
315 #define XILINX_POLL_ITERATIONS 150
317 #if 0 /* not used now */
318 static int lx_message_send(struct lx6464es *chip, struct lx_rmh *rmh)
320 u32 reg = ED_DSP_TIMED_OUT;
324 if (lx_dsp_reg_read(chip, eReg_CSM) & (Reg_CSM_MC | Reg_CSM_MR)) {
325 snd_printk(KERN_ERR LXP "PIOSendMessage eReg_CSM %x\n", reg);
330 lx_dsp_reg_writebuf(chip, eReg_CRM1, rmh->cmd, rmh->cmd_len);
332 snd_BUG_ON(atomic_read(&chip->send_message_locked) != 0);
333 atomic_set(&chip->send_message_locked, 1);
335 /* MicoBlaze gogogo */
336 lx_dsp_reg_write(chip, eReg_CSM, Reg_CSM_MC);
338 /* wait for interrupt to answer */
339 for (dwloop = 0; dwloop != XILINX_TIMEOUT_MS; ++dwloop) {
340 answer_received = atomic_read(&chip->send_message_locked);
341 if (answer_received == 0)
346 if (answer_received == 0) {
347 /* in Debug mode verify Reg_CSM_MR */
348 snd_BUG_ON(!(lx_dsp_reg_read(chip, eReg_CSM) & Reg_CSM_MR));
350 /* command finished, read status */
351 if (rmh->dsp_stat == 0)
352 reg = lx_dsp_reg_read(chip, eReg_CRM1);
357 snd_printk(KERN_WARNING LXP "TIMEOUT lx_message_send! "
358 "Interrupts disabled?\n");
360 /* attente bit Reg_CSM_MR */
361 for (i = 0; i != XILINX_POLL_ITERATIONS; i++) {
362 if ((lx_dsp_reg_read(chip, eReg_CSM) & Reg_CSM_MR)) {
363 if (rmh->dsp_stat == 0)
364 reg = lx_dsp_reg_read(chip, eReg_CRM1);
367 goto polling_successful;
370 if (i > XILINX_POLL_NO_SLEEP)
373 snd_printk(KERN_WARNING LXP "TIMEOUT lx_message_send! "
377 atomic_set(&chip->send_message_locked, 0);
380 if ((reg & ERROR_VALUE) == 0) {
383 snd_BUG_ON(rmh->stat_len >= (REG_CRM_NUMBER-1));
385 lx_dsp_reg_readbuf(chip, eReg_CRM2, rmh->stat,
389 snd_printk(KERN_WARNING LXP "lx_message_send: error_value %x\n",
392 /* clear Reg_CSM_MR */
393 lx_dsp_reg_write(chip, eReg_CSM, 0);
396 case ED_DSP_TIMED_OUT:
397 snd_printk(KERN_WARNING LXP "lx_message_send: dsp timeout\n");
401 snd_printk(KERN_WARNING LXP "lx_message_send: dsp crashed\n");
405 lx_message_dump(rmh);
408 #endif /* not used now */
410 static int lx_message_send_atomic(struct lx6464es *chip, struct lx_rmh *rmh)
412 u32 reg = ED_DSP_TIMED_OUT;
415 if (lx_dsp_reg_read(chip, eReg_CSM) & (Reg_CSM_MC | Reg_CSM_MR)) {
416 snd_printk(KERN_ERR LXP "PIOSendMessage eReg_CSM %x\n", reg);
421 lx_dsp_reg_writebuf(chip, eReg_CRM1, rmh->cmd, rmh->cmd_len);
423 /* MicoBlaze gogogo */
424 lx_dsp_reg_write(chip, eReg_CSM, Reg_CSM_MC);
426 /* wait for interrupt to answer */
427 for (dwloop = 0; dwloop != XILINX_TIMEOUT_MS * 1000; ++dwloop) {
428 if (lx_dsp_reg_read(chip, eReg_CSM) & Reg_CSM_MR) {
429 if (rmh->dsp_stat == 0)
430 reg = lx_dsp_reg_read(chip, eReg_CRM1);
433 goto polling_successful;
437 snd_printk(KERN_WARNING LXP "TIMEOUT lx_message_send_atomic! "
441 if ((reg & ERROR_VALUE) == 0) {
444 snd_BUG_ON(rmh->stat_len >= (REG_CRM_NUMBER-1));
445 lx_dsp_reg_readbuf(chip, eReg_CRM2, rmh->stat,
449 snd_printk(LXP "rmh error: %08x\n", reg);
451 /* clear Reg_CSM_MR */
452 lx_dsp_reg_write(chip, eReg_CSM, 0);
455 case ED_DSP_TIMED_OUT:
456 snd_printk(KERN_WARNING LXP "lx_message_send: dsp timeout\n");
460 snd_printk(KERN_WARNING LXP "lx_message_send: dsp crashed\n");
464 lx_message_dump(rmh);
470 /* low-level dsp access */
471 int __devinit lx_dsp_get_version(struct lx6464es *chip, u32 *rdsp_version)
476 spin_lock_irqsave(&chip->msg_lock, flags);
478 lx_message_init(&chip->rmh, CMD_01_GET_SYS_CFG);
479 ret = lx_message_send_atomic(chip, &chip->rmh);
481 *rdsp_version = chip->rmh.stat[1];
482 spin_unlock_irqrestore(&chip->msg_lock, flags);
486 int lx_dsp_get_clock_frequency(struct lx6464es *chip, u32 *rfreq)
494 spin_lock_irqsave(&chip->msg_lock, flags);
496 lx_message_init(&chip->rmh, CMD_01_GET_SYS_CFG);
497 ret = lx_message_send_atomic(chip, &chip->rmh);
500 freq_raw = chip->rmh.stat[0] >> FREQ_FIELD_OFFSET;
501 freq = freq_raw & XES_FREQ_COUNT8_MASK;
503 if ((freq < XES_FREQ_COUNT8_48_MAX) ||
504 (freq > XES_FREQ_COUNT8_44_MIN))
505 frequency = 0; /* unknown */
506 else if (freq >= XES_FREQ_COUNT8_44_MAX)
512 spin_unlock_irqrestore(&chip->msg_lock, flags);
514 *rfreq = frequency * chip->freq_ratio;
519 int lx_dsp_get_mac(struct lx6464es *chip, u8 *mac_address)
523 macmsb = lx_dsp_reg_read(chip, eReg_ADMACESMSB) & 0x00FFFFFF;
524 maclsb = lx_dsp_reg_read(chip, eReg_ADMACESLSB) & 0x00FFFFFF;
526 /* todo: endianess handling */
527 mac_address[5] = ((u8 *)(&maclsb))[0];
528 mac_address[4] = ((u8 *)(&maclsb))[1];
529 mac_address[3] = ((u8 *)(&maclsb))[2];
530 mac_address[2] = ((u8 *)(&macmsb))[0];
531 mac_address[1] = ((u8 *)(&macmsb))[1];
532 mac_address[0] = ((u8 *)(&macmsb))[2];
538 int lx_dsp_set_granularity(struct lx6464es *chip, u32 gran)
543 spin_lock_irqsave(&chip->msg_lock, flags);
545 lx_message_init(&chip->rmh, CMD_02_SET_GRANULARITY);
546 chip->rmh.cmd[0] |= gran;
548 ret = lx_message_send_atomic(chip, &chip->rmh);
549 spin_unlock_irqrestore(&chip->msg_lock, flags);
553 int lx_dsp_read_async_events(struct lx6464es *chip, u32 *data)
558 spin_lock_irqsave(&chip->msg_lock, flags);
560 lx_message_init(&chip->rmh, CMD_04_GET_EVENT);
561 chip->rmh.stat_len = 9; /* we don't necessarily need the full length */
563 ret = lx_message_send_atomic(chip, &chip->rmh);
566 memcpy(data, chip->rmh.stat, chip->rmh.stat_len * sizeof(u32));
568 spin_unlock_irqrestore(&chip->msg_lock, flags);
572 #define CSES_TIMEOUT 100 /* microseconds */
573 #define CSES_CE 0x0001
574 #define CSES_BROADCAST 0x0002
575 #define CSES_UPDATE_LDSV 0x0004
577 int lx_dsp_es_check_pipeline(struct lx6464es *chip)
581 for (i = 0; i != CSES_TIMEOUT; ++i) {
583 * le bit CSES_UPDATE_LDSV est à 1 dés que le macprog
584 * est pret. il re-passe à 0 lorsque le premier read a
585 * été fait. pour l'instant on retire le test car ce bit
586 * passe a 1 environ 200 à 400 ms aprés que le registre
587 * confES à été écrit (kick du xilinx ES).
589 * On ne teste que le bit CE.
592 u32 cses = lx_dsp_reg_read(chip, eReg_CSES);
594 if ((cses & CSES_CE) == 0)
604 #define PIPE_INFO_TO_CMD(capture, pipe) \
605 ((u32)((u32)(pipe) | ((capture) ? ID_IS_CAPTURE : 0L)) << ID_OFFSET)
609 /* low-level pipe handling */
610 int lx_pipe_allocate(struct lx6464es *chip, u32 pipe, int is_capture,
616 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
618 spin_lock_irqsave(&chip->msg_lock, flags);
619 lx_message_init(&chip->rmh, CMD_06_ALLOCATE_PIPE);
621 chip->rmh.cmd[0] |= pipe_cmd;
622 chip->rmh.cmd[0] |= channels;
624 err = lx_message_send_atomic(chip, &chip->rmh);
625 spin_unlock_irqrestore(&chip->msg_lock, flags);
628 snd_printk(KERN_ERR "lx6464es: could not allocate pipe\n");
633 int lx_pipe_release(struct lx6464es *chip, u32 pipe, int is_capture)
638 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
640 spin_lock_irqsave(&chip->msg_lock, flags);
641 lx_message_init(&chip->rmh, CMD_07_RELEASE_PIPE);
643 chip->rmh.cmd[0] |= pipe_cmd;
645 err = lx_message_send_atomic(chip, &chip->rmh);
646 spin_unlock_irqrestore(&chip->msg_lock, flags);
651 int lx_buffer_ask(struct lx6464es *chip, u32 pipe, int is_capture,
652 u32 *r_needed, u32 *r_freed, u32 *size_array)
657 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
659 #ifdef CONFIG_SND_DEBUG
661 memset(size_array, 0, sizeof(u32)*MAX_STREAM_BUFFER);
667 spin_lock_irqsave(&chip->msg_lock, flags);
668 lx_message_init(&chip->rmh, CMD_08_ASK_BUFFERS);
670 chip->rmh.cmd[0] |= pipe_cmd;
672 err = lx_message_send_atomic(chip, &chip->rmh);
676 for (i = 0; i < MAX_STREAM_BUFFER; ++i) {
677 u32 stat = chip->rmh.stat[i];
678 if (stat & (BF_EOB << BUFF_FLAGS_OFFSET)) {
682 size_array[i] = stat & MASK_DATA_SIZE;
683 } else if ((stat & (BF_VALID << BUFF_FLAGS_OFFSET))
690 snd_printdd(LXP "CMD_08_ASK_BUFFERS: needed %d, freed %d\n",
691 *r_needed, *r_freed);
692 for (i = 0; i < MAX_STREAM_BUFFER; ++i) {
693 for (i = 0; i != chip->rmh.stat_len; ++i)
694 snd_printdd(" stat[%d]: %x, %x\n", i,
696 chip->rmh.stat[i] & MASK_DATA_SIZE);
701 spin_unlock_irqrestore(&chip->msg_lock, flags);
706 int lx_pipe_stop(struct lx6464es *chip, u32 pipe, int is_capture)
711 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
713 spin_lock_irqsave(&chip->msg_lock, flags);
714 lx_message_init(&chip->rmh, CMD_09_STOP_PIPE);
716 chip->rmh.cmd[0] |= pipe_cmd;
718 err = lx_message_send_atomic(chip, &chip->rmh);
720 spin_unlock_irqrestore(&chip->msg_lock, flags);
724 static int lx_pipe_toggle_state(struct lx6464es *chip, u32 pipe, int is_capture)
729 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
731 spin_lock_irqsave(&chip->msg_lock, flags);
732 lx_message_init(&chip->rmh, CMD_0B_TOGGLE_PIPE_STATE);
734 chip->rmh.cmd[0] |= pipe_cmd;
736 err = lx_message_send_atomic(chip, &chip->rmh);
738 spin_unlock_irqrestore(&chip->msg_lock, flags);
743 int lx_pipe_start(struct lx6464es *chip, u32 pipe, int is_capture)
747 err = lx_pipe_wait_for_idle(chip, pipe, is_capture);
751 err = lx_pipe_toggle_state(chip, pipe, is_capture);
756 int lx_pipe_pause(struct lx6464es *chip, u32 pipe, int is_capture)
760 err = lx_pipe_wait_for_start(chip, pipe, is_capture);
764 err = lx_pipe_toggle_state(chip, pipe, is_capture);
770 int lx_pipe_sample_count(struct lx6464es *chip, u32 pipe, int is_capture,
776 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
778 spin_lock_irqsave(&chip->msg_lock, flags);
779 lx_message_init(&chip->rmh, CMD_0A_GET_PIPE_SPL_COUNT);
781 chip->rmh.cmd[0] |= pipe_cmd;
782 chip->rmh.stat_len = 2; /* need all words here! */
784 err = lx_message_send_atomic(chip, &chip->rmh); /* don't sleep! */
788 "lx6464es: could not query pipe's sample count\n");
790 *rsample_count = ((u64)(chip->rmh.stat[0] & MASK_SPL_COUNT_HI)
792 + chip->rmh.stat[1]; /* lo part */
795 spin_unlock_irqrestore(&chip->msg_lock, flags);
799 int lx_pipe_state(struct lx6464es *chip, u32 pipe, int is_capture, u16 *rstate)
804 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
806 spin_lock_irqsave(&chip->msg_lock, flags);
807 lx_message_init(&chip->rmh, CMD_0A_GET_PIPE_SPL_COUNT);
809 chip->rmh.cmd[0] |= pipe_cmd;
811 err = lx_message_send_atomic(chip, &chip->rmh);
814 snd_printk(KERN_ERR "lx6464es: could not query pipe's state\n");
816 *rstate = (chip->rmh.stat[0] >> PSTATE_OFFSET) & 0x0F;
818 spin_unlock_irqrestore(&chip->msg_lock, flags);
822 static int lx_pipe_wait_for_state(struct lx6464es *chip, u32 pipe,
823 int is_capture, u16 state)
827 /* max 2*PCMOnlyGranularity = 2*1024 at 44100 = < 50 ms:
829 for (i = 0; i != 50; ++i) {
831 int err = lx_pipe_state(chip, pipe, is_capture, ¤t_state);
836 if (current_state == state)
845 int lx_pipe_wait_for_start(struct lx6464es *chip, u32 pipe, int is_capture)
847 return lx_pipe_wait_for_state(chip, pipe, is_capture, PSTATE_RUN);
850 int lx_pipe_wait_for_idle(struct lx6464es *chip, u32 pipe, int is_capture)
852 return lx_pipe_wait_for_state(chip, pipe, is_capture, PSTATE_IDLE);
855 /* low-level stream handling */
856 int lx_stream_set_state(struct lx6464es *chip, u32 pipe,
857 int is_capture, enum stream_state_t state)
862 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
864 spin_lock_irqsave(&chip->msg_lock, flags);
865 lx_message_init(&chip->rmh, CMD_13_SET_STREAM_STATE);
867 chip->rmh.cmd[0] |= pipe_cmd;
868 chip->rmh.cmd[0] |= state;
870 err = lx_message_send_atomic(chip, &chip->rmh);
871 spin_unlock_irqrestore(&chip->msg_lock, flags);
876 int lx_stream_set_format(struct lx6464es *chip, struct snd_pcm_runtime *runtime,
877 u32 pipe, int is_capture)
882 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
884 u32 channels = runtime->channels;
886 if (runtime->channels != channels)
887 snd_printk(KERN_ERR LXP "channel count mismatch: %d vs %d",
888 runtime->channels, channels);
890 spin_lock_irqsave(&chip->msg_lock, flags);
891 lx_message_init(&chip->rmh, CMD_0C_DEF_STREAM);
893 chip->rmh.cmd[0] |= pipe_cmd;
895 if (runtime->sample_bits == 16)
897 chip->rmh.cmd[0] |= (STREAM_FMT_16b << STREAM_FMT_OFFSET);
899 if (snd_pcm_format_little_endian(runtime->format))
900 /* little endian/intel format */
901 chip->rmh.cmd[0] |= (STREAM_FMT_intel << STREAM_FMT_OFFSET);
903 chip->rmh.cmd[0] |= channels-1;
905 err = lx_message_send_atomic(chip, &chip->rmh);
906 spin_unlock_irqrestore(&chip->msg_lock, flags);
911 int lx_stream_state(struct lx6464es *chip, u32 pipe, int is_capture,
917 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
919 spin_lock_irqsave(&chip->msg_lock, flags);
920 lx_message_init(&chip->rmh, CMD_0E_GET_STREAM_SPL_COUNT);
922 chip->rmh.cmd[0] |= pipe_cmd;
924 err = lx_message_send_atomic(chip, &chip->rmh);
926 *rstate = (chip->rmh.stat[0] & SF_START) ? START_STATE : PAUSE_STATE;
928 spin_unlock_irqrestore(&chip->msg_lock, flags);
932 int lx_stream_sample_position(struct lx6464es *chip, u32 pipe, int is_capture,
938 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
940 spin_lock_irqsave(&chip->msg_lock, flags);
941 lx_message_init(&chip->rmh, CMD_0E_GET_STREAM_SPL_COUNT);
943 chip->rmh.cmd[0] |= pipe_cmd;
945 err = lx_message_send_atomic(chip, &chip->rmh);
947 *r_bytepos = ((u64) (chip->rmh.stat[0] & MASK_SPL_COUNT_HI)
949 + chip->rmh.stat[1]; /* lo part */
951 spin_unlock_irqrestore(&chip->msg_lock, flags);
955 /* low-level buffer handling */
956 int lx_buffer_give(struct lx6464es *chip, u32 pipe, int is_capture,
957 u32 buffer_size, u32 buf_address_lo, u32 buf_address_hi,
963 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
965 spin_lock_irqsave(&chip->msg_lock, flags);
966 lx_message_init(&chip->rmh, CMD_0F_UPDATE_BUFFER);
968 chip->rmh.cmd[0] |= pipe_cmd;
969 chip->rmh.cmd[0] |= BF_NOTIFY_EOB; /* request interrupt notification */
971 /* todo: pause request, circular buffer */
973 chip->rmh.cmd[1] = buffer_size & MASK_DATA_SIZE;
974 chip->rmh.cmd[2] = buf_address_lo;
976 if (buf_address_hi) {
977 chip->rmh.cmd_len = 4;
978 chip->rmh.cmd[3] = buf_address_hi;
979 chip->rmh.cmd[0] |= BF_64BITS_ADR;
982 err = lx_message_send_atomic(chip, &chip->rmh);
985 *r_buffer_index = chip->rmh.stat[0];
989 if (err == EB_RBUFFERS_TABLE_OVERFLOW)
990 snd_printk(LXP "lx_buffer_give EB_RBUFFERS_TABLE_OVERFLOW\n");
992 if (err == EB_INVALID_STREAM)
993 snd_printk(LXP "lx_buffer_give EB_INVALID_STREAM\n");
995 if (err == EB_CMD_REFUSED)
996 snd_printk(LXP "lx_buffer_give EB_CMD_REFUSED\n");
999 spin_unlock_irqrestore(&chip->msg_lock, flags);
1003 int lx_buffer_free(struct lx6464es *chip, u32 pipe, int is_capture,
1007 unsigned long flags;
1009 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
1011 spin_lock_irqsave(&chip->msg_lock, flags);
1012 lx_message_init(&chip->rmh, CMD_11_CANCEL_BUFFER);
1014 chip->rmh.cmd[0] |= pipe_cmd;
1015 chip->rmh.cmd[0] |= MASK_BUFFER_ID; /* ask for the current buffer: the
1016 * microblaze will seek for it */
1018 err = lx_message_send_atomic(chip, &chip->rmh);
1021 *r_buffer_size = chip->rmh.stat[0] & MASK_DATA_SIZE;
1023 spin_unlock_irqrestore(&chip->msg_lock, flags);
1027 int lx_buffer_cancel(struct lx6464es *chip, u32 pipe, int is_capture,
1031 unsigned long flags;
1033 u32 pipe_cmd = PIPE_INFO_TO_CMD(is_capture, pipe);
1035 spin_lock_irqsave(&chip->msg_lock, flags);
1036 lx_message_init(&chip->rmh, CMD_11_CANCEL_BUFFER);
1038 chip->rmh.cmd[0] |= pipe_cmd;
1039 chip->rmh.cmd[0] |= buffer_index;
1041 err = lx_message_send_atomic(chip, &chip->rmh);
1043 spin_unlock_irqrestore(&chip->msg_lock, flags);
1048 /* low-level gain/peak handling
1050 * \todo: can we unmute capture/playback channels independently?
1053 int lx_level_unmute(struct lx6464es *chip, int is_capture, int unmute)
1056 unsigned long flags;
1058 /* bit set to 1: channel muted */
1059 u64 mute_mask = unmute ? 0 : 0xFFFFFFFFFFFFFFFFLLU;
1061 spin_lock_irqsave(&chip->msg_lock, flags);
1062 lx_message_init(&chip->rmh, CMD_0D_SET_MUTE);
1064 chip->rmh.cmd[0] |= PIPE_INFO_TO_CMD(is_capture, 0);
1066 chip->rmh.cmd[1] = (u32)(mute_mask >> (u64)32); /* hi part */
1067 chip->rmh.cmd[2] = (u32)(mute_mask & (u64)0xFFFFFFFF); /* lo part */
1069 snd_printk("mute %x %x %x\n", chip->rmh.cmd[0], chip->rmh.cmd[1],
1072 err = lx_message_send_atomic(chip, &chip->rmh);
1074 spin_unlock_irqrestore(&chip->msg_lock, flags);
1078 static u32 peak_map[] = {
1079 0x00000109, /* -90.308dB */
1080 0x0000083B, /* -72.247dB */
1081 0x000020C4, /* -60.205dB */
1082 0x00008273, /* -48.030dB */
1083 0x00020756, /* -36.005dB */
1084 0x00040C37, /* -30.001dB */
1085 0x00081385, /* -24.002dB */
1086 0x00101D3F, /* -18.000dB */
1087 0x0016C310, /* -15.000dB */
1088 0x002026F2, /* -12.001dB */
1089 0x002D6A86, /* -9.000dB */
1090 0x004026E6, /* -6.004dB */
1091 0x005A9DF6, /* -3.000dB */
1092 0x0065AC8B, /* -2.000dB */
1093 0x00721481, /* -1.000dB */
1094 0x007FFFFF, /* FS */
1097 int lx_level_peaks(struct lx6464es *chip, int is_capture, int channels,
1101 unsigned long flags;
1103 spin_lock_irqsave(&chip->msg_lock, flags);
1105 for (i = 0; i < channels; i += 4) {
1108 lx_message_init(&chip->rmh, CMD_12_GET_PEAK);
1109 chip->rmh.cmd[0] |= PIPE_INFO_TO_CMD(is_capture, i);
1111 err = lx_message_send_atomic(chip, &chip->rmh);
1114 s0 = peak_map[chip->rmh.stat[0] & 0x0F];
1115 s1 = peak_map[(chip->rmh.stat[0] >> 4) & 0xf];
1116 s2 = peak_map[(chip->rmh.stat[0] >> 8) & 0xf];
1117 s3 = peak_map[(chip->rmh.stat[0] >> 12) & 0xf];
1119 s0 = s1 = s2 = s3 = 0;
1129 spin_unlock_irqrestore(&chip->msg_lock, flags);
1133 /* interrupt handling */
1134 #define PCX_IRQ_NONE 0
1135 #define IRQCS_ACTIVE_PCIDB 0x00002000L /* Bit nÃ
\83¸ 13 */
1136 #define IRQCS_ENABLE_PCIIRQ 0x00000100L /* Bit nÃ
\83¸ 08 */
1137 #define IRQCS_ENABLE_PCIDB 0x00000200L /* Bit nÃ
\83¸ 09 */
1139 static u32 lx_interrupt_test_ack(struct lx6464es *chip)
1141 u32 irqcs = lx_plx_reg_read(chip, ePLX_IRQCS);
1143 /* Test if PCI Doorbell interrupt is active */
1144 if (irqcs & IRQCS_ACTIVE_PCIDB) {
1146 irqcs = PCX_IRQ_NONE;
1148 while ((temp = lx_plx_reg_read(chip, ePLX_L2PCIDB))) {
1151 lx_plx_reg_write(chip, ePLX_L2PCIDB, temp);
1156 return PCX_IRQ_NONE;
1159 static int lx_interrupt_ack(struct lx6464es *chip, u32 *r_irqsrc,
1160 int *r_async_pending, int *r_async_escmd)
1163 u32 irqsrc = lx_interrupt_test_ack(chip);
1165 if (irqsrc == PCX_IRQ_NONE)
1170 irq_async = irqsrc & MASK_SYS_ASYNC_EVENTS; /* + EtherSound response
1171 * (set by xilinx) + EOB */
1173 if (irq_async & MASK_SYS_STATUS_ESA) {
1174 irq_async &= ~MASK_SYS_STATUS_ESA;
1178 if (irqsrc & MASK_SYS_STATUS_CMD_DONE)
1179 /* xilinx command notification */
1180 atomic_set(&chip->send_message_locked, 0);
1183 /* snd_printd("interrupt: async event pending\n"); */
1184 *r_async_pending = 1;
1190 static int lx_interrupt_handle_async_events(struct lx6464es *chip, u32 irqsrc,
1191 int *r_freq_changed,
1192 u64 *r_notified_in_pipe_mask,
1193 u64 *r_notified_out_pipe_mask)
1196 u32 stat[9]; /* answer from CMD_04_GET_EVENT */
1198 /* On peut optimiser pour ne pas lire les evenements vides
1199 * les mots de rÃ
\83©ponse sont dans l'ordre suivant :
1200 * Stat[0] mot de status gÃ
\83©nÃ
\83©ral
1201 * Stat[1] fin de buffer OUT pF
1202 * Stat[2] fin de buffer OUT pf
1203 * Stat[3] fin de buffer IN pF
1204 * Stat[4] fin de buffer IN pf
1205 * Stat[5] underrun poid fort
1206 * Stat[6] underrun poid faible
1207 * Stat[7] overrun poid fort
1208 * Stat[8] overrun poid faible
1214 int has_underrun = (irqsrc & MASK_SYS_STATUS_URUN) ? 1 : 0;
1215 int has_overrun = (irqsrc & MASK_SYS_STATUS_ORUN) ? 1 : 0;
1217 int eb_pending_out = (irqsrc & MASK_SYS_STATUS_EOBO) ? 1 : 0;
1218 int eb_pending_in = (irqsrc & MASK_SYS_STATUS_EOBI) ? 1 : 0;
1220 *r_freq_changed = (irqsrc & MASK_SYS_STATUS_FREQ) ? 1 : 0;
1222 err = lx_dsp_read_async_events(chip, stat);
1226 if (eb_pending_in) {
1227 *r_notified_in_pipe_mask = ((u64)stat[3] << 32)
1229 snd_printdd(LXP "interrupt: EOBI pending %llx\n",
1230 *r_notified_in_pipe_mask);
1232 if (eb_pending_out) {
1233 *r_notified_out_pipe_mask = ((u64)stat[1] << 32)
1235 snd_printdd(LXP "interrupt: EOBO pending %llx\n",
1236 *r_notified_out_pipe_mask);
1239 orun_mask = ((u64)stat[7] << 32) + stat[8];
1240 urun_mask = ((u64)stat[5] << 32) + stat[6];
1242 /* todo: handle xrun notification */
1247 static int lx_interrupt_request_new_buffer(struct lx6464es *chip,
1248 struct lx_stream *lx_stream)
1250 struct snd_pcm_substream *substream = lx_stream->stream;
1251 int is_capture = lx_stream->is_capture;
1253 unsigned long flags;
1255 const u32 channels = substream->runtime->channels;
1256 const u32 bytes_per_frame = channels * 3;
1257 const u32 period_size = substream->runtime->period_size;
1258 const u32 period_bytes = period_size * bytes_per_frame;
1259 const u32 pos = lx_stream->frame_pos;
1260 const u32 next_pos = ((pos+1) == substream->runtime->periods) ?
1263 dma_addr_t buf = substream->dma_buffer.addr + pos * period_bytes;
1266 u32 buffer_index = 0;
1269 u32 size_array[MAX_STREAM_BUFFER];
1271 snd_printdd("->lx_interrupt_request_new_buffer\n");
1273 spin_lock_irqsave(&chip->lock, flags);
1275 err = lx_buffer_ask(chip, 0, is_capture, &needed, &freed, size_array);
1276 snd_printdd(LXP "interrupt: needed %d, freed %d\n", needed, freed);
1278 unpack_pointer(buf, &buf_lo, &buf_hi);
1279 err = lx_buffer_give(chip, 0, is_capture, period_bytes, buf_lo, buf_hi,
1281 snd_printdd(LXP "interrupt: gave buffer index %x on %p (%d bytes)\n",
1282 buffer_index, (void *)buf, period_bytes);
1284 lx_stream->frame_pos = next_pos;
1285 spin_unlock_irqrestore(&chip->lock, flags);
1290 void lx_tasklet_playback(unsigned long data)
1292 struct lx6464es *chip = (struct lx6464es *)data;
1293 struct lx_stream *lx_stream = &chip->playback_stream;
1296 snd_printdd("->lx_tasklet_playback\n");
1298 err = lx_interrupt_request_new_buffer(chip, lx_stream);
1300 snd_printk(KERN_ERR LXP
1301 "cannot request new buffer for playback\n");
1303 snd_pcm_period_elapsed(lx_stream->stream);
1306 void lx_tasklet_capture(unsigned long data)
1308 struct lx6464es *chip = (struct lx6464es *)data;
1309 struct lx_stream *lx_stream = &chip->capture_stream;
1312 snd_printdd("->lx_tasklet_capture\n");
1313 err = lx_interrupt_request_new_buffer(chip, lx_stream);
1315 snd_printk(KERN_ERR LXP
1316 "cannot request new buffer for capture\n");
1318 snd_pcm_period_elapsed(lx_stream->stream);
1323 static int lx_interrupt_handle_audio_transfer(struct lx6464es *chip,
1324 u64 notified_in_pipe_mask,
1325 u64 notified_out_pipe_mask)
1329 if (notified_in_pipe_mask) {
1330 snd_printdd(LXP "requesting audio transfer for capture\n");
1331 tasklet_hi_schedule(&chip->tasklet_capture);
1334 if (notified_out_pipe_mask) {
1335 snd_printdd(LXP "requesting audio transfer for playback\n");
1336 tasklet_hi_schedule(&chip->tasklet_playback);
1343 irqreturn_t lx_interrupt(int irq, void *dev_id)
1345 struct lx6464es *chip = dev_id;
1346 int async_pending, async_escmd;
1349 spin_lock(&chip->lock);
1351 snd_printdd("**************************************************\n");
1353 if (!lx_interrupt_ack(chip, &irqsrc, &async_pending, &async_escmd)) {
1354 spin_unlock(&chip->lock);
1355 snd_printdd("IRQ_NONE\n");
1356 return IRQ_NONE; /* this device did not cause the interrupt */
1359 if (irqsrc & MASK_SYS_STATUS_CMD_DONE)
1363 if (irqsrc & MASK_SYS_STATUS_EOBI)
1364 snd_printdd(LXP "interrupt: EOBI\n");
1366 if (irqsrc & MASK_SYS_STATUS_EOBO)
1367 snd_printdd(LXP "interrupt: EOBO\n");
1369 if (irqsrc & MASK_SYS_STATUS_URUN)
1370 snd_printdd(LXP "interrupt: URUN\n");
1372 if (irqsrc & MASK_SYS_STATUS_ORUN)
1373 snd_printdd(LXP "interrupt: ORUN\n");
1376 if (async_pending) {
1377 u64 notified_in_pipe_mask = 0;
1378 u64 notified_out_pipe_mask = 0;
1382 /* handle async events */
1383 err = lx_interrupt_handle_async_events(chip, irqsrc,
1385 ¬ified_in_pipe_mask,
1386 ¬ified_out_pipe_mask);
1388 snd_printk(KERN_ERR LXP
1389 "error handling async events\n");
1391 err = lx_interrupt_handle_audio_transfer(chip,
1392 notified_in_pipe_mask,
1393 notified_out_pipe_mask
1396 snd_printk(KERN_ERR LXP
1397 "error during audio transfer\n");
1402 /* backdoor for ethersound commands
1404 * for now, we do not need this
1408 snd_printdd("lx6464es: interrupt requests escmd handling\n");
1413 spin_unlock(&chip->lock);
1414 return IRQ_HANDLED; /* this device caused the interrupt */
1418 static void lx_irq_set(struct lx6464es *chip, int enable)
1420 u32 reg = lx_plx_reg_read(chip, ePLX_IRQCS);
1422 /* enable/disable interrupts
1424 * Set the Doorbell and PCI interrupt enable bits
1428 reg |= (IRQCS_ENABLE_PCIIRQ | IRQCS_ENABLE_PCIDB);
1430 reg &= ~(IRQCS_ENABLE_PCIIRQ | IRQCS_ENABLE_PCIDB);
1431 lx_plx_reg_write(chip, ePLX_IRQCS, reg);
1434 void lx_irq_enable(struct lx6464es *chip)
1436 snd_printdd("->lx_irq_enable\n");
1437 lx_irq_set(chip, 1);
1440 void lx_irq_disable(struct lx6464es *chip)
1442 snd_printdd("->lx_irq_disable\n");
1443 lx_irq_set(chip, 0);