xref: /openbmc/linux/drivers/usb/isp1760/isp1760-hcd.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
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