0001
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
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
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