]> git.karo-electronics.de Git - linux-beck.git/commitdiff
greybus: hd: generalise cport allocation
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 11 May 2016 08:18:02 +0000 (10:18 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 13 May 2016 13:30:05 +0000 (15:30 +0200)
Generalise CPort allocation by allowing host-device drivers to override
the default implementation.

Also pass the connection flags down the stack as such information is
needed for proper CPort allocation. Specifically, this will initially be
used to allow the camera driver to allocate the dedicated CDSI CPorts.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/connection.c
drivers/staging/greybus/hd.c
drivers/staging/greybus/hd.h

index ac99fc043e546cd395b3fe9f3184b7c6ab3d9bea..395a9dfc99c0d682371e7c94d640fdb3575c5372 100644 (file)
@@ -152,7 +152,7 @@ _gb_connection_create(struct gb_host_device *hd, int hd_cport_id,
                goto err_unlock;
        }
 
-       ret = gb_hd_cport_allocate(hd, hd_cport_id);
+       ret = gb_hd_cport_allocate(hd, hd_cport_id, flags);
        if (ret < 0) {
                dev_err(&hd->dev, "failed to allocate cport: %d\n", ret);
                goto err_unlock;
index b87e086748b230647b7f79091c6669821050e8a3..fba6d766209f9457f455e0e4f595a5e9b3537dcd 100644 (file)
@@ -55,11 +55,15 @@ int gb_hd_cport_reserve(struct gb_host_device *hd, u16 cport_id)
 EXPORT_SYMBOL_GPL(gb_hd_cport_reserve);
 
 /* Locking: Caller guarantees serialisation */
-int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id)
+int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id,
+                               unsigned long flags)
 {
        struct ida *id_map = &hd->cport_id_map;
        int ida_start, ida_end;
 
+       if (hd->driver->cport_allocate)
+               return hd->driver->cport_allocate(hd, cport_id, flags);
+
        if (cport_id < 0) {
                ida_start = 0;
                ida_end = hd->num_cports;
@@ -77,6 +81,11 @@ int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id)
 /* Locking: Caller guarantees serialisation */
 void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id)
 {
+       if (hd->driver->cport_release) {
+               hd->driver->cport_release(hd, cport_id);
+               return;
+       }
+
        ida_simple_remove(&hd->cport_id_map, cport_id);
 }
 
index 5d74e0c45162ca5c85c3a5f94c7cb774128ff50a..80573aed56ef01084929aa0a5ee3474b33bd24eb 100644 (file)
@@ -16,6 +16,9 @@ struct gb_message;
 struct gb_hd_driver {
        size_t  hd_priv_size;
 
+       int (*cport_allocate)(struct gb_host_device *hd, int cport_id,
+                               unsigned long flags);
+       void (*cport_release)(struct gb_host_device *hd, u16 cport_id);
        int (*cport_enable)(struct gb_host_device *hd, u16 cport_id);
        int (*cport_disable)(struct gb_host_device *hd, u16 cport_id);
        int (*message_send)(struct gb_host_device *hd, u16 dest_cport_id,
@@ -51,7 +54,8 @@ struct gb_host_device {
 #define to_gb_host_device(d) container_of(d, struct gb_host_device, dev)
 
 int gb_hd_cport_reserve(struct gb_host_device *hd, u16 cport_id);
-int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id);
+int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id,
+                                       unsigned long flags);
 void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id);
 
 struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,