1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ISP1760_HCD_H_ 3 #define _ISP1760_HCD_H_ 4 5 #include <linux/spinlock.h> 6 #include <linux/regmap.h> 7 8 #include "isp1760-regs.h" 9 10 struct isp1760_qh; 11 struct isp1760_qtd; 12 struct resource; 13 struct usb_hcd; 14 15 struct isp1760_slotinfo { 16 struct isp1760_qh *qh; 17 struct isp1760_qtd *qtd; 18 unsigned long timestamp; 19 }; 20 21 /* chip memory management */ 22 #define ISP176x_BLOCK_MAX (32 + 20 + 4) 23 #define ISP176x_BLOCK_NUM 3 24 25 struct isp1760_memory_layout { 26 unsigned int blocks[ISP176x_BLOCK_NUM]; 27 unsigned int blocks_size[ISP176x_BLOCK_NUM]; 28 29 unsigned int slot_num; 30 unsigned int payload_blocks; 31 unsigned int payload_area_size; 32 }; 33 34 struct isp1760_memory_chunk { 35 unsigned int start; 36 unsigned int size; 37 unsigned int free; 38 }; 39 40 enum isp1760_queue_head_types { 41 QH_CONTROL, 42 QH_BULK, 43 QH_INTERRUPT, 44 QH_END 45 }; 46 47 struct isp1760_hcd { 48 struct usb_hcd *hcd; 49 50 void __iomem *base; 51 52 struct regmap *regs; 53 struct regmap_field *fields[HC_FIELD_MAX]; 54 55 bool is_isp1763; 56 const struct isp1760_memory_layout *memory_layout; 57 58 spinlock_t lock; 59 struct isp1760_slotinfo *atl_slots; 60 int atl_done_map; 61 struct isp1760_slotinfo *int_slots; 62 int int_done_map; 63 struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX]; 64 struct list_head qh_list[QH_END]; 65 66 /* periodic schedule support */ 67 #define DEFAULT_I_TDPS 1024 68 unsigned periodic_size; 69 unsigned i_thresh; 70 unsigned long reset_done; 71 unsigned long next_statechange; 72 }; 73 74 #ifdef CONFIG_USB_ISP1760_HCD 75 int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem, 76 int irq, unsigned long irqflags, struct device *dev); 77 void isp1760_hcd_unregister(struct isp1760_hcd *priv); 78 79 int isp1760_init_kmem_once(void); 80 void isp1760_deinit_kmem_cache(void); 81 #else 82 static inline int isp1760_hcd_register(struct isp1760_hcd *priv, 83 struct resource *mem, 84 int irq, unsigned long irqflags, 85 struct device *dev) 86 { 87 return 0; 88 } 89 90 static inline void isp1760_hcd_unregister(struct isp1760_hcd *priv) 91 { 92 } 93 94 static inline int isp1760_init_kmem_once(void) 95 { 96 return 0; 97 } 98 99 static inline void isp1760_deinit_kmem_cache(void) 100 { 101 } 102 #endif 103 104 #endif /* _ISP1760_HCD_H_ */ 105