mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-09 03:20:05 +00:00
This patch enhances the HID gadget driver to support dynamic configuration
of the interrupt polling interval (bInterval) via configfs. A new
‘interval’ attribute is exposed under each HID function’s configfs
directory, and any write to it will adjust the poll rate for all endpoints
without requiring a rebuild.
When the attribute has never been written, legacy defaults are preserved:
• Full-Speed (FS) endpoints (IN & OUT) poll every 10 ms
• High-Speed (HS) endpoints (IN & OUT) poll every 4 micro-frames
(~1 ms)
To implement this cleanly:
• Add two new fields to f_hid_opts and f_hidg:
– unsigned char interval
– bool interval_user_set
• Introduce dedicated f_hid_opts_interval_show/store functions.
The store routine parses into an unsigned int, bounds‐checks,
assigns to opts->interval, and sets opts->interval_user_set = true.
• Initialize opts->interval = 4 and opts->interval_user_set = false in
hidg_alloc_inst(), then copy both into the live f_hidg instance in
hidg_alloc().
• In hidg_bind(), set each endpoint’s bInterval based on whether the
user has written the attribute:
– If interval_user_set == false, use FS=10 / HS=4
– If interval_user_set == true, use the user’s value for both FS
& HS
Signed-off-by: Ben Hoff <hoff.benjamin.k@gmail.com>
Link: https://lore.kernel.org/r/20250429182809.811786-1-hoff.benjamin.k@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
43 lines
910 B
C
43 lines
910 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* u_hid.h
|
|
*
|
|
* Utility definitions for the hid function
|
|
*
|
|
* Copyright (c) 2014 Samsung Electronics Co., Ltd.
|
|
* http://www.samsung.com
|
|
*
|
|
* Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
|
|
*/
|
|
|
|
#ifndef U_HID_H
|
|
#define U_HID_H
|
|
|
|
#include <linux/usb/composite.h>
|
|
|
|
struct f_hid_opts {
|
|
struct usb_function_instance func_inst;
|
|
int minor;
|
|
unsigned char subclass;
|
|
unsigned char protocol;
|
|
unsigned char no_out_endpoint;
|
|
unsigned short report_length;
|
|
unsigned short report_desc_length;
|
|
unsigned char *report_desc;
|
|
bool report_desc_alloc;
|
|
unsigned char interval;
|
|
bool interval_user_set;
|
|
|
|
/*
|
|
* Protect the data form concurrent access by read/write
|
|
* and create symlink/remove symlink.
|
|
*/
|
|
struct mutex lock;
|
|
int refcnt;
|
|
};
|
|
|
|
int ghid_setup(struct usb_gadget *g, int count);
|
|
void ghid_cleanup(void);
|
|
|
|
#endif /* U_HID_H */
|