1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27ef077a8SLaurent Pinchart #ifndef _ISP1760_HCD_H_
37ef077a8SLaurent Pinchart #define _ISP1760_HCD_H_
47ef077a8SLaurent Pinchart
57ef077a8SLaurent Pinchart #include <linux/spinlock.h>
61da9e1c0SRui Miguel Silva #include <linux/regmap.h>
71da9e1c0SRui Miguel Silva
81da9e1c0SRui Miguel Silva #include "isp1760-regs.h"
97ef077a8SLaurent Pinchart
107ef077a8SLaurent Pinchart struct isp1760_qh;
117ef077a8SLaurent Pinchart struct isp1760_qtd;
127ef077a8SLaurent Pinchart struct resource;
137ef077a8SLaurent Pinchart struct usb_hcd;
147ef077a8SLaurent Pinchart
157ef077a8SLaurent Pinchart struct isp1760_slotinfo {
167ef077a8SLaurent Pinchart struct isp1760_qh *qh;
177ef077a8SLaurent Pinchart struct isp1760_qtd *qtd;
187ef077a8SLaurent Pinchart unsigned long timestamp;
197ef077a8SLaurent Pinchart };
207ef077a8SLaurent Pinchart
217ef077a8SLaurent Pinchart /* chip memory management */
22*60d789f3SRui Miguel Silva #define ISP176x_BLOCK_MAX (32 + 20 + 4)
23a74f639cSRui Miguel Silva #define ISP176x_BLOCK_NUM 3
24a74f639cSRui Miguel Silva
25a74f639cSRui Miguel Silva struct isp1760_memory_layout {
26a74f639cSRui Miguel Silva unsigned int blocks[ISP176x_BLOCK_NUM];
27a74f639cSRui Miguel Silva unsigned int blocks_size[ISP176x_BLOCK_NUM];
28a74f639cSRui Miguel Silva
29*60d789f3SRui Miguel Silva unsigned int slot_num;
30a74f639cSRui Miguel Silva unsigned int payload_blocks;
31a74f639cSRui Miguel Silva unsigned int payload_area_size;
32a74f639cSRui Miguel Silva };
33a74f639cSRui Miguel Silva
347ef077a8SLaurent Pinchart struct isp1760_memory_chunk {
357ef077a8SLaurent Pinchart unsigned int start;
367ef077a8SLaurent Pinchart unsigned int size;
377ef077a8SLaurent Pinchart unsigned int free;
387ef077a8SLaurent Pinchart };
397ef077a8SLaurent Pinchart
407ef077a8SLaurent Pinchart enum isp1760_queue_head_types {
417ef077a8SLaurent Pinchart QH_CONTROL,
427ef077a8SLaurent Pinchart QH_BULK,
437ef077a8SLaurent Pinchart QH_INTERRUPT,
447ef077a8SLaurent Pinchart QH_END
457ef077a8SLaurent Pinchart };
467ef077a8SLaurent Pinchart
477ef077a8SLaurent Pinchart struct isp1760_hcd {
487ef077a8SLaurent Pinchart struct usb_hcd *hcd;
497ef077a8SLaurent Pinchart
501da9e1c0SRui Miguel Silva void __iomem *base;
511da9e1c0SRui Miguel Silva
521da9e1c0SRui Miguel Silva struct regmap *regs;
531da9e1c0SRui Miguel Silva struct regmap_field *fields[HC_FIELD_MAX];
541da9e1c0SRui Miguel Silva
55*60d789f3SRui Miguel Silva bool is_isp1763;
56a74f639cSRui Miguel Silva const struct isp1760_memory_layout *memory_layout;
57a74f639cSRui Miguel Silva
587ef077a8SLaurent Pinchart spinlock_t lock;
59a74f639cSRui Miguel Silva struct isp1760_slotinfo *atl_slots;
607ef077a8SLaurent Pinchart int atl_done_map;
61a74f639cSRui Miguel Silva struct isp1760_slotinfo *int_slots;
627ef077a8SLaurent Pinchart int int_done_map;
63*60d789f3SRui Miguel Silva struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
647ef077a8SLaurent Pinchart struct list_head qh_list[QH_END];
657ef077a8SLaurent Pinchart
667ef077a8SLaurent Pinchart /* periodic schedule support */
677ef077a8SLaurent Pinchart #define DEFAULT_I_TDPS 1024
687ef077a8SLaurent Pinchart unsigned periodic_size;
697ef077a8SLaurent Pinchart unsigned i_thresh;
707ef077a8SLaurent Pinchart unsigned long reset_done;
717ef077a8SLaurent Pinchart unsigned long next_statechange;
727ef077a8SLaurent Pinchart };
737ef077a8SLaurent Pinchart
74100832abSLaurent Pinchart #ifdef CONFIG_USB_ISP1760_HCD
751da9e1c0SRui Miguel Silva int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
761da9e1c0SRui Miguel Silva int irq, unsigned long irqflags, struct device *dev);
777ef077a8SLaurent Pinchart void isp1760_hcd_unregister(struct isp1760_hcd *priv);
787ef077a8SLaurent Pinchart
797ef077a8SLaurent Pinchart int isp1760_init_kmem_once(void);
807ef077a8SLaurent Pinchart void isp1760_deinit_kmem_cache(void);
81100832abSLaurent Pinchart #else
isp1760_hcd_register(struct isp1760_hcd * priv,struct resource * mem,int irq,unsigned long irqflags,struct device * dev)82100832abSLaurent Pinchart static inline int isp1760_hcd_register(struct isp1760_hcd *priv,
831da9e1c0SRui Miguel Silva struct resource *mem,
84100832abSLaurent Pinchart int irq, unsigned long irqflags,
85100832abSLaurent Pinchart struct device *dev)
86100832abSLaurent Pinchart {
87100832abSLaurent Pinchart return 0;
88100832abSLaurent Pinchart }
89100832abSLaurent Pinchart
isp1760_hcd_unregister(struct isp1760_hcd * priv)90100832abSLaurent Pinchart static inline void isp1760_hcd_unregister(struct isp1760_hcd *priv)
91100832abSLaurent Pinchart {
92100832abSLaurent Pinchart }
93100832abSLaurent Pinchart
isp1760_init_kmem_once(void)94100832abSLaurent Pinchart static inline int isp1760_init_kmem_once(void)
95100832abSLaurent Pinchart {
96100832abSLaurent Pinchart return 0;
97100832abSLaurent Pinchart }
98100832abSLaurent Pinchart
isp1760_deinit_kmem_cache(void)99100832abSLaurent Pinchart static inline void isp1760_deinit_kmem_cache(void)
100100832abSLaurent Pinchart {
101100832abSLaurent Pinchart }
102100832abSLaurent Pinchart #endif
1037ef077a8SLaurent Pinchart
1047ef077a8SLaurent Pinchart #endif /* _ISP1760_HCD_H_ */
105