hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-License-Identifier: GPL-2.0+
/*
 * linux/drivers/usb/gadget/s3c2410_udc.h
 * Samsung on-chip full speed USB device controllers
 *
 * Copyright (C) 2004-2007 Herbert Pƶtzl - Arnaud Patard
 *    Additional cleanups by Ben Dooks <ben-linux@fluff.org>
 */
 
#ifndef _S3C2410_UDC_H
#define _S3C2410_UDC_H
 
struct s3c2410_ep {
   struct list_head        queue;
   unsigned long            last_io;    /* jiffies timestamp */
   struct usb_gadget        *gadget;
   struct s3c2410_udc        *dev;
   struct usb_ep            ep;
   u8                num;
 
   unsigned short            fifo_size;
   u8                bEndpointAddress;
   u8                bmAttributes;
 
   unsigned            halted : 1;
   unsigned            already_seen : 1;
   unsigned            setup_stage : 1;
};
 
 
/* Warning : ep0 has a fifo of 16 bytes */
/* Don't try to set 32 or 64            */
/* also testusb 14 fails  wit 16 but is */
/* fine with 8                          */
#define EP0_FIFO_SIZE         8
#define EP_FIFO_SIZE        64
#define DEFAULT_POWER_STATE    0x00
 
#define S3C2440_EP_FIFO_SIZE    128
 
static const char ep0name [] = "ep0";
 
static const char *const ep_name[] = {
   ep0name,                                /* everyone has ep0 */
   /* s3c2410 four bidirectional bulk endpoints */
   "ep1-bulk", "ep2-bulk", "ep3-bulk", "ep4-bulk",
};
 
#define S3C2410_ENDPOINTS       ARRAY_SIZE(ep_name)
 
struct s3c2410_request {
   struct list_head        queue;        /* ep's requests */
   struct usb_request        req;
};
 
enum ep0_state {
        EP0_IDLE,
        EP0_IN_DATA_PHASE,
        EP0_OUT_DATA_PHASE,
        EP0_END_XFER,
        EP0_STALL,
};
 
static const char *ep0states[]= {
        "EP0_IDLE",
        "EP0_IN_DATA_PHASE",
        "EP0_OUT_DATA_PHASE",
        "EP0_END_XFER",
        "EP0_STALL",
};
 
struct s3c2410_udc {
   spinlock_t            lock;
 
   struct s3c2410_ep        ep[S3C2410_ENDPOINTS];
   int                address;
   struct usb_gadget        gadget;
   struct usb_gadget_driver    *driver;
   struct s3c2410_request        fifo_req;
   u8                fifo_buf[EP_FIFO_SIZE];
   u16                devstatus;
 
   u32                port_status;
   int                ep0state;
 
   unsigned            got_irq : 1;
 
   unsigned            req_std : 1;
   unsigned            req_config : 1;
   unsigned            req_pending : 1;
   u8                vbus;
   struct dentry            *regs_info;
   int                irq;
};
#define to_s3c2410(g)    (container_of((g), struct s3c2410_udc, gadget))
 
#endif