diff options
| author | Christoph Hellwig <hch@lst.de> | 2015-10-03 09:32:38 -0400 |
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-10-14 01:12:57 -0400 |
| commit | 45b6a73f62ebcf3ff067895fb8030e67f4c7b67f (patch) | |
| tree | 11162c5088310be7c92c6645e8b1317388db92b4 /include | |
| parent | 870823e629ea194e6cf8e82a9694ac62cad49512 (diff) | |
usb-gadget: use per-attribute show and store methods
To simplify the configfs interface and remove boilerplate code that also
causes binary bloat.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/usb/gadget_configfs.h | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/include/linux/usb/gadget_configfs.h b/include/linux/usb/gadget_configfs.h index d74c0ae989d5..c36e95730de1 100644 --- a/include/linux/usb/gadget_configfs.h +++ b/include/linux/usb/gadget_configfs.h | |||
| @@ -7,9 +7,10 @@ int check_user_usb_string(const char *name, | |||
| 7 | struct usb_gadget_strings *stringtab_dev); | 7 | struct usb_gadget_strings *stringtab_dev); |
| 8 | 8 | ||
| 9 | #define GS_STRINGS_W(__struct, __name) \ | 9 | #define GS_STRINGS_W(__struct, __name) \ |
| 10 | static ssize_t __struct##_##__name##_store(struct __struct *gs, \ | 10 | static ssize_t __struct##_##__name##_store(struct config_item *item, \ |
| 11 | const char *page, size_t len) \ | 11 | const char *page, size_t len) \ |
| 12 | { \ | 12 | { \ |
| 13 | struct __struct *gs = to_##__struct(item); \ | ||
| 13 | int ret; \ | 14 | int ret; \ |
| 14 | \ | 15 | \ |
| 15 | ret = usb_string_copy(page, &gs->__name); \ | 16 | ret = usb_string_copy(page, &gs->__name); \ |
| @@ -19,30 +20,20 @@ int check_user_usb_string(const char *name, | |||
| 19 | } | 20 | } |
| 20 | 21 | ||
| 21 | #define GS_STRINGS_R(__struct, __name) \ | 22 | #define GS_STRINGS_R(__struct, __name) \ |
| 22 | static ssize_t __struct##_##__name##_show(struct __struct *gs, \ | 23 | static ssize_t __struct##_##__name##_show(struct config_item *item, char *page) \ |
| 23 | char *page) \ | ||
| 24 | { \ | 24 | { \ |
| 25 | struct __struct *gs = to_##__struct(item); \ | ||
| 25 | return sprintf(page, "%s\n", gs->__name ?: ""); \ | 26 | return sprintf(page, "%s\n", gs->__name ?: ""); \ |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | #define GS_STRING_ITEM_ATTR(struct_name, name) \ | ||
| 29 | static struct struct_name##_attribute struct_name##_##name = \ | ||
| 30 | __CONFIGFS_ATTR(name, S_IRUGO | S_IWUSR, \ | ||
| 31 | struct_name##_##name##_show, \ | ||
| 32 | struct_name##_##name##_store) | ||
| 33 | |||
| 34 | #define GS_STRINGS_RW(struct_name, _name) \ | 29 | #define GS_STRINGS_RW(struct_name, _name) \ |
| 35 | GS_STRINGS_R(struct_name, _name) \ | 30 | GS_STRINGS_R(struct_name, _name) \ |
| 36 | GS_STRINGS_W(struct_name, _name) \ | 31 | GS_STRINGS_W(struct_name, _name) \ |
| 37 | GS_STRING_ITEM_ATTR(struct_name, _name) | 32 | CONFIGFS_ATTR(struct_name##_, _name) |
| 38 | 33 | ||
| 39 | #define USB_CONFIG_STRING_RW_OPS(struct_in) \ | 34 | #define USB_CONFIG_STRING_RW_OPS(struct_in) \ |
| 40 | CONFIGFS_ATTR_OPS(struct_in); \ | ||
| 41 | \ | ||
| 42 | static struct configfs_item_operations struct_in##_langid_item_ops = { \ | 35 | static struct configfs_item_operations struct_in##_langid_item_ops = { \ |
| 43 | .release = struct_in##_attr_release, \ | 36 | .release = struct_in##_attr_release, \ |
| 44 | .show_attribute = struct_in##_attr_show, \ | ||
| 45 | .store_attribute = struct_in##_attr_store, \ | ||
| 46 | }; \ | 37 | }; \ |
| 47 | \ | 38 | \ |
| 48 | static struct config_item_type struct_in##_langid_type = { \ | 39 | static struct config_item_type struct_in##_langid_type = { \ |
