linux/drivers/staging/greybus/connection.h
<<
>>
Prefs
   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 */
 130