-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
USB: EHCI: Move sysfs related bits into ehci-sysfs.c
The only sysfs attr implemented so far is "companion" from ehci-hub.c, but in the next patch we are going to add another sysfs file, so prior to that let's structure things and move already-in-there sysfs code to separate file. NOTE: All the code I'm moving into this new file was written by Alan Stern (in 57e06c1 "EHCI: force high-speed devices to run at full speed"; Jan 16 2007), that's why I'm putting Copyright (C) 2007 by Alan Stern there after explicit request from the author. Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
- Loading branch information
Kirill Smelkov
authored and
Greg Kroah-Hartman
committed
Jul 8, 2011
1 parent
6f95b4b
commit 4c67045
Showing
3 changed files
with
97 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/* | ||
* Copyright (C) 2007 by Alan Stern | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; either version 2 of the License, or (at your | ||
* option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
* for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software Foundation, | ||
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
*/ | ||
|
||
/* this file is part of ehci-hcd.c */ | ||
|
||
|
||
/* Display the ports dedicated to the companion controller */ | ||
static ssize_t show_companion(struct device *dev, | ||
struct device_attribute *attr, | ||
char *buf) | ||
{ | ||
struct ehci_hcd *ehci; | ||
int nports, index, n; | ||
int count = PAGE_SIZE; | ||
char *ptr = buf; | ||
|
||
ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); | ||
nports = HCS_N_PORTS(ehci->hcs_params); | ||
|
||
for (index = 0; index < nports; ++index) { | ||
if (test_bit(index, &ehci->companion_ports)) { | ||
n = scnprintf(ptr, count, "%d\n", index + 1); | ||
ptr += n; | ||
count -= n; | ||
} | ||
} | ||
return ptr - buf; | ||
} | ||
|
||
/* | ||
* Dedicate or undedicate a port to the companion controller. | ||
* Syntax is "[-]portnum", where a leading '-' sign means | ||
* return control of the port to the EHCI controller. | ||
*/ | ||
static ssize_t store_companion(struct device *dev, | ||
struct device_attribute *attr, | ||
const char *buf, size_t count) | ||
{ | ||
struct ehci_hcd *ehci; | ||
int portnum, new_owner; | ||
|
||
ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev))); | ||
new_owner = PORT_OWNER; /* Owned by companion */ | ||
if (sscanf(buf, "%d", &portnum) != 1) | ||
return -EINVAL; | ||
if (portnum < 0) { | ||
portnum = - portnum; | ||
new_owner = 0; /* Owned by EHCI */ | ||
} | ||
if (portnum <= 0 || portnum > HCS_N_PORTS(ehci->hcs_params)) | ||
return -ENOENT; | ||
portnum--; | ||
if (new_owner) | ||
set_bit(portnum, &ehci->companion_ports); | ||
else | ||
clear_bit(portnum, &ehci->companion_ports); | ||
set_owner(ehci, portnum, new_owner); | ||
return count; | ||
} | ||
static DEVICE_ATTR(companion, 0644, show_companion, store_companion); | ||
|
||
static inline int create_sysfs_files(struct ehci_hcd *ehci) | ||
{ | ||
int i = 0; | ||
|
||
/* with integrated TT there is no companion! */ | ||
if (!ehci_is_TDI(ehci)) | ||
i = device_create_file(ehci_to_hcd(ehci)->self.controller, | ||
&dev_attr_companion); | ||
return i; | ||
} | ||
|
||
static inline void remove_sysfs_files(struct ehci_hcd *ehci) | ||
{ | ||
/* with integrated TT there is no companion! */ | ||
if (!ehci_is_TDI(ehci)) | ||
device_remove_file(ehci_to_hcd(ehci)->self.controller, | ||
&dev_attr_companion); | ||
} |