aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuyang Du <yuyang.du@intel.com>2017-06-08 01:04:08 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-06-13 04:51:10 -0400
commitdff3565b8e1c0be6fc83ba47dcab45c149dcab5b (patch)
treeeecdc8e61cba37461c7711a55b7725620ec1a38e
parent89a73d281fa4f58942474ada19d34d7ea39af2f4 (diff)
usbip: vhci-hcd: Rework vhci_hcd_init
A vhci struct is added as the platform-specific data to the vhci platform device, in order to get the vhci by its platform device. This is done in vhci_hcd_init(). Signed-off-by: Yuyang Du <yuyang.du@intel.com> Acked-by: Shuah Khan <shuahkh@osg.samsung.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/usbip/vhci_hcd.c51
-rw-r--r--tools/usb/usbip/libsrc/vhci_driver.c2
-rw-r--r--tools/usb/usbip/libsrc/vhci_driver.h1
3 files changed, 30 insertions, 24 deletions
diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index a445d237b0c3..893a5dedd0e5 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -1178,24 +1178,6 @@ static struct platform_driver vhci_driver = {
1178 }, 1178 },
1179}; 1179};
1180 1180
1181static int add_platform_device(int id)
1182{
1183 struct platform_device *pdev;
1184 int dev_nr;
1185
1186 if (id == 0)
1187 dev_nr = -1;
1188 else
1189 dev_nr = id;
1190
1191 pdev = platform_device_register_simple(driver_name, dev_nr, NULL, 0);
1192 if (IS_ERR(pdev))
1193 return PTR_ERR(pdev);
1194
1195 vhcis[id].pdev = pdev;
1196 return 0;
1197}
1198
1199static void del_platform_devices(void) 1181static void del_platform_devices(void)
1200{ 1182{
1201 struct platform_device *pdev; 1183 struct platform_device *pdev;
@@ -1224,23 +1206,46 @@ static int __init vhci_hcd_init(void)
1224 if (vhcis == NULL) 1206 if (vhcis == NULL)
1225 return -ENOMEM; 1207 return -ENOMEM;
1226 1208
1209 for (i = 0; i < vhci_num_controllers; i++) {
1210 vhcis[i].pdev = platform_device_alloc(driver_name, i);
1211 if (!vhcis[i].pdev) {
1212 i--;
1213 while (i >= 0)
1214 platform_device_put(vhcis[i--].pdev);
1215 ret = -ENOMEM;
1216 goto err_device_alloc;
1217 }
1218 }
1219 for (i = 0; i < vhci_num_controllers; i++) {
1220 void *vhci = &vhcis[i];
1221 ret = platform_device_add_data(vhcis[i].pdev, &vhci, sizeof(void *));
1222 if (ret)
1223 goto err_driver_register;
1224 }
1225
1227 ret = platform_driver_register(&vhci_driver); 1226 ret = platform_driver_register(&vhci_driver);
1228 if (ret) 1227 if (ret)
1229 goto err_driver_register; 1228 goto err_driver_register;
1230 1229
1231 for (i = 0; i < vhci_num_controllers; i++) { 1230 for (i = 0; i < vhci_num_controllers; i++) {
1232 ret = add_platform_device(i); 1231 ret = platform_device_add(vhcis[i].pdev);
1233 if (ret) 1232 if (ret < 0) {
1234 goto err_platform_device_register; 1233 i--;
1234 while (i >= 0)
1235 platform_device_del(vhcis[i--].pdev);
1236 goto err_add_hcd;
1237 }
1235 } 1238 }
1236 1239
1237 pr_info(DRIVER_DESC " v" USBIP_VERSION "\n"); 1240 pr_info(DRIVER_DESC " v" USBIP_VERSION "\n");
1238 return ret; 1241 return ret;
1239 1242
1240err_platform_device_register: 1243err_add_hcd:
1241 del_platform_devices();
1242 platform_driver_unregister(&vhci_driver); 1244 platform_driver_unregister(&vhci_driver);
1243err_driver_register: 1245err_driver_register:
1246 for (i = 0; i < vhci_num_controllers; i++)
1247 platform_device_put(vhcis[i].pdev);
1248err_device_alloc:
1244 kfree(vhcis); 1249 kfree(vhcis);
1245 return ret; 1250 return ret;
1246} 1251}
diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c
index f519c73c6d99..3d8189b4f539 100644
--- a/tools/usb/usbip/libsrc/vhci_driver.c
+++ b/tools/usb/usbip/libsrc/vhci_driver.c
@@ -248,7 +248,7 @@ int usbip_vhci_driver_open(void)
248 vhci_driver->hc_device = 248 vhci_driver->hc_device =
249 udev_device_new_from_subsystem_sysname(udev_context, 249 udev_device_new_from_subsystem_sysname(udev_context,
250 USBIP_VHCI_BUS_TYPE, 250 USBIP_VHCI_BUS_TYPE,
251 USBIP_VHCI_DRV_NAME); 251 USBIP_VHCI_DEVICE_NAME);
252 if (!vhci_driver->hc_device) { 252 if (!vhci_driver->hc_device) {
253 err("udev_device_new_from_subsystem_sysname failed"); 253 err("udev_device_new_from_subsystem_sysname failed");
254 goto err; 254 goto err;
diff --git a/tools/usb/usbip/libsrc/vhci_driver.h b/tools/usb/usbip/libsrc/vhci_driver.h
index 33add142c46e..dfe19c1c0245 100644
--- a/tools/usb/usbip/libsrc/vhci_driver.h
+++ b/tools/usb/usbip/libsrc/vhci_driver.h
@@ -11,6 +11,7 @@
11#include "usbip_common.h" 11#include "usbip_common.h"
12 12
13#define USBIP_VHCI_BUS_TYPE "platform" 13#define USBIP_VHCI_BUS_TYPE "platform"
14#define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0"
14#define MAXNPORT 128 15#define MAXNPORT 128
15 16
16struct usbip_imported_device { 17struct usbip_imported_device {