isp1760-hcd.h 5.6 KB
Newer Older
S
Sebastian Siewior 已提交
1 2 3 4
#ifndef _ISP1760_HCD_H_
#define _ISP1760_HCD_H_

/* exports for if */
5 6 7 8
struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
				 int irq, unsigned long irqflags,
				 struct device *dev, const char *busname,
				 unsigned int devflags);
S
Sebastian Siewior 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
int init_kmem_once(void);
void deinit_kmem_cache(void);

/* EHCI capability registers */
#define HC_CAPLENGTH		0x00
#define HC_HCSPARAMS		0x04
#define HC_HCCPARAMS		0x08

/* EHCI operational registers */
#define HC_USBCMD		0x20
#define HC_USBSTS		0x24
#define HC_FRINDEX		0x2c
#define HC_CONFIGFLAG		0x60
#define HC_PORTSC1		0x64
#define HC_ISO_PTD_DONEMAP_REG	0x130
#define HC_ISO_PTD_SKIPMAP_REG	0x134
#define HC_ISO_PTD_LASTPTD_REG	0x138
#define HC_INT_PTD_DONEMAP_REG	0x140
#define HC_INT_PTD_SKIPMAP_REG	0x144
#define HC_INT_PTD_LASTPTD_REG	0x148
#define HC_ATL_PTD_DONEMAP_REG	0x150
#define HC_ATL_PTD_SKIPMAP_REG	0x154
#define HC_ATL_PTD_LASTPTD_REG	0x158

/* Configuration Register */
#define HC_HW_MODE_CTRL		0x300
#define ALL_ATX_RESET		(1 << 31)
36
#define HW_ANA_DIGI_OC		(1 << 15)
S
Sebastian Siewior 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#define HW_DATA_BUS_32BIT	(1 << 8)
#define HW_DACK_POL_HIGH	(1 << 6)
#define HW_DREQ_POL_HIGH	(1 << 5)
#define HW_INTR_HIGH_ACT	(1 << 2)
#define HW_INTR_EDGE_TRIG	(1 << 1)
#define HW_GLOBAL_INTR_EN	(1 << 0)

#define HC_CHIP_ID_REG		0x304
#define HC_SCRATCH_REG		0x308

#define HC_RESET_REG		0x30c
#define SW_RESET_RESET_HC	(1 << 1)
#define SW_RESET_RESET_ALL	(1 << 0)

#define HC_BUFFER_STATUS_REG	0x334
#define ATL_BUFFER		0x1
#define INT_BUFFER		0x2
#define ISO_BUFFER		0x4
#define BUFFER_MAP		0x7

#define HC_MEMORY_REG		0x33c
58 59
#define ISP_BANK(x)		((x) << 16)

S
Sebastian Siewior 已提交
60 61 62 63
#define HC_PORT1_CTRL		0x374
#define PORT1_POWER		(3 << 3)
#define PORT1_INIT1		(1 << 7)
#define PORT1_INIT2		(1 << 23)
64 65
#define HW_OTG_CTRL_SET		0x374
#define HW_OTG_CTRL_CLR		0x376
S
Sebastian Siewior 已提交
66 67 68 69 70 71

/* Interrupt Register */
#define HC_INTERRUPT_REG	0x310

#define HC_INTERRUPT_ENABLE	0x314
#define INTERRUPT_ENABLE_MASK	(HC_INTL_INT | HC_ATL_INT | HC_EOT_INT)
72
#define INTERRUPT_ENABLE_SOT_MASK	(HC_INTL_INT | HC_SOT_INT | HC_EOT_INT)
S
Sebastian Siewior 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

#define HC_ISO_INT		(1 << 9)
#define HC_ATL_INT		(1 << 8)
#define HC_INTL_INT		(1 << 7)
#define HC_EOT_INT		(1 << 3)
#define HC_SOT_INT		(1 << 1)

#define HC_ISO_IRQ_MASK_OR_REG	0x318
#define HC_INT_IRQ_MASK_OR_REG	0x31C
#define HC_ATL_IRQ_MASK_OR_REG	0x320
#define HC_ISO_IRQ_MASK_AND_REG	0x324
#define HC_INT_IRQ_MASK_AND_REG	0x328
#define HC_ATL_IRQ_MASK_AND_REG	0x32C

/* urb state*/
#define DELETE_URB		(0x0008)
#define NO_TRANSFER_ACTIVE	(0xffffffff)

91 92
/* Philips Proprietary Transfer Descriptor (PTD) */
typedef __u32 __bitwise __dw;
S
Sebastian Siewior 已提交
93
struct ptd {
94 95 96 97 98 99 100 101
	__dw dw0;
	__dw dw1;
	__dw dw2;
	__dw dw3;
	__dw dw4;
	__dw dw5;
	__dw dw6;
	__dw dw7;
S
Sebastian Siewior 已提交
102
};
103 104 105 106 107
#define PTD_OFFSET		0x0400
#define ISO_PTD_OFFSET		0x0400
#define INT_PTD_OFFSET		0x0800
#define ATL_PTD_OFFSET		0x0c00
#define PAYLOAD_OFFSET		0x1000
S
Sebastian Siewior 已提交
108 109 110 111 112 113 114 115 116 117

struct inter_packet_info {
	struct isp1760_qh *qh;
	struct isp1760_qtd *qtd;
};


typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
		struct isp1760_qtd *qtd);

118 119 120 121 122 123 124 125 126 127 128
/*
 * Device flags that can vary from board to board.  All of these
 * indicate the most "atypical" case, so that a devflags of 0 is
 * a sane default configuration.
 */
#define ISP1760_FLAG_BUS_WIDTH_16	0x00000002 /* 16-bit data bus width */
#define ISP1760_FLAG_OTG_EN		0x00000004 /* Port 1 supports OTG */
#define ISP1760_FLAG_ANALOG_OC		0x00000008 /* Analog overcurrent */
#define ISP1760_FLAG_DACK_POL_HIGH	0x00000010 /* DACK active high */
#define ISP1760_FLAG_DREQ_POL_HIGH	0x00000020 /* DREQ active high */
#define ISP1760_FLAG_ISP1761		0x00000040 /* Chip is ISP1761 */
129 130
#define ISP1760_FLAG_INTR_POL_HIGH	0x00000080 /* Interrupt polarity active high */
#define ISP1760_FLAG_INTR_EDGE_TRIG	0x00000100 /* Interrupt edge triggered */
131

S
Sebastian Siewior 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/* chip memory management */
struct memory_chunk {
	unsigned int start;
	unsigned int size;
	unsigned int free;
};

/*
 * 60kb divided in:
 * - 32 blocks @ 256  bytes
 * - 20 blocks @ 1024 bytes
 * -  4 blocks @ 8192 bytes
 */

#define BLOCK_1_NUM 32
#define BLOCK_2_NUM 20
#define BLOCK_3_NUM 4

#define BLOCK_1_SIZE 256
#define BLOCK_2_SIZE 1024
#define BLOCK_3_SIZE 8192
#define BLOCKS (BLOCK_1_NUM + BLOCK_2_NUM + BLOCK_3_NUM)
154 155
#define MAX_PAYLOAD_SIZE BLOCK_3_SIZE
#define PAYLOAD_AREA_SIZE 0xf000
S
Sebastian Siewior 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209

/* ATL */
/* DW0 */
#define PTD_VALID			1
#define PTD_LENGTH(x)			(((u32) x) << 3)
#define PTD_MAXPACKET(x)		(((u32) x) << 18)
#define PTD_MULTI(x)			(((u32) x) << 29)
#define PTD_ENDPOINT(x)			(((u32)	x) << 31)
/* DW1 */
#define PTD_DEVICE_ADDR(x)		(((u32) x) << 3)
#define PTD_PID_TOKEN(x)		(((u32) x) << 10)
#define PTD_TRANS_BULK			((u32) 2 << 12)
#define PTD_TRANS_INT			((u32) 3 << 12)
#define PTD_TRANS_SPLIT			((u32) 1 << 14)
#define PTD_SE_USB_LOSPEED		((u32) 2 << 16)
#define PTD_PORT_NUM(x)			(((u32) x) << 18)
#define PTD_HUB_NUM(x)			(((u32) x) << 25)
#define PTD_PING(x)			(((u32) x) << 26)
/* DW2 */
#define PTD_RL_CNT(x)			(((u32) x) << 25)
#define PTD_DATA_START_ADDR(x)		(((u32) x) << 8)
#define BASE_ADDR			0x1000
/* DW3 */
#define PTD_CERR(x)			(((u32) x) << 23)
#define PTD_NAC_CNT(x)			(((u32) x) << 19)
#define PTD_ACTIVE			((u32) 1 << 31)
#define PTD_DATA_TOGGLE(x)		(((u32) x) << 25)

#define DW3_HALT_BIT			(1 << 30)
#define DW3_ERROR_BIT			(1 << 28)
#define DW3_QTD_ACTIVE			(1 << 31)

#define INT_UNDERRUN			(1 << 2)
#define INT_BABBLE			(1 << 1)
#define INT_EXACT			(1 << 0)

#define DW1_GET_PID(x)			(((x) >> 10) & 0x3)
#define PTD_XFERRED_LENGTH(x)		((x) & 0x7fff)
#define PTD_XFERRED_LENGTH_LO(x)	((x) & 0x7ff)

#define SETUP_PID	(2)
#define IN_PID		(1)
#define OUT_PID		(0)
#define GET_QTD_TOKEN_TYPE(x)	((x) & 0x3)

#define DATA_TOGGLE		(1 << 31)
#define GET_DATA_TOGGLE(x)	((x) >> 31)

/* Errata 1 */
#define RL_COUNTER	(0)
#define NAK_COUNTER	(0)
#define ERR_COUNTER	(2)

#endif