Commit 8c12cde3 authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: define greybus interface abstraction

Define new source files "interface.h" and "interface.c" to contain
the definitions of the Greybus interface abstraction.  A Greybus
interface represents a UniPro device present in a UniPro module.
For Project Ara, each interface block on a module implements a
UniPro interface.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent e1e9dbdd
......@@ -4,6 +4,7 @@ greybus-y := core.o \
debugfs.o \
ap.o \
module.o \
interface.o \
i2c-gb.o \
gpio-gb.o \
sdio-gb.o \
......
......@@ -21,6 +21,7 @@
#include "greybus_id.h"
#include "greybus_manifest.h"
#include "module.h"
#include "interface.h"
/* Matches up with the Greybus Protocol specification document */
......
/*
* Greybus interfaces
*
* Copyright 2014 Google Inc.
*
* Released under the GPLv2 only.
*/
#include "greybus.h"
/* XXX This could be per-host device or per-module */
static DEFINE_SPINLOCK(gb_interfaces_lock);
/*
* A Greybus interface represents a UniPro device present on a
* module. For Project Ara, each active Interface Block on a module
* implements a UniPro device, and therefore a Greybus interface. A
* Greybus module has at least one interface, but can have two (or
* even more).
*
* Create a gb_interface structure to represent a discovered
* interface. Returns a pointer to the new interface or a null
* pointer if a failure occurs due to memory exhaustion.
*/
struct gb_interface *
gb_interface_create(struct gb_module *gmod, u8 interface_id)
{
struct gb_interface *interface;
interface = kzalloc(sizeof(*interface), GFP_KERNEL);
if (!interface)
return NULL;
interface->gmod = gmod; /* XXX refcount? */
interface->interface_id = interface_id;
spin_lock_irq(&gb_interfaces_lock);
list_add_tail(&interface->links, &gmod->interfaces);
spin_unlock_irq(&gb_interfaces_lock);
return interface;
}
/*
* Tear down a previously set up interface.
*/
void gb_interface_destroy(struct gb_interface *interface)
{
if (WARN_ON(!interface))
return;
spin_lock_irq(&gb_interfaces_lock);
list_del(&interface->links);
spin_unlock_irq(&gb_interfaces_lock);
/* kref_put(gmod); */
kfree(interface);
}
/*
* Greybus interfaces
*
* Copyright 2014 Google Inc.
*
* Released under the GPLv2 only.
*/
#ifndef __INTERFACE_H
#define __INTERFACE_H
#include <linux/list.h>
struct gb_interface {
struct gb_module *gmod;
u8 interface_id;
struct list_head links; /* module->interfaces */
};
struct gb_interface *gb_interface_create(struct gb_module *gmod, u8 module_id);
void gb_interface_destroy(struct gb_interface *interface);
#endif /* __INTERFACE_H */
......@@ -67,6 +67,7 @@ struct gb_module *gb_module_create(struct greybus_host_device *hd, u8 module_id)
module->hd = hd; /* XXX refcount? */
module->module_id = module_id;
INIT_LIST_HEAD(&module->interfaces);
spin_lock_irq(&gb_modules_lock);
list_add_tail(&module->links, &hd->modules);
......
......@@ -16,6 +16,7 @@
struct gb_module {
struct device dev;
struct list_head interfaces;
struct list_head links; /* greybus_host_device->modules */
u8 module_id; /* Physical location within the Endo */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment