1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ISP1760_HCD_H_
3 #define _ISP1760_HCD_H_
4 
5 #include <regmap.h>
6 
7 #include "isp1760-regs.h"
8 
9 struct isp1760_qh;
10 struct isp1760_qtd;
11 struct resource;
12 struct usb_hcd;
13 
14 struct isp1760_slotinfo {
15 	struct isp1760_qh *qh;
16 	struct isp1760_qtd *qtd;
17 	unsigned long timestamp;
18 };
19 
20 /* chip memory management */
21 #define ISP176x_BLOCK_MAX (32 + 20 + 4)
22 #define ISP176x_BLOCK_NUM 3
23 
24 struct isp1760_memory_layout {
25 	unsigned int blocks[ISP176x_BLOCK_NUM];
26 	unsigned int blocks_size[ISP176x_BLOCK_NUM];
27 
28 	unsigned int slot_num;
29 	unsigned int payload_blocks;
30 	unsigned int payload_area_size;
31 };
32 
33 struct isp1760_memory_chunk {
34 	unsigned int start;
35 	unsigned int size;
36 	unsigned int free;
37 };
38 
39 enum isp1760_queue_head_types {
40 	QH_CONTROL,
41 	QH_BULK,
42 	QH_INTERRUPT,
43 	QH_END
44 };
45 
46 struct isp1760_hcd {
47 	struct usb_hcd		*hcd;
48 	struct udevice		*dev;
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 	struct isp1760_slotinfo	*atl_slots;
59 	int			atl_done_map;
60 	struct isp1760_slotinfo	*int_slots;
61 	int			int_done_map;
62 	struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
63 	struct list_head	qh_list[QH_END];
64 
65 	/* periodic schedule support */
66 #define	DEFAULT_I_TDPS		1024
67 	unsigned int		periodic_size;
68 	unsigned int		i_thresh;
69 	unsigned long		reset_done;
70 	unsigned long		next_statechange;
71 };
72 
73 int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
74 			 int irq, unsigned long irqflags, struct udevice *dev);
75 void isp1760_hcd_unregister(struct isp1760_hcd *priv);
76 int isp1760_hcd_lowlevel_init(struct isp1760_hcd *priv);
77 
78 int isp1760_init_kmem_once(void);
79 void isp1760_deinit_kmem_cache(void);
80 
81 #endif /* _ISP1760_HCD_H_ */
82