mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +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>
42 lines
910 B
C
42 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 */
|