162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * amd5536.h -- header for AMD 5536 UDC high/full speed USB device controller 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007 AMD (https://www.amd.com) 662306a36Sopenharmony_ci * Author: Thomas Dahlmann 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef AMD5536UDC_H 1062306a36Sopenharmony_ci#define AMD5536UDC_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* debug control */ 1362306a36Sopenharmony_ci/* #define UDC_VERBOSE */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/extcon.h> 1662306a36Sopenharmony_ci#include <linux/usb/ch9.h> 1762306a36Sopenharmony_ci#include <linux/usb/gadget.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* various constants */ 2062306a36Sopenharmony_ci#define UDC_RDE_TIMER_SECONDS 1 2162306a36Sopenharmony_ci#define UDC_RDE_TIMER_DIV 10 2262306a36Sopenharmony_ci#define UDC_POLLSTALL_TIMER_USECONDS 500 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Hs AMD5536 chip rev. */ 2562306a36Sopenharmony_ci#define UDC_HSA0_REV 1 2662306a36Sopenharmony_ci#define UDC_HSB1_REV 2 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Broadcom chip rev. */ 2962306a36Sopenharmony_ci#define UDC_BCM_REV 10 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* 3262306a36Sopenharmony_ci * SETUP usb commands 3362306a36Sopenharmony_ci * needed, because some SETUP's are handled in hw, but must be passed to 3462306a36Sopenharmony_ci * gadget driver above 3562306a36Sopenharmony_ci * SET_CONFIG 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci#define UDC_SETCONFIG_DWORD0 0x00000900 3862306a36Sopenharmony_ci#define UDC_SETCONFIG_DWORD0_VALUE_MASK 0xffff0000 3962306a36Sopenharmony_ci#define UDC_SETCONFIG_DWORD0_VALUE_OFS 16 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define UDC_SETCONFIG_DWORD1 0x00000000 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* SET_INTERFACE */ 4462306a36Sopenharmony_ci#define UDC_SETINTF_DWORD0 0x00000b00 4562306a36Sopenharmony_ci#define UDC_SETINTF_DWORD0_ALT_MASK 0xffff0000 4662306a36Sopenharmony_ci#define UDC_SETINTF_DWORD0_ALT_OFS 16 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define UDC_SETINTF_DWORD1 0x00000000 4962306a36Sopenharmony_ci#define UDC_SETINTF_DWORD1_INTF_MASK 0x0000ffff 5062306a36Sopenharmony_ci#define UDC_SETINTF_DWORD1_INTF_OFS 0 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* Mass storage reset */ 5362306a36Sopenharmony_ci#define UDC_MSCRES_DWORD0 0x0000ff21 5462306a36Sopenharmony_ci#define UDC_MSCRES_DWORD1 0x00000000 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* Global CSR's -------------------------------------------------------------*/ 5762306a36Sopenharmony_ci#define UDC_CSR_ADDR 0x500 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* EP NE bits */ 6062306a36Sopenharmony_ci/* EP number */ 6162306a36Sopenharmony_ci#define UDC_CSR_NE_NUM_MASK 0x0000000f 6262306a36Sopenharmony_ci#define UDC_CSR_NE_NUM_OFS 0 6362306a36Sopenharmony_ci/* EP direction */ 6462306a36Sopenharmony_ci#define UDC_CSR_NE_DIR_MASK 0x00000010 6562306a36Sopenharmony_ci#define UDC_CSR_NE_DIR_OFS 4 6662306a36Sopenharmony_ci/* EP type */ 6762306a36Sopenharmony_ci#define UDC_CSR_NE_TYPE_MASK 0x00000060 6862306a36Sopenharmony_ci#define UDC_CSR_NE_TYPE_OFS 5 6962306a36Sopenharmony_ci/* EP config number */ 7062306a36Sopenharmony_ci#define UDC_CSR_NE_CFG_MASK 0x00000780 7162306a36Sopenharmony_ci#define UDC_CSR_NE_CFG_OFS 7 7262306a36Sopenharmony_ci/* EP interface number */ 7362306a36Sopenharmony_ci#define UDC_CSR_NE_INTF_MASK 0x00007800 7462306a36Sopenharmony_ci#define UDC_CSR_NE_INTF_OFS 11 7562306a36Sopenharmony_ci/* EP alt setting */ 7662306a36Sopenharmony_ci#define UDC_CSR_NE_ALT_MASK 0x00078000 7762306a36Sopenharmony_ci#define UDC_CSR_NE_ALT_OFS 15 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* max pkt */ 8062306a36Sopenharmony_ci#define UDC_CSR_NE_MAX_PKT_MASK 0x3ff80000 8162306a36Sopenharmony_ci#define UDC_CSR_NE_MAX_PKT_OFS 19 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Device Config Register ---------------------------------------------------*/ 8462306a36Sopenharmony_ci#define UDC_DEVCFG_ADDR 0x400 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define UDC_DEVCFG_SOFTRESET 31 8762306a36Sopenharmony_ci#define UDC_DEVCFG_HNPSFEN 30 8862306a36Sopenharmony_ci#define UDC_DEVCFG_DMARST 29 8962306a36Sopenharmony_ci#define UDC_DEVCFG_SET_DESC 18 9062306a36Sopenharmony_ci#define UDC_DEVCFG_CSR_PRG 17 9162306a36Sopenharmony_ci#define UDC_DEVCFG_STATUS 7 9262306a36Sopenharmony_ci#define UDC_DEVCFG_DIR 6 9362306a36Sopenharmony_ci#define UDC_DEVCFG_PI 5 9462306a36Sopenharmony_ci#define UDC_DEVCFG_SS 4 9562306a36Sopenharmony_ci#define UDC_DEVCFG_SP 3 9662306a36Sopenharmony_ci#define UDC_DEVCFG_RWKP 2 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#define UDC_DEVCFG_SPD_MASK 0x3 9962306a36Sopenharmony_ci#define UDC_DEVCFG_SPD_OFS 0 10062306a36Sopenharmony_ci#define UDC_DEVCFG_SPD_HS 0x0 10162306a36Sopenharmony_ci#define UDC_DEVCFG_SPD_FS 0x1 10262306a36Sopenharmony_ci#define UDC_DEVCFG_SPD_LS 0x2 10362306a36Sopenharmony_ci/*#define UDC_DEVCFG_SPD_FS 0x3*/ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* Device Control Register --------------------------------------------------*/ 10762306a36Sopenharmony_ci#define UDC_DEVCTL_ADDR 0x404 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define UDC_DEVCTL_THLEN_MASK 0xff000000 11062306a36Sopenharmony_ci#define UDC_DEVCTL_THLEN_OFS 24 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#define UDC_DEVCTL_BRLEN_MASK 0x00ff0000 11362306a36Sopenharmony_ci#define UDC_DEVCTL_BRLEN_OFS 16 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define UDC_DEVCTL_SRX_FLUSH 14 11662306a36Sopenharmony_ci#define UDC_DEVCTL_CSR_DONE 13 11762306a36Sopenharmony_ci#define UDC_DEVCTL_DEVNAK 12 11862306a36Sopenharmony_ci#define UDC_DEVCTL_SD 10 11962306a36Sopenharmony_ci#define UDC_DEVCTL_MODE 9 12062306a36Sopenharmony_ci#define UDC_DEVCTL_BREN 8 12162306a36Sopenharmony_ci#define UDC_DEVCTL_THE 7 12262306a36Sopenharmony_ci#define UDC_DEVCTL_BF 6 12362306a36Sopenharmony_ci#define UDC_DEVCTL_BE 5 12462306a36Sopenharmony_ci#define UDC_DEVCTL_DU 4 12562306a36Sopenharmony_ci#define UDC_DEVCTL_TDE 3 12662306a36Sopenharmony_ci#define UDC_DEVCTL_RDE 2 12762306a36Sopenharmony_ci#define UDC_DEVCTL_RES 0 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/* Device Status Register ---------------------------------------------------*/ 13162306a36Sopenharmony_ci#define UDC_DEVSTS_ADDR 0x408 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define UDC_DEVSTS_TS_MASK 0xfffc0000 13462306a36Sopenharmony_ci#define UDC_DEVSTS_TS_OFS 18 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define UDC_DEVSTS_SESSVLD 17 13762306a36Sopenharmony_ci#define UDC_DEVSTS_PHY_ERROR 16 13862306a36Sopenharmony_ci#define UDC_DEVSTS_RXFIFO_EMPTY 15 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#define UDC_DEVSTS_ENUM_SPEED_MASK 0x00006000 14162306a36Sopenharmony_ci#define UDC_DEVSTS_ENUM_SPEED_OFS 13 14262306a36Sopenharmony_ci#define UDC_DEVSTS_ENUM_SPEED_FULL 1 14362306a36Sopenharmony_ci#define UDC_DEVSTS_ENUM_SPEED_HIGH 0 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define UDC_DEVSTS_SUSP 12 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define UDC_DEVSTS_ALT_MASK 0x00000f00 14862306a36Sopenharmony_ci#define UDC_DEVSTS_ALT_OFS 8 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#define UDC_DEVSTS_INTF_MASK 0x000000f0 15162306a36Sopenharmony_ci#define UDC_DEVSTS_INTF_OFS 4 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#define UDC_DEVSTS_CFG_MASK 0x0000000f 15462306a36Sopenharmony_ci#define UDC_DEVSTS_CFG_OFS 0 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci/* Device Interrupt Register ------------------------------------------------*/ 15862306a36Sopenharmony_ci#define UDC_DEVINT_ADDR 0x40c 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#define UDC_DEVINT_SVC 7 16162306a36Sopenharmony_ci#define UDC_DEVINT_ENUM 6 16262306a36Sopenharmony_ci#define UDC_DEVINT_SOF 5 16362306a36Sopenharmony_ci#define UDC_DEVINT_US 4 16462306a36Sopenharmony_ci#define UDC_DEVINT_UR 3 16562306a36Sopenharmony_ci#define UDC_DEVINT_ES 2 16662306a36Sopenharmony_ci#define UDC_DEVINT_SI 1 16762306a36Sopenharmony_ci#define UDC_DEVINT_SC 0 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci/* Device Interrupt Mask Register -------------------------------------------*/ 17062306a36Sopenharmony_ci#define UDC_DEVINT_MSK_ADDR 0x410 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#define UDC_DEVINT_MSK 0x7f 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci/* Endpoint Interrupt Register ----------------------------------------------*/ 17562306a36Sopenharmony_ci#define UDC_EPINT_ADDR 0x414 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci#define UDC_EPINT_OUT_MASK 0xffff0000 17862306a36Sopenharmony_ci#define UDC_EPINT_OUT_OFS 16 17962306a36Sopenharmony_ci#define UDC_EPINT_IN_MASK 0x0000ffff 18062306a36Sopenharmony_ci#define UDC_EPINT_IN_OFS 0 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci#define UDC_EPINT_IN_EP0 0 18362306a36Sopenharmony_ci#define UDC_EPINT_IN_EP1 1 18462306a36Sopenharmony_ci#define UDC_EPINT_IN_EP2 2 18562306a36Sopenharmony_ci#define UDC_EPINT_IN_EP3 3 18662306a36Sopenharmony_ci#define UDC_EPINT_OUT_EP0 16 18762306a36Sopenharmony_ci#define UDC_EPINT_OUT_EP1 17 18862306a36Sopenharmony_ci#define UDC_EPINT_OUT_EP2 18 18962306a36Sopenharmony_ci#define UDC_EPINT_OUT_EP3 19 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci#define UDC_EPINT_EP0_ENABLE_MSK 0x001e001e 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* Endpoint Interrupt Mask Register -----------------------------------------*/ 19462306a36Sopenharmony_ci#define UDC_EPINT_MSK_ADDR 0x418 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define UDC_EPINT_OUT_MSK_MASK 0xffff0000 19762306a36Sopenharmony_ci#define UDC_EPINT_OUT_MSK_OFS 16 19862306a36Sopenharmony_ci#define UDC_EPINT_IN_MSK_MASK 0x0000ffff 19962306a36Sopenharmony_ci#define UDC_EPINT_IN_MSK_OFS 0 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci#define UDC_EPINT_MSK_DISABLE_ALL 0xffffffff 20262306a36Sopenharmony_ci/* mask non-EP0 endpoints */ 20362306a36Sopenharmony_ci#define UDC_EPDATAINT_MSK_DISABLE 0xfffefffe 20462306a36Sopenharmony_ci/* mask all dev interrupts */ 20562306a36Sopenharmony_ci#define UDC_DEV_MSK_DISABLE 0x7f 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* Endpoint-specific CSR's --------------------------------------------------*/ 20862306a36Sopenharmony_ci#define UDC_EPREGS_ADDR 0x0 20962306a36Sopenharmony_ci#define UDC_EPIN_REGS_ADDR 0x0 21062306a36Sopenharmony_ci#define UDC_EPOUT_REGS_ADDR 0x200 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#define UDC_EPCTL_ADDR 0x0 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#define UDC_EPCTL_RRDY 9 21562306a36Sopenharmony_ci#define UDC_EPCTL_CNAK 8 21662306a36Sopenharmony_ci#define UDC_EPCTL_SNAK 7 21762306a36Sopenharmony_ci#define UDC_EPCTL_NAK 6 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci#define UDC_EPCTL_ET_MASK 0x00000030 22062306a36Sopenharmony_ci#define UDC_EPCTL_ET_OFS 4 22162306a36Sopenharmony_ci#define UDC_EPCTL_ET_CONTROL 0 22262306a36Sopenharmony_ci#define UDC_EPCTL_ET_ISO 1 22362306a36Sopenharmony_ci#define UDC_EPCTL_ET_BULK 2 22462306a36Sopenharmony_ci#define UDC_EPCTL_ET_INTERRUPT 3 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci#define UDC_EPCTL_P 3 22762306a36Sopenharmony_ci#define UDC_EPCTL_SN 2 22862306a36Sopenharmony_ci#define UDC_EPCTL_F 1 22962306a36Sopenharmony_ci#define UDC_EPCTL_S 0 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci/* Endpoint Status Registers ------------------------------------------------*/ 23262306a36Sopenharmony_ci#define UDC_EPSTS_ADDR 0x4 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#define UDC_EPSTS_RX_PKT_SIZE_MASK 0x007ff800 23562306a36Sopenharmony_ci#define UDC_EPSTS_RX_PKT_SIZE_OFS 11 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci#define UDC_EPSTS_TDC 10 23862306a36Sopenharmony_ci#define UDC_EPSTS_HE 9 23962306a36Sopenharmony_ci#define UDC_EPSTS_BNA 7 24062306a36Sopenharmony_ci#define UDC_EPSTS_IN 6 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define UDC_EPSTS_OUT_MASK 0x00000030 24362306a36Sopenharmony_ci#define UDC_EPSTS_OUT_OFS 4 24462306a36Sopenharmony_ci#define UDC_EPSTS_OUT_DATA 1 24562306a36Sopenharmony_ci#define UDC_EPSTS_OUT_DATA_CLEAR 0x10 24662306a36Sopenharmony_ci#define UDC_EPSTS_OUT_SETUP 2 24762306a36Sopenharmony_ci#define UDC_EPSTS_OUT_SETUP_CLEAR 0x20 24862306a36Sopenharmony_ci#define UDC_EPSTS_OUT_CLEAR 0x30 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci/* Endpoint Buffer Size IN/ Receive Packet Frame Number OUT Registers ------*/ 25162306a36Sopenharmony_ci#define UDC_EPIN_BUFF_SIZE_ADDR 0x8 25262306a36Sopenharmony_ci#define UDC_EPOUT_FRAME_NUMBER_ADDR 0x8 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci#define UDC_EPIN_BUFF_SIZE_MASK 0x0000ffff 25562306a36Sopenharmony_ci#define UDC_EPIN_BUFF_SIZE_OFS 0 25662306a36Sopenharmony_ci/* EP0in txfifo = 128 bytes*/ 25762306a36Sopenharmony_ci#define UDC_EPIN0_BUFF_SIZE 32 25862306a36Sopenharmony_ci/* EP0in fullspeed txfifo = 128 bytes*/ 25962306a36Sopenharmony_ci#define UDC_FS_EPIN0_BUFF_SIZE 32 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* fifo size mult = fifo size / max packet */ 26262306a36Sopenharmony_ci#define UDC_EPIN_BUFF_SIZE_MULT 2 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci/* EPin data fifo size = 1024 bytes DOUBLE BUFFERING */ 26562306a36Sopenharmony_ci#define UDC_EPIN_BUFF_SIZE 256 26662306a36Sopenharmony_ci/* EPin small INT data fifo size = 128 bytes */ 26762306a36Sopenharmony_ci#define UDC_EPIN_SMALLINT_BUFF_SIZE 32 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci/* EPin fullspeed data fifo size = 128 bytes DOUBLE BUFFERING */ 27062306a36Sopenharmony_ci#define UDC_FS_EPIN_BUFF_SIZE 32 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci#define UDC_EPOUT_FRAME_NUMBER_MASK 0x0000ffff 27362306a36Sopenharmony_ci#define UDC_EPOUT_FRAME_NUMBER_OFS 0 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci/* Endpoint Buffer Size OUT/Max Packet Size Registers -----------------------*/ 27662306a36Sopenharmony_ci#define UDC_EPOUT_BUFF_SIZE_ADDR 0x0c 27762306a36Sopenharmony_ci#define UDC_EP_MAX_PKT_SIZE_ADDR 0x0c 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci#define UDC_EPOUT_BUFF_SIZE_MASK 0xffff0000 28062306a36Sopenharmony_ci#define UDC_EPOUT_BUFF_SIZE_OFS 16 28162306a36Sopenharmony_ci#define UDC_EP_MAX_PKT_SIZE_MASK 0x0000ffff 28262306a36Sopenharmony_ci#define UDC_EP_MAX_PKT_SIZE_OFS 0 28362306a36Sopenharmony_ci/* EP0in max packet size = 64 bytes */ 28462306a36Sopenharmony_ci#define UDC_EP0IN_MAX_PKT_SIZE 64 28562306a36Sopenharmony_ci/* EP0out max packet size = 64 bytes */ 28662306a36Sopenharmony_ci#define UDC_EP0OUT_MAX_PKT_SIZE 64 28762306a36Sopenharmony_ci/* EP0in fullspeed max packet size = 64 bytes */ 28862306a36Sopenharmony_ci#define UDC_FS_EP0IN_MAX_PKT_SIZE 64 28962306a36Sopenharmony_ci/* EP0out fullspeed max packet size = 64 bytes */ 29062306a36Sopenharmony_ci#define UDC_FS_EP0OUT_MAX_PKT_SIZE 64 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci/* 29362306a36Sopenharmony_ci * Endpoint dma descriptors ------------------------------------------------ 29462306a36Sopenharmony_ci * 29562306a36Sopenharmony_ci * Setup data, Status dword 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_MASK 0x0fff0000 29862306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_OFS 16 29962306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_ALT_MASK 0x000f0000 30062306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_ALT_OFS 16 30162306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_INTF_MASK 0x00f00000 30262306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_INTF_OFS 20 30362306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_NUM_MASK 0x0f000000 30462306a36Sopenharmony_ci#define UDC_DMA_STP_STS_CFG_NUM_OFS 24 30562306a36Sopenharmony_ci#define UDC_DMA_STP_STS_RX_MASK 0x30000000 30662306a36Sopenharmony_ci#define UDC_DMA_STP_STS_RX_OFS 28 30762306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_MASK 0xc0000000 30862306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_OFS 30 30962306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_HOST_READY 0 31062306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_DMA_BUSY 1 31162306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_DMA_DONE 2 31262306a36Sopenharmony_ci#define UDC_DMA_STP_STS_BS_HOST_BUSY 3 31362306a36Sopenharmony_ci/* IN data, Status dword */ 31462306a36Sopenharmony_ci#define UDC_DMA_IN_STS_TXBYTES_MASK 0x0000ffff 31562306a36Sopenharmony_ci#define UDC_DMA_IN_STS_TXBYTES_OFS 0 31662306a36Sopenharmony_ci#define UDC_DMA_IN_STS_FRAMENUM_MASK 0x07ff0000 31762306a36Sopenharmony_ci#define UDC_DMA_IN_STS_FRAMENUM_OFS 0 31862306a36Sopenharmony_ci#define UDC_DMA_IN_STS_L 27 31962306a36Sopenharmony_ci#define UDC_DMA_IN_STS_TX_MASK 0x30000000 32062306a36Sopenharmony_ci#define UDC_DMA_IN_STS_TX_OFS 28 32162306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_MASK 0xc0000000 32262306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_OFS 30 32362306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_HOST_READY 0 32462306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_DMA_BUSY 1 32562306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_DMA_DONE 2 32662306a36Sopenharmony_ci#define UDC_DMA_IN_STS_BS_HOST_BUSY 3 32762306a36Sopenharmony_ci/* OUT data, Status dword */ 32862306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_RXBYTES_MASK 0x0000ffff 32962306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_RXBYTES_OFS 0 33062306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_FRAMENUM_MASK 0x07ff0000 33162306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_FRAMENUM_OFS 0 33262306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_L 27 33362306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_RX_MASK 0x30000000 33462306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_RX_OFS 28 33562306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_MASK 0xc0000000 33662306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_OFS 30 33762306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_HOST_READY 0 33862306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_DMA_BUSY 1 33962306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_DMA_DONE 2 34062306a36Sopenharmony_ci#define UDC_DMA_OUT_STS_BS_HOST_BUSY 3 34162306a36Sopenharmony_ci/* max ep0in packet */ 34262306a36Sopenharmony_ci#define UDC_EP0IN_MAXPACKET 1000 34362306a36Sopenharmony_ci/* max dma packet */ 34462306a36Sopenharmony_ci#define UDC_DMA_MAXPACKET 65536 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/* un-usable DMA address */ 34762306a36Sopenharmony_ci#define DMA_DONT_USE (~(dma_addr_t) 0 ) 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/* other Endpoint register addresses and values-----------------------------*/ 35062306a36Sopenharmony_ci#define UDC_EP_SUBPTR_ADDR 0x10 35162306a36Sopenharmony_ci#define UDC_EP_DESPTR_ADDR 0x14 35262306a36Sopenharmony_ci#define UDC_EP_WRITE_CONFIRM_ADDR 0x1c 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci/* EP number as layouted in AHB space */ 35562306a36Sopenharmony_ci#define UDC_EP_NUM 32 35662306a36Sopenharmony_ci#define UDC_EPIN_NUM 16 35762306a36Sopenharmony_ci#define UDC_EPIN_NUM_USED 5 35862306a36Sopenharmony_ci#define UDC_EPOUT_NUM 16 35962306a36Sopenharmony_ci/* EP number of EP's really used = EP0 + 8 data EP's */ 36062306a36Sopenharmony_ci#define UDC_USED_EP_NUM 9 36162306a36Sopenharmony_ci/* UDC CSR regs are aligned but AHB regs not - offset for OUT EP's */ 36262306a36Sopenharmony_ci#define UDC_CSR_EP_OUT_IX_OFS 12 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci#define UDC_EP0OUT_IX 16 36562306a36Sopenharmony_ci#define UDC_EP0IN_IX 0 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/* Rx fifo address and size = 1k -------------------------------------------*/ 36862306a36Sopenharmony_ci#define UDC_RXFIFO_ADDR 0x800 36962306a36Sopenharmony_ci#define UDC_RXFIFO_SIZE 0x400 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci/* Tx fifo address and size = 1.5k -----------------------------------------*/ 37262306a36Sopenharmony_ci#define UDC_TXFIFO_ADDR 0xc00 37362306a36Sopenharmony_ci#define UDC_TXFIFO_SIZE 0x600 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci/* default data endpoints --------------------------------------------------*/ 37662306a36Sopenharmony_ci#define UDC_EPIN_STATUS_IX 1 37762306a36Sopenharmony_ci#define UDC_EPIN_IX 2 37862306a36Sopenharmony_ci#define UDC_EPOUT_IX 18 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci/* general constants -------------------------------------------------------*/ 38162306a36Sopenharmony_ci#define UDC_DWORD_BYTES 4 38262306a36Sopenharmony_ci#define UDC_BITS_PER_BYTE_SHIFT 3 38362306a36Sopenharmony_ci#define UDC_BYTE_MASK 0xff 38462306a36Sopenharmony_ci#define UDC_BITS_PER_BYTE 8 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci/*---------------------------------------------------------------------------*/ 38762306a36Sopenharmony_ci/* UDC CSR's */ 38862306a36Sopenharmony_cistruct udc_csrs { 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci /* sca - setup command address */ 39162306a36Sopenharmony_ci u32 sca; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci /* ep ne's */ 39462306a36Sopenharmony_ci u32 ne[UDC_USED_EP_NUM]; 39562306a36Sopenharmony_ci} __attribute__ ((packed)); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci/* AHB subsystem CSR registers */ 39862306a36Sopenharmony_cistruct udc_regs { 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci /* device configuration */ 40162306a36Sopenharmony_ci u32 cfg; 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci /* device control */ 40462306a36Sopenharmony_ci u32 ctl; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci /* device status */ 40762306a36Sopenharmony_ci u32 sts; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci /* device interrupt */ 41062306a36Sopenharmony_ci u32 irqsts; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci /* device interrupt mask */ 41362306a36Sopenharmony_ci u32 irqmsk; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci /* endpoint interrupt */ 41662306a36Sopenharmony_ci u32 ep_irqsts; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci /* endpoint interrupt mask */ 41962306a36Sopenharmony_ci u32 ep_irqmsk; 42062306a36Sopenharmony_ci} __attribute__ ((packed)); 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci/* endpoint specific registers */ 42362306a36Sopenharmony_cistruct udc_ep_regs { 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /* endpoint control */ 42662306a36Sopenharmony_ci u32 ctl; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci /* endpoint status */ 42962306a36Sopenharmony_ci u32 sts; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /* endpoint buffer size in/ receive packet frame number out */ 43262306a36Sopenharmony_ci u32 bufin_framenum; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci /* endpoint buffer size out/max packet size */ 43562306a36Sopenharmony_ci u32 bufout_maxpkt; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci /* endpoint setup buffer pointer */ 43862306a36Sopenharmony_ci u32 subptr; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci /* endpoint data descriptor pointer */ 44162306a36Sopenharmony_ci u32 desptr; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci /* reserved */ 44462306a36Sopenharmony_ci u32 reserved; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci /* write/read confirmation */ 44762306a36Sopenharmony_ci u32 confirm; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci} __attribute__ ((packed)); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci/* control data DMA desc */ 45262306a36Sopenharmony_cistruct udc_stp_dma { 45362306a36Sopenharmony_ci /* status quadlet */ 45462306a36Sopenharmony_ci u32 status; 45562306a36Sopenharmony_ci /* reserved */ 45662306a36Sopenharmony_ci u32 _reserved; 45762306a36Sopenharmony_ci /* first setup word */ 45862306a36Sopenharmony_ci u32 data12; 45962306a36Sopenharmony_ci /* second setup word */ 46062306a36Sopenharmony_ci u32 data34; 46162306a36Sopenharmony_ci} __attribute__ ((aligned (16))); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci/* normal data DMA desc */ 46462306a36Sopenharmony_cistruct udc_data_dma { 46562306a36Sopenharmony_ci /* status quadlet */ 46662306a36Sopenharmony_ci u32 status; 46762306a36Sopenharmony_ci /* reserved */ 46862306a36Sopenharmony_ci u32 _reserved; 46962306a36Sopenharmony_ci /* buffer pointer */ 47062306a36Sopenharmony_ci u32 bufptr; 47162306a36Sopenharmony_ci /* next descriptor pointer */ 47262306a36Sopenharmony_ci u32 next; 47362306a36Sopenharmony_ci} __attribute__ ((aligned (16))); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci/* request packet */ 47662306a36Sopenharmony_cistruct udc_request { 47762306a36Sopenharmony_ci /* embedded gadget ep */ 47862306a36Sopenharmony_ci struct usb_request req; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci /* flags */ 48162306a36Sopenharmony_ci unsigned dma_going : 1, 48262306a36Sopenharmony_ci dma_done : 1; 48362306a36Sopenharmony_ci /* phys. address */ 48462306a36Sopenharmony_ci dma_addr_t td_phys; 48562306a36Sopenharmony_ci /* first dma desc. of chain */ 48662306a36Sopenharmony_ci struct udc_data_dma *td_data; 48762306a36Sopenharmony_ci /* last dma desc. of chain */ 48862306a36Sopenharmony_ci struct udc_data_dma *td_data_last; 48962306a36Sopenharmony_ci struct list_head queue; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci /* chain length */ 49262306a36Sopenharmony_ci unsigned chain_len; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci/* UDC specific endpoint parameters */ 49762306a36Sopenharmony_cistruct udc_ep { 49862306a36Sopenharmony_ci struct usb_ep ep; 49962306a36Sopenharmony_ci struct udc_ep_regs __iomem *regs; 50062306a36Sopenharmony_ci u32 __iomem *txfifo; 50162306a36Sopenharmony_ci u32 __iomem *dma; 50262306a36Sopenharmony_ci dma_addr_t td_phys; 50362306a36Sopenharmony_ci dma_addr_t td_stp_dma; 50462306a36Sopenharmony_ci struct udc_stp_dma *td_stp; 50562306a36Sopenharmony_ci struct udc_data_dma *td; 50662306a36Sopenharmony_ci /* temp request */ 50762306a36Sopenharmony_ci struct udc_request *req; 50862306a36Sopenharmony_ci unsigned req_used; 50962306a36Sopenharmony_ci unsigned req_completed; 51062306a36Sopenharmony_ci /* dummy DMA desc for BNA dummy */ 51162306a36Sopenharmony_ci struct udc_request *bna_dummy_req; 51262306a36Sopenharmony_ci unsigned bna_occurred; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci /* NAK state */ 51562306a36Sopenharmony_ci unsigned naking; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci struct udc *dev; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci /* queue for requests */ 52062306a36Sopenharmony_ci struct list_head queue; 52162306a36Sopenharmony_ci unsigned halted; 52262306a36Sopenharmony_ci unsigned cancel_transfer; 52362306a36Sopenharmony_ci unsigned num : 5, 52462306a36Sopenharmony_ci fifo_depth : 14, 52562306a36Sopenharmony_ci in : 1; 52662306a36Sopenharmony_ci}; 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci/* device struct */ 52962306a36Sopenharmony_cistruct udc { 53062306a36Sopenharmony_ci struct usb_gadget gadget; 53162306a36Sopenharmony_ci spinlock_t lock; /* protects all state */ 53262306a36Sopenharmony_ci /* all endpoints */ 53362306a36Sopenharmony_ci struct udc_ep ep[UDC_EP_NUM]; 53462306a36Sopenharmony_ci struct usb_gadget_driver *driver; 53562306a36Sopenharmony_ci /* operational flags */ 53662306a36Sopenharmony_ci unsigned stall_ep0in : 1, 53762306a36Sopenharmony_ci waiting_zlp_ack_ep0in : 1, 53862306a36Sopenharmony_ci set_cfg_not_acked : 1, 53962306a36Sopenharmony_ci data_ep_enabled : 1, 54062306a36Sopenharmony_ci data_ep_queued : 1, 54162306a36Sopenharmony_ci sys_suspended : 1, 54262306a36Sopenharmony_ci connected; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci u16 chiprev; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci /* registers */ 54762306a36Sopenharmony_ci struct pci_dev *pdev; 54862306a36Sopenharmony_ci struct udc_csrs __iomem *csr; 54962306a36Sopenharmony_ci struct udc_regs __iomem *regs; 55062306a36Sopenharmony_ci struct udc_ep_regs __iomem *ep_regs; 55162306a36Sopenharmony_ci u32 __iomem *rxfifo; 55262306a36Sopenharmony_ci u32 __iomem *txfifo; 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci /* DMA desc pools */ 55562306a36Sopenharmony_ci struct dma_pool *data_requests; 55662306a36Sopenharmony_ci struct dma_pool *stp_requests; 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci /* device data */ 55962306a36Sopenharmony_ci unsigned long phys_addr; 56062306a36Sopenharmony_ci void __iomem *virt_addr; 56162306a36Sopenharmony_ci unsigned irq; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci /* states */ 56462306a36Sopenharmony_ci u16 cur_config; 56562306a36Sopenharmony_ci u16 cur_intf; 56662306a36Sopenharmony_ci u16 cur_alt; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci /* for platform device and extcon support */ 56962306a36Sopenharmony_ci struct device *dev; 57062306a36Sopenharmony_ci struct phy *udc_phy; 57162306a36Sopenharmony_ci struct extcon_dev *edev; 57262306a36Sopenharmony_ci struct extcon_specific_cable_nb extcon_nb; 57362306a36Sopenharmony_ci struct notifier_block nb; 57462306a36Sopenharmony_ci struct delayed_work drd_work; 57562306a36Sopenharmony_ci u32 conn_type; 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci#define to_amd5536_udc(g) (container_of((g), struct udc, gadget)) 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci/* setup request data */ 58162306a36Sopenharmony_ciunion udc_setup_data { 58262306a36Sopenharmony_ci u32 data[2]; 58362306a36Sopenharmony_ci struct usb_ctrlrequest request; 58462306a36Sopenharmony_ci}; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci/* Function declarations */ 58762306a36Sopenharmony_ciint udc_enable_dev_setup_interrupts(struct udc *dev); 58862306a36Sopenharmony_ciint udc_mask_unused_interrupts(struct udc *dev); 58962306a36Sopenharmony_ciirqreturn_t udc_irq(int irq, void *pdev); 59062306a36Sopenharmony_civoid gadget_release(struct device *pdev); 59162306a36Sopenharmony_civoid empty_req_queue(struct udc_ep *ep); 59262306a36Sopenharmony_civoid udc_basic_init(struct udc *dev); 59362306a36Sopenharmony_civoid free_dma_pools(struct udc *dev); 59462306a36Sopenharmony_ciint init_dma_pools(struct udc *dev); 59562306a36Sopenharmony_civoid udc_remove(struct udc *dev); 59662306a36Sopenharmony_ciint udc_probe(struct udc *dev); 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_ci/* DMA usage flag */ 59962306a36Sopenharmony_cistatic bool use_dma = 1; 60062306a36Sopenharmony_ci/* packet per buffer dma */ 60162306a36Sopenharmony_cistatic bool use_dma_ppb = 1; 60262306a36Sopenharmony_ci/* with per descr. update */ 60362306a36Sopenharmony_cistatic bool use_dma_ppb_du; 60462306a36Sopenharmony_ci/* full speed only mode */ 60562306a36Sopenharmony_cistatic bool use_fullspeed; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci/* module parameters */ 60862306a36Sopenharmony_cimodule_param(use_dma, bool, S_IRUGO); 60962306a36Sopenharmony_ciMODULE_PARM_DESC(use_dma, "true for DMA"); 61062306a36Sopenharmony_cimodule_param(use_dma_ppb, bool, S_IRUGO); 61162306a36Sopenharmony_ciMODULE_PARM_DESC(use_dma_ppb, "true for DMA in packet per buffer mode"); 61262306a36Sopenharmony_cimodule_param(use_dma_ppb_du, bool, S_IRUGO); 61362306a36Sopenharmony_ciMODULE_PARM_DESC(use_dma_ppb_du, 61462306a36Sopenharmony_ci "true for DMA in packet per buffer mode with descriptor update"); 61562306a36Sopenharmony_cimodule_param(use_fullspeed, bool, S_IRUGO); 61662306a36Sopenharmony_ciMODULE_PARM_DESC(use_fullspeed, "true for fullspeed only"); 61762306a36Sopenharmony_ci/* 61862306a36Sopenharmony_ci *--------------------------------------------------------------------------- 61962306a36Sopenharmony_ci * SET and GET bitfields in u32 values 62062306a36Sopenharmony_ci * via constants for mask/offset: 62162306a36Sopenharmony_ci * <bit_field_stub_name> is the text between 62262306a36Sopenharmony_ci * UDC_ and _MASK|_OFS of appropriate 62362306a36Sopenharmony_ci * constant 62462306a36Sopenharmony_ci * 62562306a36Sopenharmony_ci * set bitfield value in u32 u32Val 62662306a36Sopenharmony_ci */ 62762306a36Sopenharmony_ci#define AMD_ADDBITS(u32Val, bitfield_val, bitfield_stub_name) \ 62862306a36Sopenharmony_ci (((u32Val) & (((u32) ~((u32) bitfield_stub_name##_MASK)))) \ 62962306a36Sopenharmony_ci | (((bitfield_val) << ((u32) bitfield_stub_name##_OFS)) \ 63062306a36Sopenharmony_ci & ((u32) bitfield_stub_name##_MASK))) 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* 63362306a36Sopenharmony_ci * set bitfield value in zero-initialized u32 u32Val 63462306a36Sopenharmony_ci * => bitfield bits in u32Val are all zero 63562306a36Sopenharmony_ci */ 63662306a36Sopenharmony_ci#define AMD_INIT_SETBITS(u32Val, bitfield_val, bitfield_stub_name) \ 63762306a36Sopenharmony_ci ((u32Val) \ 63862306a36Sopenharmony_ci | (((bitfield_val) << ((u32) bitfield_stub_name##_OFS)) \ 63962306a36Sopenharmony_ci & ((u32) bitfield_stub_name##_MASK))) 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci/* get bitfield value from u32 u32Val */ 64262306a36Sopenharmony_ci#define AMD_GETBITS(u32Val, bitfield_stub_name) \ 64362306a36Sopenharmony_ci ((u32Val & ((u32) bitfield_stub_name##_MASK)) \ 64462306a36Sopenharmony_ci >> ((u32) bitfield_stub_name##_OFS)) 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci/* SET and GET bits in u32 values ------------------------------------------*/ 64762306a36Sopenharmony_ci#define AMD_BIT(bit_stub_name) (1 << bit_stub_name) 64862306a36Sopenharmony_ci#define AMD_UNMASK_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name)) 64962306a36Sopenharmony_ci#define AMD_CLEAR_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name)) 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci/* debug macros ------------------------------------------------------------*/ 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci#define DBG(udc , args...) dev_dbg(udc->dev, args) 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci#ifdef UDC_VERBOSE 65662306a36Sopenharmony_ci#define VDBG DBG 65762306a36Sopenharmony_ci#else 65862306a36Sopenharmony_ci#define VDBG(udc , args...) do {} while (0) 65962306a36Sopenharmony_ci#endif 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci#endif /* #ifdef AMD5536UDC_H */ 662