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