Skip to content

Commit

Permalink
usbip: vudc: Add VUDC main file
Browse files Browse the repository at this point in the history
Add main vudc module file. This allows us to register suitable
platform device and driver (just like dummy_hcd does).

Currently number of vudc instances is determined using module
parameter but whole infrastructure is suitable to make vudc
creation dynamic (for example via configfs).

This commit is a result of cooperation between Samsung R&D Institute
Poland and Open Operating Systems Student Society at University
of Warsaw (O2S3@UW) consisting of:

    Igor Kotrasinski <ikotrasinsk@gmail.com>
    Karol Kosik <karo9@interia.eu>
    Ewelina Kosmider <3w3lfin@gmail.com>
    Dawid Lazarczyk <lazarczyk.dawid@gmail.com>
    Piotr Szulc <ps347277@students.mimuw.edu.pl>

Tutor and project owner:
    Krzysztof Opasiak <k.opasiak@samsung.com>

Signed-off-by: Igor Kotrasinski <i.kotrasinsk@samsung.com>
Signed-off-by: Karol Kosik <karo9@interia.eu>
[Various bug fixes and commit message update]
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Igor Kotrasinski authored and gregkh committed Apr 26, 2016
1 parent c7af4c2 commit 80fd9cd
Showing 1 changed file with 113 additions and 0 deletions.
113 changes: 113 additions & 0 deletions drivers/usb/usbip/vudc_main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
* Copyright (C) 2015-2016 Samsung Electronics
* Igor Kotrasinski <i.kotrasinsk@samsung.com>
* Krzysztof Opasiak <k.opasiak@samsung.com>
*
* 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, see <http://www.gnu.org/licenses/>.
*/

#include <linux/device.h>
#include <linux/list.h>
#include <linux/module.h>

#include "vudc.h"

static unsigned int vudc_number = 1;

module_param_named(num, vudc_number, uint, S_IRUGO);
MODULE_PARM_DESC(num, "number of emulated controllers");

static struct platform_driver vudc_driver = {
.probe = vudc_probe,
.remove = vudc_remove,
.driver = {
.name = GADGET_NAME,
},
};

static struct list_head vudc_devices = LIST_HEAD_INIT(vudc_devices);

static int __init init(void)
{
int retval = -ENOMEM;
int i;
struct vudc_device *udc_dev = NULL, *udc_dev2 = NULL;

if (usb_disabled())
return -ENODEV;

if (vudc_number < 1) {
pr_err("Number of emulated UDC must be no less than 1");
return -EINVAL;
}

retval = platform_driver_register(&vudc_driver);
if (retval < 0)
goto out;

for (i = 0; i < vudc_number; i++) {
udc_dev = alloc_vudc_device(i);
if (!udc_dev) {
retval = -ENOMEM;
goto cleanup;
}

retval = platform_device_add(udc_dev->pdev);
if (retval < 0) {
put_vudc_device(udc_dev);
goto cleanup;
}

list_add_tail(&udc_dev->dev_entry, &vudc_devices);
if (!platform_get_drvdata(udc_dev->pdev)) {
/*
* The udc was added successfully but its probe
* function failed for some reason.
*/
retval = -EINVAL;
goto cleanup;
}
}
goto out;

cleanup:
list_for_each_entry_safe(udc_dev, udc_dev2, &vudc_devices, dev_entry) {
list_del(&udc_dev->dev_entry);
platform_device_del(udc_dev->pdev);
put_vudc_device(udc_dev);
}

platform_driver_unregister(&vudc_driver);
out:
return retval;
}
module_init(init);

static void __exit cleanup(void)
{
struct vudc_device *udc_dev = NULL, *udc_dev2 = NULL;

list_for_each_entry_safe(udc_dev, udc_dev2, &vudc_devices, dev_entry) {
list_del(&udc_dev->dev_entry);
platform_device_unregister(udc_dev->pdev);
put_vudc_device(udc_dev);
}
platform_driver_unregister(&vudc_driver);
}
module_exit(cleanup);

MODULE_DESCRIPTION("USB over IP Device Controller");
MODULE_AUTHOR("Krzysztof Opasiak, Karol Kosik, Igor Kotrasinski");
MODULE_LICENSE("GPL");

0 comments on commit 80fd9cd

Please sign in to comment.