/* * si470x_fops_release - file release */ static int si470x_fops_release(struct inode *inode, struct file *file) { struct si470x_device *radio = video_get_drvdata(video_devdata(file)); int retval = 0; if (!radio) return -ENODEV; mutex_lock(&open_close_lock); radio->users--; if (radio->users == 0) { if (radio->disconnected) { video_unregister_device(radio->videodev); kfree(radio->buffer); kfree(radio); goto done; } /* stop rds reception */ cancel_delayed_work_sync(&radio->work); /* cancel read processes */ wake_up_interruptible(&radio->read_queue); retval = si470x_stop(radio); usb_autopm_put_interface(radio->intf); } done: mutex_unlock(&open_close_lock); return retval; }
/* * si470x_fops_release - file release */ int si470x_fops_release(struct file *file) { struct si470x_device *radio = video_drvdata(file); int retval = 0; /* safety check */ if (!radio) return -ENODEV; mutex_lock(&radio->lock); radio->users--; if (radio->users == 0) /* stop radio */ retval = si470x_stop(radio); mutex_unlock(&radio->lock); return retval; }
int si470x_fops_release(struct file *file) { struct si470x_device *radio = video_drvdata(file); int retval = 0; /* */ if (!radio) { retval = -ENODEV; goto done; } mutex_lock(&radio->lock); radio->users--; if (radio->users == 0) { /* */ if (radio->int_in_running) { radio->int_in_running = 0; if (radio->int_in_urb) usb_kill_urb(radio->int_in_urb); } if (radio->disconnected) { video_unregister_device(radio->videodev); kfree(radio->int_in_buffer); kfree(radio->buffer); mutex_unlock(&radio->lock); kfree(radio); goto done; } /* */ wake_up_interruptible(&radio->read_queue); /* */ retval = si470x_stop(radio); usb_autopm_put_interface(radio->intf); } mutex_unlock(&radio->lock); done: return retval; }
/* * si470x_usb_driver_suspend - suspend the device */ static int si470x_usb_driver_suspend(struct usb_interface *intf, pm_message_t message) { struct si470x_device *radio = usb_get_intfdata(intf); dev_info(&intf->dev, "suspending now...\n"); /* shutdown interrupt handler */ if (radio->int_in_running) { radio->int_in_running = 0; if (radio->int_in_urb) usb_kill_urb(radio->int_in_urb); } /* cancel read processes */ wake_up_interruptible(&radio->read_queue); /* stop radio */ si470x_stop(radio); return 0; }
/* * si470x_fops_release - file release */ static int si470x_fops_release(struct file *file) { struct si470x_device *radio = video_drvdata(file); int retval = 0; /* safety check */ if (!radio) { retval = -ENODEV; goto done; } mutex_lock(&radio->disconnect_lock); radio->users--; if (radio->users == 0) { if (radio->disconnected) { video_unregister_device(radio->videodev); kfree(radio->buffer); kfree(radio); goto unlock; } /* stop rds reception */ cancel_delayed_work_sync(&radio->work); /* cancel read processes */ wake_up_interruptible(&radio->read_queue); /* stop radio */ retval = si470x_stop(radio); usb_autopm_put_interface(radio->intf); } unlock: mutex_unlock(&radio->disconnect_lock); done: return retval; }
/* * si470x_fops_release - file release */ static int si470x_fops_release(struct inode *inode, struct file *file) { struct si470x_device *radio = video_get_drvdata(video_devdata(file)); int retval; if (!radio) return -ENODEV; radio->users--; if (radio->users == 0) { /* stop rds reception */ cancel_delayed_work_sync(&radio->work); /* cancel read processes */ wake_up_interruptible(&radio->read_queue); retval = si470x_stop(radio); usb_autopm_put_interface(radio->intf); return retval; } return 0; }