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
10struct isp1760_qh;
11struct isp1760_qtd;
12struct resource;
13struct usb_hcd;
14
15struct 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
25struct 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
34struct isp1760_memory_chunk {
35	unsigned int start;
36	unsigned int size;
37	unsigned int free;
38};
39
40enum isp1760_queue_head_types {
41	QH_CONTROL,
42	QH_BULK,
43	QH_INTERRUPT,
44	QH_END
45};
46
47struct 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
75int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
76			 int irq, unsigned long irqflags, struct device *dev);
77void isp1760_hcd_unregister(struct isp1760_hcd *priv);
78
79int isp1760_init_kmem_once(void);
80void isp1760_deinit_kmem_cache(void);
81#else
82static 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
90static inline void isp1760_hcd_unregister(struct isp1760_hcd *priv)
91{
92}
93
94static inline int isp1760_init_kmem_once(void)
95{
96	return 0;
97}
98
99static inline void isp1760_deinit_kmem_cache(void)
100{
101}
102#endif
103
104#endif /* _ISP1760_HCD_H_ */
105