atmel_usba_udc.h revision 00274921a052d3232d9f00856387fb269ac0af11
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) 44914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 45914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in FNUM */ 46914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_FRAME_NUM_OFFSET 0 47914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_FRAME_NUM_SIZE 3 48914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUMBER_OFFSET 3 49914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUMBER_SIZE 11 50914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FRAME_NUM_ERROR (1 << 31) 51914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 52914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in INT_ENB/INT_STA/INT_CLR */ 53914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_HIGH_SPEED (1 << 0) 54914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DET_SUSPEND (1 << 1) 55914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MICRO_SOF (1 << 2) 56914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SOF (1 << 3) 57914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_END_OF_RESET (1 << 4) 58914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_WAKE_UP (1 << 5) 59914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_END_OF_RESUME (1 << 6) 60914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_UPSTREAM_RESUME (1 << 7) 61914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_INT_OFFSET 8 62914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_INT_SIZE 16 63914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_INT_OFFSET 24 64914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_INT_SIZE 8 65914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 66914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_RST */ 67914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RST_OFFSET 0 68914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RST_SIZE 16 69914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 70914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in USBA_TST */ 71914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_OFFSET 0 72914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_SIZE 2 73914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_J_MODE (1 << 2) 74914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_K_MODE (1 << 3) 75914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TST_PKT_MODE (1 << 4) 76914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_OPMODE2 (1 << 5) 77914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 78914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_CFG */ 79914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_OFFSET 0 80914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_SIZE 3 81914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_DIR_IN (1 << 3) 82914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_OFFSET 4 83914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_SIZE 2 84914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_OFFSET 6 85914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_SIZE 2 86914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NB_TRANS_OFFSET 8 87914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NB_TRANS_SIZE 2 88914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_MAPPED (1 << 31) 89914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 90914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_CTL/EPT_CTL_ENB/EPT_CTL_DIS */ 91914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_ENABLE (1 << 0) 92914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_AUTO_VALID (1 << 1) 93914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_INTDIS_DMA (1 << 3) 94914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NYET_DIS (1 << 4) 95914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DATAX_RX (1 << 6) 96914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_MDATA_RX (1 << 7) 97914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bits 8-15 and 31 enable interrupts for respective bits in EPT_STA */ 98914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANK_IE (1 << 18) 99914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 100914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in EPT_SET_STA/EPT_CLR_STA/EPT_STA */ 101914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FORCE_STALL (1 << 5) 102914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_CLR (1 << 6) 103914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_SEQ_OFFSET 6 104914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TOGGLE_SEQ_SIZE 2 105914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ERR_OVFLW (1 << 8) 106914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RX_BK_RDY (1 << 9) 107914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_KILL_BANK (1 << 9) 108914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TX_COMPLETE (1 << 10) 109914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_TX_PK_RDY (1 << 11) 110914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_TRANS (1 << 11) 111914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_RX_SETUP (1 << 12) 112914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_FLOW (1 << 12) 113914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_STALL_SENT (1 << 13) 114914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_CRC (1 << 13) 115914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_NBTRANS (1 << 13) 116914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NAK_IN (1 << 14) 117914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_ISO_ERR_FLUSH (1 << 14) 118914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NAK_OUT (1 << 15) 119914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_CURRENT_BANK_OFFSET 16 120914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_CURRENT_BANK_SIZE 2 121914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANKS_OFFSET 18 122914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BUSY_BANKS_SIZE 2 123914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BYTE_COUNT_OFFSET 20 124914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BYTE_COUNT_SIZE 11 125914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SHORT_PACKET (1 << 31) 126914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 127914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in DMA_CONTROL */ 128914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_CH_EN (1 << 0) 129914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_LINK (1 << 1) 130914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_EN (1 << 2) 131914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_EN (1 << 3) 132914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_IE (1 << 4) 133914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_IE (1 << 5) 134914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_DESC_LOAD_IE (1 << 6) 135914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BURST_LOCK (1 << 7) 136914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BUF_LEN_OFFSET 16 137914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BUF_LEN_SIZE 16 138914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 139914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bitfields in DMA_STATUS */ 140914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_CH_ACTIVE (1 << 1) 141914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_TR_ST (1 << 4) 142914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_END_BUF_ST (1 << 5) 143914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_DESC_LOAD_ST (1 << 6) 144914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 145914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for SPEED_CFG */ 146914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_NORMAL 0 147914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_FORCE_HIGH 2 148914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_SPEED_CFG_FORCE_FULL 3 149914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 150914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for EPT_SIZE */ 151914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_8 0 152914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_16 1 153914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_32 2 154914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_64 3 155914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_128 4 156914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_256 5 157914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_512 6 158914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_SIZE_1024 7 159914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 160914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for EPT_TYPE */ 161914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_CONTROL 0 162914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_ISO 1 163914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_BULK 2 164914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_TYPE_INT 3 165914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 166914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Constants for BK_NUMBER */ 167914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_ZERO 0 168914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_ONE 1 169914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_DOUBLE 2 170914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BK_NUMBER_TRIPLE 3 171914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 172914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Bit manipulation macros */ 173914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BF(name, value) \ 174914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((value) & ((1 << USBA_##name##_SIZE) - 1)) \ 175914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen << USBA_##name##_OFFSET) 176914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BFEXT(name, value) \ 177914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((value) >> USBA_##name##_OFFSET) \ 178914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen & ((1 << USBA_##name##_SIZE) - 1)) 179914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_BFINS(name, value, old) \ 180914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen (((old) & ~(((1 << USBA_##name##_SIZE) - 1) \ 181914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen << USBA_##name##_OFFSET)) \ 182914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen | USBA_BF(name, value)) 183914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 184914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Register access macros */ 185914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_readl(udc, reg) \ 186914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((udc)->regs + USBA_##reg) 187914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_writel(udc, reg, value) \ 188914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (udc)->regs + USBA_##reg) 189914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_ep_readl(ep, reg) \ 190914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((ep)->ep_regs + USBA_EPT_##reg) 191914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_ep_writel(ep, reg, value) \ 192914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (ep)->ep_regs + USBA_EPT_##reg) 193914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_dma_readl(ep, reg) \ 194914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_readl((ep)->dma_regs + USBA_DMA_##reg) 195914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define usba_dma_writel(ep, reg, value) \ 196914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen __raw_writel((value), (ep)->dma_regs + USBA_DMA_##reg) 197914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 198914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Calculate base address for a given endpoint or DMA controller */ 199914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_EPT_BASE(x) (0x100 + (x) * 0x20) 200914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_DMA_BASE(x) (0x300 + (x) * 0x10) 201914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_FIFO_BASE(x) ((x) << 16) 202914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 203914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* Synth parameters */ 204914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define USBA_NR_ENDPOINTS 7 205914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 206914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_FIFO_SIZE 64 207914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_EPT_SIZE USBA_EPT_SIZE_64 208914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define EP0_NR_BANKS 1 209914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 210914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* 211914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * REVISIT: Try to eliminate this value. Can we rely on req->mapped to 212914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen * provide this information? 213914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen */ 214914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DMA_ADDR_INVALID (~(dma_addr_t)0) 215914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 216914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define FIFO_IOMEM_ID 0 217914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define CTRL_IOMEM_ID 1 218914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 219914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_ERR 0x0001 /* report all error returns */ 220914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_HW 0x0002 /* debug hardware initialization */ 221914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_GADGET 0x0004 /* calls to/from gadget driver */ 222914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_INT 0x0008 /* interrupts */ 223914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_BUS 0x0010 /* report changes in bus state */ 224914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_QUEUE 0x0020 /* debug request queue processing */ 225914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_FIFO 0x0040 /* debug FIFO contents */ 226914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_DMA 0x0080 /* debug DMA handling */ 227914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_REQ 0x0100 /* print out queued request length */ 228914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_ALL 0xffff 229914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG_NONE 0x0000 230914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 231914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DEBUG_LEVEL (DBG_ERR) 23200274921a052d3232d9f00856387fb269ac0af11David Brownell 233914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define DBG(level, fmt, ...) \ 234914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen do { \ 235914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen if ((level) & DEBUG_LEVEL) \ 23600274921a052d3232d9f00856387fb269ac0af11David Brownell pr_debug("udc: " fmt, ## __VA_ARGS__); \ 237914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen } while (0) 238914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 239914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenenum usba_ctrl_state { 240914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen WAIT_FOR_SETUP, 241914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen DATA_STAGE_IN, 242914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen DATA_STAGE_OUT, 243914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_IN, 244914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_OUT, 245914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_ADDR, 246914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen STATUS_STAGE_TEST, 247914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 248914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen/* 249914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_IDLE, 250914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_SETUP, 251914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_IN_DATA, 252914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_OUT_DATA, 253914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_SET_ADDR_STATUS, 254914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_RX_STATUS, 255914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_TX_STATUS, 256914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen EP_STATE_HALT, 257914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen*/ 258914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 259914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_dma_desc { 260914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen dma_addr_t next; 261914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen dma_addr_t addr; 262914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 ctrl; 263914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 264914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 265914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_ep { 266914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int state; 267914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *ep_regs; 268914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *dma_regs; 269914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *fifo; 270914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_ep ep; 271914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usba_udc *udc; 272914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 273914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct list_head queue; 274914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen const struct usb_endpoint_descriptor *desc; 275914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 276914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u16 fifo_size; 277914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u8 nr_banks; 278914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u8 index; 279914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int can_dma:1; 280914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int can_isoc:1; 281914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int is_isoc:1; 282914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int is_in:1; 283914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 284914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#ifdef CONFIG_USB_GADGET_DEBUG_FS 285914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 last_dma_status; 286914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_dir; 287914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_queue; 288914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_dma_status; 289914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_state; 290914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif 291914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 292914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 293914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_request { 294914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_request req; 295914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct list_head queue; 296914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 297914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen u32 ctrl; 298914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 299914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int submitted:1; 300914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int last_transaction:1; 301914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int using_dma:1; 302914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen unsigned int mapped:1; 303914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 304914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 305914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstruct usba_udc { 306914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen /* Protect hw registers from concurrent modifications */ 307914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen spinlock_t lock; 308914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 309914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *regs; 310914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen void __iomem *fifo; 311914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 312914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_gadget gadget; 313914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct usb_gadget_driver *driver; 314914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct platform_device *pdev; 315914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int irq; 316914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int vbus_pin; 317914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct clk *pclk; 318914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct clk *hclk; 319914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 32058ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen u16 devstatus; 32158ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen 32258ed7b94d98245fbad54a0af7ea3317ab1dd6876Haavard Skinnemoen u16 test_mode; 323914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen int vbus_prev; 324914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 325914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#ifdef CONFIG_USB_GADGET_DEBUG_FS 326914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_root; 327914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen struct dentry *debugfs_regs; 328914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif 329914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen}; 330914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 331914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_ep *to_usba_ep(struct usb_ep *ep) 332914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 333914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(ep, struct usba_ep, ep); 334914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 335914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 336914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_request *to_usba_req(struct usb_request *req) 337914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 338914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(req, struct usba_request, req); 339914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 340914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 341914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoenstatic inline struct usba_udc *to_usba_udc(struct usb_gadget *gadget) 342914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen{ 343914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen return container_of(gadget, struct usba_udc, gadget); 344914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen} 345914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 346914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define ep_is_control(ep) ((ep)->index == 0) 347914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#define ep_is_idle(ep) ((ep)->state == EP_STATE_IDLE) 348914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen 349914a3f3b375493eb44ad652a431939258cf34f71Haavard Skinnemoen#endif /* __LINUX_USB_GADGET_USBA_UDC_H */ 350