Lines Matching +full:timer +full:- +full:dsp
12 * Real-time tone generation
14 * Real-time cross-connection and conferrence
23 * The dsp module provides layer 2 for b-channels (64kbit). It provides
26 * - (1) generation of tones
27 * - (2) detection of dtmf tones
28 * - (3) crossconnecting and conferences (clocking)
29 * - (4) echo generation for delay test
30 * - (5) volume control
31 * - (6) disable receive data
32 * - (7) pipeline
33 * - (8) encryption/decryption
37 * ------upper layer------
41 * +-----+-------------+-----+
45 * | +-------------+
48 * |+---------+| +----+----+
54 * |+----+----+| +----+----+
55 * +-----+-----+ ^
58 * +----+----+ +----+----+
64 * +----+----+ +----+----+
68 * +----+-------------+----+
74 * +----+-------------+----+
78 * +----+----+ +----+----+
84 * +----+----+ +----+----+
88 * ------card layer------
96 * NOTE: The channel must be activated in order to make dsp work, even if
131 * will be played without cpu load. Small PBXs and NT-Mode applications will
137 * When data is received from upper or lower layer (card), the complete dsp
139 * must lock timer events by DSP poll timer.
141 * outside lock and timer event.
161 #include "dsp.h"
180 DEFINE_SPINLOCK(dsp_lock); /* global dsp lock */
189 dsp_rx_off_member(struct dsp *dsp) in dsp_rx_off_member() argument
196 if (!dsp->features_rx_off) in dsp_rx_off_member()
200 if (!dsp->rx_disabled) in dsp_rx_off_member()
203 else if (dsp->dtmf.software) in dsp_rx_off_member()
206 else if (dsp->echo.software) in dsp_rx_off_member()
209 else if (dsp->conf && dsp->conf->software) in dsp_rx_off_member()
212 * for echo dtmf detection, soft-echo, soft-bridging */ in dsp_rx_off_member()
214 if (rx_off == dsp->rx_is_off) in dsp_rx_off_member()
217 if (!dsp->ch.peer) { in dsp_rx_off_member()
225 if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) { in dsp_rx_off_member()
230 dsp->rx_is_off = rx_off; in dsp_rx_off_member()
233 __func__, dsp->name, rx_off); in dsp_rx_off_member()
236 dsp_rx_off(struct dsp *dsp) in dsp_rx_off() argument
244 if (!dsp->conf) { in dsp_rx_off()
245 dsp_rx_off_member(dsp); in dsp_rx_off()
249 list_for_each_entry(member, &dsp->conf->mlist, list) { in dsp_rx_off()
250 dsp_rx_off_member(member->dsp); in dsp_rx_off()
256 dsp_fill_empty(struct dsp *dsp) in dsp_fill_empty() argument
262 if (!dsp->ch.peer) { in dsp_fill_empty()
271 if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) { in dsp_fill_empty()
278 __func__, dsp->name); in dsp_fill_empty()
282 dsp_control_req(struct dsp *dsp, struct mISDNhead *hh, struct sk_buff *skb) in dsp_control_req() argument
290 if (skb->len < sizeof(int)) { in dsp_control_req()
292 return -EINVAL; in dsp_control_req()
294 cont = *((int *)skb->data); in dsp_control_req()
295 len = skb->len - sizeof(int); in dsp_control_req()
296 data = skb->data + sizeof(int); in dsp_control_req()
300 if (dsp->hdlc) { in dsp_control_req()
301 ret = -EINVAL; in dsp_control_req()
310 dsp->dtmf.treshold = (*(int *)data) * 10000; in dsp_control_req()
312 dsp->dtmf.enable = 1; in dsp_control_req()
314 dsp_dtmf_goertzel_init(dsp); in dsp_control_req()
317 dsp_dtmf_hardware(dsp); in dsp_control_req()
318 dsp_rx_off(dsp); in dsp_control_req()
323 dsp->dtmf.enable = 0; in dsp_control_req()
324 dsp->dtmf.hardware = 0; in dsp_control_req()
325 dsp->dtmf.software = 0; in dsp_control_req()
329 ret = -EINVAL; in dsp_control_req()
337 ret = dsp_cmx_conf(dsp, *((u32 *)data)); in dsp_control_req()
339 dsp_rx_off(dsp); in dsp_control_req()
341 dsp_cmx_debug(dsp); in dsp_control_req()
347 ret = dsp_cmx_conf(dsp, 0); in dsp_control_req()
350 dsp_cmx_debug(dsp); in dsp_control_req()
351 dsp_rx_off(dsp); in dsp_control_req()
354 if (dsp->hdlc) { in dsp_control_req()
355 ret = -EINVAL; in dsp_control_req()
359 ret = -EINVAL; in dsp_control_req()
364 __func__, *((int *)skb->data)); in dsp_control_req()
365 ret = dsp_tone(dsp, *((int *)data)); in dsp_control_req()
367 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
368 dsp_rx_off(dsp); in dsp_control_req()
370 if (!dsp->tone.tone) in dsp_control_req()
374 if (dsp->hdlc) { in dsp_control_req()
375 ret = -EINVAL; in dsp_control_req()
380 dsp_tone(dsp, 0); in dsp_control_req()
381 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
382 dsp_rx_off(dsp); in dsp_control_req()
385 dsp->rx_W = 0; in dsp_control_req()
386 dsp->rx_R = 0; in dsp_control_req()
389 if (dsp->hdlc) { in dsp_control_req()
390 ret = -EINVAL; in dsp_control_req()
394 ret = -EINVAL; in dsp_control_req()
397 dsp->tx_volume = *((int *)data); in dsp_control_req()
400 __func__, dsp->tx_volume); in dsp_control_req()
401 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
402 dsp_dtmf_hardware(dsp); in dsp_control_req()
403 dsp_rx_off(dsp); in dsp_control_req()
406 if (dsp->hdlc) { in dsp_control_req()
407 ret = -EINVAL; in dsp_control_req()
411 ret = -EINVAL; in dsp_control_req()
414 dsp->rx_volume = *((int *)data); in dsp_control_req()
417 __func__, dsp->tx_volume); in dsp_control_req()
418 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
419 dsp_dtmf_hardware(dsp); in dsp_control_req()
420 dsp_rx_off(dsp); in dsp_control_req()
423 dsp->echo.software = 1; /* soft echo */ in dsp_control_req()
425 printk(KERN_DEBUG "%s: enable cmx-echo\n", __func__); in dsp_control_req()
426 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
427 dsp_rx_off(dsp); in dsp_control_req()
429 dsp_cmx_debug(dsp); in dsp_control_req()
432 dsp->echo.software = 0; in dsp_control_req()
433 dsp->echo.hardware = 0; in dsp_control_req()
435 printk(KERN_DEBUG "%s: disable cmx-echo\n", __func__); in dsp_control_req()
436 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
437 dsp_rx_off(dsp); in dsp_control_req()
439 dsp_cmx_debug(dsp); in dsp_control_req()
445 dsp->rx_disabled = 0; in dsp_control_req()
446 dsp_rx_off(dsp); in dsp_control_req()
452 dsp->rx_disabled = 1; in dsp_control_req()
453 dsp_rx_off(dsp); in dsp_control_req()
456 if (dsp->hdlc) { in dsp_control_req()
457 ret = -EINVAL; in dsp_control_req()
462 "tx-data with conf members\n", __func__); in dsp_control_req()
463 dsp->tx_mix = 1; in dsp_control_req()
464 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
465 dsp_rx_off(dsp); in dsp_control_req()
467 dsp_cmx_debug(dsp); in dsp_control_req()
470 if (dsp->hdlc) { in dsp_control_req()
471 ret = -EINVAL; in dsp_control_req()
476 "tx-data with conf members\n", __func__); in dsp_control_req()
477 dsp->tx_mix = 0; in dsp_control_req()
478 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
479 dsp_rx_off(dsp); in dsp_control_req()
481 dsp_cmx_debug(dsp); in dsp_control_req()
484 dsp->tx_data = 1; in dsp_control_req()
486 printk(KERN_DEBUG "%s: enable tx-data\n", __func__); in dsp_control_req()
487 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
488 dsp_rx_off(dsp); in dsp_control_req()
490 dsp_cmx_debug(dsp); in dsp_control_req()
493 dsp->tx_data = 0; in dsp_control_req()
495 printk(KERN_DEBUG "%s: disable tx-data\n", __func__); in dsp_control_req()
496 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
497 dsp_rx_off(dsp); in dsp_control_req()
499 dsp_cmx_debug(dsp); in dsp_control_req()
503 if (dsp->hdlc) { in dsp_control_req()
504 ret = -EINVAL; in dsp_control_req()
508 ret = -EINVAL; in dsp_control_req()
511 dsp->cmx_delay = (*((int *)data)) << 3; in dsp_control_req()
513 if (dsp->cmx_delay >= (CMX_BUFF_HALF >> 1)) in dsp_control_req()
516 dsp->cmx_delay = (CMX_BUFF_HALF >> 1) - 1; in dsp_control_req()
520 __func__, dsp->cmx_delay); in dsp_control_req()
524 if (dsp->hdlc) { in dsp_control_req()
525 ret = -EINVAL; in dsp_control_req()
528 dsp->cmx_delay = 0; in dsp_control_req()
533 case DSP_TX_DEJITTER: /* use dynamic jitter algorithm for tx-buffer */ in dsp_control_req()
534 if (dsp->hdlc) { in dsp_control_req()
535 ret = -EINVAL; in dsp_control_req()
538 dsp->tx_dejitter = 1; in dsp_control_req()
543 case DSP_TX_DEJ_OFF: /* use tx-buffer without dejittering*/ in dsp_control_req()
544 if (dsp->hdlc) { in dsp_control_req()
545 ret = -EINVAL; in dsp_control_req()
548 dsp->tx_dejitter = 0; in dsp_control_req()
554 if (dsp->hdlc) { in dsp_control_req()
555 ret = -EINVAL; in dsp_control_req()
558 if (len > 0 && ((char *)data)[len - 1]) { in dsp_control_req()
561 ret = -EINVAL; in dsp_control_req()
563 dsp->pipeline.inuse = 1; in dsp_control_req()
564 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
565 ret = dsp_pipeline_build(&dsp->pipeline, in dsp_control_req()
567 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
568 dsp_rx_off(dsp); in dsp_control_req()
572 if (dsp->hdlc) { in dsp_control_req()
573 ret = -EINVAL; in dsp_control_req()
577 ret = -EINVAL; in dsp_control_req()
583 ret = dsp_bf_init(dsp, (u8 *)data, len); in dsp_control_req()
593 if (dsp->up) { in dsp_control_req()
594 if (dsp->up->send(dsp->up, nskb)) in dsp_control_req()
600 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
601 dsp_dtmf_hardware(dsp); in dsp_control_req()
602 dsp_rx_off(dsp); in dsp_control_req()
606 if (dsp->hdlc) { in dsp_control_req()
607 ret = -EINVAL; in dsp_control_req()
612 dsp_bf_cleanup(dsp); in dsp_control_req()
613 dsp_cmx_hardware(dsp->conf, dsp); in dsp_control_req()
614 dsp_dtmf_hardware(dsp); in dsp_control_req()
615 dsp_rx_off(dsp); in dsp_control_req()
621 ret = -EINVAL; in dsp_control_req()
629 struct dsp *dsp = container_of(ch, struct dsp, ch); in get_features() local
632 if (!ch->peer) { in get_features()
640 if (ch->peer->ctrl(ch->peer, CONTROL_CHANNEL, &cq) < 0) { in get_features()
646 dsp->features_rx_off = 1; in get_features()
648 dsp->features_fill_empty = 1; in get_features()
653 *((u_long *)&cq.p1) = (u_long)&dsp->features; in get_features()
654 if (ch->peer->ctrl(ch->peer, CONTROL_CHANNEL, &cq)) { in get_features()
661 __func__, dsp->name); in get_features()
667 struct dsp *dsp = container_of(ch, struct dsp, ch); in dsp_function() local
674 switch (hh->prim) { in dsp_function()
677 dsp->data_pending = 0; in dsp_function()
679 if (dsp->hdlc) { in dsp_function()
681 if (dsp->b_active) in dsp_function()
682 schedule_work(&dsp->workq); in dsp_function()
688 if (skb->len < 1) { in dsp_function()
689 ret = -EINVAL; in dsp_function()
692 if (dsp->rx_is_off) { in dsp_function()
694 printk(KERN_DEBUG "%s: rx-data during rx_off" in dsp_function()
696 __func__, dsp->name); in dsp_function()
698 if (dsp->hdlc) { in dsp_function()
701 dsp_cmx_hdlc(dsp, skb); in dsp_function()
703 if (dsp->rx_disabled) { in dsp_function()
707 hh->prim = DL_DATA_IND; in dsp_function()
708 if (dsp->up) in dsp_function()
709 return dsp->up->send(dsp->up, skb); in dsp_function()
716 if (dsp->bf_enable) in dsp_function()
717 dsp_bf_decrypt(dsp, skb->data, skb->len); in dsp_function()
719 if (dsp->pipeline.inuse) in dsp_function()
720 dsp_pipeline_process_rx(&dsp->pipeline, skb->data, in dsp_function()
721 skb->len, hh->id); in dsp_function()
723 if (dsp->rx_volume) in dsp_function()
724 dsp_change_volume(skb, dsp->rx_volume); in dsp_function()
726 if (dsp->dtmf.software) { in dsp_function()
727 digits = dsp_dtmf_goertzel_decode(dsp, skb->data, in dsp_function()
728 skb->len, (dsp_options & DSP_OPT_ULAW) ? 1 : 0); in dsp_function()
731 if (dsp->conf && dsp->conf->software) { in dsp_function()
733 dsp_cmx_receive(dsp, skb); in dsp_function()
746 __func__, *digits, dsp->name); in dsp_function()
752 if (dsp->up) { in dsp_function()
753 if (dsp->up->send( in dsp_function()
754 dsp->up, nskb)) in dsp_function()
762 if (dsp->rx_disabled) { in dsp_function()
766 hh->prim = DL_DATA_IND; in dsp_function()
767 if (dsp->up) in dsp_function()
768 return dsp->up->send(dsp->up, skb); in dsp_function()
774 hh->id, skb->len, dsp->name); in dsp_function()
775 switch (hh->id) { in dsp_function()
777 if (!dsp->dtmf.hardware) { in dsp_function()
784 digits = dsp_dtmf_goertzel_decode(dsp, skb->data, in dsp_function()
785 skb->len, 2); in dsp_function()
792 __func__, *digits, dsp->name); in dsp_function()
798 if (dsp->up) { in dsp_function()
799 if (dsp->up->send( in dsp_function()
800 dsp->up, nskb)) in dsp_function()
809 if (skb->len != sizeof(int)) { in dsp_function()
810 ret = -EINVAL; in dsp_function()
814 dsp->tx_volume = *((int *)skb->data); in dsp_function()
817 "%d\n", __func__, dsp->tx_volume); in dsp_function()
818 dsp_cmx_hardware(dsp->conf, dsp); in dsp_function()
819 dsp_dtmf_hardware(dsp); in dsp_function()
820 dsp_rx_off(dsp); in dsp_function()
826 "%s\n", __func__, hh->id, dsp->name); in dsp_function()
827 ret = -EINVAL; in dsp_function()
834 __func__, dsp->name); in dsp_function()
837 dsp->b_active = 1; in dsp_function()
838 dsp->data_pending = 0; in dsp_function()
839 dsp->rx_init = 1; in dsp_function()
841 dsp->rx_W = 0; in dsp_function()
842 dsp->rx_R = 0; in dsp_function()
843 memset(dsp->rx_buff, 0, sizeof(dsp->rx_buff)); in dsp_function()
844 dsp_cmx_hardware(dsp->conf, dsp); in dsp_function()
845 dsp_dtmf_hardware(dsp); in dsp_function()
846 dsp_rx_off(dsp); in dsp_function()
851 dsp->name); in dsp_function()
853 hh->prim = DL_ESTABLISH_CNF; in dsp_function()
854 if (dsp->up) in dsp_function()
855 return dsp->up->send(dsp->up, skb); in dsp_function()
861 __func__, dsp->name); in dsp_function()
864 dsp->b_active = 0; in dsp_function()
865 dsp->data_pending = 0; in dsp_function()
866 dsp_cmx_hardware(dsp->conf, dsp); in dsp_function()
867 dsp_rx_off(dsp); in dsp_function()
869 hh->prim = DL_RELEASE_CNF; in dsp_function()
870 if (dsp->up) in dsp_function()
871 return dsp->up->send(dsp->up, skb); in dsp_function()
876 if (skb->len < 1) { in dsp_function()
877 ret = -EINVAL; in dsp_function()
880 if (dsp->hdlc) { in dsp_function()
882 if (!dsp->b_active) { in dsp_function()
883 ret = -EIO; in dsp_function()
886 hh->prim = PH_DATA_REQ; in dsp_function()
888 skb_queue_tail(&dsp->sendq, skb); in dsp_function()
889 schedule_work(&dsp->workq); in dsp_function()
893 /* send data to tx-buffer (if no tone is played) */ in dsp_function()
894 if (!dsp->tone.tone) { in dsp_function()
896 dsp_cmx_transmit(dsp, skb); in dsp_function()
902 ret = dsp_control_req(dsp, hh, skb); in dsp_function()
909 __func__, dsp->name); in dsp_function()
910 if (dsp->dtmf.hardware || dsp->dtmf.software) in dsp_function()
911 dsp_dtmf_goertzel_init(dsp); in dsp_function()
914 if (dsp->features_fill_empty) in dsp_function()
915 dsp_fill_empty(dsp); in dsp_function()
917 hh->prim = PH_ACTIVATE_REQ; in dsp_function()
918 if (ch->peer) in dsp_function()
919 return ch->recv(ch->peer, skb); in dsp_function()
925 __func__, dsp->name); in dsp_function()
927 dsp->tone.tone = 0; in dsp_function()
928 dsp->tone.hardware = 0; in dsp_function()
929 dsp->tone.software = 0; in dsp_function()
930 if (timer_pending(&dsp->tone.tl)) in dsp_function()
931 del_timer(&dsp->tone.tl); in dsp_function()
932 if (dsp->conf) in dsp_function()
933 dsp_cmx_conf(dsp, 0); /* dsp_cmx_hardware will also be in dsp_function()
935 skb_queue_purge(&dsp->sendq); in dsp_function()
937 hh->prim = PH_DEACTIVATE_REQ; in dsp_function()
938 if (ch->peer) in dsp_function()
939 return ch->recv(ch->peer, skb); in dsp_function()
944 __func__, hh->prim, dsp->name); in dsp_function()
945 ret = -EINVAL; in dsp_function()
955 struct dsp *dsp = container_of(ch, struct dsp, ch); in dsp_ctrl() local
965 if (dsp->ch.peer) in dsp_ctrl()
966 dsp->ch.peer->ctrl(dsp->ch.peer, CLOSE_CHANNEL, NULL); in dsp_ctrl()
969 * must lock here, or we may hit send-process currently in dsp_ctrl()
972 dsp->b_active = 0; in dsp_ctrl()
975 cancel_work_sync(&dsp->workq); in dsp_ctrl()
977 if (timer_pending(&dsp->tone.tl)) in dsp_ctrl()
978 del_timer(&dsp->tone.tl); in dsp_ctrl()
979 skb_queue_purge(&dsp->sendq); in dsp_ctrl()
982 __func__, dsp->name); in dsp_ctrl()
983 dsp->b_active = 0; in dsp_ctrl()
984 dsp_cmx_conf(dsp, 0); /* dsp_cmx_hardware will also be called in dsp_ctrl()
986 dsp_pipeline_destroy(&dsp->pipeline); in dsp_ctrl()
990 __func__, dsp->name); in dsp_ctrl()
991 list_del(&dsp->list); in dsp_ctrl()
995 printk(KERN_DEBUG "%s: dsp instance released\n", in dsp_ctrl()
997 vfree(dsp); in dsp_ctrl()
1007 struct dsp *dsp = container_of(work, struct dsp, workq); in dsp_send_bh() local
1011 if (dsp->hdlc && dsp->data_pending) in dsp_send_bh()
1015 while ((skb = skb_dequeue(&dsp->sendq))) { in dsp_send_bh()
1017 if (dsp->data_pending) { in dsp_send_bh()
1020 "no bug!\n", __func__, dsp->name); in dsp_send_bh()
1026 if (hh->prim == DL_DATA_REQ) { in dsp_send_bh()
1028 if (dsp->up) { in dsp_send_bh()
1029 if (dsp->up->send(dsp->up, skb)) in dsp_send_bh()
1035 if (dsp->ch.peer) { in dsp_send_bh()
1036 dsp->data_pending = 1; in dsp_send_bh()
1037 if (dsp->ch.recv(dsp->ch.peer, skb)) { in dsp_send_bh()
1039 dsp->data_pending = 0; in dsp_send_bh()
1050 struct dsp *ndsp; in dspcreate()
1053 if (crq->protocol != ISDN_P_B_L2DSP in dspcreate()
1054 && crq->protocol != ISDN_P_B_L2DSPHDLC) in dspcreate()
1055 return -EPROTONOSUPPORT; in dspcreate()
1056 ndsp = vzalloc(sizeof(struct dsp)); in dspcreate()
1058 printk(KERN_ERR "%s: vmalloc struct dsp failed\n", __func__); in dspcreate()
1059 return -ENOMEM; in dspcreate()
1062 printk(KERN_DEBUG "%s: creating new dsp instance\n", __func__); in dspcreate()
1065 INIT_WORK(&ndsp->workq, (void *)dsp_send_bh); in dspcreate()
1066 skb_queue_head_init(&ndsp->sendq); in dspcreate()
1067 ndsp->ch.send = dsp_function; in dspcreate()
1068 ndsp->ch.ctrl = dsp_ctrl; in dspcreate()
1069 ndsp->up = crq->ch; in dspcreate()
1070 crq->ch = &ndsp->ch; in dspcreate()
1071 if (crq->protocol == ISDN_P_B_L2DSP) { in dspcreate()
1072 crq->protocol = ISDN_P_B_RAW; in dspcreate()
1073 ndsp->hdlc = 0; in dspcreate()
1075 crq->protocol = ISDN_P_B_HDLC; in dspcreate()
1076 ndsp->hdlc = 1; in dspcreate()
1082 sprintf(ndsp->name, "DSP_C%x(0x%p)", in dspcreate()
1083 ndsp->up->st->dev->id + 1, ndsp); in dspcreate()
1085 ndsp->features.hfc_id = -1; /* current PCM id */ in dspcreate()
1086 ndsp->features.pcm_id = -1; /* current PCM id */ in dspcreate()
1087 ndsp->pcm_slot_rx = -1; /* current CPM slot */ in dspcreate()
1088 ndsp->pcm_slot_tx = -1; in dspcreate()
1089 ndsp->pcm_bank_rx = -1; in dspcreate()
1090 ndsp->pcm_bank_tx = -1; in dspcreate()
1091 ndsp->hfc_conf = -1; /* current conference number */ in dspcreate()
1092 /* set tone timer */ in dspcreate()
1093 timer_setup(&ndsp->tone.tl, dsp_tone_timeout, 0); in dspcreate()
1097 ndsp->dtmf.treshold = dtmfthreshold * 10000; in dspcreate()
1101 dsp_pipeline_init(&ndsp->pipeline); in dspcreate()
1102 list_add_tail(&ndsp->list, &dsp_ilist); in dspcreate()
1109 static struct Bprotocol DSP = { variable
1112 .name = "dsp",
1121 printk(KERN_INFO "DSP module %s\n", mISDN_dsp_revision); in dsp_init()
1132 err = -EINVAL; in dsp_init()
1138 err = -EINVAL; in dsp_init()
1146 err = -EINVAL; in dsp_init()
1164 "clock that equals exactly the duration of 8-256 " in dsp_init()
1167 err = -EINVAL; in dsp_init()
1170 printk(KERN_INFO "mISDN_dsp: DSP clocks every %d samples. This equals " in dsp_init()
1192 err = mISDN_register_Bprotocol(&DSP); in dsp_init()
1194 printk(KERN_ERR "Can't register %s error(%d)\n", DSP.name, err); in dsp_init()
1198 /* set sample timer */ in dsp_init()
1210 mISDN_unregister_Bprotocol(&DSP); in dsp_cleanup()
1215 printk(KERN_ERR "mISDN_dsp: Audio DSP object inst list not " in dsp_cleanup()