1914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* 2914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * Driver for the Atmel USBA high speed USB device controller 3914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * 4914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * Copyright (C) 2005-2007 Atmel Corporation 5914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * 6914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * This program is free software; you can redistribute it and/or modify 7914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * it under the terms of the GNU General Public License version 2 as 8914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * published by the Free Software Foundation. 9914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen */ 10914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#ifndef __LINUX_USB_GADGET_USBA_UDC_H__ 11914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define __LINUX_USB_GADGET_USBA_UDC_H__ 12914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 13914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* USB register offsets */ 14914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_CTRL 0x0000 15914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FNUM 0x0004 16914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_INT_ENB 0x0010 17914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_INT_STA 0x0014 18914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_INT_CLR 0x0018 19914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_RST 0x001c 20914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST 0x00e0 21914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 22914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* USB endpoint register offsets */ 23914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_CFG 0x0000 24914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_CTL_ENB 0x0004 25914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_CTL_DIS 0x0008 26914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_CTL 0x000c 27914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SET_STA 0x0014 28914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_CLR_STA 0x0018 29914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_STA 0x001c 30914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 31914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* USB DMA register offsets */ 32914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_NXT_DSC 0x0000 33914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_ADDRESS 0x0004 34914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_CONTROL 0x0008 35914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_STATUS 0x000c 36914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 37914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in CTRL */ 38914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DEV_ADDR_OFFSET 0 39914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DEV_ADDR_SIZE 7 40914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FADDR_EN (1 << 7) 41914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EN_USBA (1 << 8) 42914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DETACH (1 << 9) 43914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_REMOTE_WAKE_UP (1 << 10) 4416a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#define USBA_PULLD_DIS (1 << 11) 4516a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop 4616a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#if defined(CONFIG_AVR32) 4716a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#define USBA_ENABLE_MASK USBA_EN_USBA 4816a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#define USBA_DISABLE_MASK 0 4916a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#elif defined(CONFIG_ARCH_AT91) 5016a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#define USBA_ENABLE_MASK (USBA_EN_USBA | USBA_PULLD_DIS) 5116a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#define USBA_DISABLE_MASK USBA_DETACH 5216a45bc82e61891daec1ffcd057679bdf962aeb8Stelian Pop#endif /* CONFIG_ARCH_AT91 */ 53914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 54914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in FNUM */ 55914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_FRAME_NUM_OFFSET 0 56914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_FRAME_NUM_SIZE 3 57914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUMBER_OFFSET 3 58914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUMBER_SIZE 11 59914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUM_ERROR (1 << 31) 60914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 61914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in INT_ENB/INT_STA/INT_CLR */ 62914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_HIGH_SPEED (1 << 0) 63914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DET_SUSPEND (1 << 1) 64914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_SOF (1 << 2) 65914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SOF (1 << 3) 66914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_END_OF_RESET (1 << 4) 67914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_WAKE_UP (1 << 5) 68914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_END_OF_RESUME (1 << 6) 69914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_UPSTREAM_RESUME (1 << 7) 70914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_INT_OFFSET 8 71914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_INT_SIZE 16 72914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_INT_OFFSET 24 73914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_INT_SIZE 8 74914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 75914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_RST */ 76914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RST_OFFSET 0 77914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RST_SIZE 16 78914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 79914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in USBA_TST */ 80914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_OFFSET 0 81914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_SIZE 2 82914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_J_MODE (1 << 2) 83914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_K_MODE (1 << 3) 84914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_PKT_MODE (1 << 4) 85914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_OPMODE2 (1 << 5) 86914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 87914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_CFG */ 88914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_OFFSET 0 89914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_SIZE 3 90914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_DIR_IN (1 << 3) 91914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_OFFSET 4 92914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_SIZE 2 93914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_OFFSET 6 94914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_SIZE 2 95914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NB_TRANS_OFFSET 8 96914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NB_TRANS_SIZE 2 97914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_MAPPED (1 << 31) 98914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 99914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_CTL/EPT_CTL_ENB/EPT_CTL_DIS */ 100914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_ENABLE (1 << 0) 101914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_AUTO_VALID (1 << 1) 102914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_INTDIS_DMA (1 << 3) 103914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NYET_DIS (1 << 4) 104914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DATAX_RX (1 << 6) 105914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MDATA_RX (1 << 7) 106914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bits 8-15 and 31 enable interrupts for respective bits in EPT_STA */ 107914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANK_IE (1 << 18) 108914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 109914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_SET_STA/EPT_CLR_STA/EPT_STA */ 110914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FORCE_STALL (1 << 5) 111914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_CLR (1 << 6) 112914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_SEQ_OFFSET 6 113914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_SEQ_SIZE 2 114914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ERR_OVFLW (1 << 8) 115914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RX_BK_RDY (1 << 9) 116914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_KILL_BANK (1 << 9) 117914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TX_COMPLETE (1 << 10) 118914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TX_PK_RDY (1 << 11) 119914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_TRANS (1 << 11) 120914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RX_SETUP (1 << 12) 121914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_FLOW (1 << 12) 122914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_STALL_SENT (1 << 13) 123914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_CRC (1 << 13) 124914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_NBTRANS (1 << 13) 125914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NAK_IN (1 << 14) 126914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_FLUSH (1 << 14) 127914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NAK_OUT (1 << 15) 128914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_CURRENT_BANK_OFFSET 16 129914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_CURRENT_BANK_SIZE 2 130914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANKS_OFFSET 18 131914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANKS_SIZE 2 132914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BYTE_COUNT_OFFSET 20 133914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BYTE_COUNT_SIZE 11 134914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SHORT_PACKET (1 << 31) 135914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 136914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in DMA_CONTROL */ 137914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_CH_EN (1 << 0) 138914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_LINK (1 << 1) 139914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_EN (1 << 2) 140914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_EN (1 << 3) 141914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_IE (1 << 4) 142914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_IE (1 << 5) 143914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_DESC_LOAD_IE (1 << 6) 144914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BURST_LOCK (1 << 7) 145914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BUF_LEN_OFFSET 16 146914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BUF_LEN_SIZE 16 147914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 148914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in DMA_STATUS */ 149914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_CH_ACTIVE (1 << 1) 150914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_ST (1 << 4) 151914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_ST (1 << 5) 152914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_DESC_LOAD_ST (1 << 6) 153914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 154914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for SPEED_CFG */ 155914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_NORMAL 0 156914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_FORCE_HIGH 2 157914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_FORCE_FULL 3 158914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 159914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for EPT_SIZE */ 160914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_8 0 161914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_16 1 162914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_32 2 163914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_64 3 164914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_128 4 165914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_256 5 166914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_512 6 167914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_1024 7 168914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 169914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for EPT_TYPE */ 170914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_CONTROL 0 171914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_ISO 1 172914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_BULK 2 173914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_INT 3 174914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 175914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for BK_NUMBER */ 176914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_ZERO 0 177914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_ONE 1 178914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_DOUBLE 2 179914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_TRIPLE 3 180914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 181914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bit manipulation macros */ 182914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BF(name, value) \ 183914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((value) & ((1 << USBA_##name##_SIZE) - 1)) \ 184914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen << USBA_##name##_OFFSET) 185914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BFEXT(name, value) \ 186914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((value) >> USBA_##name##_OFFSET) \ 187914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen & ((1 << USBA_##name##_SIZE) - 1)) 188914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BFINS(name, value, old) \ 189914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((old) & ~(((1 << USBA_##name##_SIZE) - 1) \ 190914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen << USBA_##name##_OFFSET)) \ 191914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen | USBA_BF(name, value)) 192914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 193914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Register access macros */ 194914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_readl(udc, reg) \ 195914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((udc)->regs + USBA_##reg) 196914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_writel(udc, reg, value) \ 197914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (udc)->regs + USBA_##reg) 198914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_ep_readl(ep, reg) \ 199914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((ep)->ep_regs + USBA_EPT_##reg) 200914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_ep_writel(ep, reg, value) \ 201914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (ep)->ep_regs + USBA_EPT_##reg) 202914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_dma_readl(ep, reg) \ 203914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((ep)->dma_regs + USBA_DMA_##reg) 204914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_dma_writel(ep, reg, value) \ 205914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (ep)->dma_regs + USBA_DMA_##reg) 206914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 207914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Calculate base address for a given endpoint or DMA controller */ 208914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_BASE(x) (0x100 + (x) * 0x20) 209914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BASE(x) (0x300 + (x) * 0x10) 210914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FIFO_BASE(x) ((x) << 16) 211914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 212914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Synth parameters */ 2133fcba0d87bfb5f880d34868090e05571dca80f78Bo Shen#define USBA_NR_DMAS 7 214914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 215914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_FIFO_SIZE 64 216914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_EPT_SIZE USBA_EPT_SIZE_64 217914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_NR_BANKS 1 218914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 219914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define FIFO_IOMEM_ID 0 220914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define CTRL_IOMEM_ID 1 221914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 222914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_ERR 0x0001 /* report all error returns */ 223914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_HW 0x0002 /* debug hardware initialization */ 224914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_GADGET 0x0004 /* calls to/from gadget driver */ 225914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_INT 0x0008 /* interrupts */ 226914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_BUS 0x0010 /* report changes in bus state */ 227914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_QUEUE 0x0020 /* debug request queue processing */ 228914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_FIFO 0x0040 /* debug FIFO contents */ 229914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_DMA 0x0080 /* debug DMA handling */ 230914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_REQ 0x0100 /* print out queued request length */ 231914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_ALL 0xffff 232914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_NONE 0x0000 233914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 234914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DEBUG_LEVEL (DBG_ERR) 23500274921a052d3232d9f00856387fb269ac0af11David Brownell 236914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG(level, fmt, ...) \ 237914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen do { \ 238914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen if ((level) & DEBUG_LEVEL) \ 23900274921a052d3232d9f00856387fb269ac0af11David Brownell pr_debug("udc: " fmt, ## __VA_ARGS__); \ 240914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen } while (0) 241914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 242914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenenum usba_ctrl_state { 243914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen WAIT_FOR_SETUP, 244914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen DATA_STAGE_IN, 245914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen DATA_STAGE_OUT, 246914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_IN, 247914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_OUT, 248914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_ADDR, 249914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_TEST, 250914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 251914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* 252914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_IDLE, 253914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_SETUP, 254914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_IN_DATA, 255914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_OUT_DATA, 256914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_SET_ADDR_STATUS, 257914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_RX_STATUS, 258914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_TX_STATUS, 259914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_HALT, 260914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen*/ 261914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 262914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_dma_desc { 263914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen dma_addr_t next; 264914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen dma_addr_t addr; 265914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 ctrl; 266914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 267914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 268914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_ep { 269914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int state; 270914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *ep_regs; 271914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *dma_regs; 272914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *fifo; 273914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_ep ep; 274914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usba_udc *udc; 275914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 276914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct list_head queue; 277914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 278914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u16 fifo_size; 279914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u8 nr_banks; 280914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u8 index; 281914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int can_dma:1; 282914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int can_isoc:1; 283914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int is_isoc:1; 284914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int is_in:1; 285914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 286914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#ifdef CONFIG_USB_GADGET_DEBUG_FS 287914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 last_dma_status; 288914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_dir; 289914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_queue; 290914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_dma_status; 291914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_state; 292914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif 293914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 294914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 295914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_request { 296914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_request req; 297914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct list_head queue; 298914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 299914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 ctrl; 300914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 301914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int submitted:1; 302914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int last_transaction:1; 303914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int using_dma:1; 304914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int mapped:1; 305914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 306914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 307914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_udc { 308914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen /* Protect hw registers from concurrent modifications */ 309914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen spinlock_t lock; 310914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 311914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *regs; 312914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *fifo; 313914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 314914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_gadget gadget; 315914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_gadget_driver *driver; 316914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct platform_device *pdev; 317914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int irq; 318914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int vbus_pin; 319640e95abdfae9fef5949084c92e80c8f2f8b5ec5Eirik Aanonsen int vbus_pin_inverted; 3204a3ae9324ebeb9715369d2bca799bfd7dcff6dd7Jean-Christophe PLAGNIOL-VILLARD int num_ep; 321914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct clk *pclk; 322914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct clk *hclk; 32368522de70e4b08445c10cded43c08b016ebda538Jean-Christophe PLAGNIOL-VILLARD struct usba_ep *usba_ep; 324914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 32558ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen u16 devstatus; 32658ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen 32758ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen u16 test_mode; 328914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int vbus_prev; 329914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 330914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#ifdef CONFIG_USB_GADGET_DEBUG_FS 331914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_root; 332914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_regs; 333914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif 334914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 335914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 336914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_ep *to_usba_ep(struct usb_ep *ep) 337914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 338914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(ep, struct usba_ep, ep); 339914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 340914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 341914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_request *to_usba_req(struct usb_request *req) 342914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 343914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(req, struct usba_request, req); 344914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 345914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 346914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_udc *to_usba_udc(struct usb_gadget *gadget) 347914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 348914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(gadget, struct usba_udc, gadget); 349914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 350914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 351914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define ep_is_control(ep) ((ep)->index == 0) 352914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define ep_is_idle(ep) ((ep)->state == EP_STATE_IDLE) 353914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 354914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif /* __LINUX_USB_GADGET_USBA_UDC_H */ 355