1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Greybus Host Device 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2014-2015 Google Inc. 6*4882a593Smuzhiyun * Copyright 2014-2015 Linaro Ltd. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __HD_H 10*4882a593Smuzhiyun #define __HD_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <linux/device.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct gb_host_device; 16*4882a593Smuzhiyun struct gb_message; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct gb_hd_driver { 19*4882a593Smuzhiyun size_t hd_priv_size; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun int (*cport_allocate)(struct gb_host_device *hd, int cport_id, 22*4882a593Smuzhiyun unsigned long flags); 23*4882a593Smuzhiyun void (*cport_release)(struct gb_host_device *hd, u16 cport_id); 24*4882a593Smuzhiyun int (*cport_enable)(struct gb_host_device *hd, u16 cport_id, 25*4882a593Smuzhiyun unsigned long flags); 26*4882a593Smuzhiyun int (*cport_disable)(struct gb_host_device *hd, u16 cport_id); 27*4882a593Smuzhiyun int (*cport_connected)(struct gb_host_device *hd, u16 cport_id); 28*4882a593Smuzhiyun int (*cport_flush)(struct gb_host_device *hd, u16 cport_id); 29*4882a593Smuzhiyun int (*cport_shutdown)(struct gb_host_device *hd, u16 cport_id, 30*4882a593Smuzhiyun u8 phase, unsigned int timeout); 31*4882a593Smuzhiyun int (*cport_quiesce)(struct gb_host_device *hd, u16 cport_id, 32*4882a593Smuzhiyun size_t peer_space, unsigned int timeout); 33*4882a593Smuzhiyun int (*cport_clear)(struct gb_host_device *hd, u16 cport_id); 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun int (*message_send)(struct gb_host_device *hd, u16 dest_cport_id, 36*4882a593Smuzhiyun struct gb_message *message, gfp_t gfp_mask); 37*4882a593Smuzhiyun void (*message_cancel)(struct gb_message *message); 38*4882a593Smuzhiyun int (*latency_tag_enable)(struct gb_host_device *hd, u16 cport_id); 39*4882a593Smuzhiyun int (*latency_tag_disable)(struct gb_host_device *hd, u16 cport_id); 40*4882a593Smuzhiyun int (*output)(struct gb_host_device *hd, void *req, u16 size, u8 cmd, 41*4882a593Smuzhiyun bool async); 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct gb_host_device { 45*4882a593Smuzhiyun struct device dev; 46*4882a593Smuzhiyun int bus_id; 47*4882a593Smuzhiyun const struct gb_hd_driver *driver; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct list_head modules; 50*4882a593Smuzhiyun struct list_head connections; 51*4882a593Smuzhiyun struct ida cport_id_map; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* Number of CPorts supported by the UniPro IP */ 54*4882a593Smuzhiyun size_t num_cports; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* Host device buffer constraints */ 57*4882a593Smuzhiyun size_t buffer_size_max; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct gb_svc *svc; 60*4882a593Smuzhiyun /* Private data for the host driver */ 61*4882a593Smuzhiyun unsigned long hd_priv[0] __aligned(sizeof(s64)); 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun #define to_gb_host_device(d) container_of(d, struct gb_host_device, dev) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun int gb_hd_cport_reserve(struct gb_host_device *hd, u16 cport_id); 66*4882a593Smuzhiyun void gb_hd_cport_release_reserved(struct gb_host_device *hd, u16 cport_id); 67*4882a593Smuzhiyun int gb_hd_cport_allocate(struct gb_host_device *hd, int cport_id, 68*4882a593Smuzhiyun unsigned long flags); 69*4882a593Smuzhiyun void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver, 72*4882a593Smuzhiyun struct device *parent, 73*4882a593Smuzhiyun size_t buffer_size_max, 74*4882a593Smuzhiyun size_t num_cports); 75*4882a593Smuzhiyun int gb_hd_add(struct gb_host_device *hd); 76*4882a593Smuzhiyun void gb_hd_del(struct gb_host_device *hd); 77*4882a593Smuzhiyun void gb_hd_shutdown(struct gb_host_device *hd); 78*4882a593Smuzhiyun void gb_hd_put(struct gb_host_device *hd); 79*4882a593Smuzhiyun int gb_hd_output(struct gb_host_device *hd, void *req, u16 size, u8 cmd, 80*4882a593Smuzhiyun bool in_irq); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun int gb_hd_init(void); 83*4882a593Smuzhiyun void gb_hd_exit(void); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #endif /* __HD_H */ 86