Commit b750fa33 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

greybus: connection: remove 'struct device' from 'struct gb_connection'

We don't want this in the driver core, as nothing will be binding to it,
that's the job of a bundle.  So remove the struct device and use a kref
to handle reference counting instead.

Note, I don't think we really need a kref, but it keeps the lifetime the
same as before, and is the simplest change for now.  In the future it
might be easier to just attach all connections to the bundle and clean
them up when the bundle is removed.

Also remove the cport sysfs documentation as it's no longer relevant.
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
Reviewed-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
Reviewed-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
parent b6789ee5
...@@ -155,40 +155,3 @@ Description: ...@@ -155,40 +155,3 @@ Description:
process watching the file will be woken up, and the new process watching the file will be woken up, and the new
value can be read. It's a "poor-man's IPC", yes, but value can be read. It's a "poor-man's IPC", yes, but
simplifies the Android userspace code immensely. simplifies the Android userspace code immensely.
What: /sys/bus/greybus/device/endoE:M:I:B:C
Date: October 2015
KernelVersion: 4.XX
Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
A cport C within bundle B, C is replaced by a 2-byte
number representing the cport.
What: /sys/bus/greybus/device/endoE:M:I:B:C/ap_cport_id
Date: October 2015
KernelVersion: 4.XX
Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
The cport ID of the AP, to which cport of the module is
connected.
What: /sys/bus/greybus/device/endoE:M:I:B:C/protocol_id
Date: October 2015
KernelVersion: 4.XX
Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
The protocol ID of a Greybus cport.
What: /sys/bus/greybus/device/endoE:M:I:B:C/state
Date: October 2015
KernelVersion: 4.XX
Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
The current state of a Greybus connection.
It will be one of the following values:
0 - invalid
1 - disabled
2 - enabled
3 - error
4 - destroying
...@@ -67,63 +67,18 @@ void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id, ...@@ -67,63 +67,18 @@ void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id,
} }
EXPORT_SYMBOL_GPL(greybus_data_rcvd); EXPORT_SYMBOL_GPL(greybus_data_rcvd);
static ssize_t state_show(struct device *dev, struct device_attribute *attr, static DEFINE_MUTEX(connection_mutex);
char *buf)
{
struct gb_connection *connection = to_gb_connection(dev);
enum gb_connection_state state;
spin_lock_irq(&connection->lock);
state = connection->state;
spin_unlock_irq(&connection->lock);
return sprintf(buf, "%d\n", state);
}
static DEVICE_ATTR_RO(state);
static ssize_t
protocol_id_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct gb_connection *connection = to_gb_connection(dev);
if (connection->protocol)
return sprintf(buf, "%d\n", connection->protocol->id);
else
return -EINVAL;
}
static DEVICE_ATTR_RO(protocol_id);
static ssize_t
ap_cport_id_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct gb_connection *connection = to_gb_connection(dev);
return sprintf(buf, "%hu\n", connection->hd_cport_id);
}
static DEVICE_ATTR_RO(ap_cport_id);
static struct attribute *connection_attrs[] = {
&dev_attr_state.attr,
&dev_attr_protocol_id.attr,
&dev_attr_ap_cport_id.attr,
NULL,
};
ATTRIBUTE_GROUPS(connection);
static void gb_connection_release(struct device *dev) static void gb_connection_kref_release(struct kref *kref)
{ {
struct gb_connection *connection = to_gb_connection(dev); struct gb_connection *connection;
connection = container_of(kref, struct gb_connection, kref);
destroy_workqueue(connection->wq); destroy_workqueue(connection->wq);
kfree(connection); kfree(connection);
mutex_unlock(&connection_mutex);
} }
struct device_type greybus_connection_type = {
.name = "greybus_connection",
.release = gb_connection_release,
};
int svc_update_connection(struct gb_interface *intf, int svc_update_connection(struct gb_interface *intf,
struct gb_connection *connection) struct gb_connection *connection)
{ {
...@@ -133,13 +88,7 @@ int svc_update_connection(struct gb_interface *intf, ...@@ -133,13 +88,7 @@ int svc_update_connection(struct gb_interface *intf,
if (!bundle) if (!bundle)
return -EINVAL; return -EINVAL;
device_del(&connection->dev);
connection->bundle = bundle; connection->bundle = bundle;
connection->dev.parent = &bundle->dev;
dev_set_name(&connection->dev, "%s:%d", dev_name(&bundle->dev),
GB_SVC_CPORT_ID);
WARN_ON(device_add(&connection->dev));
spin_lock_irq(&gb_connections_lock); spin_lock_irq(&gb_connections_lock);
list_add(&connection->bundle_links, &bundle->connections); list_add(&connection->bundle_links, &bundle->connections);
...@@ -210,24 +159,7 @@ gb_connection_create_range(struct greybus_host_device *hd, ...@@ -210,24 +159,7 @@ gb_connection_create_range(struct greybus_host_device *hd,
if (!connection->wq) if (!connection->wq)
goto err_free_connection; goto err_free_connection;
connection->dev.parent = parent; kref_init(&connection->kref);
connection->dev.bus = &greybus_bus_type;
connection->dev.type = &greybus_connection_type;
connection->dev.groups = connection_groups;
device_initialize(&connection->dev);
dev_set_name(&connection->dev, "%s:%d",
dev_name(parent), cport_id);
retval = device_add(&connection->dev);
if (retval) {
connection->hd_cport_id = CPORT_ID_BAD;
put_device(&connection->dev);
dev_err(parent, "failed to register connection to cport %04hx: %d\n",
cport_id, retval);
goto err_remove_ida;
}
spin_lock_irq(&gb_connections_lock); spin_lock_irq(&gb_connections_lock);
list_add(&connection->hd_links, &hd->connections); list_add(&connection->hd_links, &hd->connections);
...@@ -524,7 +456,8 @@ void gb_connection_destroy(struct gb_connection *connection) ...@@ -524,7 +456,8 @@ void gb_connection_destroy(struct gb_connection *connection)
ida_simple_remove(id_map, connection->hd_cport_id); ida_simple_remove(id_map, connection->hd_cport_id);
connection->hd_cport_id = CPORT_ID_BAD; connection->hd_cport_id = CPORT_ID_BAD;
device_unregister(&connection->dev); kref_put_mutex(&connection->kref, gb_connection_kref_release,
&connection_mutex);
} }
void gb_connection_latency_tag_enable(struct gb_connection *connection) void gb_connection_latency_tag_enable(struct gb_connection *connection)
......
...@@ -24,7 +24,7 @@ enum gb_connection_state { ...@@ -24,7 +24,7 @@ enum gb_connection_state {
struct gb_connection { struct gb_connection {
struct greybus_host_device *hd; struct greybus_host_device *hd;
struct gb_bundle *bundle; struct gb_bundle *bundle;
struct device dev; struct kref kref;
u16 hd_cport_id; u16 hd_cport_id;
u16 intf_cport_id; u16 intf_cport_id;
...@@ -48,7 +48,6 @@ struct gb_connection { ...@@ -48,7 +48,6 @@ struct gb_connection {
void *private; void *private;
}; };
#define to_gb_connection(d) container_of(d, struct gb_connection, dev)
int svc_update_connection(struct gb_interface *intf, int svc_update_connection(struct gb_interface *intf,
struct gb_connection *connection); struct gb_connection *connection);
......
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