blob: 893c02af371053eadc5a725fa91a738ee1560919 [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 Elderc68adb22014-10-01 21:54:14 -050024struct gb_connection {
Alex Elderc68adb22014-10-01 21:54:14 -050025 struct greybus_host_device *hd;
Alex Eldercd345072014-10-02 12:30:05 -050026 struct gb_interface *interface;
Greg Kroah-Hartmanf0f61b92014-10-24 17:34:46 +080027 struct device dev;
Alex Eldercd345072014-10-02 12:30:05 -050028 u16 hd_cport_id;
29 u16 interface_cport_id;
Alex Elderc68adb22014-10-01 21:54:14 -050030
Alex Elderee9ebe42014-10-06 06:53:08 -050031 struct rb_node hd_node;
Alex Eldercd345072014-10-02 12:30:05 -050032 struct list_head interface_links;
Alex Elder4ccb6b72014-10-28 19:36:00 -050033
34 struct gb_protocol *protocol;
Alex Elder7fba0072014-10-28 19:35:59 -050035
Alex Elder36561f22014-10-22 02:04:30 -050036 enum gb_connection_state state;
Alex Eldere88afa52014-10-01 21:54:15 -050037
38 struct list_head operations;
Alex Elder84d148b2014-10-16 06:35:32 -050039 struct rb_root pending; /* awaiting reponse */
Alex Eldere88afa52014-10-01 21:54:15 -050040 atomic_t op_cycle;
Alex Elder8a306722014-10-03 15:05:21 -050041
42 void *private;
Alex Elderc68adb22014-10-01 21:54:14 -050043};
Greg Kroah-Hartmanf0f61b92014-10-24 17:34:46 +080044#define to_gb_connection(d) container_of(d, struct gb_connection, dev)
Alex Elderc68adb22014-10-01 21:54:14 -050045
Alex Eldercd345072014-10-02 12:30:05 -050046struct gb_connection *gb_connection_create(struct gb_interface *interface,
Alex Elder7fba0072014-10-28 19:35:59 -050047 u16 cport_id, u8 protocol_id);
Alex Elderb05890d2014-10-02 12:30:01 -050048void gb_connection_destroy(struct gb_connection *connection);
Alex Elderc68adb22014-10-01 21:54:14 -050049
Alex Elder574341c2014-10-16 06:35:35 -050050int gb_connection_init(struct gb_connection *connection);
Alex Elder697e55d2014-10-20 23:01:04 -050051void gb_connection_exit(struct gb_connection *connection);
Alex Elder574341c2014-10-16 06:35:35 -050052
Alex Elderee9ebe42014-10-06 06:53:08 -050053struct gb_connection *gb_hd_connection_find(struct greybus_host_device *hd,
54 u16 cport_id);
55
Alex Elder84d148b2014-10-16 06:35:32 -050056u16 gb_connection_operation_id(struct gb_connection *connection);
Alex Eldere88afa52014-10-01 21:54:15 -050057
Alex Eldereeeed422014-10-03 15:05:22 -050058__printf(2, 3)
59void gb_connection_err(struct gb_connection *connection, const char *fmt, ...);
60
Alex Elderc68adb22014-10-01 21:54:14 -050061#endif /* __CONNECTION_H */