mirror of https://gitee.com/openkylin/linux.git
usb: gadget: f_phonet: add configfs support
f_phonet learns about configfs so we can remove in-kernel gadget drivers. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
b904d0811d
commit
83408745b2
|
@ -0,0 +1,8 @@
|
|||
What: /config/usb-gadget/gadget/functions/phonet.name
|
||||
Date: May 2013
|
||||
KenelVersion: 3.11
|
||||
Description:
|
||||
|
||||
This item contains just one readonly attribute: ifname.
|
||||
It contains the network interface name assigned during
|
||||
network device registration.
|
|
@ -541,6 +541,16 @@ choice
|
|||
|
||||
# this first set of drivers all depend on bulk-capable hardware.
|
||||
|
||||
config USB_CONFIGFS_PHONET
|
||||
boolean "Phonet protocol"
|
||||
depends on USB_CONFIGFS
|
||||
depends on NET
|
||||
depends on PHONET
|
||||
select USB_U_ETHER
|
||||
select USB_F_PHONET
|
||||
help
|
||||
The Phonet protocol implementation for USB device.
|
||||
|
||||
config USB_ZERO
|
||||
tristate "Gadget Zero (DEVELOPMENT)"
|
||||
select USB_LIBCOMPOSITE
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/usb/composite.h>
|
||||
|
||||
#include "u_phonet.h"
|
||||
#include "u_ether.h"
|
||||
|
||||
#define PN_MEDIA_USB 0x1B
|
||||
#define MAXPACKET 512
|
||||
|
@ -581,6 +582,58 @@ static int pn_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
return status;
|
||||
}
|
||||
|
||||
static inline struct f_phonet_opts *to_f_phonet_opts(struct config_item *item)
|
||||
{
|
||||
return container_of(to_config_group(item), struct f_phonet_opts,
|
||||
func_inst.group);
|
||||
}
|
||||
|
||||
CONFIGFS_ATTR_STRUCT(f_phonet_opts);
|
||||
static ssize_t f_phonet_attr_show(struct config_item *item,
|
||||
struct configfs_attribute *attr,
|
||||
char *page)
|
||||
{
|
||||
struct f_phonet_opts *opts = to_f_phonet_opts(item);
|
||||
struct f_phonet_opts_attribute *f_phonet_opts_attr =
|
||||
container_of(attr, struct f_phonet_opts_attribute, attr);
|
||||
ssize_t ret = 0;
|
||||
|
||||
if (f_phonet_opts_attr->show)
|
||||
ret = f_phonet_opts_attr->show(opts, page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void phonet_attr_release(struct config_item *item)
|
||||
{
|
||||
struct f_phonet_opts *opts = to_f_phonet_opts(item);
|
||||
|
||||
usb_put_function_instance(&opts->func_inst);
|
||||
}
|
||||
|
||||
static struct configfs_item_operations phonet_item_ops = {
|
||||
.release = phonet_attr_release,
|
||||
.show_attribute = f_phonet_attr_show,
|
||||
};
|
||||
|
||||
static ssize_t f_phonet_ifname_show(struct f_phonet_opts *opts, char *page)
|
||||
{
|
||||
return gether_get_ifname(opts->net, page, PAGE_SIZE);
|
||||
}
|
||||
|
||||
static struct f_phonet_opts_attribute f_phonet_ifname =
|
||||
__CONFIGFS_ATTR_RO(ifname, f_phonet_ifname_show);
|
||||
|
||||
static struct configfs_attribute *phonet_attrs[] = {
|
||||
&f_phonet_ifname.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct config_item_type phonet_func_type = {
|
||||
.ct_item_ops = &phonet_item_ops,
|
||||
.ct_attrs = phonet_attrs,
|
||||
.ct_owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static void phonet_free_inst(struct usb_function_instance *f)
|
||||
{
|
||||
struct f_phonet_opts *opts;
|
||||
|
@ -606,6 +659,9 @@ static struct usb_function_instance *phonet_alloc_inst(void)
|
|||
if (IS_ERR(opts->net))
|
||||
return ERR_PTR(PTR_ERR(opts->net));
|
||||
|
||||
config_group_init_type_name(&opts->func_inst.group, "",
|
||||
&phonet_func_type);
|
||||
|
||||
return &opts->func_inst;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue