/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __GADGET_CONFIGFS__ #define __GADGET_CONFIGFS__ #include <linux/configfs.h> int check_user_usb_string(const char *name, struct usb_gadget_strings *stringtab_dev); #define GS_STRINGS_W(__struct, __name) \ static ssize_t __struct##_##__name##_store(struct config_item *item, \ const char *page, size_t len) \ { \ struct __struct *gs = to_##__struct(item); \ int ret; \ \ ret = usb_string_copy(page, &gs->__name); \ if (ret) \ return ret; \ return len; \ } #define GS_STRINGS_R(__struct, __name) \ static ssize_t __struct##_##__name##_show(struct config_item *item, char *page) \ { \ struct __struct *gs = to_##__struct(item); \ return sprintf(page, "%s\n", gs->__name ?: ""); \ } #define GS_STRINGS_RW(struct_name, _name) \ GS_STRINGS_R(struct_name, _name) \ GS_STRINGS_W(struct_name, _name) \ CONFIGFS_ATTR(struct_name##_, _name) #define USB_CONFIG_STRING_RW_OPS(struct_in) \ static struct configfs_item_operations struct_in##_langid_item_ops = { \ .release = struct_in##_attr_release, \ }; \ \ static struct config_item_type struct_in##_langid_type = { \ .ct_item_ops = &struct_in##_langid_item_ops, \ .ct_attrs = struct_in##_langid_attrs, \ .ct_owner = THIS_MODULE, \ } #define USB_CONFIG_STRINGS_LANG(struct_in, struct_member) \ static struct config_group *struct_in##_strings_make( \ struct config_group *group, \ const char *name) \ { \ struct struct_member *gi; \ struct struct_in *gs; \ struct struct_in *new; \ int langs = 0; \ int ret; \ \ new = kzalloc(sizeof(*new), GFP_KERNEL); \ if (!new) \ return ERR_PTR(-ENOMEM); \ \ ret = check_user_usb_string(name, &new->stringtab_dev); \ if (ret) \ goto err; \ config_group_init_type_name(&new->group, name, \ &struct_in##_langid_type); \ \ gi = container_of(group, struct struct_member, strings_group); \ ret = -EEXIST; \ list_for_each_entry(gs, &gi->string_list, list) { \ if (gs->stringtab_dev.language == new->stringtab_dev.language) \ goto err; \ langs++; \ } \ ret = -EOVERFLOW; \ if (langs >= MAX_USB_STRING_LANGS) \ goto err; \ \ list_add_tail(&new->list, &gi->string_list); \ return &new->group; \ err: \ kfree(new); \ return ERR_PTR(ret); \ } \ \ static void struct_in##_strings_drop( \ struct config_group *group, \ struct config_item *item) \ { \ config_item_put(item); \ } \ \ static struct configfs_group_operations struct_in##_strings_ops = { \ .make_group = &struct_in##_strings_make, \ .drop_item = &struct_in##_strings_drop, \ }; \ \ static struct config_item_type struct_in##_strings_type = { \ .ct_group_ops = &struct_in##_strings_ops, \ .ct_owner = THIS_MODULE, \ } #endif
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
association.h | File | 4.59 KB | 0644 |
|
atmel_usba_udc.h | File | 421 B | 0644 |
|
audio-v2.h | File | 13.17 KB | 0644 |
|
audio.h | File | 1.23 KB | 0644 |
|
c67x00.h | File | 1.82 KB | 0644 |
|
cdc-wdm.h | File | 651 B | 0644 |
|
cdc.h | File | 1.48 KB | 0644 |
|
cdc_ncm.h | File | 5.56 KB | 0644 |
|
ch9.h | File | 2.5 KB | 0644 |
|
chipidea.h | File | 2.77 KB | 0644 |
|
composite.h | File | 25.17 KB | 0644 |
|
ehci-dbgp.h | File | 2.05 KB | 0644 |
|
ehci_def.h | File | 7.89 KB | 0644 |
|
ehci_pdriver.h | File | 2.31 KB | 0644 |
|
ezusb.h | File | 286 B | 0644 |
|
functionfs.h | File | 151 B | 0644 |
|
g_hid.h | File | 1.13 KB | 0644 |
|
gadget.h | File | 32.65 KB | 0644 |
|
gadget_configfs.h | File | 2.94 KB | 0644 |
|
gpio_vbus.h | File | 1.13 KB | 0644 |
|
hcd.h | File | 25.93 KB | 0644 |
|
input.h | File | 716 B | 0644 |
|
iowarrior.h | File | 1.34 KB | 0644 |
|
irda.h | File | 3.76 KB | 0644 |
|
isp116x.h | File | 1.13 KB | 0644 |
|
isp1301.h | File | 2.38 KB | 0644 |
|
isp1362.h | File | 1.59 KB | 0644 |
|
isp1760.h | File | 633 B | 0644 |
|
m66592.h | File | 1.41 KB | 0644 |
|
musb-ux500.h | File | 899 B | 0644 |
|
musb.h | File | 4.59 KB | 0644 |
|
net2280.h | File | 23.55 KB | 0644 |
|
of.h | File | 1.46 KB | 0644 |
|
ohci_pdriver.h | File | 1.71 KB | 0644 |
|
otg-fsm.h | File | 8.61 KB | 0644 |
|
otg.h | File | 3.01 KB | 0644 |
|
pd.h | File | 8.98 KB | 0644 |
|
pd_bdo.h | File | 1011 B | 0644 |
|
pd_vdo.h | File | 7.58 KB | 0644 |
|
phy.h | File | 9.25 KB | 0644 |
|
phy_companion.h | File | 1.17 KB | 0644 |
|
quirks.h | File | 2.34 KB | 0644 |
|
r8a66597.h | File | 17.65 KB | 0644 |
|
renesas_usbhs.h | File | 4.76 KB | 0644 |
|
rndis_host.h | File | 5.94 KB | 0644 |
|
samsung_usb_phy.h | File | 530 B | 0644 |
|
serial.h | File | 17.12 KB | 0644 |
|
sl811.h | File | 838 B | 0644 |
|
storage.h | File | 2.58 KB | 0644 |
|
tcpm.h | File | 6.46 KB | 0644 |
|
tegra_usb_phy.h | File | 2.38 KB | 0644 |
|
tilegx.h | File | 983 B | 0644 |
|
typec.h | File | 7.04 KB | 0644 |
|
uas.h | File | 2.07 KB | 0644 |
|
ulpi.h | File | 1.99 KB | 0644 |
|
usb338x.h | File | 7.63 KB | 0644 |
|
usb_phy_generic.h | File | 892 B | 0644 |
|
usbnet.h | File | 10.01 KB | 0644 |
|
wusb-wa.h | File | 7.5 KB | 0644 |
|
wusb.h | File | 9.92 KB | 0644 |
|
xhci-dbgp.h | File | 825 B | 0644 |
|