diff options
author | Yuyang Du <yuyang.du@intel.com> | 2017-06-08 01:04:08 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-06-13 04:51:10 -0400 |
commit | dff3565b8e1c0be6fc83ba47dcab45c149dcab5b (patch) | |
tree | eecdc8e61cba37461c7711a55b7725620ec1a38e | |
parent | 89a73d281fa4f58942474ada19d34d7ea39af2f4 (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.c | 51 | ||||
-rw-r--r-- | tools/usb/usbip/libsrc/vhci_driver.c | 2 | ||||
-rw-r--r-- | tools/usb/usbip/libsrc/vhci_driver.h | 1 |
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 | ||
1181 | static 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 | |||
1199 | static void del_platform_devices(void) | 1181 | static 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 | ||
1240 | err_platform_device_register: | 1243 | err_add_hcd: |
1241 | del_platform_devices(); | ||
1242 | platform_driver_unregister(&vhci_driver); | 1244 | platform_driver_unregister(&vhci_driver); |
1243 | err_driver_register: | 1245 | err_driver_register: |
1246 | for (i = 0; i < vhci_num_controllers; i++) | ||
1247 | platform_device_put(vhcis[i].pdev); | ||
1248 | err_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 | ||
16 | struct usbip_imported_device { | 17 | struct usbip_imported_device { |