Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/sun-nontendocm-kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanTheMan827 <790119+DanTheMan827@users.noreply.github.com>2017-12-20 01:07:20 +0300
committermadmonkey1907 <madfkingmonkey@gmail.com>2017-12-20 01:07:20 +0300
commitf82225622fef037edef3f0ea18799b920219f3bd (patch)
treeb0bd126b5036e24d77c12f56d00ced0a55e20383
parent113b9526b01efd295e30c18efc051c10a95679ed (diff)
sunxi_usb (#1)
* Modify sunxi_usb to allow switching between host and device mode through with /sys/devices/sunxi_usb/usb_role
-rw-r--r--drivers/usb/sunxi_usb/manager/usb_manager.c59
-rw-r--r--drivers/usb/sunxi_usb/manager/usb_msg_center.c5
-rw-r--r--drivers/usb/sunxi_usb/manager/usb_msg_center.h1
3 files changed, 63 insertions, 2 deletions
diff --git a/drivers/usb/sunxi_usb/manager/usb_manager.c b/drivers/usb/sunxi_usb/manager/usb_manager.c
index dee4504e..a44b485d 100644
--- a/drivers/usb/sunxi_usb/manager/usb_manager.c
+++ b/drivers/usb/sunxi_usb/manager/usb_manager.c
@@ -40,12 +40,20 @@
#include <mach/platform.h>
#include <linux/gpio.h>
+#include <linux/device.h>
+#include <linux/sysfs.h>
+#include <linux/kobject.h>
+
#include "../include/sunxi_usb_config.h"
#include "usb_manager.h"
#include "usbc_platform.h"
#include "usb_hw_scan.h"
#include "usb_msg_center.h"
+static struct device *dev_attr_sunxi_usb;
+static struct kobject kobj_sunxi_usb;
+static struct usb_scan_info g_usb_scan_info;
+
static struct usb_cfg g_usb_cfg;
#ifdef CONFIG_USB_SUNXI_USB0_OTG
@@ -395,7 +403,7 @@ static __s32 usb_script_parse(struct usb_cfg *cfg)
memset(&cfg->port[i],0,sizeof(cfg->port[0]));
}
cfg->port[0].enable = 1;
- cfg->port[0].port_type = USB_PORT_TYPE_HOST;
+ cfg->port[0].port_type = USB_PORT_TYPE_OTG;
cfg->port[0].detect_type = USB_DETECT_TYPE_DP_DM;
return 0;
@@ -552,6 +560,47 @@ static __s32 get_usb_cfg(struct usb_cfg *cfg)
return 0;
}
+static ssize_t show_usb_role(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ enum usb_role role = USB_ROLE_NULL;
+
+ role = get_usb_role();
+ return sprintf(buf, "%u\n", role);
+}
+
+static ssize_t store_usb_role(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+ enum usb_role role = USB_ROLE_NULL;
+ enum usb_role target_role = USB_ROLE_NULL;
+ role = get_usb_role();
+
+ if(!strncmp(buf, "0", 1)){
+ target_role = USB_ROLE_NULL;
+ }else if(!strncmp(buf, "1", 1)){
+ target_role = USB_ROLE_HOST;
+ }else if(!strncmp(buf, "2", 1)){
+ target_role = USB_ROLE_DEVICE;
+ }
+
+ if(role == USB_ROLE_DEVICE)
+ hw_rmmod_usb_device();
+
+ if(role == USB_ROLE_HOST)
+ hw_rmmod_usb_host();
+
+ if(target_role == USB_ROLE_DEVICE)
+ hw_insmod_usb_device();
+
+ if(target_role == USB_ROLE_HOST)
+ hw_insmod_usb_host();
+
+ usb_msg_center(&g_usb_cfg);
+
+ return count;
+}
+
+static DEVICE_ATTR(usb_role, 0644, show_usb_role, store_usb_role);
+
static int __init usb_manager_init(void)
{
__s32 ret = 0;
@@ -614,6 +663,10 @@ static int __init usb_manager_init(void)
#endif
DMSG_MANAGER_DEBUG("[sw usb]: usb_manager_init end\n");
+ // Create /sys/devices/sunxi_usb
+ dev_attr_sunxi_usb = root_device_register("sunxi_usb");
+ kobj_sunxi_usb = dev_attr_sunxi_usb->kobj;
+ sysfs_create_file(&kobj_sunxi_usb, &dev_attr_usb_role.attr);
return 0;
}
@@ -653,7 +706,9 @@ static void __exit usb_manager_exit(void)
usb_hw_scan_exit(&g_usb_cfg);
}
#endif
-
+
+ sysfs_remove_file(&kobj_sunxi_usb, &dev_attr_usb_role.attr);
+ root_device_unregister(dev_attr_sunxi_usb);
usbc0_platform_device_exit(&g_usb_cfg.port[0]);
return;
}
diff --git a/drivers/usb/sunxi_usb/manager/usb_msg_center.c b/drivers/usb/sunxi_usb/manager/usb_msg_center.c
index 0739b257..d850b9f2 100644
--- a/drivers/usb/sunxi_usb/manager/usb_msg_center.c
+++ b/drivers/usb/sunxi_usb/manager/usb_msg_center.c
@@ -57,6 +57,11 @@ static void set_usb_role(struct usb_msg_center_info *center_info, enum usb_role
return;
}
+void _set_usb_role(enum usb_role role)
+{
+ set_usb_role(&g_center_info, role);
+}
+
/*
void app_insmod_usb_host(void)
{
diff --git a/drivers/usb/sunxi_usb/manager/usb_msg_center.h b/drivers/usb/sunxi_usb/manager/usb_msg_center.h
index 7a0e6780..70fc048e 100644
--- a/drivers/usb/sunxi_usb/manager/usb_msg_center.h
+++ b/drivers/usb/sunxi_usb/manager/usb_msg_center.h
@@ -52,6 +52,7 @@ void hw_insmod_usb_device(void);
void hw_rmmod_usb_device(void);
enum usb_role get_usb_role(void);
+void _set_usb_role(enum usb_role role);
void usb_msg_center(struct usb_cfg *cfg);
s32 usb_msg_center_init(struct usb_cfg *cfg);