greybus: introduce a connection abstraction
Within a UniPro network a pair of CPorts can be linked to form a UniPro Connection. This patch creates a new abstraction to represent an AP CPort that is connected with a CPort used by a function within a Greybus module. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
This commit is contained in:
parent
ef0d2ba201
commit
c68adb2f2c
|
@ -6,6 +6,7 @@ greybus-y := core.o \
|
||||||
module.o \
|
module.o \
|
||||||
interface.o \
|
interface.o \
|
||||||
function.o \
|
function.o \
|
||||||
|
connection.o \
|
||||||
i2c-gb.o \
|
i2c-gb.o \
|
||||||
gpio-gb.o \
|
gpio-gb.o \
|
||||||
sdio-gb.o \
|
sdio-gb.o \
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Greybus connections
|
||||||
|
*
|
||||||
|
* Copyright 2014 Google Inc.
|
||||||
|
*
|
||||||
|
* Released under the GPLv2 only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "greybus.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up a Greybus connection, representing the bidirectional link
|
||||||
|
* between a CPort on a (local) Greybus host device and a CPort on
|
||||||
|
* another Greybus module.
|
||||||
|
*
|
||||||
|
* Returns a pointer to the new connection if successful, or a null
|
||||||
|
* pointer otherwise.
|
||||||
|
*/
|
||||||
|
struct gb_connection *gb_connection_create(struct greybus_host_device *hd,
|
||||||
|
u16 cport_id, struct gb_function *function)
|
||||||
|
{
|
||||||
|
struct gb_connection *connection;
|
||||||
|
|
||||||
|
connection = kzalloc(sizeof(*connection), GFP_KERNEL);
|
||||||
|
if (!connection)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
connection->hd = hd; /* XXX refcount? */
|
||||||
|
connection->cport_id = cport_id;
|
||||||
|
connection->function = function; /* XXX refcount? */
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tear down a previously set up connection.
|
||||||
|
*/
|
||||||
|
void gb_connection_destroy(struct gb_connection *connection)
|
||||||
|
{
|
||||||
|
if (WARN_ON(!connection))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* XXX Need to wait for any outstanding requests to complete */
|
||||||
|
|
||||||
|
/* kref_put(function); */
|
||||||
|
/* kref_put(hd); */
|
||||||
|
kfree(connection);
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Greybus connections
|
||||||
|
*
|
||||||
|
* Copyright 2014 Google Inc.
|
||||||
|
*
|
||||||
|
* Released under the GPLv2 only.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONNECTION_H
|
||||||
|
#define __CONNECTION_H
|
||||||
|
|
||||||
|
#include <linux/list.h>
|
||||||
|
|
||||||
|
#include "greybus.h"
|
||||||
|
#include "function.h"
|
||||||
|
|
||||||
|
struct gb_connection {
|
||||||
|
struct gb_function *function;
|
||||||
|
struct greybus_host_device *hd;
|
||||||
|
u16 cport_id; /* Host side */
|
||||||
|
|
||||||
|
struct list_head host_links;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool gb_connection_setup(struct greybus_host_device *hd, u16 cport_id,
|
||||||
|
struct gb_function *function);
|
||||||
|
void gb_connection_teardown(struct gb_connection *connection);
|
||||||
|
|
||||||
|
#endif /* __CONNECTION_H */
|
|
@ -147,12 +147,22 @@ static struct device_type greybus_module_type = {
|
||||||
.release = greybus_module_release,
|
.release = greybus_module_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* XXX
|
||||||
|
* This needs to be driven by the list of functions that the
|
||||||
|
* manifest says are present.
|
||||||
|
*/
|
||||||
static int gb_init_subdevs(struct gb_module *gmod,
|
static int gb_init_subdevs(struct gb_module *gmod,
|
||||||
const struct greybus_module_id *id)
|
const struct greybus_module_id *id)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
/* Allocate all of the different "sub device types" for this device */
|
/* Allocate all of the different "sub device types" for this device */
|
||||||
|
|
||||||
|
/* XXX
|
||||||
|
* Decide what exactly we should get supplied for the i2c
|
||||||
|
* probe, and then work that back to what should be present
|
||||||
|
* in the manifest.
|
||||||
|
*/
|
||||||
retval = gb_i2c_probe(gmod, id);
|
retval = gb_i2c_probe(gmod, id);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto error_i2c;
|
goto error_i2c;
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
|
#include "connection.h"
|
||||||
|
|
||||||
|
|
||||||
/* Matches up with the Greybus Protocol specification document */
|
/* Matches up with the Greybus Protocol specification document */
|
||||||
|
@ -180,6 +181,7 @@ struct greybus_host_device {
|
||||||
const struct greybus_host_driver *driver;
|
const struct greybus_host_driver *driver;
|
||||||
|
|
||||||
struct list_head modules;
|
struct list_head modules;
|
||||||
|
struct list_head connections;
|
||||||
|
|
||||||
/* Private data for the host driver */
|
/* Private data for the host driver */
|
||||||
unsigned long hd_priv[0] __attribute__ ((aligned(sizeof(s64))));
|
unsigned long hd_priv[0] __attribute__ ((aligned(sizeof(s64))));
|
||||||
|
|
Loading…
Reference in New Issue