Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ISP1760_HCD_H_
0003 #define _ISP1760_HCD_H_
0004 
0005 #include <linux/spinlock.h>
0006 #include <linux/regmap.h>
0007 
0008 #include "isp1760-regs.h"
0009 
0010 struct isp1760_qh;
0011 struct isp1760_qtd;
0012 struct resource;
0013 struct usb_hcd;
0014 
0015 struct isp1760_slotinfo {
0016     struct isp1760_qh *qh;
0017     struct isp1760_qtd *qtd;
0018     unsigned long timestamp;
0019 };
0020 
0021 /* chip memory management */
0022 #define ISP176x_BLOCK_MAX (32 + 20 + 4)
0023 #define ISP176x_BLOCK_NUM 3
0024 
0025 struct isp1760_memory_layout {
0026     unsigned int blocks[ISP176x_BLOCK_NUM];
0027     unsigned int blocks_size[ISP176x_BLOCK_NUM];
0028 
0029     unsigned int slot_num;
0030     unsigned int payload_blocks;
0031     unsigned int payload_area_size;
0032 };
0033 
0034 struct isp1760_memory_chunk {
0035     unsigned int start;
0036     unsigned int size;
0037     unsigned int free;
0038 };
0039 
0040 enum isp1760_queue_head_types {
0041     QH_CONTROL,
0042     QH_BULK,
0043     QH_INTERRUPT,
0044     QH_END
0045 };
0046 
0047 struct isp1760_hcd {
0048     struct usb_hcd      *hcd;
0049 
0050     void __iomem        *base;
0051 
0052     struct regmap       *regs;
0053     struct regmap_field *fields[HC_FIELD_MAX];
0054 
0055     bool            is_isp1763;
0056     const struct isp1760_memory_layout  *memory_layout;
0057 
0058     spinlock_t      lock;
0059     struct isp1760_slotinfo *atl_slots;
0060     int         atl_done_map;
0061     struct isp1760_slotinfo *int_slots;
0062     int         int_done_map;
0063     struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
0064     struct list_head    qh_list[QH_END];
0065 
0066     /* periodic schedule support */
0067 #define DEFAULT_I_TDPS      1024
0068     unsigned        periodic_size;
0069     unsigned        i_thresh;
0070     unsigned long       reset_done;
0071     unsigned long       next_statechange;
0072 };
0073 
0074 #ifdef CONFIG_USB_ISP1760_HCD
0075 int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
0076              int irq, unsigned long irqflags, struct device *dev);
0077 void isp1760_hcd_unregister(struct isp1760_hcd *priv);
0078 
0079 int isp1760_init_kmem_once(void);
0080 void isp1760_deinit_kmem_cache(void);
0081 #else
0082 static inline int isp1760_hcd_register(struct isp1760_hcd *priv,
0083                        struct resource *mem,
0084                        int irq, unsigned long irqflags,
0085                        struct device *dev)
0086 {
0087     return 0;
0088 }
0089 
0090 static inline void isp1760_hcd_unregister(struct isp1760_hcd *priv)
0091 {
0092 }
0093 
0094 static inline int isp1760_init_kmem_once(void)
0095 {
0096     return 0;
0097 }
0098 
0099 static inline void isp1760_deinit_kmem_cache(void)
0100 {
0101 }
0102 #endif
0103 
0104 #endif /* _ISP1760_HCD_H_ */