Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/*
  2 * Greybus connections
  3 *
  4 * Copyright 2014 Google Inc.
  5 * Copyright 2014 Linaro Ltd.
  6 *
  7 * Released under the GPLv2 only.
  8 */
  9
 10#ifndef __CONNECTION_H
 11#define __CONNECTION_H
 12
 13#include <linux/list.h>
 14#include <linux/kfifo.h>
 15
 16#define GB_CONNECTION_FLAG_CSD		BIT(0)
 17#define GB_CONNECTION_FLAG_NO_FLOWCTRL	BIT(1)
 18#define GB_CONNECTION_FLAG_OFFLOADED	BIT(2)
 19#define GB_CONNECTION_FLAG_CDSI1	BIT(3)
 20#define GB_CONNECTION_FLAG_CONTROL	BIT(4)
 21#define GB_CONNECTION_FLAG_HIGH_PRIO	BIT(5)
 22
 23#define GB_CONNECTION_FLAG_CORE_MASK	GB_CONNECTION_FLAG_CONTROL
 24
 25enum gb_connection_state {
 26	GB_CONNECTION_STATE_DISABLED		= 0,
 27	GB_CONNECTION_STATE_ENABLED_TX		= 1,
 28	GB_CONNECTION_STATE_ENABLED		= 2,
 29	GB_CONNECTION_STATE_DISCONNECTING	= 3,
 30};
 31
 32struct gb_operation;
 33
 34typedef int (*gb_request_handler_t)(struct gb_operation *);
 35
 36struct gb_connection {
 37	struct gb_host_device		*hd;
 38	struct gb_interface		*intf;
 39	struct gb_bundle		*bundle;
 40	struct kref			kref;
 41	u16				hd_cport_id;
 42	u16				intf_cport_id;
 43
 44	struct list_head		hd_links;
 45	struct list_head		bundle_links;
 46
 47	gb_request_handler_t		handler;
 48	unsigned long			flags;
 49
 50	struct mutex			mutex;
 51	spinlock_t			lock;
 52	enum gb_connection_state	state;
 53	struct list_head		operations;
 54
 55	char				name[16];
 56	struct workqueue_struct		*wq;
 57
 58	atomic_t			op_cycle;
 59
 60	void				*private;
 61
 62	bool				mode_switch;
 63};
 64
 65struct gb_connection *gb_connection_create_static(struct gb_host_device *hd,
 66				u16 hd_cport_id, gb_request_handler_t handler);
 67struct gb_connection *gb_connection_create_control(struct gb_interface *intf);
 68struct gb_connection *gb_connection_create(struct gb_bundle *bundle,
 69				u16 cport_id, gb_request_handler_t handler);
 70struct gb_connection *gb_connection_create_flags(struct gb_bundle *bundle,
 71				u16 cport_id, gb_request_handler_t handler,
 72				unsigned long flags);
 73struct gb_connection *gb_connection_create_offloaded(struct gb_bundle *bundle,
 74				u16 cport_id, unsigned long flags);
 75void gb_connection_destroy(struct gb_connection *connection);
 76
 77static inline bool gb_connection_is_static(struct gb_connection *connection)
 78{
 79	return !connection->intf;
 80}
 81
 82int gb_connection_enable(struct gb_connection *connection);
 83int gb_connection_enable_tx(struct gb_connection *connection);
 84void gb_connection_disable_rx(struct gb_connection *connection);
 85void gb_connection_disable(struct gb_connection *connection);
 86void gb_connection_disable_forced(struct gb_connection *connection);
 87
 88void gb_connection_mode_switch_prepare(struct gb_connection *connection);
 89void gb_connection_mode_switch_complete(struct gb_connection *connection);
 90
 91void greybus_data_rcvd(struct gb_host_device *hd, u16 cport_id,
 92			u8 *data, size_t length);
 93
 94void gb_connection_latency_tag_enable(struct gb_connection *connection);
 95void gb_connection_latency_tag_disable(struct gb_connection *connection);
 96
 97static inline bool gb_connection_e2efc_enabled(struct gb_connection *connection)
 98{
 99	return !(connection->flags & GB_CONNECTION_FLAG_CSD);
100}
101
102static inline bool
103gb_connection_flow_control_disabled(struct gb_connection *connection)
104{
105	return connection->flags & GB_CONNECTION_FLAG_NO_FLOWCTRL;
106}
107
108static inline bool gb_connection_is_offloaded(struct gb_connection *connection)
109{
110	return connection->flags & GB_CONNECTION_FLAG_OFFLOADED;
111}
112
113static inline bool gb_connection_is_control(struct gb_connection *connection)
114{
115	return connection->flags & GB_CONNECTION_FLAG_CONTROL;
116}
117
118static inline void *gb_connection_get_data(struct gb_connection *connection)
119{
120	return connection->private;
121}
122
123static inline void gb_connection_set_data(struct gb_connection *connection,
124					  void *data)
125{
126	connection->private = data;
127}
128
129#endif /* __CONNECTION_H */