summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/control.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-04-13 19:19:02 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2016-04-21 10:06:00 +0900
commita6e5b014b8fe0bd4cb1e1ca0380320a200605742 (patch)
tree963b67c08d45090c768eff28ce8b1b27b3382604 /drivers/staging/greybus/control.c
parent1ed8cdef405806c246b62a1ba926e0251fdaa531 (diff)
downloadop-kernel-dev-a6e5b014b8fe0bd4cb1e1ca0380320a200605742.zip
op-kernel-dev-a6e5b014b8fe0bd4cb1e1ca0380320a200605742.tar.gz
greybus: core: make the control object be a device
Make the control object be a greybus device. The control device will be used to expose attributes specific to greybus-type interfaces. Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/control.c')
-rw-r--r--drivers/staging/greybus/control.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/staging/greybus/control.c b/drivers/staging/greybus/control.c
index 3c1f664..c303bb2 100644
--- a/drivers/staging/greybus/control.c
+++ b/drivers/staging/greybus/control.c
@@ -213,6 +213,20 @@ int gb_control_timesync_authoritative(struct gb_control *control,
NULL, 0);
}
+static void gb_control_release(struct device *dev)
+{
+ struct gb_control *control = to_gb_control(dev);
+
+ gb_connection_destroy(control->connection);
+
+ kfree(control);
+}
+
+struct device_type greybus_control_type = {
+ .name = "greybus_control",
+ .release = gb_control_release,
+};
+
struct gb_control *gb_control_create(struct gb_interface *intf)
{
struct gb_control *control;
@@ -221,6 +235,8 @@ struct gb_control *gb_control_create(struct gb_interface *intf)
if (!control)
return NULL;
+ control->intf = intf;
+
control->connection = gb_connection_create_control(intf);
if (IS_ERR(control->connection)) {
dev_err(&intf->dev,
@@ -230,6 +246,13 @@ struct gb_control *gb_control_create(struct gb_interface *intf)
return NULL;
}
+ control->dev.parent = &intf->dev;
+ control->dev.bus = &greybus_bus_type;
+ control->dev.type = &greybus_control_type;
+ control->dev.dma_mask = intf->dev.dma_mask;
+ device_initialize(&control->dev);
+ dev_set_name(&control->dev, "%s.ctrl", dev_name(&intf->dev));
+
gb_connection_set_data(control->connection, control);
return control;
@@ -271,8 +294,7 @@ void gb_control_disable(struct gb_control *control)
gb_connection_disable(control->connection);
}
-void gb_control_destroy(struct gb_control *control)
+void gb_control_put(struct gb_control *control)
{
- gb_connection_destroy(control->connection);
- kfree(control);
+ put_device(&control->dev);
}
OpenPOWER on IntegriCloud