162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * udc.c - Core UDC Framework
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2016 Intel Corporation
662306a36Sopenharmony_ci * Author: Felipe Balbi <felipe.balbi@linux.intel.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#undef TRACE_SYSTEM
1062306a36Sopenharmony_ci#define TRACE_SYSTEM gadget
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#if !defined(__UDC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
1362306a36Sopenharmony_ci#define __UDC_TRACE_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/types.h>
1662306a36Sopenharmony_ci#include <linux/tracepoint.h>
1762306a36Sopenharmony_ci#include <asm/byteorder.h>
1862306a36Sopenharmony_ci#include <linux/usb/gadget.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(udc_log_gadget,
2162306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
2262306a36Sopenharmony_ci	TP_ARGS(g, ret),
2362306a36Sopenharmony_ci	TP_STRUCT__entry(
2462306a36Sopenharmony_ci		__field(enum usb_device_speed, speed)
2562306a36Sopenharmony_ci		__field(enum usb_device_speed, max_speed)
2662306a36Sopenharmony_ci		__field(enum usb_device_state, state)
2762306a36Sopenharmony_ci		__field(unsigned, mA)
2862306a36Sopenharmony_ci		__field(unsigned, sg_supported)
2962306a36Sopenharmony_ci		__field(unsigned, is_otg)
3062306a36Sopenharmony_ci		__field(unsigned, is_a_peripheral)
3162306a36Sopenharmony_ci		__field(unsigned, b_hnp_enable)
3262306a36Sopenharmony_ci		__field(unsigned, a_hnp_support)
3362306a36Sopenharmony_ci		__field(unsigned, hnp_polling_support)
3462306a36Sopenharmony_ci		__field(unsigned, host_request_flag)
3562306a36Sopenharmony_ci		__field(unsigned, quirk_ep_out_aligned_size)
3662306a36Sopenharmony_ci		__field(unsigned, quirk_altset_not_supp)
3762306a36Sopenharmony_ci		__field(unsigned, quirk_stall_not_supp)
3862306a36Sopenharmony_ci		__field(unsigned, quirk_zlp_not_supp)
3962306a36Sopenharmony_ci		__field(unsigned, is_selfpowered)
4062306a36Sopenharmony_ci		__field(unsigned, deactivated)
4162306a36Sopenharmony_ci		__field(unsigned, connected)
4262306a36Sopenharmony_ci		__field(int, ret)
4362306a36Sopenharmony_ci	),
4462306a36Sopenharmony_ci	TP_fast_assign(
4562306a36Sopenharmony_ci		__entry->speed = g->speed;
4662306a36Sopenharmony_ci		__entry->max_speed = g->max_speed;
4762306a36Sopenharmony_ci		__entry->state = g->state;
4862306a36Sopenharmony_ci		__entry->mA = g->mA;
4962306a36Sopenharmony_ci		__entry->sg_supported = g->sg_supported;
5062306a36Sopenharmony_ci		__entry->is_otg = g->is_otg;
5162306a36Sopenharmony_ci		__entry->is_a_peripheral = g->is_a_peripheral;
5262306a36Sopenharmony_ci		__entry->b_hnp_enable = g->b_hnp_enable;
5362306a36Sopenharmony_ci		__entry->a_hnp_support = g->a_hnp_support;
5462306a36Sopenharmony_ci		__entry->hnp_polling_support = g->hnp_polling_support;
5562306a36Sopenharmony_ci		__entry->host_request_flag = g->host_request_flag;
5662306a36Sopenharmony_ci		__entry->quirk_ep_out_aligned_size = g->quirk_ep_out_aligned_size;
5762306a36Sopenharmony_ci		__entry->quirk_altset_not_supp = g->quirk_altset_not_supp;
5862306a36Sopenharmony_ci		__entry->quirk_stall_not_supp = g->quirk_stall_not_supp;
5962306a36Sopenharmony_ci		__entry->quirk_zlp_not_supp = g->quirk_zlp_not_supp;
6062306a36Sopenharmony_ci		__entry->is_selfpowered = g->is_selfpowered;
6162306a36Sopenharmony_ci		__entry->deactivated = g->deactivated;
6262306a36Sopenharmony_ci		__entry->connected = g->connected;
6362306a36Sopenharmony_ci		__entry->ret = ret;
6462306a36Sopenharmony_ci	),
6562306a36Sopenharmony_ci	TP_printk("speed %d/%d state %d %dmA [%s%s%s%s%s%s%s%s%s%s%s%s%s%s] --> %d",
6662306a36Sopenharmony_ci		__entry->speed, __entry->max_speed, __entry->state, __entry->mA,
6762306a36Sopenharmony_ci		__entry->sg_supported ? "sg:" : "",
6862306a36Sopenharmony_ci		__entry->is_otg ? "OTG:" : "",
6962306a36Sopenharmony_ci		__entry->is_a_peripheral ? "a_peripheral:" : "",
7062306a36Sopenharmony_ci		__entry->b_hnp_enable ? "b_hnp:" : "",
7162306a36Sopenharmony_ci		__entry->a_hnp_support ? "a_hnp:" : "",
7262306a36Sopenharmony_ci		__entry->hnp_polling_support ? "hnp_poll:" : "",
7362306a36Sopenharmony_ci		__entry->host_request_flag ? "hostreq:" : "",
7462306a36Sopenharmony_ci		__entry->quirk_ep_out_aligned_size ? "out_aligned:" : "",
7562306a36Sopenharmony_ci		__entry->quirk_altset_not_supp ? "no_altset:" : "",
7662306a36Sopenharmony_ci		__entry->quirk_stall_not_supp ? "no_stall:" : "",
7762306a36Sopenharmony_ci		__entry->quirk_zlp_not_supp ? "no_zlp" : "",
7862306a36Sopenharmony_ci		__entry->is_selfpowered ? "self-powered:" : "bus-powered:",
7962306a36Sopenharmony_ci		__entry->deactivated ? "deactivated:" : "activated:",
8062306a36Sopenharmony_ci		__entry->connected ? "connected" : "disconnected",
8162306a36Sopenharmony_ci		__entry->ret)
8262306a36Sopenharmony_ci);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_frame_number,
8562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
8662306a36Sopenharmony_ci	TP_ARGS(g, ret)
8762306a36Sopenharmony_ci);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_wakeup,
9062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
9162306a36Sopenharmony_ci	TP_ARGS(g, ret)
9262306a36Sopenharmony_ci);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_set_remote_wakeup,
9562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
9662306a36Sopenharmony_ci	TP_ARGS(g, ret)
9762306a36Sopenharmony_ci);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_set_selfpowered,
10062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
10162306a36Sopenharmony_ci	TP_ARGS(g, ret)
10262306a36Sopenharmony_ci);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_clear_selfpowered,
10562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
10662306a36Sopenharmony_ci	TP_ARGS(g, ret)
10762306a36Sopenharmony_ci);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_connect,
11062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
11162306a36Sopenharmony_ci	TP_ARGS(g, ret)
11262306a36Sopenharmony_ci);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_draw,
11562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
11662306a36Sopenharmony_ci	TP_ARGS(g, ret)
11762306a36Sopenharmony_ci);
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_disconnect,
12062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
12162306a36Sopenharmony_ci	TP_ARGS(g, ret)
12262306a36Sopenharmony_ci);
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_connect,
12562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
12662306a36Sopenharmony_ci	TP_ARGS(g, ret)
12762306a36Sopenharmony_ci);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_disconnect,
13062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
13162306a36Sopenharmony_ci	TP_ARGS(g, ret)
13262306a36Sopenharmony_ci);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_deactivate,
13562306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
13662306a36Sopenharmony_ci	TP_ARGS(g, ret)
13762306a36Sopenharmony_ci);
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_gadget, usb_gadget_activate,
14062306a36Sopenharmony_ci	TP_PROTO(struct usb_gadget *g, int ret),
14162306a36Sopenharmony_ci	TP_ARGS(g, ret)
14262306a36Sopenharmony_ci);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ciDECLARE_EVENT_CLASS(udc_log_ep,
14562306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
14662306a36Sopenharmony_ci	TP_ARGS(ep, ret),
14762306a36Sopenharmony_ci	TP_STRUCT__entry(
14862306a36Sopenharmony_ci		__string(name, ep->name)
14962306a36Sopenharmony_ci		__field(unsigned, maxpacket)
15062306a36Sopenharmony_ci		__field(unsigned, maxpacket_limit)
15162306a36Sopenharmony_ci		__field(unsigned, max_streams)
15262306a36Sopenharmony_ci		__field(unsigned, mult)
15362306a36Sopenharmony_ci		__field(unsigned, maxburst)
15462306a36Sopenharmony_ci		__field(u8, address)
15562306a36Sopenharmony_ci		__field(bool, claimed)
15662306a36Sopenharmony_ci		__field(bool, enabled)
15762306a36Sopenharmony_ci		__field(int, ret)
15862306a36Sopenharmony_ci	),
15962306a36Sopenharmony_ci	TP_fast_assign(
16062306a36Sopenharmony_ci		__assign_str(name, ep->name);
16162306a36Sopenharmony_ci		__entry->maxpacket = ep->maxpacket;
16262306a36Sopenharmony_ci		__entry->maxpacket_limit = ep->maxpacket_limit;
16362306a36Sopenharmony_ci		__entry->max_streams = ep->max_streams;
16462306a36Sopenharmony_ci		__entry->mult = ep->mult;
16562306a36Sopenharmony_ci		__entry->maxburst = ep->maxburst;
16662306a36Sopenharmony_ci		__entry->address = ep->address,
16762306a36Sopenharmony_ci		__entry->claimed = ep->claimed;
16862306a36Sopenharmony_ci		__entry->enabled = ep->enabled;
16962306a36Sopenharmony_ci		__entry->ret = ret;
17062306a36Sopenharmony_ci	),
17162306a36Sopenharmony_ci	TP_printk("%s: mps %d/%d streams %d mult %d burst %d addr %02x %s%s --> %d",
17262306a36Sopenharmony_ci		__get_str(name), __entry->maxpacket, __entry->maxpacket_limit,
17362306a36Sopenharmony_ci		__entry->max_streams, __entry->mult, __entry->maxburst,
17462306a36Sopenharmony_ci		__entry->address, __entry->claimed ? "claimed:" : "released:",
17562306a36Sopenharmony_ci		__entry->enabled ? "enabled" : "disabled", ret)
17662306a36Sopenharmony_ci);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_set_maxpacket_limit,
17962306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
18062306a36Sopenharmony_ci	TP_ARGS(ep, ret)
18162306a36Sopenharmony_ci);
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_enable,
18462306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
18562306a36Sopenharmony_ci	TP_ARGS(ep, ret)
18662306a36Sopenharmony_ci);
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_disable,
18962306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
19062306a36Sopenharmony_ci	TP_ARGS(ep, ret)
19162306a36Sopenharmony_ci);
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_set_halt,
19462306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
19562306a36Sopenharmony_ci	TP_ARGS(ep, ret)
19662306a36Sopenharmony_ci);
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_clear_halt,
19962306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
20062306a36Sopenharmony_ci	TP_ARGS(ep, ret)
20162306a36Sopenharmony_ci);
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_set_wedge,
20462306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
20562306a36Sopenharmony_ci	TP_ARGS(ep, ret)
20662306a36Sopenharmony_ci);
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_fifo_status,
20962306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
21062306a36Sopenharmony_ci	TP_ARGS(ep, ret)
21162306a36Sopenharmony_ci);
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ciDEFINE_EVENT(udc_log_ep, usb_ep_fifo_flush,
21462306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, int ret),
21562306a36Sopenharmony_ci	TP_ARGS(ep, ret)
21662306a36Sopenharmony_ci);
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(udc_log_req,
21962306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
22062306a36Sopenharmony_ci	TP_ARGS(ep, req, ret),
22162306a36Sopenharmony_ci	TP_STRUCT__entry(
22262306a36Sopenharmony_ci		__string(name, ep->name)
22362306a36Sopenharmony_ci		__field(unsigned, length)
22462306a36Sopenharmony_ci		__field(unsigned, actual)
22562306a36Sopenharmony_ci		__field(unsigned, num_sgs)
22662306a36Sopenharmony_ci		__field(unsigned, num_mapped_sgs)
22762306a36Sopenharmony_ci		__field(unsigned, stream_id)
22862306a36Sopenharmony_ci		__field(unsigned, no_interrupt)
22962306a36Sopenharmony_ci		__field(unsigned, zero)
23062306a36Sopenharmony_ci		__field(unsigned, short_not_ok)
23162306a36Sopenharmony_ci		__field(int, status)
23262306a36Sopenharmony_ci		__field(int, ret)
23362306a36Sopenharmony_ci		__field(struct usb_request *, req)
23462306a36Sopenharmony_ci	),
23562306a36Sopenharmony_ci	TP_fast_assign(
23662306a36Sopenharmony_ci		__assign_str(name, ep->name);
23762306a36Sopenharmony_ci		__entry->length = req->length;
23862306a36Sopenharmony_ci		__entry->actual = req->actual;
23962306a36Sopenharmony_ci		__entry->num_sgs = req->num_sgs;
24062306a36Sopenharmony_ci		__entry->num_mapped_sgs = req->num_mapped_sgs;
24162306a36Sopenharmony_ci		__entry->stream_id = req->stream_id;
24262306a36Sopenharmony_ci		__entry->no_interrupt = req->no_interrupt;
24362306a36Sopenharmony_ci		__entry->zero = req->zero;
24462306a36Sopenharmony_ci		__entry->short_not_ok = req->short_not_ok;
24562306a36Sopenharmony_ci		__entry->status = req->status;
24662306a36Sopenharmony_ci		__entry->ret = ret;
24762306a36Sopenharmony_ci		__entry->req = req;
24862306a36Sopenharmony_ci	),
24962306a36Sopenharmony_ci	TP_printk("%s: req %p length %d/%d sgs %d/%d stream %d %s%s%s status %d --> %d",
25062306a36Sopenharmony_ci		__get_str(name),__entry->req,  __entry->actual, __entry->length,
25162306a36Sopenharmony_ci		__entry->num_mapped_sgs, __entry->num_sgs, __entry->stream_id,
25262306a36Sopenharmony_ci		__entry->zero ? "Z" : "z",
25362306a36Sopenharmony_ci		__entry->short_not_ok ? "S" : "s",
25462306a36Sopenharmony_ci		__entry->no_interrupt ? "i" : "I",
25562306a36Sopenharmony_ci		__entry->status, __entry->ret
25662306a36Sopenharmony_ci	)
25762306a36Sopenharmony_ci);
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_req, usb_ep_alloc_request,
26062306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
26162306a36Sopenharmony_ci	TP_ARGS(ep, req, ret)
26262306a36Sopenharmony_ci);
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_req, usb_ep_free_request,
26562306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
26662306a36Sopenharmony_ci	TP_ARGS(ep, req, ret)
26762306a36Sopenharmony_ci);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_req, usb_ep_queue,
27062306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
27162306a36Sopenharmony_ci	TP_ARGS(ep, req, ret)
27262306a36Sopenharmony_ci);
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ciDEFINE_EVENT(udc_log_req, usb_ep_dequeue,
27562306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
27662306a36Sopenharmony_ci	TP_ARGS(ep, req, ret)
27762306a36Sopenharmony_ci);
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ciDEFINE_EVENT(udc_log_req, usb_gadget_giveback_request,
28062306a36Sopenharmony_ci	TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
28162306a36Sopenharmony_ci	TP_ARGS(ep, req, ret)
28262306a36Sopenharmony_ci);
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci#endif /* __UDC_TRACE_H */
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci/* this part has to be here */
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
28962306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
29262306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci#include <trace/define_trace.h>
295