mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			124 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/drivers/usb/dwc3/proc.c	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ linux-4.9.y/drivers/usb/dwc3/proc.c	2021-06-07 13:01:34.000000000 +0300
 | |
| @@ -0,0 +1,120 @@
 | |
| +/*
 | |
| + * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
 | |
| + */
 | |
| +
 | |
| +#include <linux/proc_fs.h>
 | |
| +#include <linux/seq_file.h>
 | |
| +#include <linux/device.h>
 | |
| +#include <linux/io.h>
 | |
| +#include <linux/platform_device.h>
 | |
| +
 | |
| +#include "core.h"
 | |
| +
 | |
| +#define DWC3_PROC_ROOT "dwc3"
 | |
| +#define DWC3_PROC_CONNECTED_STATUS "csts"
 | |
| +
 | |
| +static struct proc_dir_entry *proc_dwc3_dir = NULL;
 | |
| +static int proc_dwc3_dir_cnt = 0;
 | |
| +
 | |
| +static void dwc3_stats_seq_printout(struct seq_file *s)
 | |
| +{
 | |
| +	struct dwc3 *dwc = s->private;
 | |
| +
 | |
| +	switch (dwc->udc_connect_status) {
 | |
| +	case UDC_CONNECT_HOST:
 | |
| +		seq_puts(s, "cnt2host\n");
 | |
| +		break;
 | |
| +	case UDC_CONNECT_CHARGER:
 | |
| +		seq_puts(s, "cnt2charger\n");
 | |
| +		break;
 | |
| +	default:
 | |
| +		seq_puts(s, "disconnected\n");
 | |
| +		break;
 | |
| +	}
 | |
| +}
 | |
| +
 | |
| +/* define parameters where showed in proc file */
 | |
| +static int dwc3_stats_seq_show(struct seq_file *s, void *v)
 | |
| +{
 | |
| +	if (s == NULL)
 | |
| +		return -EINVAL;
 | |
| +
 | |
| +	dwc3_stats_seq_printout(s);
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +/* proc file open */
 | |
| +static int dwc3_stats_proc_open(struct inode *inode, struct file *file)
 | |
| +{
 | |
| +	if ((inode == NULL) || (file == NULL))
 | |
| +		return -EINVAL;
 | |
| +
 | |
| +	return single_open(file, dwc3_stats_seq_show, PDE_DATA(inode));
 | |
| +};
 | |
| +
 | |
| +/* proc file operation */
 | |
| +static const struct file_operations dwc3_stats_proc_ops = {
 | |
| +	.owner = THIS_MODULE,
 | |
| +	.open = dwc3_stats_proc_open,
 | |
| +	.read = seq_read,
 | |
| +	.release = single_release,
 | |
| +};
 | |
| +
 | |
| +int dwc3_proc_init(struct dwc3 *dwc)
 | |
| +{
 | |
| +	struct proc_dir_entry *proc_entry = NULL;
 | |
| +
 | |
| +	if (dwc == NULL)
 | |
| +		return -EINVAL;
 | |
| +
 | |
| +	if (proc_dwc3_dir == NULL) {
 | |
| +		proc_entry = proc_mkdir(DWC3_PROC_ROOT, NULL);
 | |
| +		if (proc_entry == NULL) {
 | |
| +			pr_err("%s: failed to create proc file %s\n",
 | |
| +					__func__, DWC3_PROC_ROOT);
 | |
| +			return 1;
 | |
| +		}
 | |
| +		proc_dwc3_dir = proc_entry;
 | |
| +	}
 | |
| +	proc_dwc3_dir_cnt++;
 | |
| +
 | |
| +	proc_entry = proc_mkdir(to_platform_device(dwc->dev)->name, proc_dwc3_dir);
 | |
| +	if (proc_entry == NULL) {
 | |
| +		pr_err("%s: failed to create proc file %s\n",
 | |
| +				__func__, to_platform_device(dwc->dev)->name);
 | |
| +		return -1;
 | |
| +	}
 | |
| +	dwc->parent_entry = proc_entry;
 | |
| +
 | |
| +	proc_entry = proc_create_data(DWC3_PROC_CONNECTED_STATUS,
 | |
| +			0, dwc->parent_entry, &dwc3_stats_proc_ops, dwc);
 | |
| +	if (proc_entry == NULL) {
 | |
| +		pr_err("%s: failed to create proc file %s\n",
 | |
| +				__func__, DWC3_PROC_CONNECTED_STATUS);
 | |
| +		return -1;
 | |
| +	}
 | |
| +	dwc->csts_entry = proc_entry;
 | |
| +
 | |
| +	/*
 | |
| +	 * add here if more proc information need.
 | |
| +	 */
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +int dwc3_proc_shutdown(struct dwc3 *dwc)
 | |
| +{
 | |
| +	if (proc_dwc3_dir != NULL) {
 | |
| +		remove_proc_entry(DWC3_PROC_CONNECTED_STATUS, dwc->parent_entry);
 | |
| +		remove_proc_entry(to_platform_device(dwc->dev)->name, proc_dwc3_dir);
 | |
| +	}
 | |
| +
 | |
| +	if (proc_dwc3_dir_cnt)
 | |
| +		proc_dwc3_dir_cnt--;
 | |
| +
 | |
| +	if (proc_dwc3_dir_cnt == 0) {
 | |
| +		remove_proc_entry(DWC3_PROC_ROOT, NULL);
 | |
| +		proc_dwc3_dir = NULL;
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +}
 |