diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> | 2013-01-27 23:51:56 +0100 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> | 2013-01-27 23:57:32 +0100 |
commit | 95a576df37e0562364449b6a4419e98ca1699064 (patch) | |
tree | 00210fa4a8b1296074d525d0ddb3f5a79bec64ab | |
parent | 9f95550206eec45dc2f5c1a2feecda701465cd7c (diff) | |
download | kernel_goldelico_gta04-replicant-4.0+3.7+WIP.zip kernel_goldelico_gta04-replicant-4.0+3.7+WIP.tar.gz kernel_goldelico_gta04-replicant-4.0+3.7+WIP.tar.bz2 |
usb: gadget: android: fix compilation.replicant-4.0+3.7+WIP
Without that fix we have:
undefined reference to `functionfs_acquire_dev_callback'
undefined reference to `functionfs_release_dev_callback'
To fix it, we backport commit 581791f5c7a480b2cc3431af9a6e799ffd51eb5e
(FunctionFS: enable multiple functions)
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
-rw-r--r-- | drivers/usb/gadget/android.c | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index 67ac8c0..1e1153b 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -219,6 +219,23 @@ static void android_disable(struct android_dev *dev) /*-------------------------------------------------------------------------*/ /* Supported functions initialization */ +#define GFS_MAX_DEVS 10 + +struct gfs_ffs_obj { + const char *name; + bool mounted; + bool desc_ready; + struct ffs_data *ffs_data; +}; + +static DEFINE_MUTEX(gfs_lock); +static unsigned int missing_funcs; +static bool gfs_ether_setup; +static bool gfs_registered; +static bool gfs_single_func; +static struct gfs_ffs_obj *ffs_tab; +static char *func_names[GFS_MAX_DEVS]; +static unsigned int func_num; struct functionfs_config { bool opened; @@ -226,6 +243,22 @@ struct functionfs_config { struct ffs_data *data; }; +static struct gfs_ffs_obj *gfs_find_dev(const char *dev_name) +{ + int i; + + ENTER(); + + if (gfs_single_func) + return &ffs_tab[0]; + + for (i = 0; i < func_num; i++) + if (strcmp(ffs_tab[i].name, dev_name) == 0) + return &ffs_tab[i]; + + return NULL; +} + static int ffs_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev) { @@ -366,12 +399,45 @@ static void functionfs_closed_callback(struct ffs_data *ffs) mutex_unlock(&dev->mutex); } -static int functionfs_check_dev_callback(const char *dev_name) +static void *functionfs_acquire_dev_callback(const char *dev_name) { - return 0; + struct gfs_ffs_obj *ffs_dev; + + ENTER(); + mutex_lock(&gfs_lock); + + ffs_dev = gfs_find_dev(dev_name); + if (!ffs_dev) { + ffs_dev = ERR_PTR(-ENODEV); + goto done; + } + + if (ffs_dev->mounted) { + ffs_dev = ERR_PTR(-EBUSY); + goto done; + } + ffs_dev->mounted = true; + +done: + mutex_unlock(&gfs_lock); + return ffs_dev; } +static void functionfs_release_dev_callback(struct ffs_data *ffs_data) +{ + struct gfs_ffs_obj *ffs_dev; + + ENTER(); + mutex_lock(&gfs_lock); + + ffs_dev = ffs_data->private_data; + if (ffs_dev) + ffs_dev->mounted = false; + + mutex_unlock(&gfs_lock); +} + struct adb_data { bool opened; bool enabled; |