(IEC958_AES1_CON_PCM_CODER<<8)|\
                                         (IEC958_AES3_CON_FS_48000<<24))
 
+#define PCM_RUNTIME_CHECK(sub) snd_BUG_ON(!(sub) || !(sub)->runtime)
+
 #endif /* __SOUND_PCM_H */
 
        struct snd_ctl_file *ctl;
        struct snd_kctl_event *ev;
        
-       snd_assert(card != NULL && id != NULL, return);
+       if (snd_BUG_ON(!card || !id))
+               return;
        read_lock(&card->ctl_files_rwlock);
 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
        card->mixer_oss_change_count++;
        struct snd_kcontrol *kctl;
        unsigned int idx;
        
-       snd_assert(control != NULL, return NULL);
-       snd_assert(control->count > 0, return NULL);
+       if (snd_BUG_ON(!control || !control->count))
+               return NULL;
        kctl = kzalloc(sizeof(*kctl) + sizeof(struct snd_kcontrol_volatile) * control->count, GFP_KERNEL);
        if (kctl == NULL) {
                snd_printk(KERN_ERR "Cannot allocate control instance\n");
        struct snd_kcontrol kctl;
        unsigned int access;
        
-       snd_assert(ncontrol != NULL, return NULL);
-       snd_assert(ncontrol->info != NULL, return NULL);
+       if (snd_BUG_ON(!ncontrol || !ncontrol->info))
+               return NULL;
        memset(&kctl, 0, sizeof(kctl));
        kctl.id.iface = ncontrol->iface;
        kctl.id.device = ncontrol->device;
 
        if (! kcontrol)
                return err;
-       snd_assert(card != NULL, goto error);
-       snd_assert(kcontrol->info != NULL, goto error);
+       if (snd_BUG_ON(!card || !kcontrol->info))
+               goto error;
        id = kcontrol->id;
        down_write(&card->controls_rwsem);
        if (snd_ctl_find_id(card, &id)) {
        struct snd_ctl_elem_id id;
        unsigned int idx;
 
-       snd_assert(card != NULL && kcontrol != NULL, return -EINVAL);
+       if (snd_BUG_ON(!card || !kcontrol))
+               return -EINVAL;
        list_del(&kcontrol->list);
        card->controls_count -= kcontrol->count;
        id = kcontrol->id;
 {
        struct snd_kcontrol *kctl;
 
-       snd_assert(card != NULL && numid != 0, return NULL);
+       if (snd_BUG_ON(!card || !numid))
+               return NULL;
        list_for_each_entry(kctl, &card->controls, list) {
                if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
                        return kctl;
 {
        struct snd_kcontrol *kctl;
 
-       snd_assert(card != NULL && id != NULL, return NULL);
+       if (snd_BUG_ON(!card || !id))
+               return NULL;
        if (id->numid != 0)
                return snd_ctl_find_numid(card, id->numid);
        list_for_each_entry(kctl, &card->controls, list) {
 #endif
        result = kctl->info(kctl, info);
        if (result >= 0) {
-               snd_assert(info->access == 0, );
+               snd_BUG_ON(info->access);
                index_offset = snd_ctl_get_ioff(kctl, &info->id);
                vd = &kctl->vd[index_offset];
                snd_ctl_build_ioff(&info->id, kctl, index_offset);
 
        ctl = file->private_data;
        card = ctl->card;
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        switch (cmd) {
        case SNDRV_CTL_IOCTL_PVERSION:
                return put_user(SNDRV_CTL_VERSION, ip) ? -EFAULT : 0;
        ssize_t result = 0;
 
        ctl = file->private_data;
-       snd_assert(ctl != NULL && ctl->card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!ctl || !ctl->card))
+               return -ENXIO;
        if (!ctl->subscribed)
                return -EBADFD;
        if (count < sizeof(struct snd_ctl_event))
 {
        struct snd_kctl_ioctl *p;
 
-       snd_assert(fcn != NULL, return -EINVAL);
+       if (snd_BUG_ON(!fcn))
+               return -EINVAL;
        down_write(&snd_ioctl_rwsem);
        list_for_each_entry(p, lists, list) {
                if (p->fioctl == fcn) {
        int err, cardnum;
        char name[16];
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        cardnum = card->number;
-       snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
+       if (snd_BUG_ON(cardnum < 0 || cardnum >= SNDRV_CARDS))
+               return -ENXIO;
        sprintf(name, "controlC%i", cardnum);
        if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
                                       &snd_ctl_f_ops, card, name)) < 0)
        struct snd_ctl_file *ctl;
        int err, cardnum;
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        cardnum = card->number;
-       snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
+       if (snd_BUG_ON(cardnum < 0 || cardnum >= SNDRV_CARDS))
+               return -ENXIO;
 
        down_read(&card->controls_rwsem);
        list_for_each_entry(ctl, &card->ctl_files, list) {
                .dev_disconnect = snd_ctl_dev_disconnect,
        };
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
 }
 
 
        int err;
 
        ctl = file->private_data;
-       snd_assert(ctl && ctl->card, return -ENXIO);
+       if (snd_BUG_ON(!ctl || !ctl->card))
+               return -ENXIO;
 
        switch (cmd) {
        case SNDRV_CTL_IOCTL_PVERSION:
 
 {
        struct snd_device *dev;
 
-       snd_assert(card != NULL, return -ENXIO);
-       snd_assert(device_data != NULL, return -ENXIO);
-       snd_assert(ops != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card || !device_data || !ops))
+               return -ENXIO;
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (dev == NULL) {
                snd_printk(KERN_ERR "Cannot allocate device\n");
 {
        struct snd_device *dev;
        
-       snd_assert(card != NULL, return -ENXIO);
-       snd_assert(device_data != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card || !device_data))
+               return -ENXIO;
        list_for_each_entry(dev, &card->devices, list) {
                if (dev->device_data != device_data)
                        continue;
 {
        struct snd_device *dev;
 
-       snd_assert(card != NULL, return -ENXIO);
-       snd_assert(device_data != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card || !device_data))
+               return -ENXIO;
        list_for_each_entry(dev, &card->devices, list) {
                if (dev->device_data != device_data)
                        continue;
        struct snd_device *dev;
        int err;
 
-       snd_assert(card != NULL, return -ENXIO);
-       snd_assert(device_data != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card || !device_data))
+               return -ENXIO;
        list_for_each_entry(dev, &card->devices, list) {
                if (dev->device_data != device_data)
                        continue;
        struct snd_device *dev;
        int err;
        
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        list_for_each_entry(dev, &card->devices, list) {
                if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) {
                        if ((err = dev->ops->dev_register(dev)) < 0)
        struct snd_device *dev;
        int err = 0;
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        list_for_each_entry(dev, &card->devices, list) {
                if (snd_device_disconnect(card, dev->device_data) < 0)
                        err = -ENXIO;
        int err;
        unsigned int range_low, range_high;
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        range_low = cmd * SNDRV_DEV_TYPE_RANGE_SIZE;
        range_high = range_low + SNDRV_DEV_TYPE_RANGE_SIZE - 1;
       __again:
 
                .dev_disconnect = snd_hwdep_dev_disconnect,
        };
 
-       snd_assert(rhwdep != NULL, return -EINVAL);
-       *rhwdep = NULL;
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
+       if (rhwdep)
+               *rhwdep = NULL;
        hwdep = kzalloc(sizeof(*hwdep), GFP_KERNEL);
        if (hwdep == NULL) {
                snd_printk(KERN_ERR "hwdep: cannot allocate\n");
        }
        init_waitqueue_head(&hwdep->open_wait);
        mutex_init(&hwdep->open_mutex);
-       *rhwdep = hwdep;
+       if (rhwdep)
+               *rhwdep = hwdep;
        return 0;
 }
 
 static int snd_hwdep_free(struct snd_hwdep *hwdep)
 {
-       snd_assert(hwdep != NULL, return -ENXIO);
+       if (!hwdep)
+               return 0;
        if (hwdep->private_free)
                hwdep->private_free(hwdep);
        kfree(hwdep);
 {
        struct snd_hwdep *hwdep = device->device_data;
 
-       snd_assert(hwdep != NULL, return -ENXIO);
+       if (snd_BUG_ON(!hwdep))
+               return -ENXIO;
        mutex_lock(®ister_mutex);
        if (snd_hwdep_search(hwdep->card, hwdep->device) != hwdep) {
                mutex_unlock(®ister_mutex);
 
        loff_t pos;
 
        data = file->private_data;
-       snd_assert(data != NULL, return -ENXIO);
+       if (snd_BUG_ON(!data))
+               return -ENXIO;
        pos = *offset;
        if (pos < 0 || (long) pos != pos || (ssize_t) count < 0)
                return -EIO;
        loff_t pos;
 
        data = file->private_data;
-       snd_assert(data != NULL, return -ENXIO);
+       if (snd_BUG_ON(!data))
+               return -ENXIO;
        entry = data->entry;
        pos = *offset;
        if (pos < 0 || (long) pos != pos || (ssize_t) count < 0)
        char str[8];
        struct snd_info_entry *entry;
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
 
        sprintf(str, "card%i", card->number);
        if ((entry = snd_info_create_module_entry(card->module, str, NULL)) == NULL)
 {
        struct proc_dir_entry *p;
 
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
 
        if (!strcmp(card->id, card->proc_root->name))
                return 0;
  */
 void snd_info_card_disconnect(struct snd_card *card)
 {
-       snd_assert(card != NULL, return);
+       if (!card)
+               return;
        mutex_lock(&info_mutex);
        if (card->proc_root_link) {
                snd_remove_proc_entry(snd_proc_root, card->proc_root_link);
  */
 int snd_info_card_free(struct snd_card *card)
 {
-       snd_assert(card != NULL, return -ENXIO);
+       if (!card)
+               return 0;
        snd_info_free_entry(card->proc_root);
        card->proc_root = NULL;
        return 0;
                return;
        list_del_init(&entry->list);
        root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
-       snd_assert(root, return);
+       snd_BUG_ON(!root);
        snd_remove_proc_entry(root, entry->p);
        entry->p = NULL;
 }
 {
        struct proc_dir_entry *root, *p = NULL;
 
-       snd_assert(entry != NULL, return -ENXIO);
+       if (snd_BUG_ON(!entry))
+               return -ENXIO;
        root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
        mutex_lock(&info_mutex);
        p = snd_create_proc_entry(entry->name, entry->mode, root);
 
 {
        char *x;
 
-       snd_assert(dev >= 0 && dev < SNDRV_OSS_INFO_DEV_COUNT, return -ENXIO);
-       snd_assert(num >= 0 && num < SNDRV_CARDS, return -ENXIO);
+       if (snd_BUG_ON(dev < 0 || dev >= SNDRV_OSS_INFO_DEV_COUNT))
+               return -ENXIO;
+       if (snd_BUG_ON(num < 0 || num >= SNDRV_CARDS))
+               return -ENXIO;
        mutex_lock(&strings);
        if (string == NULL) {
                if ((x = snd_sndstat_strings[num][dev]) != NULL) {
 
 {
        int err;
 
-       snd_assert(card != NULL, return -EINVAL);
+       if (snd_BUG_ON(!card))
+               return -EINVAL;
 #ifndef CONFIG_SYSFS_DEPRECATED
        if (!card->card_dev) {
                card->card_dev = device_create_drvdata(sound_class, card->dev,
 
 /* id for pre-allocated buffers */
 #define SNDRV_DMA_DEVICE_UNUSED (unsigned int)-1
 
-#ifdef CONFIG_SND_DEBUG
-#define __ASTRING__(x) #x
-#define snd_assert(expr, args...) do {\
-       if (!(expr)) {\
-               printk(KERN_ERR "snd-malloc: BUG? (%s) (called from %p)\n", __ASTRING__(expr), __builtin_return_address(0));\
-               args;\
-       }\
-} while (0)
-#else
-#define snd_assert(expr, args...) /**/
-#endif
-
 /*
  *
  *  Generic memory allocators
        int pg;
        void *res;
 
-       snd_assert(size > 0, return NULL);
-       snd_assert(gfp_flags != 0, return NULL);
+       if (WARN_ON(!size))
+               return NULL;
+       if (WARN_ON(!gfp_flags))
+               return NULL;
        gfp_flags |= __GFP_COMP;        /* compound page lets parts be mapped */
        pg = get_order(size);
        if ((res = (void *) __get_free_pages(gfp_flags, pg)) != NULL)
        void *res;
        gfp_t gfp_flags;
 
-       snd_assert(size > 0, return NULL);
-       snd_assert(dma != NULL, return NULL);
+       if (WARN_ON(!dma))
+               return NULL;
        pg = get_order(size);
        gfp_flags = GFP_KERNEL
                | __GFP_COMP    /* compound page lets parts be mapped */
        int pg;
        void *res;
 
-       snd_assert(size > 0, return NULL);
-       snd_assert(dma_addr != NULL, return NULL);
+       if (WARN_ON(!dma_addr))
+               return NULL;
        pg = get_order(size);
        res = sbus_alloc_consistent(sdev, PAGE_SIZE * (1 << pg), dma_addr);
        if (res != NULL)
 int snd_dma_alloc_pages(int type, struct device *device, size_t size,
                        struct snd_dma_buffer *dmab)
 {
-       snd_assert(size > 0, return -ENXIO);
-       snd_assert(dmab != NULL, return -ENXIO);
+       if (WARN_ON(!size))
+               return -ENXIO;
+       if (WARN_ON(!dmab))
+               return -ENXIO;
 
        dmab->dev.type = type;
        dmab->dev.dev = device;
 {
        int err;
 
-       snd_assert(size > 0, return -ENXIO);
-       snd_assert(dmab != NULL, return -ENXIO);
-
        while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) {
                if (err != -ENOMEM)
                        return err;
 {
        struct snd_mem_list *mem;
 
-       snd_assert(dmab, return 0);
+       if (WARN_ON(!dmab))
+               return 0;
 
        mutex_lock(&list_mutex);
        list_for_each_entry(mem, &mem_list_head, list) {
 {
        struct snd_mem_list *mem;
 
-       snd_assert(dmab, return -EINVAL);
+       if (WARN_ON(!dmab))
+               return -EINVAL;
        mem = kmalloc(sizeof(*mem), GFP_KERNEL);
        if (! mem)
                return -ENOMEM;
 
        unsigned int channel;
        unsigned int nchannels;
 
-       snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin || !src_channels || !dst_channels))
+               return -ENXIO;
        if (frames == 0)
                return 0;
        nchannels = plugin->src_format.channels;
        for (channel = 0; channel < nchannels; channel++) {
-               snd_assert(src_channels->area.first % 8 == 0 &&
-                          src_channels->area.step % 8 == 0,
-                          return -ENXIO);
-               snd_assert(dst_channels->area.first % 8 == 0 &&
-                          dst_channels->area.step % 8 == 0,
-                          return -ENXIO);
+               if (snd_BUG_ON(src_channels->area.first % 8 ||
+                              src_channels->area.step % 8))
+                       return -ENXIO;
+               if (snd_BUG_ON(dst_channels->area.first % 8 ||
+                              dst_channels->area.step % 8))
+                       return -ENXIO;
                if (!src_channels->enabled) {
                        if (dst_channels->wanted)
                                snd_pcm_area_silence(&dst_channels->area, 0, frames, plugin->dst_format.format);
        struct snd_pcm_plugin *plugin;
        int width;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
 
-       snd_assert(src_format->format == dst_format->format, return -ENXIO);
-       snd_assert(src_format->rate == dst_format->rate, return -ENXIO);
-       snd_assert(src_format->channels == dst_format->channels, return -ENXIO);
+       if (snd_BUG_ON(src_format->format != dst_format->format))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->rate != dst_format->rate))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->channels != dst_format->channels))
+               return -ENXIO;
 
        width = snd_pcm_format_physical_width(src_format->format);
-       snd_assert(width > 0, return -ENXIO);
+       if (snd_BUG_ON(width <= 0))
+               return -ENXIO;
 
        err = snd_pcm_plugin_build(plug, "copy", src_format, dst_format,
                                   0, &plugin);
 
                                    struct snd_pcm_plugin_channel *dst_channels,
                                    snd_pcm_uframes_t frames)
 {
-       snd_assert(plugin != NULL, return -ENXIO);
-       snd_assert(src_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin))
+               return -ENXIO;
+       if (snd_BUG_ON(!src_channels))
+               return -ENXIO;
        if (plugin->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED) {
                return pcm_write(plugin->plug, src_channels->area.addr, frames);
        } else {
                int channel, channels = plugin->dst_format.channels;
                void **bufs = (void**)plugin->extra_data;
-               snd_assert(bufs != NULL, return -ENXIO);
+               if (snd_BUG_ON(!bufs))
+                       return -ENXIO;
                for (channel = 0; channel < channels; channel++) {
                        if (src_channels[channel].enabled)
                                bufs[channel] = src_channels[channel].area.addr;
                                   struct snd_pcm_plugin_channel *dst_channels,
                                   snd_pcm_uframes_t frames)
 {
-       snd_assert(plugin != NULL, return -ENXIO);
-       snd_assert(dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin))
+               return -ENXIO;
+       if (snd_BUG_ON(!dst_channels))
+               return -ENXIO;
        if (plugin->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED) {
                return pcm_read(plugin->plug, dst_channels->area.addr, frames);
        } else {
                int channel, channels = plugin->dst_format.channels;
                void **bufs = (void**)plugin->extra_data;
-               snd_assert(bufs != NULL, return -ENXIO);
+               if (snd_BUG_ON(!bufs))
+                       return -ENXIO;
                for (channel = 0; channel < channels; channel++) {
                        if (dst_channels[channel].enabled)
                                bufs[channel] = dst_channels[channel].area.addr;
        struct snd_pcm_plugin_format format;
        struct snd_pcm_plugin *plugin;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
-       snd_assert(plug != NULL && params != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plug || !params))
+               return -ENXIO;
        format.format = params_format(params);
        format.rate = params_rate(params);
        format.channels = params_channels(params);
 
 {
        struct linear_priv *data;
 
-       snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin || !src_channels || !dst_channels))
+               return -ENXIO;
        data = (struct linear_priv *)plugin->extra_data;
        if (frames == 0)
                return 0;
        {
                unsigned int channel;
                for (channel = 0; channel < plugin->src_format.channels; channel++) {
-                       snd_assert(src_channels[channel].area.first % 8 == 0 &&
-                                  src_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
-                       snd_assert(dst_channels[channel].area.first % 8 == 0 &&
-                                  dst_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
+                       if (snd_BUG_ON(src_channels[channel].area.first % 8 ||
+                                      src_channels[channel].area.step % 8))
+                               return -ENXIO;
+                       if (snd_BUG_ON(dst_channels[channel].area.first % 8 ||
+                                      dst_channels[channel].area.step % 8))
+                               return -ENXIO;
                }
        }
 #endif
        struct linear_priv *data;
        struct snd_pcm_plugin *plugin;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
 
-       snd_assert(src_format->rate == dst_format->rate, return -ENXIO);
-       snd_assert(src_format->channels == dst_format->channels, return -ENXIO);
-       snd_assert(snd_pcm_format_linear(src_format->format) &&
-                  snd_pcm_format_linear(dst_format->format), return -ENXIO);
+       if (snd_BUG_ON(src_format->rate != dst_format->rate))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->channels != dst_format->channels))
+               return -ENXIO;
+       if (snd_BUG_ON(!snd_pcm_format_linear(src_format->format) ||
+                      !snd_pcm_format_linear(dst_format->format)))
+               return -ENXIO;
 
        err = snd_pcm_plugin_build(plug, "linear format conversion",
                                   src_format, dst_format,
 
                result = pslot->get_volume(fmixer, pslot, &left, &right);
        if (!pslot->stereo)
                right = left;
-       snd_assert(left >= 0 && left <= 100, return -EIO);
-       snd_assert(right >= 0 && right <= 100, return -EIO);
+       if (snd_BUG_ON(left < 0 || left > 100))
+               return -EIO;
+       if (snd_BUG_ON(right < 0 || right > 100))
+               return -EIO;
        if (result >= 0) {
                pslot->volume[0] = left;
                pslot->volume[1] = right;
        int __user *p = argp;
        int tmp;
 
-       snd_assert(fmixer != NULL, return -ENXIO);
+       if (snd_BUG_ON(!fmixer))
+               return -ENXIO;
        if (((cmd >> 8) & 0xff) == 'M') {
                switch (cmd) {
                case SOUND_MIXER_INFO:
 {
        struct snd_mixer_oss_file fmixer;
        
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
        if (card->mixer_oss == NULL)
                return -ENXIO;
        memset(&fmixer, 0, sizeof(fmixer));
        struct snd_card *card;
        int idx;
  
-       snd_assert(mixer != NULL, return -ENXIO);
+       if (!mixer)
+               return 0;
        card = mixer->card;
-       snd_assert(mixer == card->mixer_oss, return -ENXIO);
+       if (snd_BUG_ON(mixer != card->mixer_oss))
+               return -ENXIO;
        card->mixer_oss = NULL;
        for (idx = 0; idx < SNDRV_OSS_MAX_MIXERS; idx++) {
                struct snd_mixer_oss_slot *chn = &mixer->slots[idx];
 
 {
        struct mulaw_priv *data;
 
-       snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin || !src_channels || !dst_channels))
+               return -ENXIO;
        if (frames == 0)
                return 0;
 #ifdef CONFIG_SND_DEBUG
        {
                unsigned int channel;
                for (channel = 0; channel < plugin->src_format.channels; channel++) {
-                       snd_assert(src_channels[channel].area.first % 8 == 0 &&
-                                  src_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
-                       snd_assert(dst_channels[channel].area.first % 8 == 0 &&
-                                  dst_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
+                       if (snd_BUG_ON(src_channels[channel].area.first % 8 ||
+                                      src_channels[channel].area.step % 8))
+                               return -ENXIO;
+                       if (snd_BUG_ON(dst_channels[channel].area.first % 8 ||
+                                      dst_channels[channel].area.step % 8))
+                               return -ENXIO;
                }
        }
 #endif
        struct snd_pcm_plugin_format *format;
        mulaw_f func;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
 
-       snd_assert(src_format->rate == dst_format->rate, return -ENXIO);
-       snd_assert(src_format->channels == dst_format->channels, return -ENXIO);
+       if (snd_BUG_ON(src_format->rate != dst_format->rate))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->channels != dst_format->channels))
+               return -ENXIO;
 
        if (dst_format->format == SNDRV_PCM_FORMAT_MU_LAW) {
                format = src_format;
                snd_BUG();
                return -EINVAL;
        }
-       snd_assert(snd_pcm_format_linear(format->format) != 0, return -ENXIO);
+       if (snd_BUG_ON(!snd_pcm_format_linear(format->format)))
+               return -ENXIO;
 
        err = snd_pcm_plugin_build(plug, "Mu-Law<->linear conversion",
                                   src_format, dst_format,
 
        } else {
                *params = *save;
                max = snd_pcm_hw_param_max(pcm, params, var, max, &maxdir);
-               snd_assert(max >= 0, return -EINVAL);
+               if (max < 0)
+                       return max;
                last = 1;
        }
  _end:
                v = snd_pcm_hw_param_last(pcm, params, var, dir);
        else
                v = snd_pcm_hw_param_first(pcm, params, var, dir);
-       snd_assert(v >= 0, return -EINVAL);
+       snd_BUG_ON(v < 0);
        return v;
 }
 
        while (oss_period_size * oss_periods > oss_buffer_size)
                oss_period_size /= 2;
 
-       snd_assert(oss_period_size >= 16, return -EINVAL);
+       if (oss_period_size < 16)
+               return -EINVAL;
        runtime->oss.period_bytes = oss_period_size;
        runtime->oss.period_frames = 1;
        runtime->oss.periods = oss_periods;
                }
        }
        err = _snd_pcm_hw_param_set(sparams, SNDRV_PCM_HW_PARAM_FORMAT, sformat, 0);
-       snd_assert(err >= 0, goto failure);
+       if (err < 0)
+               goto failure;
 
        if (direct) {
                memcpy(params, sparams, sizeof(*params));
 
        n = snd_pcm_plug_slave_size(substream, runtime->oss.period_bytes / oss_frame_size);
        err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, n, NULL);
-       snd_assert(err >= 0, goto failure);
+       if (err < 0)
+               goto failure;
 
        err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIODS,
                                     runtime->oss.periods, NULL);
-       snd_assert(err >= 0, goto failure);
+       if (err < 0)
+               goto failure;
 
        snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL);
 
 
        runtime->oss.periods = params_periods(sparams);
        oss_period_size = snd_pcm_plug_client_size(substream, params_period_size(sparams));
-       snd_assert(oss_period_size >= 0, err = -EINVAL; goto failure);
+       if (oss_period_size < 0) {
+               err = -EINVAL;
+               goto failure;
+       }
 #ifdef CONFIG_SND_PCM_OSS_PLUGINS
        if (runtime->oss.plugin_first) {
                err = snd_pcm_plug_alloc(substream, oss_period_size);
        oss_period_size *= oss_frame_size;
 
        oss_buffer_size = oss_period_size * runtime->oss.periods;
-       snd_assert(oss_buffer_size >= 0, err = -EINVAL; goto failure);
+       if (oss_buffer_size < 0) {
+               err = -EINVAL;
+               goto failure;
+       }
 
        runtime->oss.period_bytes = oss_period_size;
        runtime->oss.buffer_bytes = oss_buffer_size;
                                return err;
                }
        }
-       snd_assert(asubstream != NULL, return -EIO);
+       if (!asubstream)
+               return -EIO;
        if (r_substream)
                *r_substream = asubstream;
        return 0;
        err = snd_pcm_hw_refine(substream, params);
        format_mask = *hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); 
        kfree(params);
-       snd_assert(err >= 0, return err);
+       if (err < 0)
+               return err;
        for (fmt = 0; fmt < 32; ++fmt) {
                if (snd_mask_test(&format_mask, fmt)) {
                        int f = snd_pcm_oss_format_to(fmt);
 static int snd_pcm_oss_release_file(struct snd_pcm_oss_file *pcm_oss_file)
 {
        int cidx;
-       snd_assert(pcm_oss_file != NULL, return -ENXIO);
+       if (!pcm_oss_file)
+               return 0;
        for (cidx = 0; cidx < 2; ++cidx) {
                struct snd_pcm_substream *substream = pcm_oss_file->streams[cidx];
                if (substream)
        struct snd_pcm_substream *substream;
        unsigned int f_mode = file->f_mode;
 
-       snd_assert(rpcm_oss_file != NULL, return -EINVAL);
-       *rpcm_oss_file = NULL;
+       if (rpcm_oss_file)
+               *rpcm_oss_file = NULL;
 
        pcm_oss_file = kzalloc(sizeof(*pcm_oss_file), GFP_KERNEL);
        if (pcm_oss_file == NULL)
        }
 
        file->private_data = pcm_oss_file;
-       *rpcm_oss_file = pcm_oss_file;
+       if (rpcm_oss_file)
+               *rpcm_oss_file = pcm_oss_file;
        return 0;
 }
 
 {
        unsigned int idx;
 
-       snd_assert(task != NULL && name != NULL && size >= 2, return -EINVAL);
+       if (snd_BUG_ON(!task || !name || size < 2))
+               return -EINVAL;
        for (idx = 0; idx < sizeof(task->comm) && idx + 1 < size; idx++)
                name[idx] = task->comm[idx];
        name[idx] = '\0';
        substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
        if (substream == NULL)
                substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE];
-       snd_assert(substream != NULL, return -ENXIO);
+       if (snd_BUG_ON(!substream))
+               return -ENXIO;
        pcm = substream->pcm;
        if (!pcm->card->shutdown)
                snd_pcm_oss_sync(pcm_oss_file);
                        if (substream != NULL)
                                break;
                }
-               snd_assert(substream != NULL, return -ENXIO);
+               if (snd_BUG_ON(idx >= 2))
+                       return -ENXIO;
                return snd_mixer_oss_ioctl_card(substream->pcm->card, cmd, arg);
        }
 #endif
 
        if ((width = snd_pcm_format_physical_width(format->format)) < 0)
                return width;
        size = frames * format->channels * width;
-       snd_assert((size % 8) == 0, return -ENXIO);
+       if (snd_BUG_ON(size % 8))
+               return -ENXIO;
        size /= 8;
        if (plugin->buf_frames < frames) {
                vfree(plugin->buf);
                        c->area.step = format->channels * width;
                }
        } else if (plugin->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) {
-               snd_assert((size % format->channels) == 0,);
+               if (snd_BUG_ON(size % format->channels))
+                       return -EINVAL;
                size /= format->channels;
                for (channel = 0; channel < format->channels; channel++, c++) {
                        c->frames = frames;
 int snd_pcm_plug_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t frames)
 {
        int err;
-       snd_assert(snd_pcm_plug_first(plug) != NULL, return -ENXIO);
+       if (snd_BUG_ON(!snd_pcm_plug_first(plug)))
+               return -ENXIO;
        if (snd_pcm_plug_stream(plug) == SNDRV_PCM_STREAM_PLAYBACK) {
                struct snd_pcm_plugin *plugin = snd_pcm_plug_first(plug);
                while (plugin->next) {
                        if (plugin->dst_frames)
                                frames = plugin->dst_frames(plugin, frames);
-                       snd_assert(frames > 0, return -ENXIO);
+                       if (snd_BUG_ON(frames <= 0))
+                               return -ENXIO;
                        plugin = plugin->next;
                        err = snd_pcm_plugin_alloc(plugin, frames);
                        if (err < 0)
                while (plugin->prev) {
                        if (plugin->src_frames)
                                frames = plugin->src_frames(plugin, frames);
-                       snd_assert(frames > 0, return -ENXIO);
+                       if (snd_BUG_ON(frames <= 0))
+                               return -ENXIO;
                        plugin = plugin->prev;
                        err = snd_pcm_plugin_alloc(plugin, frames);
                        if (err < 0)
        struct snd_pcm_plugin *plugin;
        unsigned int channels;
        
-       snd_assert(plug != NULL, return -ENXIO);
-       snd_assert(src_format != NULL && dst_format != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plug))
+               return -ENXIO;
+       if (snd_BUG_ON(!src_format || !dst_format))
+               return -ENXIO;
        plugin = kzalloc(sizeof(*plugin) + extra, GFP_KERNEL);
        if (plugin == NULL)
                return -ENOMEM;
        plugin->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
        plugin->src_format = *src_format;
        plugin->src_width = snd_pcm_format_physical_width(src_format->format);
-       snd_assert(plugin->src_width > 0, );
+       snd_BUG_ON(plugin->src_width <= 0);
        plugin->dst_format = *dst_format;
        plugin->dst_width = snd_pcm_format_physical_width(dst_format->format);
-       snd_assert(plugin->dst_width > 0, );
+       snd_BUG_ON(plugin->dst_width <= 0);
        if (plugin->stream == SNDRV_PCM_STREAM_PLAYBACK)
                channels = src_format->channels;
        else
        struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next;
        int stream = snd_pcm_plug_stream(plug);
 
-       snd_assert(plug != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plug))
+               return -ENXIO;
        if (drv_frames == 0)
                return 0;
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
        snd_pcm_sframes_t frames;
        int stream = snd_pcm_plug_stream(plug);
        
-       snd_assert(plug != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plug))
+               return -ENXIO;
        if (clt_frames == 0)
                return 0;
        frames = clt_frames;
        int width, nchannels, channel;
        int stream = snd_pcm_plug_stream(plug);
 
-       snd_assert(buf != NULL, return -ENXIO);
+       if (snd_BUG_ON(!buf))
+               return -ENXIO;
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
                plugin = snd_pcm_plug_first(plug);
                format = &plugin->src_format;
        if ((width = snd_pcm_format_physical_width(format->format)) < 0)
                return width;
        nchannels = format->channels;
-       snd_assert(plugin->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || format->channels <= 1, return -ENXIO);
+       if (snd_BUG_ON(plugin->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
+                      format->channels > 1))
+               return -ENXIO;
        for (channel = 0; channel < nchannels; channel++, v++) {
                v->frames = count;
                v->enabled = 1;
 
        struct rate_priv *data;
        snd_pcm_sframes_t res;
 
-       snd_assert(plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin))
+               return -ENXIO;
        if (frames == 0)
                return 0;
        data = (struct rate_priv *)plugin->extra_data;
        struct rate_priv *data;
        snd_pcm_sframes_t res;
 
-       snd_assert(plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin))
+               return -ENXIO;
        if (frames == 0)
                return 0;
        data = (struct rate_priv *)plugin->extra_data;
        snd_pcm_uframes_t dst_frames;
        struct rate_priv *data;
 
-       snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin || !src_channels || !dst_channels))
+               return -ENXIO;
        if (frames == 0)
                return 0;
 #ifdef CONFIG_SND_DEBUG
        {
                unsigned int channel;
                for (channel = 0; channel < plugin->src_format.channels; channel++) {
-                       snd_assert(src_channels[channel].area.first % 8 == 0 &&
-                                  src_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
-                       snd_assert(dst_channels[channel].area.first % 8 == 0 &&
-                                  dst_channels[channel].area.step % 8 == 0,
-                                  return -ENXIO);
+                       if (snd_BUG_ON(src_channels[channel].area.first % 8 ||
+                                      src_channels[channel].area.step % 8))
+                               return -ENXIO;
+                       if (snd_BUG_ON(dst_channels[channel].area.first % 8 ||
+                                      dst_channels[channel].area.step % 8))
+                               return -ENXIO;
                }
        }
 #endif
                       enum snd_pcm_plugin_action action,
                       unsigned long udata)
 {
-       snd_assert(plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin))
+               return -ENXIO;
        switch (action) {
        case INIT:
        case PREPARE:
        struct rate_priv *data;
        struct snd_pcm_plugin *plugin;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
 
-       snd_assert(src_format->channels == dst_format->channels, return -ENXIO);
-       snd_assert(src_format->channels > 0, return -ENXIO);
-       snd_assert(src_format->format == SNDRV_PCM_FORMAT_S16, return -ENXIO);
-       snd_assert(dst_format->format == SNDRV_PCM_FORMAT_S16, return -ENXIO);
-       snd_assert(src_format->rate != dst_format->rate, return -ENXIO);
+       if (snd_BUG_ON(src_format->channels != dst_format->channels))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->channels <= 0))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->format != SNDRV_PCM_FORMAT_S16))
+               return -ENXIO;
+       if (snd_BUG_ON(dst_format->format != SNDRV_PCM_FORMAT_S16))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->rate == dst_format->rate))
+               return -ENXIO;
 
        err = snd_pcm_plugin_build(plug, "rate conversion",
                                   src_format, dst_format,
 
        struct snd_pcm_plugin_channel *dvp;
        int format;
 
-       snd_assert(plugin != NULL && src_channels != NULL && dst_channels != NULL, return -ENXIO);
+       if (snd_BUG_ON(!plugin || !src_channels || !dst_channels))
+               return -ENXIO;
        if (frames == 0)
                return 0;
 
        struct snd_pcm_plugin *plugin;
        int err;
 
-       snd_assert(r_plugin != NULL, return -ENXIO);
+       if (snd_BUG_ON(!r_plugin))
+               return -ENXIO;
        *r_plugin = NULL;
-       snd_assert(src_format->rate == dst_format->rate, return -ENXIO);
-       snd_assert(src_format->format == dst_format->format, return -ENXIO);
+       if (snd_BUG_ON(src_format->rate != dst_format->rate))
+               return -ENXIO;
+       if (snd_BUG_ON(src_format->format != dst_format->format))
+               return -ENXIO;
 
        err = snd_pcm_plugin_build(plug, "route conversion",
                                   src_format, dst_format, 0, &plugin);
 
 
 static const char *snd_pcm_stream_name(int stream)
 {
-       snd_assert(stream <= SNDRV_PCM_STREAM_LAST, return NULL);
        return snd_pcm_stream_names[stream];
 }
 
 
 static const char *snd_pcm_tstamp_mode_name(int mode)
 {
-       snd_assert(mode <= SNDRV_PCM_TSTAMP_LAST, return NULL);
        return snd_pcm_tstamp_mode_names[mode];
 }
 
                .dev_disconnect = snd_pcm_dev_disconnect,
        };
 
-       snd_assert(rpcm != NULL, return -EINVAL);
-       *rpcm = NULL;
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
+       if (rpcm)
+               *rpcm = NULL;
        pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
        if (pcm == NULL) {
                snd_printk(KERN_ERR "Cannot allocate PCM\n");
                snd_pcm_free(pcm);
                return err;
        }
-       *rpcm = pcm;
+       if (rpcm)
+               *rpcm = pcm;
        return 0;
 }
 
 {
        struct snd_pcm_notify *notify;
 
-       snd_assert(pcm != NULL, return -ENXIO);
+       if (!pcm)
+               return 0;
        list_for_each_entry(notify, &snd_pcm_notify_list, list) {
                notify->n_unregister(pcm);
        }
        int prefer_subdevice = -1;
        size_t size;
 
-       snd_assert(rsubstream != NULL, return -EINVAL);
+       if (snd_BUG_ON(!pcm || !rsubstream))
+               return -ENXIO;
        *rsubstream = NULL;
-       snd_assert(pcm != NULL, return -ENXIO);
        pstr = &pcm->streams[stream];
        if (pstr->substream == NULL || pstr->substream_count == 0)
                return -ENODEV;
 {
        struct snd_pcm_runtime *runtime;
 
+       if (PCM_RUNTIME_CHECK(substream))
+               return;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return);
        if (runtime->private_free != NULL)
                runtime->private_free(runtime);
        snd_free_pages((void*)runtime->status,
        struct snd_pcm *pcm = device->device_data;
        struct device *dev;
 
-       snd_assert(pcm != NULL && device != NULL, return -ENXIO);
+       if (snd_BUG_ON(!pcm || !device))
+               return -ENXIO;
        mutex_lock(®ister_mutex);
        err = snd_pcm_add(pcm);
        if (err) {
 {
        struct snd_pcm *pcm;
 
-       snd_assert(notify != NULL &&
-                  notify->n_register != NULL &&
-                  notify->n_unregister != NULL &&
-                  notify->n_disconnect, return -EINVAL);
+       if (snd_BUG_ON(!notify ||
+                      !notify->n_register ||
+                      !notify->n_unregister ||
+                      !notify->n_disconnect))
+               return -EINVAL;
        mutex_lock(®ister_mutex);
        if (nfree) {
                list_del(¬ify->list);
 
        snd_pcm_uframes_t boundary;
        int err;
 
-       snd_assert(runtime, return -EINVAL);
+       if (snd_BUG_ON(!runtime))
+               return -EINVAL;
 
        if (get_user(sflags, &src->flags) ||
            get_user(scontrol.appl_ptr, &src->c.control.appl_ptr) ||
 
                }
                frames = runtime->buffer_size - runtime->silence_filled;
        }
-       snd_assert(frames <= runtime->buffer_size, return);
+       if (snd_BUG_ON(frames > runtime->buffer_size))
+               return;
        if (frames == 0)
                return;
        ofs = runtime->silence_start % runtime->buffer_size;
                        if (substream->ops->silence) {
                                int err;
                                err = substream->ops->silence(substream, -1, ofs, transfer);
-                               snd_assert(err >= 0, );
+                               snd_BUG_ON(err < 0);
                        } else {
                                char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, ofs);
                                snd_pcm_format_set_silence(runtime->format, hwbuf, transfer * runtime->channels);
                                for (c = 0; c < channels; ++c) {
                                        int err;
                                        err = substream->ops->silence(substream, c, ofs, transfer);
-                                       snd_assert(err >= 0, );
+                                       snd_BUG_ON(err < 0);
                                }
                        } else {
                                size_t dma_csize = runtime->dma_bytes / channels;
 {
        u_int64_t n = (u_int64_t) a * b;
        if (c == 0) {
-               snd_assert(n > 0, );
+               snd_BUG_ON(!n);
                *r = 0;
                return UINT_MAX;
        }
 int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v)
 {
        int changed = 0;
-       snd_assert(!snd_interval_empty(i), return -EINVAL);
+       if (snd_BUG_ON(snd_interval_empty(i)))
+               return -EINVAL;
        if (i->min < v->min) {
                i->min = v->min;
                i->openmin = v->openmin;
 
 static int snd_interval_refine_first(struct snd_interval *i)
 {
-       snd_assert(!snd_interval_empty(i), return -EINVAL);
+       if (snd_BUG_ON(snd_interval_empty(i)))
+               return -EINVAL;
        if (snd_interval_single(i))
                return 0;
        i->max = i->min;
 
 static int snd_interval_refine_last(struct snd_interval *i)
 {
-       snd_assert(!snd_interval_empty(i), return -EINVAL);
+       if (snd_BUG_ON(snd_interval_empty(i)))
+               return -EINVAL;
        if (snd_interval_single(i))
                return 0;
        i->min = i->max;
        c->private = private;
        k = 0;
        while (1) {
-               snd_assert(k < ARRAY_SIZE(c->deps), return -EINVAL);
+               if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps)))
+                       return -EINVAL;
                c->deps[k++] = dep;
                if (dep < 0)
                        break;
                return changed;
        if (params->rmask) {
                int err = snd_pcm_hw_refine(pcm, params);
-               snd_assert(err >= 0, return err);
+               if (snd_BUG_ON(err < 0))
+                       return err;
        }
        return snd_pcm_hw_param_value(params, var, dir);
 }
                return changed;
        if (params->rmask) {
                int err = snd_pcm_hw_refine(pcm, params);
-               snd_assert(err >= 0, return err);
+               if (snd_BUG_ON(err < 0))
+                       return err;
        }
        return snd_pcm_hw_param_value(params, var, dir);
 }
                        err = snd_pcm_hw_param_first(pcm, params, *v, NULL);
                else
                        err = snd_pcm_hw_param_last(pcm, params, *v, NULL);
-               snd_assert(err >= 0, return err);
+               if (snd_BUG_ON(err < 0))
+                       return err;
        }
        return 0;
 }
        struct snd_pcm_runtime *runtime;
        unsigned long flags;
 
-       snd_assert(substream != NULL, return);
+       if (PCM_RUNTIME_CHECK(substream))
+               return;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return);
 
        if (runtime->transfer_ack_begin)
                runtime->transfer_ack_begin(substream);
                        return err;
        } else {
                char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
-               snd_assert(runtime->dma_area, return -EFAULT);
                if (copy_from_user(hwbuf, buf, frames_to_bytes(runtime, frames)))
                        return -EFAULT;
        }
                cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
                if (frames > cont)
                        frames = cont;
-               snd_assert(frames != 0, snd_pcm_stream_unlock_irq(substream); return -EINVAL);
+               if (snd_BUG_ON(!frames)) {
+                       snd_pcm_stream_unlock_irq(substream);
+                       return -EINVAL;
+               }
                appl_ptr = runtime->control->appl_ptr;
                appl_ofs = appl_ptr % runtime->buffer_size;
                snd_pcm_stream_unlock_irq(substream);
        return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
 }
 
-snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const void __user *buf, snd_pcm_uframes_t size)
+/* sanity-check for read/write methods */
+static int pcm_sanity_check(struct snd_pcm_substream *substream)
 {
        struct snd_pcm_runtime *runtime;
-       int nonblock;
-
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
-       snd_assert(substream->ops->copy != NULL || runtime->dma_area != NULL, return -EINVAL);
+       if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area))
+               return -EINVAL;
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
+       return 0;
+}
+
+snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const void __user *buf, snd_pcm_uframes_t size)
+{
+       struct snd_pcm_runtime *runtime;
+       int nonblock;
+       int err;
 
+       err = pcm_sanity_check(substream);
+       if (err < 0)
+               return err;
+       runtime = substream->runtime;
        nonblock = !!(substream->f_flags & O_NONBLOCK);
 
        if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
        int channels = runtime->channels;
        int c;
        if (substream->ops->copy) {
-               snd_assert(substream->ops->silence != NULL, return -EINVAL);
+               if (snd_BUG_ON(!substream->ops->silence))
+                       return -EINVAL;
                for (c = 0; c < channels; ++c, ++bufs) {
                        if (*bufs == NULL) {
                                if ((err = substream->ops->silence(substream, c, hwoff, frames)) < 0)
        } else {
                /* default transfer behaviour */
                size_t dma_csize = runtime->dma_bytes / channels;
-               snd_assert(runtime->dma_area, return -EFAULT);
                for (c = 0; c < channels; ++c, ++bufs) {
                        char *hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, hwoff);
                        if (*bufs == NULL) {
 {
        struct snd_pcm_runtime *runtime;
        int nonblock;
+       int err;
 
-       snd_assert(substream != NULL, return -ENXIO);
+       err = pcm_sanity_check(substream);
+       if (err < 0)
+               return err;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
-       snd_assert(substream->ops->copy != NULL || runtime->dma_area != NULL, return -EINVAL);
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
-               return -EBADFD;
-
        nonblock = !!(substream->f_flags & O_NONBLOCK);
 
        if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
                        return err;
        } else {
                char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
-               snd_assert(runtime->dma_area, return -EFAULT);
                if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)))
                        return -EFAULT;
        }
                cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
                if (frames > cont)
                        frames = cont;
-               snd_assert(frames != 0, snd_pcm_stream_unlock_irq(substream); return -EINVAL);
+               if (snd_BUG_ON(!frames)) {
+                       snd_pcm_stream_unlock_irq(substream);
+                       return -EINVAL;
+               }
                appl_ptr = runtime->control->appl_ptr;
                appl_ofs = appl_ptr % runtime->buffer_size;
                snd_pcm_stream_unlock_irq(substream);
 {
        struct snd_pcm_runtime *runtime;
        int nonblock;
+       int err;
        
-       snd_assert(substream != NULL, return -ENXIO);
+       err = pcm_sanity_check(substream);
+       if (err < 0)
+               return err;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
-       snd_assert(substream->ops->copy != NULL || runtime->dma_area != NULL, return -EINVAL);
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
-               return -EBADFD;
-
        nonblock = !!(substream->f_flags & O_NONBLOCK);
        if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED)
                return -EINVAL;
                }
        } else {
                snd_pcm_uframes_t dma_csize = runtime->dma_bytes / channels;
-               snd_assert(runtime->dma_area, return -EFAULT);
                for (c = 0; c < channels; ++c, ++bufs) {
                        char *hwbuf;
                        char __user *buf;
 {
        struct snd_pcm_runtime *runtime;
        int nonblock;
+       int err;
 
-       snd_assert(substream != NULL, return -ENXIO);
+       err = pcm_sanity_check(substream);
+       if (err < 0)
+               return err;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
-       snd_assert(substream->ops->copy != NULL || runtime->dma_area != NULL, return -EINVAL);
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
 
 
        struct snd_dma_buffer *dmab = &substream->dma_buffer;
        int err;
 
-       snd_assert(size > 0, return -EINVAL);
-
        /* already reserved? */
        if (snd_dma_get_reserved_buf(dmab, substream->dma_buf_id) > 0) {
                if (dmab->bytes >= size)
        struct snd_pcm_runtime *runtime;
        struct snd_dma_buffer *dmab = NULL;
 
-       snd_assert(substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_UNKNOWN, return -EINVAL);
-       snd_assert(substream != NULL, return -EINVAL);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -EINVAL;
+       if (snd_BUG_ON(substream->dma_buffer.dev.type ==
+                      SNDRV_DMA_TYPE_UNKNOWN))
+               return -EINVAL;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -EINVAL);
 
        if (runtime->dma_buffer_p) {
                /* perphaps, we might free the large DMA memory region
 {
        struct snd_pcm_runtime *runtime;
 
-       snd_assert(substream != NULL, return -EINVAL);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -EINVAL;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -EINVAL);
        if (runtime->dma_area == NULL)
                return 0;
        if (runtime->dma_buffer_p != &substream->dma_buffer) {
 
        struct snd_pcm *pcm = substream->pcm;
        struct snd_pcm_str *pstr = substream->pstr;
 
-       snd_assert(substream != NULL, return -ENXIO);
        memset(info, 0, sizeof(*info));
        info->card = pcm->card->number;
        info->device = pcm->device;
        unsigned int bits;
        snd_pcm_uframes_t frames;
 
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
        snd_pcm_stream_lock_irq(substream);
        switch (runtime->status->state) {
        case SNDRV_PCM_STATE_OPEN:
        struct snd_pcm_runtime *runtime;
        int result = 0;
 
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
        snd_pcm_stream_lock_irq(substream);
        switch (runtime->status->state) {
        case SNDRV_PCM_STATE_SETUP:
 {
        struct snd_pcm_runtime *runtime;
 
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -ENXIO);
        snd_pcm_stream_lock_irq(substream);
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
                snd_pcm_stream_unlock_irq(substream);
                               struct snd_pcm_status __user * _status)
 {
        struct snd_pcm_status status;
-       struct snd_pcm_runtime *runtime;
        int res;
        
-       snd_assert(substream != NULL, return -ENXIO);
-       runtime = substream->runtime;
        memset(&status, 0, sizeof(status));
        res = snd_pcm_status(substream, &status);
        if (res < 0)
        struct snd_pcm_runtime *runtime;
        unsigned int channel;
        
-       snd_assert(substream != NULL, return -ENXIO);
        channel = info->channel;
        runtime = substream->runtime;
        snd_pcm_stream_lock_irq(substream);
        int err = substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_RESET, NULL);
        if (err < 0)
                return err;
-       // snd_assert(runtime->status->hw_ptr < runtime->buffer_size, );
        runtime->hw_ptr_base = 0;
        runtime->hw_ptr_interrupt = runtime->status->hw_ptr -
                runtime->status->hw_ptr % runtime->period_size;
        int i, num_drecs;
        struct drain_rec *drec, drec_tmp, *d;
 
-       snd_assert(substream != NULL, return -ENXIO);
        card = substream->pcm->card;
        runtime = substream->runtime;
 
        struct snd_card *card;
        int result = 0;
        
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
        card = substream->pcm->card;
 
                        mask |= 1 << SNDRV_PCM_ACCESS_MMAP_COMPLEX;
        }
        err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_ACCESS, mask);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT, hw->formats);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_constraint_mask(runtime, SNDRV_PCM_HW_PARAM_SUBFORMAT, 1 << SNDRV_PCM_SUBFORMAT_STD);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS,
                                           hw->channels_min, hw->channels_max);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE,
                                           hw->rate_min, hw->rate_max);
-       snd_assert(err >= 0, return -EINVAL);
+        if (err < 0)
+                return err;
 
        err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
                                           hw->period_bytes_min, hw->period_bytes_max);
-       snd_assert(err >= 0, return -EINVAL);
+        if (err < 0)
+                return err;
 
        err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIODS,
                                           hw->periods_min, hw->periods_max);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
                                           hw->period_bytes_min, hw->buffer_bytes_max);
-       snd_assert(err >= 0, return -EINVAL);
+       if (err < 0)
+               return err;
 
        err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 
                                  snd_pcm_hw_rule_buffer_bytes_max, substream,
        /* FIXME: remove */
        if (runtime->dma_bytes) {
                err = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, runtime->dma_bytes);
-               snd_assert(err >= 0, return -EINVAL);
+               if (err < 0)
+                       return -EINVAL;
        }
 
        if (!(hw->rates & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))) {
        struct snd_pcm_str *str;
        int err;
 
-       snd_assert(rpcm_file != NULL, return -EINVAL);
-       *rpcm_file = NULL;
+       if (rpcm_file)
+               *rpcm_file = NULL;
 
        err = snd_pcm_open_substream(pcm, stream, file, &substream);
        if (err < 0)
                substream->pcm_release = pcm_release_private;
        }
        file->private_data = pcm_file;
-       *rpcm_file = pcm_file;
+       if (rpcm_file)
+               *rpcm_file = pcm_file;
        return 0;
 }
 
 
        pcm_file = file->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (snd_BUG_ON(!substream))
+               return -ENXIO;
        pcm = substream->pcm;
        fasync_helper(-1, file, 0, &substream->runtime->fasync);
        mutex_lock(&pcm->open_mutex);
                                 struct snd_pcm_substream *substream,
                                 unsigned int cmd, void __user *arg)
 {
-       snd_assert(substream != NULL, return -ENXIO);
-
        switch (cmd) {
        case SNDRV_PCM_IOCTL_PVERSION:
                return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0;
                                   struct snd_pcm_substream *substream,
                                   unsigned int cmd, void __user *arg)
 {
-       snd_assert(substream != NULL, return -ENXIO);
-       snd_assert(substream->stream == SNDRV_PCM_STREAM_PLAYBACK, return -EINVAL);
+       if (snd_BUG_ON(!substream))
+               return -ENXIO;
+       if (snd_BUG_ON(substream->stream != SNDRV_PCM_STREAM_PLAYBACK))
+               return -EINVAL;
        switch (cmd) {
        case SNDRV_PCM_IOCTL_WRITEI_FRAMES:
        {
                                  struct snd_pcm_substream *substream,
                                  unsigned int cmd, void __user *arg)
 {
-       snd_assert(substream != NULL, return -ENXIO);
-       snd_assert(substream->stream == SNDRV_PCM_STREAM_CAPTURE, return -EINVAL);
+       if (snd_BUG_ON(!substream))
+               return -ENXIO;
+       if (snd_BUG_ON(substream->stream != SNDRV_PCM_STREAM_CAPTURE))
+               return -EINVAL;
        switch (cmd) {
        case SNDRV_PCM_IOCTL_READI_FRAMES:
        {
 
        pcm_file = file->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
 
        pcm_file = file->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, result = -ENXIO; goto end);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
-               result = -EBADFD;
-               goto end;
-       }
-       if (!frame_aligned(runtime, count)) {
-               result = -EINVAL;
-               goto end;
-       }
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+               return -EBADFD;
+       if (!frame_aligned(runtime, count))
+               return -EINVAL;
        count = bytes_to_frames(runtime, count);
        result = snd_pcm_lib_write(substream, buf, count);
        if (result > 0)
                result = frames_to_bytes(runtime, result);
- end:
        return result;
 }
 
 
        pcm_file = iocb->ki_filp->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
 
        pcm_file = iocb->ki_filp->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, result = -ENXIO; goto end);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
-               result = -EBADFD;
-               goto end;
-       }
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+               return -EBADFD;
        if (nr_segs > 128 || nr_segs != runtime->channels ||
-           !frame_aligned(runtime, iov->iov_len)) {
-               result = -EINVAL;
-               goto end;
-       }
+           !frame_aligned(runtime, iov->iov_len))
+               return -EINVAL;
        frames = bytes_to_samples(runtime, iov->iov_len);
        bufs = kmalloc(sizeof(void *) * nr_segs, GFP_KERNEL);
        if (bufs == NULL)
        if (result > 0)
                result = frames_to_bytes(runtime, result);
        kfree(bufs);
- end:
        return result;
 }
 
        pcm_file = file->private_data;
 
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
 
        poll_wait(file, &runtime->sleep, wait);
        pcm_file = file->private_data;
 
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
        runtime = substream->runtime;
 
        poll_wait(file, &runtime->sleep, wait);
        if (!(area->vm_flags & VM_READ))
                return -EINVAL;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -EAGAIN);
        size = area->vm_end - area->vm_start;
        if (size != PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)))
                return -EINVAL;
        if (!(area->vm_flags & VM_READ))
                return -EINVAL;
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -EAGAIN);
        size = area->vm_end - area->vm_start;
        if (size != PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control)))
                return -EINVAL;
                        return -EINVAL;
        }
        runtime = substream->runtime;
-       snd_assert(runtime != NULL, return -EAGAIN);
        if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
        if (!(runtime->info & SNDRV_PCM_INFO_MMAP))
        
        pcm_file = file->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, return -ENXIO);
+       if (PCM_RUNTIME_CHECK(substream))
+               return -ENXIO;
 
        offset = area->vm_pgoff << PAGE_SHIFT;
        switch (offset) {
        lock_kernel();
        pcm_file = file->private_data;
        substream = pcm_file->substream;
-       snd_assert(substream != NULL, goto out);
+       if (PCM_RUNTIME_CHECK(substream))
+               goto out;
        runtime = substream->runtime;
-
        err = fasync_helper(fd, file, on, &runtime->fasync);
 out:
        unlock_kernel();
 
        
         mult = 1000000000;
        rate = runtime->rate;
-       snd_assert(rate != 0, return);
+       if (snd_BUG_ON(!rate))
+               return;
        l = gcd(mult, rate);
        mult /= l;
        rate /= l;
        fsize = runtime->period_size;
-       snd_assert(fsize != 0, return);
+       if (snd_BUG_ON(!fsize))
+               return;
        l = gcd(rate, fsize);
        rate /= l;
        fsize /= l;
 
        struct snd_rawmidi_substream *substream;
        struct snd_rawmidi_runtime *runtime;
 
-       snd_assert(rfile != NULL, return -ENXIO);
-       snd_assert(rfile->input != NULL || rfile->output != NULL, return -ENXIO);
+       if (snd_BUG_ON(!rfile))
+               return -ENXIO;
        rmidi = rfile->rmidi;
        mutex_lock(&rmidi->open_mutex);
        if (rfile->input != NULL) {
                return -EINVAL;
        }
        spin_lock_irqsave(&runtime->lock, flags);
-       snd_assert(runtime->avail + count <= runtime->buffer_size, );
+       snd_BUG_ON(runtime->avail + count > runtime->buffer_size);
        runtime->hw_ptr += count;
        runtime->hw_ptr %= runtime->buffer_size;
        runtime->avail += count;
        long count1, result;
        struct snd_rawmidi_runtime *runtime = substream->runtime;
 
-       snd_assert(kernelbuf != NULL || userbuf != NULL, return -EINVAL);
-       snd_assert(runtime->buffer != NULL, return -EINVAL);
+       if (snd_BUG_ON(!kernelbuf && !userbuf))
+               return -EINVAL;
+       if (snd_BUG_ON(!runtime->buffer))
+               return -EINVAL;
 
        result = 0;
        spin_lock_irqsave(&runtime->lock, flags);
                .dev_disconnect = snd_rawmidi_dev_disconnect,
        };
 
-       snd_assert(rrawmidi != NULL, return -EINVAL);
-       *rrawmidi = NULL;
-       snd_assert(card != NULL, return -ENXIO);
+       if (snd_BUG_ON(!card))
+               return -ENXIO;
+       if (rrawmidi)
+               *rrawmidi = NULL;
        rmidi = kzalloc(sizeof(*rmidi), GFP_KERNEL);
        if (rmidi == NULL) {
                snd_printk(KERN_ERR "rawmidi: cannot allocate\n");
                snd_rawmidi_free(rmidi);
                return err;
        }
-       *rrawmidi = rmidi;
+       if (rrawmidi)
+               *rrawmidi = rmidi;
        return 0;
 }
 
 
 static int snd_rawmidi_free(struct snd_rawmidi *rmidi)
 {
-       snd_assert(rmidi != NULL, return -ENXIO);       
+       if (!rmidi)
+               return 0;
 
        snd_info_free_entry(rmidi->proc_entry);
        rmidi->proc_entry = NULL;
 
 rtctimer_start(struct snd_timer *timer)
 {
        rtc_task_t *rtc = timer->private_data;
-       snd_assert(rtc != NULL, return -EINVAL);
+       if (snd_BUG_ON(!rtc))
+               return -EINVAL;
        rtc_control(rtc, RTC_IRQP_SET, rtctimer_freq);
        rtc_control(rtc, RTC_PIE_ON, 0);
        return 0;
 rtctimer_stop(struct snd_timer *timer)
 {
        rtc_task_t *rtc = timer->private_data;
-       snd_assert(rtc != NULL, return -EINVAL);
+       if (snd_BUG_ON(!rtc))
+               return -EINVAL;
        rtc_control(rtc, RTC_PIE_OFF, 0);
        return 0;
 }
 
 {
        struct seq_oss_devinfo *dp;
        dp = file->private_data;
-       snd_assert(dp != NULL, return -EIO);
+       if (snd_BUG_ON(!dp))
+               return -ENXIO;
        return snd_seq_oss_read(dp, buf, count);
 }
 
 {
        struct seq_oss_devinfo *dp;
        dp = file->private_data;
-       snd_assert(dp != NULL, return -EIO);
+       if (snd_BUG_ON(!dp))
+               return -ENXIO;
        return snd_seq_oss_write(dp, buf, count, file);
 }
 
 {
        struct seq_oss_devinfo *dp;
        dp = file->private_data;
-       snd_assert(dp != NULL, return -EIO);
+       if (snd_BUG_ON(!dp))
+               return -ENXIO;
        return snd_seq_oss_ioctl(dp, cmd, arg);
 }
 
 {
        struct seq_oss_devinfo *dp;
        dp = file->private_data;
-       snd_assert(dp != NULL, return 0);
+       if (snd_BUG_ON(!dp))
+               return -ENXIO;
        return snd_seq_oss_poll(dp, file, wait);
 }
 
 
        struct seq_oss_synth *rec;
        struct seq_oss_synthinfo *info;
 
-       snd_assert(dp->max_synthdev <= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS, return);
+       if (snd_BUG_ON(dp->max_synthdev >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS))
+               return;
        for (i = 0; i < dp->max_synthdev; i++) {
                info = &dp->synths[i];
                if (! info->opened)
        struct seq_oss_synth *rec;
        struct seq_oss_synthinfo *info;
 
-       snd_assert(dev >= 0 && dev < dp->max_synthdev, return);
+       if (snd_BUG_ON(dev < 0 || dev >= dp->max_synthdev))
+               return;
        info = &dp->synths[dev];
        if (! info->opened)
                return;
 
 {
        unsigned long flags;
 
-       snd_assert(client != NULL, return -EINVAL);
+       if (!client)
+               return 0;
        snd_seq_delete_all_ports(client);
        snd_seq_queue_client_leave(client->number);
        spin_lock_irqsave(&clients_lock, flags);
                return -EFAULT;
 
        /* check client structures are in place */
-       snd_assert(client != NULL, return -ENXIO);
+       if (snd_BUG_ON(!client))
+               return -ENXIO;
 
        if (!client->accept_input || (fifo = client->data.user.fifo) == NULL)
                return -ENXIO;
        struct snd_seq_client *client;
        int result;
 
-       snd_assert(cell != NULL, return -EINVAL);
+       if (snd_BUG_ON(!cell))
+               return -EINVAL;
 
        client = snd_seq_client_use_ptr(cell->event.source.client);
        if (client == NULL) {
                return -ENXIO;
 
        /* check client structures are in place */
-       snd_assert(client != NULL, return -ENXIO);
+       if (snd_BUG_ON(!client))
+               return -ENXIO;
                
        if (!client->accept_output || client->pool == NULL)
                return -ENXIO;
        unsigned int mask = 0;
 
        /* check client structures are in place */
-       snd_assert(client != NULL, return -ENXIO);
+       if (snd_BUG_ON(!client))
+               return -ENXIO;
 
        if ((snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_INPUT) &&
            client->data.user.fifo) {
 {
        struct snd_seq_client *client = file->private_data;
 
-       snd_assert(client != NULL, return -ENXIO);
+       if (snd_BUG_ON(!client))
+               return -ENXIO;
                
        return snd_seq_do_ioctl(client, cmd, (void __user *) arg);
 }
        struct snd_seq_client *client;
        va_list args;
 
-       snd_assert(! in_interrupt(), return -EBUSY);
+       if (snd_BUG_ON(in_interrupt()))
+               return -EBUSY;
 
        if (card && client_index >= SNDRV_SEQ_CLIENTS_PER_CARD)
                return -EINVAL;
 {
        struct snd_seq_client *ptr;
 
-       snd_assert(! in_interrupt(), return -EBUSY);
+       if (snd_BUG_ON(in_interrupt()))
+               return -EBUSY;
 
        ptr = clientptr(client);
        if (ptr == NULL)
        struct snd_seq_client *cptr;
        int result;
 
-       snd_assert(ev != NULL, return -EINVAL);
+       if (snd_BUG_ON(!ev))
+               return -EINVAL;
 
        if (ev->type == SNDRV_SEQ_EVENT_NONE)
                return 0; /* ignore this */
        struct snd_seq_client *cptr;
        int result;
 
-       snd_assert(ev != NULL, return -EINVAL);
+       if (snd_BUG_ON(!ev))
+               return -EINVAL;
 
        /* fill in client number */
        ev->queue = SNDRV_SEQ_QUEUE_DIRECT;
 
        struct snd_seq_client *client = file->private_data;
        void __user *argp = compat_ptr(arg);
 
-       snd_assert(client != NULL, return -ENXIO);
+       if (snd_BUG_ON(!client))
+               return -ENXIO;
 
        switch (cmd) {
        case SNDRV_SEQ_IOCTL_PVERSION:
 
        if (result)
                *result = NULL;
 
-       snd_assert(id != NULL, return -EINVAL);
+       if (snd_BUG_ON(!id))
+               return -EINVAL;
 
        ops = find_driver(id, 1);
        if (ops == NULL)
 {
        struct ops_list *ops;
 
-       snd_assert(dev != NULL, return -EINVAL);
+       if (snd_BUG_ON(!dev))
+               return -EINVAL;
 
        ops = find_driver(dev->id, 0);
        if (ops == NULL)
 
 {
        struct snd_seq_fifo *f;
 
-       snd_assert(fifo != NULL, return);
+       if (snd_BUG_ON(!fifo))
+               return;
        f = *fifo;
-       snd_assert(f != NULL, return);
+       if (snd_BUG_ON(!f))
+               return;
        *fifo = NULL;
 
        snd_seq_fifo_clear(f);
        unsigned long flags;
        int err;
 
-       snd_assert(f != NULL, return -EINVAL);
+       if (snd_BUG_ON(!f))
+               return -EINVAL;
 
        snd_use_lock_use(&f->use_lock);
        err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL); /* always non-blocking */
        unsigned long flags;
        wait_queue_t wait;
 
-       snd_assert(f != NULL, return -EINVAL);
+       if (snd_BUG_ON(!f))
+               return -EINVAL;
 
        *cellp = NULL;
        init_waitqueue_entry(&wait, current);
        struct snd_seq_pool *newpool, *oldpool;
        struct snd_seq_event_cell *cell, *next, *oldhead;
 
-       snd_assert(f != NULL && f->pool != NULL, return -EINVAL);
+       if (snd_BUG_ON(!f || !f->pool))
+               return -EINVAL;
 
        /* allocate new pool */
        newpool = snd_seq_pool_new(poolsize);
 
        unsigned long flags;
        struct snd_seq_pool *pool;
 
-       snd_assert(cell != NULL, return);
+       if (snd_BUG_ON(!cell))
+               return;
        pool = cell->pool;
-       snd_assert(pool != NULL, return);
+       if (snd_BUG_ON(!pool))
+               return;
 
        spin_lock_irqsave(&pool->lock, flags);
        free_cell(pool, cell);
        struct snd_seq_event_cell *cellptr;
        unsigned long flags;
 
-       snd_assert(pool != NULL, return -EINVAL);
+       if (snd_BUG_ON(!pool))
+               return -EINVAL;
        if (pool->ptr)                  /* should be atomic? */
                return 0;
 
        struct snd_seq_event_cell *ptr;
        int max_count = 5 * HZ;
 
-       snd_assert(pool != NULL, return -EINVAL);
+       if (snd_BUG_ON(!pool))
+               return -EINVAL;
 
        /* wait for closing all threads */
        spin_lock_irqsave(&pool->lock, flags);
 
        struct snd_rawmidi_runtime *runtime;
        int tmp;
 
-       snd_assert(substream != NULL || buf != NULL, return -EINVAL);
+       if (snd_BUG_ON(!substream || !buf))
+               return -EINVAL;
        runtime = substream->runtime;
        if ((tmp = runtime->avail) < count) {
                snd_printd("warning, output event was lost (count = %i, available = %i)\n", count, tmp);
        struct snd_rawmidi_substream *substream;
        int len;
 
-       snd_assert(msynth != NULL, return -EINVAL);
+       if (snd_BUG_ON(!msynth))
+               return -EINVAL;
        substream = msynth->output_rfile.output;
        if (substream == NULL)
                return -ENODEV;
        int err;
        struct seq_midisynth *msynth = private_data;
 
-       snd_assert(msynth->input_rfile.input != NULL, return -EINVAL);
+       if (snd_BUG_ON(!msynth->input_rfile.input))
+               return -EINVAL;
        err = snd_rawmidi_kernel_release(&msynth->input_rfile);
        return err;
 }
        struct seq_midisynth *msynth = private_data;
        unsigned char buf = 0xff; /* MIDI reset */
 
-       snd_assert(msynth->output_rfile.output != NULL, return -EINVAL);
+       if (snd_BUG_ON(!msynth->output_rfile.output))
+               return -EINVAL;
        /* sending single MIDI reset message to shut the device up */
        snd_rawmidi_kernel_write(msynth->output_rfile.output, &buf, 1);
        snd_rawmidi_drain_output(msynth->output_rfile.output);
        int device = dev->device;
        unsigned int input_count = 0, output_count = 0;
 
-       snd_assert(card != NULL && device >= 0 && device < SNDRV_RAWMIDI_DEVICES, return -EINVAL);
+       if (snd_BUG_ON(!card || device < 0 || device >= SNDRV_RAWMIDI_DEVICES))
+               return -EINVAL;
        info = kmalloc(sizeof(*info), GFP_KERNEL);
        if (! info)
                return -ENOMEM;
 
        int num = -1;
        
        /* sanity check */
-       snd_assert(client, return NULL);
+       if (snd_BUG_ON(!client))
+               return NULL;
 
        if (client->num_ports >= SNDRV_SEQ_MAX_PORTS - 1) {
                snd_printk(KERN_WARNING "too many ports for client %d\n", client->number);
        if (port->private_free)
                port->private_free(port->private_data);
 
-       snd_assert(port->c_src.count == 0,);
-       snd_assert(port->c_dest.count == 0,);
+       snd_BUG_ON(port->c_src.count != 0);
+       snd_BUG_ON(port->c_dest.count != 0);
 
        kfree(port);
        return 0;
 int snd_seq_set_port_info(struct snd_seq_client_port * port,
                          struct snd_seq_port_info * info)
 {
-       snd_assert(port && info, return -EINVAL);
+       if (snd_BUG_ON(!port || !info))
+               return -EINVAL;
 
        /* set port name */
        if (info->name[0])
 int snd_seq_get_port_info(struct snd_seq_client_port * port,
                          struct snd_seq_port_info * info)
 {
-       snd_assert(port && info, return -EINVAL);
+       if (snd_BUG_ON(!port || !info))
+               return -EINVAL;
 
        /* get port name */
        strlcpy(info->name, port->name, sizeof(info->name));
 
        int count;
        int prior;
 
-       snd_assert(f, return -EINVAL);
-       snd_assert(cell, return -EINVAL);
+       if (snd_BUG_ON(!f || !cell))
+               return -EINVAL;
        
        /* check flags */
        prior = (cell->event.flags & SNDRV_SEQ_PRIORITY_MASK);
 
        int dest, err;
        struct snd_seq_queue *q;
 
-       snd_assert(cell != NULL, return -EINVAL);
+       if (snd_BUG_ON(!cell))
+               return -EINVAL;
        dest = cell->event.queue;       /* destination queue */
        q = queueptr(dest);
        if (q == NULL)
 {
        struct snd_seq_queue *q;
 
-       snd_assert(ev != NULL, return -EINVAL);
+       if (snd_BUG_ON(!ev))
+               return -EINVAL;
        q = queueptr(ev->data.queue.queue);
 
        if (q == NULL)
 
 {
        unsigned long flags;
 
-       snd_assert(tmr, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
        if (tempo <= 0)
                return -EINVAL;
        spin_lock_irqsave(&tmr->lock, flags);
 {
        unsigned long flags;
 
-       snd_assert(tmr, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
        if (ppq <= 0)
                return -EINVAL;
        spin_lock_irqsave(&tmr->lock, flags);
 {
        unsigned long flags;
 
-       snd_assert(tmr, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
 
        spin_lock_irqsave(&tmr->lock, flags);
        tmr->tick.cur_tick = position;
 {
        unsigned long flags;
 
-       snd_assert(tmr, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
 
        snd_seq_sanity_real_time(&position);
        spin_lock_irqsave(&tmr->lock, flags);
 {
        unsigned long flags;
 
-       snd_assert(tmr, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
 
        /* FIXME */
        if (base != SKEW_BASE) {
        int err;
 
        tmr = q->timer;
-       snd_assert(tmr != NULL, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
        if (tmr->timeri)
                return -EBUSY;
        sprintf(str, "sequencer queue %i", q->queue);
        struct snd_seq_timer *tmr;
        
        tmr = q->timer;
-       snd_assert(tmr != NULL, return -EINVAL);
+       if (snd_BUG_ON(!tmr))
+               return -EINVAL;
        if (tmr->timeri) {
                snd_timer_stop(tmr->timeri);
                snd_timer_close(tmr->timeri);
        unsigned long freq;
 
        t = tmr->timeri->timer;
-       snd_assert(t, return -EINVAL);
+       if (snd_BUG_ON(!t))
+               return -EINVAL;
 
        freq = tmr->preferred_resolution;
        if (!freq)
 
                minor = type;
                break;
        case SNDRV_DEVICE_TYPE_CONTROL:
-               snd_assert(card != NULL, return -EINVAL);
+               if (snd_BUG_ON(!card))
+                       return -EINVAL;
                minor = SNDRV_MINOR(card->number, type);
                break;
        case SNDRV_DEVICE_TYPE_HWDEP:
        case SNDRV_DEVICE_TYPE_RAWMIDI:
        case SNDRV_DEVICE_TYPE_PCM_PLAYBACK:
        case SNDRV_DEVICE_TYPE_PCM_CAPTURE:
-               snd_assert(card != NULL, return -EINVAL);
+               if (snd_BUG_ON(!card))
+                       return -EINVAL;
                minor = SNDRV_MINOR(card->number, type + dev);
                break;
        default:
                return -EINVAL;
        }
-       snd_assert(minor >= 0 && minor < SNDRV_OS_MINORS, return -EINVAL);
+       if (snd_BUG_ON(minor < 0 || minor >= SNDRV_OS_MINORS))
+               return -EINVAL;
        return minor;
 }
 #endif
        int minor;
        struct snd_minor *preg;
 
-       snd_assert(name, return -EINVAL);
+       if (snd_BUG_ON(!name))
+               return -EINVAL;
        preg = kmalloc(sizeof *preg, GFP_KERNEL);
        if (preg == NULL)
                return -ENOMEM;
 
 
        switch (type) {
        case SNDRV_OSS_DEVICE_TYPE_MIXER:
-               snd_assert(card != NULL && dev <= 1, return -EINVAL);
+               if (snd_BUG_ON(!card || dev < 0 || dev > 1))
+                       return -EINVAL;
                minor = SNDRV_MINOR_OSS(card->number, (dev ? SNDRV_MINOR_OSS_MIXER1 : SNDRV_MINOR_OSS_MIXER));
                break;
        case SNDRV_OSS_DEVICE_TYPE_SEQUENCER:
                minor = SNDRV_MINOR_OSS_MUSIC;
                break;
        case SNDRV_OSS_DEVICE_TYPE_PCM:
-               snd_assert(card != NULL && dev <= 1, return -EINVAL);
+               if (snd_BUG_ON(!card || dev < 0 || dev > 1))
+                       return -EINVAL;
                minor = SNDRV_MINOR_OSS(card->number, (dev ? SNDRV_MINOR_OSS_PCM1 : SNDRV_MINOR_OSS_PCM));
                break;
        case SNDRV_OSS_DEVICE_TYPE_MIDI:
-               snd_assert(card != NULL && dev <= 1, return -EINVAL);
+               if (snd_BUG_ON(!card || dev < 0 || dev > 1))
+                       return -EINVAL;
                minor = SNDRV_MINOR_OSS(card->number, (dev ? SNDRV_MINOR_OSS_MIDI1 : SNDRV_MINOR_OSS_MIDI));
                break;
        case SNDRV_OSS_DEVICE_TYPE_DMFM:
        default:
                return -EINVAL;
        }
-       snd_assert(minor >= 0 && minor < SNDRV_OSS_MINORS, return -EINVAL);
+       if (snd_BUG_ON(minor < 0 || minor >= SNDRV_OSS_MINORS))
+               return -EINVAL;
        return minor;
 }
 
 
        struct snd_timer *timer = NULL;
        struct snd_timer_instance *slave, *tmp;
 
-       snd_assert(timeri != NULL, return -ENXIO);
+       if (snd_BUG_ON(!timer))
+               return -ENXIO;
 
        /* force to stop the timer */
        snd_timer_stop(timeri);
                do_posix_clock_monotonic_gettime(&tstamp);
        else
                getnstimeofday(&tstamp);
-       snd_assert(event >= SNDRV_TIMER_EVENT_START &&
-                  event <= SNDRV_TIMER_EVENT_PAUSE, return);
+       if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_START ||
+                      event > SNDRV_TIMER_EVENT_PAUSE))
+               return;
        if (event == SNDRV_TIMER_EVENT_START ||
            event == SNDRV_TIMER_EVENT_CONTINUE)
                resolution = snd_timer_resolution(ti);
        struct snd_timer *timer;
        unsigned long flags;
 
-       snd_assert(timeri != NULL, return -ENXIO);
+       if (snd_BUG_ON(!timeri))
+               return -ENXIO;
 
        if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) {
                if (!keep_flag) {
                .dev_disconnect = snd_timer_dev_disconnect,
        };
 
-       snd_assert(tid != NULL, return -EINVAL);
-       snd_assert(rtimer != NULL, return -EINVAL);
-       *rtimer = NULL;
+       if (snd_BUG_ON(!tid))
+               return -EINVAL;
+       if (rtimer)
+               *rtimer = NULL;
        timer = kzalloc(sizeof(*timer), GFP_KERNEL);
        if (timer == NULL) {
                snd_printk(KERN_ERR "timer: cannot allocate\n");
                        return err;
                }
        }
-       *rtimer = timer;
+       if (rtimer)
+               *rtimer = timer;
        return 0;
 }
 
 static int snd_timer_free(struct snd_timer *timer)
 {
-       snd_assert(timer != NULL, return -ENXIO);
+       if (!timer)
+               return 0;
 
        mutex_lock(®ister_mutex);
        if (! list_empty(&timer->open_list_head)) {
        struct snd_timer *timer = dev->device_data;
        struct snd_timer *timer1;
 
-       snd_assert(timer != NULL && timer->hw.start != NULL &&
-                  timer->hw.stop != NULL, return -ENXIO);
+       if (snd_BUG_ON(!timer || !timer->hw.start || !timer->hw.stop))
+               return -ENXIO;
        if (!(timer->hw.flags & SNDRV_TIMER_HW_SLAVE) &&
            !timer->hw.resolution && timer->hw.c_resolution == NULL)
                return -EINVAL;
 
        if (! (timer->hw.flags & SNDRV_TIMER_HW_SLAVE))
                return;
-       snd_assert(event >= SNDRV_TIMER_EVENT_MSTART &&
-                  event <= SNDRV_TIMER_EVENT_MRESUME, return);
+       if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_MSTART ||
+                      event > SNDRV_TIMER_EVENT_MRESUME))
+               return;
        spin_lock_irqsave(&timer->lock, flags);
        if (event == SNDRV_TIMER_EVENT_MSTART ||
            event == SNDRV_TIMER_EVENT_MCONTINUE ||
 
        struct snd_timer *t;
 
        tu = file->private_data;
-       snd_assert(tu->timeri != NULL, return -ENXIO);
+       if (snd_BUG_ON(!tu->timeri))
+               return -ENXIO;
        t = tu->timeri->timer;
-       snd_assert(t != NULL, return -ENXIO);
+       if (snd_BUG_ON(!t))
+               return -ENXIO;
        memset(&info, 0, sizeof(info));
        info.card = t->card ? t->card->number : -1;
        if (t->hw.flags & SNDRV_TIMER_HW_SLAVE)
        struct snd_timer_status status;
        
        tu = file->private_data;
-       snd_assert(tu->timeri != NULL, return -ENXIO);
+       if (snd_BUG_ON(!tu->timeri))
+               return -ENXIO;
        memset(&status, 0, sizeof(status));
        status.tstamp = tu->tstamp;
        status.resolution = snd_timer_resolution(tu->timeri);