aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@no-log.org>2013-01-27 23:51:56 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@no-log.org>2013-01-27 23:57:32 +0100
commit95a576df37e0562364449b6a4419e98ca1699064 (patch)
tree00210fa4a8b1296074d525d0ddb3f5a79bec64ab
parent9f95550206eec45dc2f5c1a2feecda701465cd7c (diff)
downloadkernel_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.c70
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;