]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/staging/echo/echo.c
Staging: echo: fix kmalloc()/kfree() uses
[linux-2.6-omap-h63xx.git] / drivers / staging / echo / echo.c
index 4a281b14fc5840031cc7c8f936bd7acab88b021d..a2d307865eabec6e81032700237181f49fb95231 100644 (file)
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#define malloc(a) kmalloc((a), GFP_KERNEL)
-#define free(a) kfree(a)
 
 #include "bit_operations.h"
 #include "echo.h"
 /* adapting coeffs using the traditional stochastic descent (N)LMS algorithm */
 
 
-#ifdef __BLACKFIN_ASM__
-static void __inline__ lms_adapt_bg(echo_can_state_t *ec, int clean, int shift)
+#ifdef __bfin__
+static void __inline__ lms_adapt_bg(struct oslec_state *ec, int clean, int shift)
 {
     int i, j;
     int offset1;
@@ -200,7 +198,7 @@ static void __inline__ lms_adapt_bg(echo_can_state_t *ec, int clean, int shift)
 */
 
 #else
-static __inline__ void lms_adapt_bg(echo_can_state_t *ec, int clean, int shift)
+static __inline__ void lms_adapt_bg(struct oslec_state *ec, int clean, int shift)
 {
     int i;
 
@@ -234,31 +232,23 @@ static __inline__ void lms_adapt_bg(echo_can_state_t *ec, int clean, int shift)
 
 /*- End of function --------------------------------------------------------*/
 
-echo_can_state_t *echo_can_create(int len, int adaption_mode)
+struct oslec_state *oslec_create(int len, int adaption_mode)
 {
-    echo_can_state_t *ec;
+    struct oslec_state *ec;
     int i;
-    int j;
 
-    ec = kmalloc(sizeof(*ec), GFP_KERNEL);
-    if (ec == NULL)
-        return  NULL;
-    memset(ec, 0, sizeof(*ec));
+    ec = kzalloc(sizeof(*ec), GFP_KERNEL);
+    if (!ec)
+        return NULL;
 
     ec->taps = len;
     ec->log2taps = top_bit(len);
     ec->curr_pos = ec->taps - 1;
 
-    for (i = 0;  i < 2;  i++)
-    {
-        if ((ec->fir_taps16[i] = (int16_t *) malloc((ec->taps)*sizeof(int16_t))) == NULL)
-        {
-            for (j = 0;  j < i;  j++)
-                kfree(ec->fir_taps16[j]);
-            kfree(ec);
-            return  NULL;
-        }
-        memset(ec->fir_taps16[i], 0, (ec->taps)*sizeof(int16_t));
+    for (i = 0; i < 2; i++) {
+        ec->fir_taps16[i] = kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL);
+        if (!ec->fir_taps16[i])
+           goto error_oom;
     }
 
     fir16_create(&ec->fir_state,
@@ -273,10 +263,11 @@ echo_can_state_t *echo_can_create(int len, int adaption_mode)
     }
 
     ec->cng_level = 1000;
-    echo_can_adaption_mode(ec, adaption_mode);
+    oslec_adaption_mode(ec, adaption_mode);
 
-    ec->snapshot = (int16_t*)malloc(ec->taps*sizeof(int16_t));
-    memset(ec->snapshot, 0, sizeof(int16_t)*ec->taps);
+    ec->snapshot = kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL);
+    if (!ec->snapshot)
+        goto error_oom;
 
     ec->cond_met = 0;
     ec->Pstates = 0;
@@ -288,10 +279,18 @@ echo_can_state_t *echo_can_create(int len, int adaption_mode)
     ec->Lbgn_upper_acc = ec->Lbgn_upper << 13;
 
     return  ec;
+
+error_oom:
+    for (i = 0; i < 2; i++)
+        kfree(ec->fir_taps16[i]);
+
+    kfree(ec);
+    return NULL;
 }
+EXPORT_SYMBOL_GPL(oslec_create);
 /*- End of function --------------------------------------------------------*/
 
-void echo_can_free(echo_can_state_t *ec)
+void oslec_free(struct oslec_state *ec)
 {
        int i;
 
@@ -302,15 +301,17 @@ void echo_can_free(echo_can_state_t *ec)
        kfree(ec->snapshot);
        kfree(ec);
 }
+EXPORT_SYMBOL_GPL(oslec_free);
 /*- End of function --------------------------------------------------------*/
 
-void echo_can_adaption_mode(echo_can_state_t *ec, int adaption_mode)
+void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode)
 {
     ec->adaption_mode = adaption_mode;
 }
+EXPORT_SYMBOL_GPL(oslec_adaption_mode);
 /*- End of function --------------------------------------------------------*/
 
-void echo_can_flush(echo_can_state_t *ec)
+void oslec_flush(struct oslec_state *ec)
 {
     int i;
 
@@ -334,16 +335,18 @@ void echo_can_flush(echo_can_state_t *ec)
     ec->curr_pos = ec->taps - 1;
     ec->Pstates = 0;
 }
+EXPORT_SYMBOL_GPL(oslec_flush);
 /*- End of function --------------------------------------------------------*/
 
-void echo_can_snapshot(echo_can_state_t *ec) {
+void oslec_snapshot(struct oslec_state *ec) {
     memcpy(ec->snapshot, ec->fir_taps16[0], ec->taps*sizeof(int16_t));
 }
+EXPORT_SYMBOL_GPL(oslec_snapshot);
 /*- End of function --------------------------------------------------------*/
 
 /* Dual Path Echo Canceller ------------------------------------------------*/
 
-int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx)
+int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx)
 {
     int32_t echo_value;
     int clean_bg;
@@ -584,7 +587,7 @@ int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx)
 
     return (int16_t) ec->clean_nlp << 1;
 }
-
+EXPORT_SYMBOL_GPL(oslec_update);
 /*- End of function --------------------------------------------------------*/
 
 /* This function is seperated from the echo canceller is it is usually called
@@ -608,7 +611,7 @@ int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx)
    precision, which noise shapes things, giving very clean DC removal.
 */
 
-int16_t echo_can_hpf_tx(echo_can_state_t *ec, int16_t tx) {
+int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx) {
     int tmp, tmp1;
 
     if (ec->adaption_mode & ECHO_CAN_USE_TX_HPF) {
@@ -630,3 +633,9 @@ int16_t echo_can_hpf_tx(echo_can_state_t *ec, int16_t tx) {
 
     return tx;
 }
+EXPORT_SYMBOL_GPL(oslec_hpf_tx);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("David Rowe");
+MODULE_DESCRIPTION("Open Source Line Echo Canceller");
+MODULE_VERSION("0.3.0");