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