blob: 8056993c00acf1465dc7978b379ef8d890367b67 [file] [log] [blame]
Alex Elderc68adb22014-10-01 21:54:14 -05001/*
2 * Greybus connections
3 *
4 * Copyright 2014 Google Inc.
5 *
6 * Released under the GPLv2 only.
7 */
8
9#ifndef __CONNECTION_H
10#define __CONNECTION_H
11
12#include <linux/list.h>
13
14#include "greybus.h"
Alex Elderc68adb22014-10-01 21:54:14 -050015
Alex Elder36561f22014-10-22 02:04:30 -050016enum gb_connection_state {
17 GB_CONNECTION_STATE_INVALID = 0,
18 GB_CONNECTION_STATE_DISABLED = 1,
19 GB_CONNECTION_STATE_ENABLED = 2,
20 GB_CONNECTION_STATE_ERROR = 3,
21 GB_CONNECTION_STATE_DESTROYING = 4,
22};
23
Alex Elder3689f972014-10-27 06:04:30 -050024struct gb_connection;
25typedef int (*gb_connection_init_t)(struct gb_connection *);
26typedef void (*gb_connection_exit_t)(struct gb_connection *);
27
28struct gb_connection_handler {
29 gb_connection_init_t connection_init;
30 gb_connection_exit_t connection_exit;
31};
32
Alex Elderc68adb22014-10-01 21:54:14 -050033struct gb_connection {
Alex Elderc68adb22014-10-01 21:54:14 -050034 struct greybus_host_device *hd;
Alex Eldercd345072014-10-02 12:30:05 -050035 struct gb_interface *interface;
Greg Kroah-Hartmanf0f61b92014-10-24 17:34:46 +080036 struct device dev;
Alex Eldercd345072014-10-02 12:30:05 -050037 u16 hd_cport_id;
38 u16 interface_cport_id;
Alex Elderc68adb22014-10-01 21:54:14 -050039
Alex Elderee9ebe42014-10-06 06:53:08 -050040 struct rb_node hd_node;
Alex Eldercd345072014-10-02 12:30:05 -050041 struct list_head interface_links;
Alex Elder4ccb6b72014-10-28 19:36:00 -050042
43 struct gb_protocol *protocol;
44 struct list_head protocol_links;
Alex Elder7fba0072014-10-28 19:35:59 -050045
Alex Elder36561f22014-10-22 02:04:30 -050046 enum gb_connection_state state;
Alex Eldere88afa52014-10-01 21:54:15 -050047
48 struct list_head operations;
Alex Elder84d148b2014-10-16 06:35:32 -050049 struct rb_root pending; /* awaiting reponse */
Alex Eldere88afa52014-10-01 21:54:15 -050050 atomic_t op_cycle;
Alex Elder8a306722014-10-03 15:05:21 -050051
Alex Elder3689f972014-10-27 06:04:30 -050052 struct gb_connection_handler *handler;
53
Alex Elder8a306722014-10-03 15:05:21 -050054 void *private;
Alex Elderc68adb22014-10-01 21:54:14 -050055};
Greg Kroah-Hartmanf0f61b92014-10-24 17:34:46 +080056#define to_gb_connection(d) container_of(d, struct gb_connection, dev)
Alex Elderc68adb22014-10-01 21:54:14 -050057
Alex Eldercd345072014-10-02 12:30:05 -050058struct gb_connection *gb_connection_create(struct gb_interface *interface,
Alex Elder7fba0072014-10-28 19:35:59 -050059 u16 cport_id, u8 protocol_id);
Alex Elderb05890d2014-10-02 12:30:01 -050060void gb_connection_destroy(struct gb_connection *connection);
Alex Elderc68adb22014-10-01 21:54:14 -050061
Alex Elder574341c2014-10-16 06:35:35 -050062int gb_connection_init(struct gb_connection *connection);
Alex Elder697e55d2014-10-20 23:01:04 -050063void gb_connection_exit(struct gb_connection *connection);
Alex Elder574341c2014-10-16 06:35:35 -050064
Alex Elderee9ebe42014-10-06 06:53:08 -050065struct gb_connection *gb_hd_connection_find(struct greybus_host_device *hd,
66 u16 cport_id);
67
Alex Elder84d148b2014-10-16 06:35:32 -050068u16 gb_connection_operation_id(struct gb_connection *connection);
Alex Eldere88afa52014-10-01 21:54:15 -050069
Alex Eldereeeed422014-10-03 15:05:22 -050070__printf(2, 3)
71void gb_connection_err(struct gb_connection *connection, const char *fmt, ...);
72
Alex Elderc68adb22014-10-01 21:54:14 -050073#endif /* __CONNECTION_H */