void alsa_cleanup() { dev_stop(); if (hparams != NULL) snd_pcm_hw_params_free(hparams); free_ringbuf(rbuf); rbuf = NULL; return; }
/* call when the device plug out. free all the memory alloced by probe */ static void spcp8x5_release(struct usb_serial *serial) { int i; struct spcp8x5_private *priv; for (i = 0; i < serial->num_ports; i++) { priv = usb_get_serial_port_data(serial->port[i]); if (priv) { free_ringbuf(priv->buf); kfree(priv); } } }
static void free_feed(FEED *feed) { if (feed == NULL) return; if (feed->thread_id != 0) pthread_cancel(feed->thread_id); free_ringbuf(feed->cbuf); feed->cbuf = NULL; if (feed->converter) { src_delete(feed->converter); free(feed->src_data_in); free(feed->src_data_out); feed->src_data_in = feed->src_data_out = NULL; } if (feed->sock) close(feed->sock); free(feed); }
/* desc : when device plug in,this function would be called. * thanks to usb_serial subsystem,then do almost every things for us. And what * we should do just alloc the buffer */ static int spcp8x5_startup(struct usb_serial *serial) { struct spcp8x5_private *priv; int i; enum spcp8x5_type type = SPCP825_007_TYPE; u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); if (product == 0x0201) type = SPCP825_007_TYPE; else if (product == 0x0231) type = SPCP835_TYPE; else if (product == 0x0235) type = SPCP825_008_TYPE; else if (product == 0x0204) type = SPCP825_INTERMATIC_TYPE; else if (product == 0x0471 && serial->dev->descriptor.idVendor == cpu_to_le16(0x081e)) type = SPCP825_PHILIP_TYPE; dev_dbg(&serial->dev->dev, "device type = %d\n", (int)type); for (i = 0; i < serial->num_ports; ++i) { priv = kzalloc(sizeof(struct spcp8x5_private), GFP_KERNEL); if (!priv) goto cleanup; spin_lock_init(&priv->lock); priv->buf = alloc_ringbuf(SPCP8x5_BUF_SIZE); if (priv->buf == NULL) goto cleanup2; init_waitqueue_head(&priv->delta_msr_wait); priv->type = type; usb_set_serial_port_data(serial->port[i] , priv); } return 0; cleanup2: kfree(priv); cleanup: for (--i; i >= 0; --i) { priv = usb_get_serial_port_data(serial->port[i]); free_ringbuf(priv->buf); kfree(priv); usb_set_serial_port_data(serial->port[i] , NULL); } return -ENOMEM; }