162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ISP1760_HCD_H_
362306a36Sopenharmony_ci#define _ISP1760_HCD_H_
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/spinlock.h>
662306a36Sopenharmony_ci#include <linux/regmap.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "isp1760-regs.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct isp1760_qh;
1162306a36Sopenharmony_cistruct isp1760_qtd;
1262306a36Sopenharmony_cistruct resource;
1362306a36Sopenharmony_cistruct usb_hcd;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct isp1760_slotinfo {
1662306a36Sopenharmony_ci	struct isp1760_qh *qh;
1762306a36Sopenharmony_ci	struct isp1760_qtd *qtd;
1862306a36Sopenharmony_ci	unsigned long timestamp;
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* chip memory management */
2262306a36Sopenharmony_ci#define ISP176x_BLOCK_MAX (32 + 20 + 4)
2362306a36Sopenharmony_ci#define ISP176x_BLOCK_NUM 3
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct isp1760_memory_layout {
2662306a36Sopenharmony_ci	unsigned int blocks[ISP176x_BLOCK_NUM];
2762306a36Sopenharmony_ci	unsigned int blocks_size[ISP176x_BLOCK_NUM];
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	unsigned int slot_num;
3062306a36Sopenharmony_ci	unsigned int payload_blocks;
3162306a36Sopenharmony_ci	unsigned int payload_area_size;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct isp1760_memory_chunk {
3562306a36Sopenharmony_ci	unsigned int start;
3662306a36Sopenharmony_ci	unsigned int size;
3762306a36Sopenharmony_ci	unsigned int free;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cienum isp1760_queue_head_types {
4162306a36Sopenharmony_ci	QH_CONTROL,
4262306a36Sopenharmony_ci	QH_BULK,
4362306a36Sopenharmony_ci	QH_INTERRUPT,
4462306a36Sopenharmony_ci	QH_END
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct isp1760_hcd {
4862306a36Sopenharmony_ci	struct usb_hcd		*hcd;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	void __iomem		*base;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	struct regmap		*regs;
5362306a36Sopenharmony_ci	struct regmap_field	*fields[HC_FIELD_MAX];
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	bool			is_isp1763;
5662306a36Sopenharmony_ci	const struct isp1760_memory_layout	*memory_layout;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	spinlock_t		lock;
5962306a36Sopenharmony_ci	struct isp1760_slotinfo	*atl_slots;
6062306a36Sopenharmony_ci	int			atl_done_map;
6162306a36Sopenharmony_ci	struct isp1760_slotinfo	*int_slots;
6262306a36Sopenharmony_ci	int			int_done_map;
6362306a36Sopenharmony_ci	struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
6462306a36Sopenharmony_ci	struct list_head	qh_list[QH_END];
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	/* periodic schedule support */
6762306a36Sopenharmony_ci#define	DEFAULT_I_TDPS		1024
6862306a36Sopenharmony_ci	unsigned		periodic_size;
6962306a36Sopenharmony_ci	unsigned		i_thresh;
7062306a36Sopenharmony_ci	unsigned long		reset_done;
7162306a36Sopenharmony_ci	unsigned long		next_statechange;
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#ifdef CONFIG_USB_ISP1760_HCD
7562306a36Sopenharmony_ciint isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
7662306a36Sopenharmony_ci			 int irq, unsigned long irqflags, struct device *dev);
7762306a36Sopenharmony_civoid isp1760_hcd_unregister(struct isp1760_hcd *priv);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciint isp1760_init_kmem_once(void);
8062306a36Sopenharmony_civoid isp1760_deinit_kmem_cache(void);
8162306a36Sopenharmony_ci#else
8262306a36Sopenharmony_cistatic inline int isp1760_hcd_register(struct isp1760_hcd *priv,
8362306a36Sopenharmony_ci				       struct resource *mem,
8462306a36Sopenharmony_ci				       int irq, unsigned long irqflags,
8562306a36Sopenharmony_ci				       struct device *dev)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return 0;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline void isp1760_hcd_unregister(struct isp1760_hcd *priv)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic inline int isp1760_init_kmem_once(void)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	return 0;
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline void isp1760_deinit_kmem_cache(void)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci#endif
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#endif /* _ISP1760_HCD_H_ */
105