162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * debug.h - DesignWare USB3 DRD Controller Debug Header
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Authors: Felipe Balbi <balbi@ti.com>,
862306a36Sopenharmony_ci *	    Sebastian Andrzej Siewior <bigeasy@linutronix.de>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __DWC3_DEBUG_H
1262306a36Sopenharmony_ci#define __DWC3_DEBUG_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "core.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/**
1762306a36Sopenharmony_ci * dwc3_gadget_ep_cmd_string - returns endpoint command string
1862306a36Sopenharmony_ci * @cmd: command code
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_cistatic inline const char *
2162306a36Sopenharmony_cidwc3_gadget_ep_cmd_string(u8 cmd)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	switch (cmd) {
2462306a36Sopenharmony_ci	case DWC3_DEPCMD_DEPSTARTCFG:
2562306a36Sopenharmony_ci		return "Start New Configuration";
2662306a36Sopenharmony_ci	case DWC3_DEPCMD_ENDTRANSFER:
2762306a36Sopenharmony_ci		return "End Transfer";
2862306a36Sopenharmony_ci	case DWC3_DEPCMD_UPDATETRANSFER:
2962306a36Sopenharmony_ci		return "Update Transfer";
3062306a36Sopenharmony_ci	case DWC3_DEPCMD_STARTTRANSFER:
3162306a36Sopenharmony_ci		return "Start Transfer";
3262306a36Sopenharmony_ci	case DWC3_DEPCMD_CLEARSTALL:
3362306a36Sopenharmony_ci		return "Clear Stall";
3462306a36Sopenharmony_ci	case DWC3_DEPCMD_SETSTALL:
3562306a36Sopenharmony_ci		return "Set Stall";
3662306a36Sopenharmony_ci	case DWC3_DEPCMD_GETEPSTATE:
3762306a36Sopenharmony_ci		return "Get Endpoint State";
3862306a36Sopenharmony_ci	case DWC3_DEPCMD_SETTRANSFRESOURCE:
3962306a36Sopenharmony_ci		return "Set Endpoint Transfer Resource";
4062306a36Sopenharmony_ci	case DWC3_DEPCMD_SETEPCONFIG:
4162306a36Sopenharmony_ci		return "Set Endpoint Configuration";
4262306a36Sopenharmony_ci	default:
4362306a36Sopenharmony_ci		return "UNKNOWN command";
4462306a36Sopenharmony_ci	}
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/**
4862306a36Sopenharmony_ci * dwc3_gadget_generic_cmd_string - returns generic command string
4962306a36Sopenharmony_ci * @cmd: command code
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_cistatic inline const char *
5262306a36Sopenharmony_cidwc3_gadget_generic_cmd_string(u8 cmd)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	switch (cmd) {
5562306a36Sopenharmony_ci	case DWC3_DGCMD_SET_LMP:
5662306a36Sopenharmony_ci		return "Set LMP";
5762306a36Sopenharmony_ci	case DWC3_DGCMD_SET_PERIODIC_PAR:
5862306a36Sopenharmony_ci		return "Set Periodic Parameters";
5962306a36Sopenharmony_ci	case DWC3_DGCMD_XMIT_FUNCTION:
6062306a36Sopenharmony_ci		return "Transmit Function Wake Device Notification";
6162306a36Sopenharmony_ci	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
6262306a36Sopenharmony_ci		return "Set Scratchpad Buffer Array Address Lo";
6362306a36Sopenharmony_ci	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
6462306a36Sopenharmony_ci		return "Set Scratchpad Buffer Array Address Hi";
6562306a36Sopenharmony_ci	case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
6662306a36Sopenharmony_ci		return "Selected FIFO Flush";
6762306a36Sopenharmony_ci	case DWC3_DGCMD_ALL_FIFO_FLUSH:
6862306a36Sopenharmony_ci		return "All FIFO Flush";
6962306a36Sopenharmony_ci	case DWC3_DGCMD_SET_ENDPOINT_NRDY:
7062306a36Sopenharmony_ci		return "Set Endpoint NRDY";
7162306a36Sopenharmony_ci	case DWC3_DGCMD_SET_ENDPOINT_PRIME:
7262306a36Sopenharmony_ci		return "Set Endpoint Prime";
7362306a36Sopenharmony_ci	case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
7462306a36Sopenharmony_ci		return "Run SoC Bus Loopback Test";
7562306a36Sopenharmony_ci	case DWC3_DGCMD_DEV_NOTIFICATION:
7662306a36Sopenharmony_ci		return "Device Notification";
7762306a36Sopenharmony_ci	default:
7862306a36Sopenharmony_ci		return "UNKNOWN";
7962306a36Sopenharmony_ci	}
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/**
8362306a36Sopenharmony_ci * dwc3_gadget_link_string - returns link name
8462306a36Sopenharmony_ci * @link_state: link state code
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_cistatic inline const char *
8762306a36Sopenharmony_cidwc3_gadget_link_string(enum dwc3_link_state link_state)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	switch (link_state) {
9062306a36Sopenharmony_ci	case DWC3_LINK_STATE_U0:
9162306a36Sopenharmony_ci		return "U0";
9262306a36Sopenharmony_ci	case DWC3_LINK_STATE_U1:
9362306a36Sopenharmony_ci		return "U1";
9462306a36Sopenharmony_ci	case DWC3_LINK_STATE_U2:
9562306a36Sopenharmony_ci		return "U2";
9662306a36Sopenharmony_ci	case DWC3_LINK_STATE_U3:
9762306a36Sopenharmony_ci		return "U3";
9862306a36Sopenharmony_ci	case DWC3_LINK_STATE_SS_DIS:
9962306a36Sopenharmony_ci		return "SS.Disabled";
10062306a36Sopenharmony_ci	case DWC3_LINK_STATE_RX_DET:
10162306a36Sopenharmony_ci		return "RX.Detect";
10262306a36Sopenharmony_ci	case DWC3_LINK_STATE_SS_INACT:
10362306a36Sopenharmony_ci		return "SS.Inactive";
10462306a36Sopenharmony_ci	case DWC3_LINK_STATE_POLL:
10562306a36Sopenharmony_ci		return "Polling";
10662306a36Sopenharmony_ci	case DWC3_LINK_STATE_RECOV:
10762306a36Sopenharmony_ci		return "Recovery";
10862306a36Sopenharmony_ci	case DWC3_LINK_STATE_HRESET:
10962306a36Sopenharmony_ci		return "Hot Reset";
11062306a36Sopenharmony_ci	case DWC3_LINK_STATE_CMPLY:
11162306a36Sopenharmony_ci		return "Compliance";
11262306a36Sopenharmony_ci	case DWC3_LINK_STATE_LPBK:
11362306a36Sopenharmony_ci		return "Loopback";
11462306a36Sopenharmony_ci	case DWC3_LINK_STATE_RESET:
11562306a36Sopenharmony_ci		return "Reset";
11662306a36Sopenharmony_ci	case DWC3_LINK_STATE_RESUME:
11762306a36Sopenharmony_ci		return "Resume";
11862306a36Sopenharmony_ci	default:
11962306a36Sopenharmony_ci		return "UNKNOWN link state";
12062306a36Sopenharmony_ci	}
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/**
12462306a36Sopenharmony_ci * dwc3_gadget_hs_link_string - returns highspeed and below link name
12562306a36Sopenharmony_ci * @link_state: link state code
12662306a36Sopenharmony_ci */
12762306a36Sopenharmony_cistatic inline const char *
12862306a36Sopenharmony_cidwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	switch (link_state) {
13162306a36Sopenharmony_ci	case DWC3_LINK_STATE_U0:
13262306a36Sopenharmony_ci		return "On";
13362306a36Sopenharmony_ci	case DWC3_LINK_STATE_U2:
13462306a36Sopenharmony_ci		return "Sleep";
13562306a36Sopenharmony_ci	case DWC3_LINK_STATE_U3:
13662306a36Sopenharmony_ci		return "Suspend";
13762306a36Sopenharmony_ci	case DWC3_LINK_STATE_SS_DIS:
13862306a36Sopenharmony_ci		return "Disconnected";
13962306a36Sopenharmony_ci	case DWC3_LINK_STATE_RX_DET:
14062306a36Sopenharmony_ci		return "Early Suspend";
14162306a36Sopenharmony_ci	case DWC3_LINK_STATE_RECOV:
14262306a36Sopenharmony_ci		return "Recovery";
14362306a36Sopenharmony_ci	case DWC3_LINK_STATE_RESET:
14462306a36Sopenharmony_ci		return "Reset";
14562306a36Sopenharmony_ci	case DWC3_LINK_STATE_RESUME:
14662306a36Sopenharmony_ci		return "Resume";
14762306a36Sopenharmony_ci	default:
14862306a36Sopenharmony_ci		return "UNKNOWN link state";
14962306a36Sopenharmony_ci	}
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/**
15362306a36Sopenharmony_ci * dwc3_trb_type_string - returns TRB type as a string
15462306a36Sopenharmony_ci * @type: the type of the TRB
15562306a36Sopenharmony_ci */
15662306a36Sopenharmony_cistatic inline const char *dwc3_trb_type_string(unsigned int type)
15762306a36Sopenharmony_ci{
15862306a36Sopenharmony_ci	switch (type) {
15962306a36Sopenharmony_ci	case DWC3_TRBCTL_NORMAL:
16062306a36Sopenharmony_ci		return "normal";
16162306a36Sopenharmony_ci	case DWC3_TRBCTL_CONTROL_SETUP:
16262306a36Sopenharmony_ci		return "setup";
16362306a36Sopenharmony_ci	case DWC3_TRBCTL_CONTROL_STATUS2:
16462306a36Sopenharmony_ci		return "status2";
16562306a36Sopenharmony_ci	case DWC3_TRBCTL_CONTROL_STATUS3:
16662306a36Sopenharmony_ci		return "status3";
16762306a36Sopenharmony_ci	case DWC3_TRBCTL_CONTROL_DATA:
16862306a36Sopenharmony_ci		return "data";
16962306a36Sopenharmony_ci	case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
17062306a36Sopenharmony_ci		return "isoc-first";
17162306a36Sopenharmony_ci	case DWC3_TRBCTL_ISOCHRONOUS:
17262306a36Sopenharmony_ci		return "isoc";
17362306a36Sopenharmony_ci	case DWC3_TRBCTL_LINK_TRB:
17462306a36Sopenharmony_ci		return "link";
17562306a36Sopenharmony_ci	default:
17662306a36Sopenharmony_ci		return "UNKNOWN";
17762306a36Sopenharmony_ci	}
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	switch (state) {
18362306a36Sopenharmony_ci	case EP0_UNCONNECTED:
18462306a36Sopenharmony_ci		return "Unconnected";
18562306a36Sopenharmony_ci	case EP0_SETUP_PHASE:
18662306a36Sopenharmony_ci		return "Setup Phase";
18762306a36Sopenharmony_ci	case EP0_DATA_PHASE:
18862306a36Sopenharmony_ci		return "Data Phase";
18962306a36Sopenharmony_ci	case EP0_STATUS_PHASE:
19062306a36Sopenharmony_ci		return "Status Phase";
19162306a36Sopenharmony_ci	default:
19262306a36Sopenharmony_ci		return "UNKNOWN";
19362306a36Sopenharmony_ci	}
19462306a36Sopenharmony_ci}
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci/**
19762306a36Sopenharmony_ci * dwc3_gadget_event_string - returns event name
19862306a36Sopenharmony_ci * @event: the event code
19962306a36Sopenharmony_ci */
20062306a36Sopenharmony_cistatic inline const char *dwc3_gadget_event_string(char *str, size_t size,
20162306a36Sopenharmony_ci		const struct dwc3_event_devt *event)
20262306a36Sopenharmony_ci{
20362306a36Sopenharmony_ci	enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	switch (event->type) {
20662306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_DISCONNECT:
20762306a36Sopenharmony_ci		snprintf(str, size, "Disconnect: [%s]",
20862306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
20962306a36Sopenharmony_ci		break;
21062306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_RESET:
21162306a36Sopenharmony_ci		snprintf(str, size, "Reset [%s]",
21262306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
21362306a36Sopenharmony_ci		break;
21462306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_CONNECT_DONE:
21562306a36Sopenharmony_ci		snprintf(str, size, "Connection Done [%s]",
21662306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
21762306a36Sopenharmony_ci		break;
21862306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
21962306a36Sopenharmony_ci		snprintf(str, size, "Link Change [%s]",
22062306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
22162306a36Sopenharmony_ci		break;
22262306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_WAKEUP:
22362306a36Sopenharmony_ci		snprintf(str, size, "WakeUp [%s]",
22462306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
22562306a36Sopenharmony_ci		break;
22662306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_SUSPEND:
22762306a36Sopenharmony_ci		snprintf(str, size, "Suspend [%s]",
22862306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
22962306a36Sopenharmony_ci		break;
23062306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_SOF:
23162306a36Sopenharmony_ci		snprintf(str, size, "Start-Of-Frame [%s]",
23262306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
23362306a36Sopenharmony_ci		break;
23462306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
23562306a36Sopenharmony_ci		snprintf(str, size, "Erratic Error [%s]",
23662306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
23762306a36Sopenharmony_ci		break;
23862306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_CMD_CMPL:
23962306a36Sopenharmony_ci		snprintf(str, size, "Command Complete [%s]",
24062306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
24162306a36Sopenharmony_ci		break;
24262306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_OVERFLOW:
24362306a36Sopenharmony_ci		snprintf(str, size, "Overflow [%s]",
24462306a36Sopenharmony_ci				dwc3_gadget_link_string(state));
24562306a36Sopenharmony_ci		break;
24662306a36Sopenharmony_ci	default:
24762306a36Sopenharmony_ci		snprintf(str, size, "UNKNOWN");
24862306a36Sopenharmony_ci	}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	return str;
25162306a36Sopenharmony_ci}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci/**
25462306a36Sopenharmony_ci * dwc3_ep_event_string - returns event name
25562306a36Sopenharmony_ci * @event: then event code
25662306a36Sopenharmony_ci */
25762306a36Sopenharmony_cistatic inline const char *dwc3_ep_event_string(char *str, size_t size,
25862306a36Sopenharmony_ci		const struct dwc3_event_depevt *event, u32 ep0state)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	u8 epnum = event->endpoint_number;
26162306a36Sopenharmony_ci	size_t len;
26262306a36Sopenharmony_ci	int status;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	len = scnprintf(str, size, "ep%d%s: ", epnum >> 1,
26562306a36Sopenharmony_ci			(epnum & 1) ? "in" : "out");
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	status = event->status;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	switch (event->endpoint_event) {
27062306a36Sopenharmony_ci	case DWC3_DEPEVT_XFERCOMPLETE:
27162306a36Sopenharmony_ci		len += scnprintf(str + len, size - len,
27262306a36Sopenharmony_ci				"Transfer Complete (%c%c%c)",
27362306a36Sopenharmony_ci				status & DEPEVT_STATUS_SHORT ? 'S' : 's',
27462306a36Sopenharmony_ci				status & DEPEVT_STATUS_IOC ? 'I' : 'i',
27562306a36Sopenharmony_ci				status & DEPEVT_STATUS_LST ? 'L' : 'l');
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci		if (epnum <= 1)
27862306a36Sopenharmony_ci			scnprintf(str + len, size - len, " [%s]",
27962306a36Sopenharmony_ci					dwc3_ep0_state_string(ep0state));
28062306a36Sopenharmony_ci		break;
28162306a36Sopenharmony_ci	case DWC3_DEPEVT_XFERINPROGRESS:
28262306a36Sopenharmony_ci		scnprintf(str + len, size - len,
28362306a36Sopenharmony_ci				"Transfer In Progress [%08x] (%c%c%c)",
28462306a36Sopenharmony_ci				event->parameters,
28562306a36Sopenharmony_ci				status & DEPEVT_STATUS_SHORT ? 'S' : 's',
28662306a36Sopenharmony_ci				status & DEPEVT_STATUS_IOC ? 'I' : 'i',
28762306a36Sopenharmony_ci				status & DEPEVT_STATUS_LST ? 'M' : 'm');
28862306a36Sopenharmony_ci		break;
28962306a36Sopenharmony_ci	case DWC3_DEPEVT_XFERNOTREADY:
29062306a36Sopenharmony_ci		len += scnprintf(str + len, size - len,
29162306a36Sopenharmony_ci				"Transfer Not Ready [%08x]%s",
29262306a36Sopenharmony_ci				event->parameters,
29362306a36Sopenharmony_ci				status & DEPEVT_STATUS_TRANSFER_ACTIVE ?
29462306a36Sopenharmony_ci				" (Active)" : " (Not Active)");
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci		/* Control Endpoints */
29762306a36Sopenharmony_ci		if (epnum <= 1) {
29862306a36Sopenharmony_ci			int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci			switch (phase) {
30162306a36Sopenharmony_ci			case DEPEVT_STATUS_CONTROL_DATA:
30262306a36Sopenharmony_ci				scnprintf(str + len, size - len,
30362306a36Sopenharmony_ci						" [Data Phase]");
30462306a36Sopenharmony_ci				break;
30562306a36Sopenharmony_ci			case DEPEVT_STATUS_CONTROL_STATUS:
30662306a36Sopenharmony_ci				scnprintf(str + len, size - len,
30762306a36Sopenharmony_ci						" [Status Phase]");
30862306a36Sopenharmony_ci			}
30962306a36Sopenharmony_ci		}
31062306a36Sopenharmony_ci		break;
31162306a36Sopenharmony_ci	case DWC3_DEPEVT_RXTXFIFOEVT:
31262306a36Sopenharmony_ci		scnprintf(str + len, size - len, "FIFO");
31362306a36Sopenharmony_ci		break;
31462306a36Sopenharmony_ci	case DWC3_DEPEVT_STREAMEVT:
31562306a36Sopenharmony_ci		status = event->status;
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci		switch (status) {
31862306a36Sopenharmony_ci		case DEPEVT_STREAMEVT_FOUND:
31962306a36Sopenharmony_ci			scnprintf(str + len, size - len, " Stream %d Found",
32062306a36Sopenharmony_ci					event->parameters);
32162306a36Sopenharmony_ci			break;
32262306a36Sopenharmony_ci		case DEPEVT_STREAMEVT_NOTFOUND:
32362306a36Sopenharmony_ci		default:
32462306a36Sopenharmony_ci			scnprintf(str + len, size - len, " Stream Not Found");
32562306a36Sopenharmony_ci			break;
32662306a36Sopenharmony_ci		}
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci		break;
32962306a36Sopenharmony_ci	case DWC3_DEPEVT_EPCMDCMPLT:
33062306a36Sopenharmony_ci		scnprintf(str + len, size - len, "Endpoint Command Complete");
33162306a36Sopenharmony_ci		break;
33262306a36Sopenharmony_ci	default:
33362306a36Sopenharmony_ci		scnprintf(str + len, size - len, "UNKNOWN");
33462306a36Sopenharmony_ci	}
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	return str;
33762306a36Sopenharmony_ci}
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci/**
34062306a36Sopenharmony_ci * dwc3_gadget_event_type_string - return event name
34162306a36Sopenharmony_ci * @event: the event code
34262306a36Sopenharmony_ci */
34362306a36Sopenharmony_cistatic inline const char *dwc3_gadget_event_type_string(u8 event)
34462306a36Sopenharmony_ci{
34562306a36Sopenharmony_ci	switch (event) {
34662306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_DISCONNECT:
34762306a36Sopenharmony_ci		return "Disconnect";
34862306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_RESET:
34962306a36Sopenharmony_ci		return "Reset";
35062306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_CONNECT_DONE:
35162306a36Sopenharmony_ci		return "Connect Done";
35262306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
35362306a36Sopenharmony_ci		return "Link Status Change";
35462306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_WAKEUP:
35562306a36Sopenharmony_ci		return "Wake-Up";
35662306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_HIBER_REQ:
35762306a36Sopenharmony_ci		return "Hibernation";
35862306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_SUSPEND:
35962306a36Sopenharmony_ci		return "Suspend";
36062306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_SOF:
36162306a36Sopenharmony_ci		return "Start of Frame";
36262306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
36362306a36Sopenharmony_ci		return "Erratic Error";
36462306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_CMD_CMPL:
36562306a36Sopenharmony_ci		return "Command Complete";
36662306a36Sopenharmony_ci	case DWC3_DEVICE_EVENT_OVERFLOW:
36762306a36Sopenharmony_ci		return "Overflow";
36862306a36Sopenharmony_ci	default:
36962306a36Sopenharmony_ci		return "UNKNOWN";
37062306a36Sopenharmony_ci	}
37162306a36Sopenharmony_ci}
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cistatic inline const char *dwc3_decode_event(char *str, size_t size, u32 event,
37462306a36Sopenharmony_ci		u32 ep0state)
37562306a36Sopenharmony_ci{
37662306a36Sopenharmony_ci	union dwc3_event evt;
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	memcpy(&evt, &event, sizeof(event));
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	if (evt.type.is_devspec)
38162306a36Sopenharmony_ci		return dwc3_gadget_event_string(str, size, &evt.devt);
38262306a36Sopenharmony_ci	else
38362306a36Sopenharmony_ci		return dwc3_ep_event_string(str, size, &evt.depevt, ep0state);
38462306a36Sopenharmony_ci}
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_cistatic inline const char *dwc3_ep_cmd_status_string(int status)
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	switch (status) {
38962306a36Sopenharmony_ci	case -ETIMEDOUT:
39062306a36Sopenharmony_ci		return "Timed Out";
39162306a36Sopenharmony_ci	case 0:
39262306a36Sopenharmony_ci		return "Successful";
39362306a36Sopenharmony_ci	case DEPEVT_TRANSFER_NO_RESOURCE:
39462306a36Sopenharmony_ci		return "No Resource";
39562306a36Sopenharmony_ci	case DEPEVT_TRANSFER_BUS_EXPIRY:
39662306a36Sopenharmony_ci		return "Bus Expiry";
39762306a36Sopenharmony_ci	default:
39862306a36Sopenharmony_ci		return "UNKNOWN";
39962306a36Sopenharmony_ci	}
40062306a36Sopenharmony_ci}
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cistatic inline const char *dwc3_gadget_generic_cmd_status_string(int status)
40362306a36Sopenharmony_ci{
40462306a36Sopenharmony_ci	switch (status) {
40562306a36Sopenharmony_ci	case -ETIMEDOUT:
40662306a36Sopenharmony_ci		return "Timed Out";
40762306a36Sopenharmony_ci	case 0:
40862306a36Sopenharmony_ci		return "Successful";
40962306a36Sopenharmony_ci	case 1:
41062306a36Sopenharmony_ci		return "Error";
41162306a36Sopenharmony_ci	default:
41262306a36Sopenharmony_ci		return "UNKNOWN";
41362306a36Sopenharmony_ci	}
41462306a36Sopenharmony_ci}
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
41862306a36Sopenharmony_ciextern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
41962306a36Sopenharmony_ciextern void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep);
42062306a36Sopenharmony_ciextern void dwc3_debugfs_init(struct dwc3 *d);
42162306a36Sopenharmony_ciextern void dwc3_debugfs_exit(struct dwc3 *d);
42262306a36Sopenharmony_ci#else
42362306a36Sopenharmony_cistatic inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
42462306a36Sopenharmony_ci{  }
42562306a36Sopenharmony_cistatic inline void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep)
42662306a36Sopenharmony_ci{  }
42762306a36Sopenharmony_cistatic inline void dwc3_debugfs_init(struct dwc3 *d)
42862306a36Sopenharmony_ci{  }
42962306a36Sopenharmony_cistatic inline void dwc3_debugfs_exit(struct dwc3 *d)
43062306a36Sopenharmony_ci{  }
43162306a36Sopenharmony_ci#endif
43262306a36Sopenharmony_ci#endif /* __DWC3_DEBUG_H */
433