From: "Bruno Prémont" <bonbons@linux-vserver.org> To: Jiri Kosina <jkosina@suse.cz> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>, linux-input@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, "Rick L. Vinyard Jr." <rvinyard@cs.nmsu.edu>, Nicu Pavel <npavel@ituner.com>, Oliver Neukum <oliver@neukum.org> Subject: Re: [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for hid drivers Date: Sun, 11 Apr 2010 13:02:26 +0200 [thread overview] Message-ID: <20100411130226.4086a92d@neptune.home> (raw) In-Reply-To: <alpine.LNX.2.00.1003311415000.24576@pobox.suse.cz> On Wed, 31 March 2010 Jiri Kosina <jkosina@suse.cz> wrote: > On Tue, 30 Mar 2010, Bruno Prémont wrote: > > > Add suspend/resume hooks for HID drivers so these can do some > > additional state adjustment when device gets suspended/resumed. > > > > This patch calls these hooks from usbhid suspend/resume functions, > > only calling suspend on plain suspend, not autosuspend. > > (it might be worth adding an autosuspend parameter to suspend > > hook and calling suspend in both cases) > > > > Signed-off-by: Bruno Prémont <bonbons@linux-vserver.org> > > --- > > > > Note: > > this patch needs improvements as mentionned by Olivier Neukum: > > - suspend hook for both system suspend and autosuspend > > - no call of hook on USB-HID-resume failure > > I agree with Oliver's comments. > > We should also consider putting the hook calls into bluetooth > implementation as well (though there is currently no driver using it, but > I don't know, maybe Wacom could benefit from it as well). Where do I find the bluetooth HID bits? I've been searching through kernel sources (under drivers/) but did not find bluetooth code trying to register a HID device... Below an updated patch which also calls the hook for auto-suspend case. The patch compiles but I've not runtime-tested it yet (especially for the auto-suspend part, as I'm not sure what should trigger it). As far as I understand the code, in auto-suspend case if the driver sends commands to the device it will have to call usbhid_wait_io(). Please correct me if I'm wrong! Thanks, Bruno --- Add suspend/resume hooks for HID drivers so these can do some additional state adjustment when device gets suspended/resumed. v2: - Adds auto_suspend parameter to suspend hook - Only calls HID driver's resume hooks when previous code did succeed Signed-off-by: Bruno Prémont <bonbons@linux-vserver.org> --- drivers/hid/usbhid/hid-core.c | 24 +++++++++++++++++++++++- include/linux/hid.h | 8 ++++++++ 2 files changed, 31 insertions(+), 1 deletions(-) diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 3e7909b..1f40695 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -1291,6 +1291,11 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) { set_bit(HID_REPORTED_IDLE, &usbhid->iofl); spin_unlock_irq(&usbhid->lock); + if (hid->driver && hid->driver->suspend) { + status = hid->driver->suspend(hid, 1); + if (status < 0) + return status; + } } else { usbhid_mark_busy(usbhid); spin_unlock_irq(&usbhid->lock); @@ -1298,6 +1303,11 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) } } else { + if (hid->driver && hid->driver->suspend) { + status = hid->driver->suspend(hid, 0); + if (status < 0) + return status; + } spin_lock_irq(&usbhid->lock); set_bit(HID_REPORTED_IDLE, &usbhid->iofl); spin_unlock_irq(&usbhid->lock); @@ -1352,6 +1362,11 @@ static int hid_resume(struct usb_interface *intf) hid_io_error(hid); usbhid_restart_queues(usbhid); + if (status >= 0 && hid->driver && hid->driver->resume) { + int ret = hid->driver->resume(hid); + if (ret < 0) + status = ret; + } dev_dbg(&intf->dev, "resume status %d\n", status); return 0; } @@ -1360,9 +1375,16 @@ static int hid_reset_resume(struct usb_interface *intf) { struct hid_device *hid = usb_get_intfdata(intf); struct usbhid_device *usbhid = hid->driver_data; + int status; clear_bit(HID_REPORTED_IDLE, &usbhid->iofl); - return hid_post_reset(intf); + status = hid_post_reset(intf); + if (status >= 0 && hid->driver && hid->driver->reset_resume) { + int ret = hid->driver->reset_resume(hid); + if (ret < 0) + status = ret; + } + return status; } #endif /* CONFIG_PM */ diff --git a/include/linux/hid.h b/include/linux/hid.h index b1344ec..a2f3612 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -589,6 +589,9 @@ struct hid_usage_id { * @report_fixup: called before report descriptor parsing (NULL means nop) * @input_mapping: invoked on input registering before mapping an usage * @input_mapped: invoked on input registering after mapping an usage + * @suspend: invoked on suspend (NULL means nop) + * @resume: invoked on resume if device was not reset (NULL means nop) + * @reset_resume: invoked on resume if device was reset (NULL means nop) * * raw_event and event should return 0 on no action performed, 1 when no * further processing should be done and negative on error @@ -629,6 +632,11 @@ struct hid_driver { int (*input_mapped)(struct hid_device *hdev, struct hid_input *hidinput, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max); +#ifdef CONFIG_PM + int (*suspend)(struct hid_device *hdev, int auto_suspend); + int (*resume)(struct hid_device *hdev); + int (*reset_resume)(struct hid_device *hdev); +#endif /* private: */ struct device_driver driver; }; -- 1.6.4.4
WARNING: multiple messages have this Message-ID (diff)
From: "Bruno Prémont" <bonbons@linux-vserver.org> To: Jiri Kosina <jkosina@suse.cz> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>, linux-input@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, "Rick L. Vinyard Jr." <rvinyard@cs.nmsu.edu>, Nicu Pavel <npavel@ituner.com>, Oliver Neukum <oliver@neukum.org> Subject: Re: [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for hid drivers Date: Sun, 11 Apr 2010 13:02:26 +0200 [thread overview] Message-ID: <20100411130226.4086a92d@neptune.home> (raw) In-Reply-To: <alpine.LNX.2.00.1003311415000.24576@pobox.suse.cz> On Wed, 31 March 2010 Jiri Kosina <jkosina@suse.cz> wrote: > On Tue, 30 Mar 2010, Bruno Prémont wrote: > > > Add suspend/resume hooks for HID drivers so these can do some > > additional state adjustment when device gets suspended/resumed. > > > > This patch calls these hooks from usbhid suspend/resume functions, > > only calling suspend on plain suspend, not autosuspend. > > (it might be worth adding an autosuspend parameter to suspend > > hook and calling suspend in both cases) > > > > Signed-off-by: Bruno Prémont <bonbons@linux-vserver.org> > > --- > > > > Note: > > this patch needs improvements as mentionned by Olivier Neukum: > > - suspend hook for both system suspend and autosuspend > > - no call of hook on USB-HID-resume failure > > I agree with Oliver's comments. > > We should also consider putting the hook calls into bluetooth > implementation as well (though there is currently no driver using it, but > I don't know, maybe Wacom could benefit from it as well). Where do I find the bluetooth HID bits? I've been searching through kernel sources (under drivers/) but did not find bluetooth code trying to register a HID device... Below an updated patch which also calls the hook for auto-suspend case. The patch compiles but I've not runtime-tested it yet (especially for the auto-suspend part, as I'm not sure what should trigger it). As far as I understand the code, in auto-suspend case if the driver sends commands to the device it will have to call usbhid_wait_io(). Please correct me if I'm wrong! Thanks, Bruno --- Add suspend/resume hooks for HID drivers so these can do some additional state adjustment when device gets suspended/resumed. v2: - Adds auto_suspend parameter to suspend hook - Only calls HID driver's resume hooks when previous code did succeed Signed-off-by: Bruno Prémont <bonbons@linux-vserver.org> --- drivers/hid/usbhid/hid-core.c | 24 +++++++++++++++++++++++- include/linux/hid.h | 8 ++++++++ 2 files changed, 31 insertions(+), 1 deletions(-) diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 3e7909b..1f40695 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -1291,6 +1291,11 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) { set_bit(HID_REPORTED_IDLE, &usbhid->iofl); spin_unlock_irq(&usbhid->lock); + if (hid->driver && hid->driver->suspend) { + status = hid->driver->suspend(hid, 1); + if (status < 0) + return status; + } } else { usbhid_mark_busy(usbhid); spin_unlock_irq(&usbhid->lock); @@ -1298,6 +1303,11 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) } } else { + if (hid->driver && hid->driver->suspend) { + status = hid->driver->suspend(hid, 0); + if (status < 0) + return status; + } spin_lock_irq(&usbhid->lock); set_bit(HID_REPORTED_IDLE, &usbhid->iofl); spin_unlock_irq(&usbhid->lock); @@ -1352,6 +1362,11 @@ static int hid_resume(struct usb_interface *intf) hid_io_error(hid); usbhid_restart_queues(usbhid); + if (status >= 0 && hid->driver && hid->driver->resume) { + int ret = hid->driver->resume(hid); + if (ret < 0) + status = ret; + } dev_dbg(&intf->dev, "resume status %d\n", status); return 0; } @@ -1360,9 +1375,16 @@ static int hid_reset_resume(struct usb_interface *intf) { struct hid_device *hid = usb_get_intfdata(intf); struct usbhid_device *usbhid = hid->driver_data; + int status; clear_bit(HID_REPORTED_IDLE, &usbhid->iofl); - return hid_post_reset(intf); + status = hid_post_reset(intf); + if (status >= 0 && hid->driver && hid->driver->reset_resume) { + int ret = hid->driver->reset_resume(hid); + if (ret < 0) + status = ret; + } + return status; } #endif /* CONFIG_PM */ diff --git a/include/linux/hid.h b/include/linux/hid.h index b1344ec..a2f3612 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -589,6 +589,9 @@ struct hid_usage_id { * @report_fixup: called before report descriptor parsing (NULL means nop) * @input_mapping: invoked on input registering before mapping an usage * @input_mapped: invoked on input registering after mapping an usage + * @suspend: invoked on suspend (NULL means nop) + * @resume: invoked on resume if device was not reset (NULL means nop) + * @reset_resume: invoked on resume if device was reset (NULL means nop) * * raw_event and event should return 0 on no action performed, 1 when no * further processing should be done and negative on error @@ -629,6 +632,11 @@ struct hid_driver { int (*input_mapped)(struct hid_device *hdev, struct hid_input *hidinput, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max); +#ifdef CONFIG_PM + int (*suspend)(struct hid_device *hdev, int auto_suspend); + int (*resume)(struct hid_device *hdev); + int (*reset_resume)(struct hid_device *hdev); +#endif /* private: */ struct device_driver driver; }; -- 1.6.4.4 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2010-04-11 11:02 UTC|newest] Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-03-24 22:37 [PATCH v3 0/6] hid: new driver for PicoLCD device Bruno Prémont 2010-03-24 22:37 ` Bruno Prémont 2010-03-24 22:40 ` [PATCH v3 1/6] " Bruno Prémont 2010-03-24 22:40 ` Bruno Prémont 2010-03-24 22:40 ` Bruno Prémont 2010-03-26 6:56 ` Dmitry Torokhov 2010-03-26 6:56 ` Dmitry Torokhov 2010-03-26 9:29 ` Bruno Prémont 2010-03-26 9:29 ` Bruno Prémont 2010-03-26 9:29 ` Bruno Prémont 2010-03-26 20:59 ` Jiri Kosina 2010-03-26 20:59 ` Jiri Kosina 2010-03-26 20:59 ` Jiri Kosina 2010-03-26 21:16 ` Dmitry Torokhov 2010-03-26 21:16 ` Dmitry Torokhov 2010-03-26 21:16 ` Dmitry Torokhov 2010-03-26 21:39 ` Bruno Prémont 2010-03-26 21:39 ` Bruno Prémont 2010-03-26 21:39 ` Bruno Prémont 2010-03-27 0:22 ` [PATCH v4 " Bruno Prémont 2010-03-27 0:22 ` Bruno Prémont 2010-03-29 9:47 ` Jiri Kosina 2010-03-29 9:47 ` Jiri Kosina 2010-03-29 9:47 ` Jiri Kosina 2010-03-29 10:16 ` Bruno Prémont 2010-03-29 10:16 ` Bruno Prémont 2010-03-30 8:12 ` Jiri Kosina 2010-03-30 8:12 ` Jiri Kosina 2010-03-30 8:12 ` Jiri Kosina 2010-03-30 20:32 ` [PATCH v6 0/8] " Bruno Prémont 2010-03-30 20:32 ` Bruno Prémont 2010-03-30 20:32 ` Bruno Prémont 2010-03-30 20:33 ` [PATCH v6 1/8] " Bruno Prémont 2010-03-30 20:33 ` Bruno Prémont 2010-03-30 20:33 ` Bruno Prémont 2010-04-01 16:58 ` Oliver Neukum 2010-04-01 16:58 ` Oliver Neukum 2010-04-01 16:58 ` Oliver Neukum 2010-04-25 19:29 ` [PATCH] hid: split picolcd's operation_mode sysfs attribute Bruno Prémont 2010-04-25 19:29 ` Bruno Prémont 2010-04-25 19:29 ` Bruno Prémont 2010-04-27 13:32 ` Jiri Kosina 2010-04-27 13:32 ` Jiri Kosina 2010-04-27 13:32 ` Jiri Kosina 2010-03-30 20:34 ` [PATCH v6 2/8] hid: add framebuffer support to PicoLCD device Bruno Prémont 2010-03-30 20:34 ` Bruno Prémont 2010-03-30 20:35 ` [PATCH v6 3/8] hid: add backlight " Bruno Prémont 2010-03-30 20:35 ` Bruno Prémont 2010-03-30 20:35 ` Bruno Prémont 2010-03-30 20:36 ` [PATCH v6 4/8] hid: add lcd " Bruno Prémont 2010-03-30 20:36 ` Bruno Prémont 2010-03-30 20:36 ` Bruno Prémont 2010-03-30 20:36 ` [PATCH v6 5/8] hid: add GPO (leds) " Bruno Prémont 2010-03-30 20:36 ` Bruno Prémont 2010-03-30 20:36 ` Bruno Prémont 2010-03-30 20:38 ` [PATCH v6 6/8] hid: add experimental access to PicoLCD device's EEPROM and FLASH Bruno Prémont 2010-03-30 20:38 ` [PATCH v6 6/8] hid: add experimental access to PicoLCD device's Bruno Prémont 2010-03-30 20:42 ` [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for hid drivers Bruno Prémont 2010-03-30 20:42 ` [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for Bruno Prémont 2010-03-31 12:15 ` [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for hid drivers Jiri Kosina 2010-03-31 12:15 ` [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks Jiri Kosina 2010-03-31 12:15 ` [PATCH v6 7/8, needs improvement] hid: add suspend/resume hooks for hid drivers Jiri Kosina 2010-04-11 11:02 ` Bruno Prémont [this message] 2010-04-11 11:02 ` Bruno Prémont 2010-04-11 13:38 ` Oliver Neukum 2010-04-11 13:38 ` Oliver Neukum 2010-04-11 18:31 ` Jiri Kosina 2010-04-11 18:31 ` Jiri Kosina 2010-04-11 18:40 ` Bruno Prémont 2010-04-11 20:27 ` Oliver Neukum 2010-04-11 20:27 ` Oliver Neukum 2010-04-12 11:43 ` Jiri Kosina 2010-04-12 16:56 ` Bruno Prémont 2010-04-12 16:56 ` Bruno Prémont 2010-04-12 19:45 ` Oliver Neukum 2010-04-12 19:45 ` Oliver Neukum 2010-03-30 20:43 ` [PATCH v6 8/8] hid: add PM support to PicoLCD device Bruno Prémont 2010-03-30 20:43 ` Bruno Prémont 2010-03-30 20:43 ` Bruno Prémont 2010-03-31 9:28 ` [PATCH v6 0/8] hid: new driver for " Jiri Kosina 2010-03-31 9:28 ` Jiri Kosina 2010-03-31 9:28 ` Jiri Kosina 2010-03-24 22:49 ` [PATCH v3 2/6] hid: add framebuffer support to " Bruno Prémont 2010-03-24 22:49 ` Bruno Prémont 2010-03-24 22:49 ` Bruno Prémont 2010-03-27 0:22 ` [PATCH v4 " Bruno Prémont 2010-03-27 0:22 ` Bruno Prémont 2010-03-29 20:30 ` [PATCH v5 " Bruno Prémont 2010-03-29 20:30 ` Bruno Prémont 2010-03-24 22:51 ` [PATCH v3 3/6] hid: add backlight " Bruno Prémont 2010-03-24 22:51 ` Bruno Prémont 2010-03-24 22:51 ` Bruno Prémont 2010-03-24 22:54 ` [PATCH v3 4/6] hid: add lcd " Bruno Prémont 2010-03-24 22:54 ` Bruno Prémont 2010-03-24 22:54 ` Bruno Prémont 2010-03-24 22:55 ` [PATCH v3 5/6] hid: add GPO (leds) " Bruno Prémont 2010-03-24 22:55 ` Bruno Prémont 2010-03-24 22:55 ` Bruno Prémont 2010-03-24 22:58 ` [PATCH v3 6/6] hid: add experimental access to PicoLCD device's EEPROM and FLASH Bruno Prémont 2010-03-24 22:58 ` [PATCH v3 6/6] hid: add experimental access to PicoLCD device's Bruno Prémont 2010-03-24 22:58 ` [PATCH v3 6/6] hid: add experimental access to PicoLCD device's EEPROM and FLASH Bruno Prémont 2010-03-29 9:44 ` Jiri Kosina 2010-03-29 9:44 ` [PATCH v3 6/6] hid: add experimental access to PicoLCD device's Jiri Kosina 2010-03-29 20:34 ` [PATCH v4 6/6] hid: add experimental access to PicoLCD device's EEPROM and FLASH Bruno Prémont 2010-03-29 20:34 ` [PATCH v4 6/6] hid: add experimental access to PicoLCD device's Bruno Prémont 2010-03-29 20:34 ` [PATCH v4 6/6] hid: add experimental access to PicoLCD device's EEPROM and FLASH Bruno Prémont
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20100411130226.4086a92d@neptune.home \ --to=bonbons@linux-vserver.org \ --cc=dmitry.torokhov@gmail.com \ --cc=jkosina@suse.cz \ --cc=linux-input@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=npavel@ituner.com \ --cc=oliver@neukum.org \ --cc=rvinyard@cs.nmsu.edu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.