static ssize_t set_autosuspend(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_device *udev = to_usb_device(dev); int value, old_delay; int rc; if (sscanf(buf, "%d", &value) != 1 || value >= INT_MAX/HZ || value <= - INT_MAX/HZ) return -EINVAL; value *= HZ; usb_lock_device(udev); old_delay = udev->autosuspend_delay; udev->autosuspend_delay = value; if (old_delay < 0) { /* Autosuspend wasn't allowed */ if (value >= 0) usb_autosuspend_device(udev); } else { /* Autosuspend was allowed */ if (value < 0) { rc = usb_autoresume_device(udev); if (rc < 0) { count = rc; udev->autosuspend_delay = old_delay; } } else { usb_try_autosuspend_device(udev); } } usb_unlock_device(udev); return count; }
static ssize_t set_autosuspend(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_device *udev = to_usb_device(dev); unsigned value, old; if (sscanf(buf, "%u", &value) != 1 || value >= INT_MAX/HZ) return -EINVAL; value *= HZ; old = udev->autosuspend_delay; udev->autosuspend_delay = value; if (value > 0 && old == 0) usb_try_autosuspend_device(udev); return count; }
static ssize_t set_autosuspend(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_device *udev = to_usb_device(dev); int value; if (sscanf(buf, "%d", &value) != 1 || value >= INT_MAX/HZ || value <= - INT_MAX/HZ) return -EINVAL; value *= HZ; udev->autosuspend_delay = value; if (value >= 0) usb_try_autosuspend_device(udev); else { if (usb_autoresume_device(udev) == 0) usb_autosuspend_device(udev); } return count; }