1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include <common.h>
4 #include <linux/errno.h>
5 #include <linux/delay.h>
6 #include <asm/gpio.h>
7 #include <linux/list.h>
8 #include <linux/bitfield.h>
9 #include <linux/usb/ch9.h>
10 #include <linux/usb/gadget.h>
11 #include <malloc.h>
12 #include <spi.h>
13 #include <dm.h>
14 #include <g_dnl.h>
15
16 #define MAX3420_MAX_EPS 4
17 #define EP_MAX_PACKET 64 /* Same for all Endpoints */
18 #define EPNAME_SIZE 16 /* Buffer size for endpoint name */
19
20 #define MAX3420_SPI_DIR_RD 0 /* read register from MAX3420 */
21 #define MAX3420_SPI_DIR_WR 1 /* write register to MAX3420 */
22
23 /* SPI commands: */
24 #define MAX3420_SPI_ACK_MASK BIT(0)
25 #define MAX3420_SPI_DIR_MASK BIT(1)
26 #define MAX3420_SPI_REG_MASK GENMASK(7, 3)
27
28 #define MAX3420_REG_EP0FIFO 0
29 #define MAX3420_REG_EP1FIFO 1
30 #define MAX3420_REG_EP2FIFO 2
31 #define MAX3420_REG_EP3FIFO 3
32 #define MAX3420_REG_SUDFIFO 4
33 #define MAX3420_REG_EP0BC 5
34 #define MAX3420_REG_EP1BC 6
35 #define MAX3420_REG_EP2BC 7
36 #define MAX3420_REG_EP3BC 8
37
38 #define MAX3420_REG_EPSTALLS 9
39 #define bACKSTAT BIT(6)
40 #define bSTLSTAT BIT(5)
41 #define bSTLEP3IN BIT(4)
42 #define bSTLEP2IN BIT(3)
43 #define bSTLEP1OUT BIT(2)
44 #define bSTLEP0OUT BIT(1)
45 #define bSTLEP0IN BIT(0)
46
47 #define MAX3420_REG_CLRTOGS 10
48 #define bEP3DISAB BIT(7)
49 #define bEP2DISAB BIT(6)
50 #define bEP1DISAB BIT(5)
51 #define bCTGEP3IN BIT(4)
52 #define bCTGEP2IN BIT(3)
53 #define bCTGEP1OUT BIT(2)
54
55 #define MAX3420_REG_EPIRQ 11
56 #define MAX3420_REG_EPIEN 12
57 #define bSUDAVIRQ BIT(5)
58 #define bIN3BAVIRQ BIT(4)
59 #define bIN2BAVIRQ BIT(3)
60 #define bOUT1DAVIRQ BIT(2)
61 #define bOUT0DAVIRQ BIT(1)
62 #define bIN0BAVIRQ BIT(0)
63
64 #define MAX3420_REG_USBIRQ 13
65 #define MAX3420_REG_USBIEN 14
66 #define bOSCOKIRQ BIT(0)
67 #define bRWUDNIRQ BIT(1)
68 #define bBUSACTIRQ BIT(2)
69 #define bURESIRQ BIT(3)
70 #define bSUSPIRQ BIT(4)
71 #define bNOVBUSIRQ BIT(5)
72 #define bVBUSIRQ BIT(6)
73 #define bURESDNIRQ BIT(7)
74
75 #define MAX3420_REG_USBCTL 15
76 #define bHOSCSTEN BIT(7)
77 #define bVBGATE BIT(6)
78 #define bCHIPRES BIT(5)
79 #define bPWRDOWN BIT(4)
80 #define bCONNECT BIT(3)
81 #define bSIGRWU BIT(2)
82
83 #define MAX3420_REG_CPUCTL 16
84 #define bIE BIT(0)
85
86 #define MAX3420_REG_PINCTL 17
87 #define bEP3INAK BIT(7)
88 #define bEP2INAK BIT(6)
89 #define bEP0INAK BIT(5)
90 #define bFDUPSPI BIT(4)
91 #define bINTLEVEL BIT(3)
92 #define bPOSINT BIT(2)
93 #define bGPXB BIT(1)
94 #define bGPXA BIT(0)
95
96 #define MAX3420_REG_REVISION 18
97
98 #define MAX3420_REG_FNADDR 19
99 #define FNADDR_MASK 0x7f
100
101 #define MAX3420_REG_IOPINS 20
102 #define MAX3420_REG_IOPINS2 21
103 #define MAX3420_REG_GPINIRQ 22
104 #define MAX3420_REG_GPINIEN 23
105 #define MAX3420_REG_GPINPOL 24
106 #define MAX3420_REG_HIRQ 25
107 #define MAX3420_REG_HIEN 26
108 #define MAX3420_REG_MODE 27
109 #define MAX3420_REG_PERADDR 28
110 #define MAX3420_REG_HCTL 29
111 #define MAX3420_REG_HXFR 30
112 #define MAX3420_REG_HRSL 31
113
114 struct max3420_req {
115 struct usb_request usb_req;
116 struct list_head queue;
117 struct max3420_ep *ep;
118 };
119
120 struct max3420_ep {
121 struct max3420_udc *udc;
122 struct list_head queue;
123 char name[EPNAME_SIZE];
124 unsigned int maxpacket;
125 struct usb_ep ep_usb;
126 int halted;
127 int id;
128 };
129
130 struct max3420_udc {
131 struct max3420_ep ep[MAX3420_MAX_EPS];
132 struct usb_gadget_driver *driver;
133 bool softconnect;
134 struct usb_ctrlrequest setup;
135 struct max3420_req ep0req;
136 struct usb_gadget gadget;
137 struct spi_slave *slave;
138 struct udevice *dev;
139 u8 ep0buf[64];
140 int remote_wkp;
141 bool suspended;
142 };
143
144 #define to_max3420_req(r) container_of((r), struct max3420_req, usb_req)
145 #define to_max3420_ep(e) container_of((e), struct max3420_ep, ep_usb)
146 #define to_udc(g) container_of((g), struct max3420_udc, gadget)
147
spi_ack_ctrl(struct max3420_udc * udc)148 static void spi_ack_ctrl(struct max3420_udc *udc)
149 {
150 struct spi_slave *slave = udc->slave;
151 u8 txdata[1];
152
153 txdata[0] = FIELD_PREP(MAX3420_SPI_ACK_MASK, 1);
154 spi_xfer(slave, sizeof(txdata), txdata, NULL, SPI_XFER_ONCE);
155 }
156
spi_rd8_ack(struct max3420_udc * udc,u8 reg,int ackstat)157 static u8 spi_rd8_ack(struct max3420_udc *udc, u8 reg, int ackstat)
158 {
159 struct spi_slave *slave = udc->slave;
160 u8 txdata[2], rxdata[2];
161
162 txdata[0] = FIELD_PREP(MAX3420_SPI_REG_MASK, reg) |
163 FIELD_PREP(MAX3420_SPI_DIR_MASK, MAX3420_SPI_DIR_RD) |
164 FIELD_PREP(MAX3420_SPI_ACK_MASK, ackstat ? 1 : 0);
165
166 rxdata[0] = 0;
167 rxdata[1] = 0;
168 spi_xfer(slave, sizeof(txdata), txdata, rxdata, SPI_XFER_ONCE);
169
170 return rxdata[1];
171 }
172
spi_rd8(struct max3420_udc * udc,u8 reg)173 static u8 spi_rd8(struct max3420_udc *udc, u8 reg)
174 {
175 return spi_rd8_ack(udc, reg, 0);
176 }
177
spi_wr8_ack(struct max3420_udc * udc,u8 reg,u8 val,int ackstat)178 static void spi_wr8_ack(struct max3420_udc *udc, u8 reg, u8 val, int ackstat)
179 {
180 struct spi_slave *slave = udc->slave;
181 u8 txdata[2];
182
183 txdata[0] = FIELD_PREP(MAX3420_SPI_REG_MASK, reg) |
184 FIELD_PREP(MAX3420_SPI_DIR_MASK, MAX3420_SPI_DIR_WR) |
185 FIELD_PREP(MAX3420_SPI_ACK_MASK, ackstat ? 1 : 0);
186 txdata[1] = val;
187
188 spi_xfer(slave, sizeof(txdata), txdata, NULL, SPI_XFER_ONCE);
189 }
190
spi_wr8(struct max3420_udc * udc,u8 reg,u8 val)191 static void spi_wr8(struct max3420_udc *udc, u8 reg, u8 val)
192 {
193 spi_wr8_ack(udc, reg, val, 0);
194 }
195
spi_rd_buf(struct max3420_udc * udc,u8 reg,void * buf,u8 len)196 static void spi_rd_buf(struct max3420_udc *udc, u8 reg, void *buf, u8 len)
197 {
198 struct spi_slave *slave = udc->slave;
199 u8 txdata[1];
200
201 txdata[0] = FIELD_PREP(MAX3420_SPI_REG_MASK, reg) |
202 FIELD_PREP(MAX3420_SPI_DIR_MASK, MAX3420_SPI_DIR_RD);
203
204 spi_xfer(slave, sizeof(txdata), txdata, NULL, SPI_XFER_BEGIN);
205 spi_xfer(slave, len * 8, NULL, buf, SPI_XFER_END);
206 }
207
spi_wr_buf(struct max3420_udc * udc,u8 reg,void * buf,u8 len)208 static void spi_wr_buf(struct max3420_udc *udc, u8 reg, void *buf, u8 len)
209 {
210 struct spi_slave *slave = udc->slave;
211 u8 txdata[1];
212
213 txdata[0] = FIELD_PREP(MAX3420_SPI_REG_MASK, reg) |
214 FIELD_PREP(MAX3420_SPI_DIR_MASK, MAX3420_SPI_DIR_WR);
215
216 spi_xfer(slave, sizeof(txdata), txdata, NULL, SPI_XFER_BEGIN);
217 spi_xfer(slave, len * 8, buf, NULL, SPI_XFER_END);
218 }
219
220 /* 0 if not-connected */
g_dnl_board_usb_cable_connected(void)221 int g_dnl_board_usb_cable_connected(void)
222 {
223 return 1;
224 }
225
spi_max3420_enable(struct max3420_ep * ep,int enable)226 static void spi_max3420_enable(struct max3420_ep *ep, int enable)
227 {
228 struct max3420_udc *udc = ep->udc;
229 u8 epdis, epien;
230
231 if (ep->id == 0)
232 return;
233
234 epien = spi_rd8(udc, MAX3420_REG_EPIEN);
235 epdis = spi_rd8(udc, MAX3420_REG_CLRTOGS);
236
237 if (enable) {
238 epdis &= ~BIT(ep->id + 4);
239 epien |= BIT(ep->id + 1);
240 } else {
241 epdis |= BIT(ep->id + 4);
242 epien &= ~BIT(ep->id + 1);
243 }
244
245 spi_wr8(udc, MAX3420_REG_CLRTOGS, epdis);
246 spi_wr8(udc, MAX3420_REG_EPIEN, epien);
247 }
248
249 static int
max3420_ep_enable(struct usb_ep * _ep,const struct usb_endpoint_descriptor * desc)250 max3420_ep_enable(struct usb_ep *_ep,
251 const struct usb_endpoint_descriptor *desc)
252 {
253 struct max3420_ep *ep = to_max3420_ep(_ep);
254
255 _ep->desc = desc;
256 _ep->maxpacket = usb_endpoint_maxp(desc) & 0x7ff;
257
258 spi_max3420_enable(ep, 1);
259
260 return 0;
261 }
262
max3420_req_done(struct max3420_req * req,int status)263 static void max3420_req_done(struct max3420_req *req, int status)
264 {
265 struct max3420_ep *ep = req->ep;
266
267 if (req->usb_req.status == -EINPROGRESS)
268 req->usb_req.status = status;
269 else
270 status = req->usb_req.status;
271
272 if (status && status != -ESHUTDOWN)
273 dev_err(ep->udc->dev, "%s done %p, status %d\n",
274 ep->ep_usb.name, req, status);
275
276 if (req->usb_req.complete)
277 req->usb_req.complete(&ep->ep_usb, &req->usb_req);
278 }
279
max3420_ep_nuke(struct max3420_ep * ep,int status)280 static void max3420_ep_nuke(struct max3420_ep *ep, int status)
281 {
282 struct max3420_req *req, *r;
283
284 list_for_each_entry_safe(req, r, &ep->queue, queue) {
285 list_del_init(&req->queue);
286 max3420_req_done(req, status);
287 }
288 }
289
max3420_ep_disable(struct usb_ep * _ep)290 static int max3420_ep_disable(struct usb_ep *_ep)
291 {
292 struct max3420_ep *ep = to_max3420_ep(_ep);
293
294 _ep->desc = NULL;
295 max3420_ep_nuke(ep, -ESHUTDOWN);
296 spi_max3420_enable(ep, 0);
297
298 return 0;
299 }
300
301 static struct usb_request *
max3420_ep_alloc_request(struct usb_ep * _ep,gfp_t gfp_flags)302 max3420_ep_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
303 {
304 struct max3420_ep *ep = to_max3420_ep(_ep);
305 struct max3420_req *req = kzalloc(sizeof(*req), gfp_flags);
306
307 if (!req)
308 return NULL;
309
310 req->ep = ep;
311 INIT_LIST_HEAD(&req->queue);
312
313 return &req->usb_req;
314 }
315
316 static void
max3420_ep_free_request(struct usb_ep * _ep,struct usb_request * _req)317 max3420_ep_free_request(struct usb_ep *_ep, struct usb_request *_req)
318 {
319 kfree(to_max3420_req(_req));
320 }
321
322 static int
max3420_ep_queue(struct usb_ep * _ep,struct usb_request * _req,gfp_t gfp_flags)323 max3420_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
324 {
325 struct max3420_req *req = to_max3420_req(_req);
326 struct max3420_ep *ep = to_max3420_ep(_ep);
327
328 _req->status = -EINPROGRESS;
329 _req->actual = 0;
330 list_add_tail(&req->queue, &ep->queue);
331
332 return 0;
333 }
334
max3420_ep_dequeue(struct usb_ep * _ep,struct usb_request * _req)335 static int max3420_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
336 {
337 struct max3420_req *req = to_max3420_req(_req);
338
339 list_del_init(&req->queue);
340 max3420_req_done(req, -ECONNRESET);
341
342 return 0;
343 }
344
max3420_ep_set_halt(struct usb_ep * _ep,int halt)345 static int max3420_ep_set_halt(struct usb_ep *_ep, int halt)
346 {
347 struct max3420_ep *ep = to_max3420_ep(_ep);
348 struct max3420_udc *udc = ep->udc;
349 u8 epstalls;
350
351 if (ep->id == 0) /* can't stall EP0 */
352 return 0;
353
354 epstalls = spi_rd8(udc, MAX3420_REG_EPSTALLS);
355 if (halt) {
356 ep->halted = 1;
357 epstalls |= BIT(ep->id + 1);
358 } else {
359 u8 clrtogs;
360
361 ep->halted = 0;
362 epstalls &= ~BIT(ep->id + 1);
363 clrtogs = spi_rd8(udc, MAX3420_REG_CLRTOGS);
364 clrtogs |= BIT(ep->id + 1);
365 spi_wr8(udc, MAX3420_REG_CLRTOGS, clrtogs);
366 }
367 spi_wr8(udc, MAX3420_REG_EPSTALLS, epstalls | bACKSTAT);
368
369 return 0;
370 }
371
372 static const struct usb_ep_ops max3420_ep_ops = {
373 .enable = max3420_ep_enable,
374 .disable = max3420_ep_disable,
375 .alloc_request = max3420_ep_alloc_request,
376 .free_request = max3420_ep_free_request,
377 .queue = max3420_ep_queue,
378 .dequeue = max3420_ep_dequeue,
379 .set_halt = max3420_ep_set_halt,
380 };
381
__max3420_stop(struct max3420_udc * udc)382 static void __max3420_stop(struct max3420_udc *udc)
383 {
384 u8 val;
385
386 /* Disable IRQ to CPU */
387 spi_wr8(udc, MAX3420_REG_CPUCTL, 0);
388
389 val = spi_rd8(udc, MAX3420_REG_USBCTL);
390 val |= bPWRDOWN;
391 val |= bHOSCSTEN;
392 spi_wr8(udc, MAX3420_REG_USBCTL, val);
393 }
394
__max3420_start(struct max3420_udc * udc)395 static void __max3420_start(struct max3420_udc *udc)
396 {
397 u8 val;
398
399 /* configure SPI */
400 spi_wr8(udc, MAX3420_REG_PINCTL, bFDUPSPI);
401
402 /* Chip Reset */
403 spi_wr8(udc, MAX3420_REG_USBCTL, bCHIPRES);
404 mdelay(5);
405 spi_wr8(udc, MAX3420_REG_USBCTL, 0);
406
407 /* Poll for OSC to stabilize */
408 while (1) {
409 val = spi_rd8(udc, MAX3420_REG_USBIRQ);
410 if (val & bOSCOKIRQ)
411 break;
412 cond_resched();
413 }
414
415 /* Enable PULL-UP only when Vbus detected */
416 val = spi_rd8(udc, MAX3420_REG_USBCTL);
417 val |= bVBGATE | bCONNECT;
418 spi_wr8(udc, MAX3420_REG_USBCTL, val);
419
420 val = bURESDNIRQ | bURESIRQ;
421 spi_wr8(udc, MAX3420_REG_USBIEN, val);
422
423 /* Enable only EP0 interrupts */
424 val = bIN0BAVIRQ | bOUT0DAVIRQ | bSUDAVIRQ;
425 spi_wr8(udc, MAX3420_REG_EPIEN, val);
426
427 /* Enable IRQ to CPU */
428 spi_wr8(udc, MAX3420_REG_CPUCTL, bIE);
429 }
430
max3420_udc_start(struct usb_gadget * gadget,struct usb_gadget_driver * driver)431 static int max3420_udc_start(struct usb_gadget *gadget,
432 struct usb_gadget_driver *driver)
433 {
434 struct max3420_udc *udc = to_udc(gadget);
435
436 udc->driver = driver;
437 udc->remote_wkp = 0;
438 udc->softconnect = true;
439
440 __max3420_start(udc);
441
442 return 0;
443 }
444
max3420_udc_stop(struct usb_gadget * gadget)445 static int max3420_udc_stop(struct usb_gadget *gadget)
446 {
447 struct max3420_udc *udc = to_udc(gadget);
448
449 udc->driver = NULL;
450 udc->softconnect = false;
451
452 __max3420_stop(udc);
453
454 return 0;
455 }
456
max3420_wakeup(struct usb_gadget * gadget)457 static int max3420_wakeup(struct usb_gadget *gadget)
458 {
459 struct max3420_udc *udc = to_udc(gadget);
460 u8 usbctl;
461
462 /* Only if wakeup allowed by host */
463 if (!udc->remote_wkp || !udc->suspended)
464 return 0;
465
466 /* Set Remote-Wakeup Signal*/
467 usbctl = spi_rd8(udc, MAX3420_REG_USBCTL);
468 usbctl |= bSIGRWU;
469 spi_wr8(udc, MAX3420_REG_USBCTL, usbctl);
470
471 mdelay(5);
472
473 /* Clear Remote-WkUp Signal*/
474 usbctl = spi_rd8(udc, MAX3420_REG_USBCTL);
475 usbctl &= ~bSIGRWU;
476 spi_wr8(udc, MAX3420_REG_USBCTL, usbctl);
477
478 udc->suspended = false;
479
480 return 0;
481 }
482
483 static const struct usb_gadget_ops max3420_udc_ops = {
484 .udc_start = max3420_udc_start,
485 .udc_stop = max3420_udc_stop,
486 .wakeup = max3420_wakeup,
487 };
488
489 static struct usb_endpoint_descriptor ep0_desc = {
490 .bLength = USB_DT_ENDPOINT_SIZE,
491 .bDescriptorType = USB_DT_ENDPOINT,
492 .bEndpointAddress = USB_DIR_OUT,
493 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
494 .wMaxPacketSize = cpu_to_le16(EP_MAX_PACKET),
495 };
496
max3420_getstatus(struct max3420_udc * udc)497 static void max3420_getstatus(struct max3420_udc *udc)
498 {
499 struct max3420_ep *ep;
500 u16 status = 0;
501
502 switch (udc->setup.bRequestType & USB_RECIP_MASK) {
503 case USB_RECIP_DEVICE:
504 /* Get device status */
505 status = 0 << USB_DEVICE_SELF_POWERED;
506 status |= (udc->remote_wkp << USB_DEVICE_REMOTE_WAKEUP);
507 break;
508 case USB_RECIP_INTERFACE:
509 if (udc->driver->setup(&udc->gadget, &udc->setup) < 0)
510 goto stall;
511 break;
512 case USB_RECIP_ENDPOINT:
513 ep = &udc->ep[udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK];
514 if (ep->halted)
515 status = 1 << USB_ENDPOINT_HALT;
516 break;
517 default:
518 goto stall;
519 }
520
521 status = cpu_to_le16(status);
522 spi_wr_buf(udc, MAX3420_REG_EP0FIFO, &status, 2);
523 spi_wr8_ack(udc, MAX3420_REG_EP0BC, 2, 1);
524 return;
525 stall:
526 dev_err(udc->dev, "Can't respond to getstatus request\n");
527 spi_wr8(udc, MAX3420_REG_EPSTALLS, bSTLEP0IN | bSTLEP0OUT | bSTLSTAT);
528 }
529
max3420_set_clear_feature(struct max3420_udc * udc)530 static void max3420_set_clear_feature(struct max3420_udc *udc)
531 {
532 int set = udc->setup.bRequest == USB_REQ_SET_FEATURE;
533 struct max3420_ep *ep;
534 int id;
535
536 switch (udc->setup.bRequestType) {
537 case USB_RECIP_DEVICE:
538 if (udc->setup.wValue != USB_DEVICE_REMOTE_WAKEUP)
539 break;
540
541 if (udc->setup.bRequest == USB_REQ_SET_FEATURE)
542 udc->remote_wkp = 1;
543 else
544 udc->remote_wkp = 0;
545
546 return spi_ack_ctrl(udc);
547
548 case USB_RECIP_ENDPOINT:
549 if (udc->setup.wValue != USB_ENDPOINT_HALT)
550 break;
551
552 id = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK;
553 ep = &udc->ep[id];
554
555 max3420_ep_set_halt(&ep->ep_usb, set);
556 return;
557 default:
558 break;
559 }
560
561 dev_err(udc->dev, "Can't respond to SET/CLEAR FEATURE\n");
562 spi_wr8(udc, MAX3420_REG_EPSTALLS, bSTLEP0IN | bSTLEP0OUT | bSTLSTAT);
563 }
564
max3420_handle_setup(struct max3420_udc * udc)565 static void max3420_handle_setup(struct max3420_udc *udc)
566 {
567 struct usb_ctrlrequest setup;
568 u8 addr;
569
570 spi_rd_buf(udc, MAX3420_REG_SUDFIFO, (void *)&setup, 8);
571
572 udc->setup = setup;
573 udc->setup.wValue = cpu_to_le16(setup.wValue);
574 udc->setup.wIndex = cpu_to_le16(setup.wIndex);
575 udc->setup.wLength = cpu_to_le16(setup.wLength);
576
577 switch (udc->setup.bRequest) {
578 case USB_REQ_GET_STATUS:
579 /* Data+Status phase form udc */
580 if ((udc->setup.bRequestType &
581 (USB_DIR_IN | USB_TYPE_MASK)) !=
582 (USB_DIR_IN | USB_TYPE_STANDARD)) {
583 break;
584 }
585 return max3420_getstatus(udc);
586 case USB_REQ_SET_ADDRESS:
587 /* Status phase from udc */
588 if (udc->setup.bRequestType != (USB_DIR_OUT |
589 USB_TYPE_STANDARD | USB_RECIP_DEVICE))
590 break;
591 addr = spi_rd8_ack(udc, MAX3420_REG_FNADDR, 1);
592 dev_dbg(udc->dev, "Assigned Address=%d/%d\n",
593 udc->setup.wValue, addr);
594 return;
595 case USB_REQ_CLEAR_FEATURE:
596 case USB_REQ_SET_FEATURE:
597 /* Requests with no data phase, status phase from udc */
598 if ((udc->setup.bRequestType & USB_TYPE_MASK)
599 != USB_TYPE_STANDARD)
600 break;
601 return max3420_set_clear_feature(udc);
602 default:
603 break;
604 }
605
606 if (udc->driver->setup(&udc->gadget, &setup) < 0) {
607 /* Stall EP0 */
608 spi_wr8(udc, MAX3420_REG_EPSTALLS,
609 bSTLEP0IN | bSTLEP0OUT | bSTLSTAT);
610 }
611 }
612
do_data(struct max3420_udc * udc,int ep_id,int in)613 static int do_data(struct max3420_udc *udc, int ep_id, int in)
614 {
615 struct max3420_ep *ep = &udc->ep[ep_id];
616 struct max3420_req *req;
617 int done, length, psz;
618 void *buf;
619
620 if (list_empty(&ep->queue))
621 return 0;
622
623 req = list_first_entry(&ep->queue, struct max3420_req, queue);
624 buf = req->usb_req.buf + req->usb_req.actual;
625
626 psz = ep->ep_usb.maxpacket;
627 length = req->usb_req.length - req->usb_req.actual;
628 length = min(length, psz);
629
630 if (length == 0) {
631 done = 1;
632 goto xfer_done;
633 }
634
635 done = 0;
636 if (in) {
637 spi_wr_buf(udc, MAX3420_REG_EP0FIFO + ep_id, buf, length);
638 spi_wr8(udc, MAX3420_REG_EP0BC + ep_id, length);
639 if (length < psz)
640 done = 1;
641 } else {
642 psz = spi_rd8(udc, MAX3420_REG_EP0BC + ep_id);
643 length = min(length, psz);
644 spi_rd_buf(udc, MAX3420_REG_EP0FIFO + ep_id, buf, length);
645 if (length < ep->ep_usb.maxpacket)
646 done = 1;
647 }
648
649 req->usb_req.actual += length;
650
651 if (req->usb_req.actual == req->usb_req.length)
652 done = 1;
653
654 xfer_done:
655 if (done) {
656 list_del_init(&req->queue);
657
658 if (ep_id == 0)
659 spi_ack_ctrl(udc);
660
661 max3420_req_done(req, 0);
662 }
663
664 return 1;
665 }
666
max3420_handle_irqs(struct max3420_udc * udc)667 static int max3420_handle_irqs(struct max3420_udc *udc)
668 {
669 u8 epien, epirq, usbirq, usbien, reg[4];
670 int ret = 0;
671
672 spi_rd_buf(udc, MAX3420_REG_EPIRQ, reg, 4);
673 epirq = reg[0];
674 epien = reg[1];
675 usbirq = reg[2];
676 usbien = reg[3];
677
678 usbirq &= usbien;
679 epirq &= epien;
680
681 if (epirq & bSUDAVIRQ) {
682 spi_wr8(udc, MAX3420_REG_EPIRQ, bSUDAVIRQ);
683 max3420_handle_setup(udc);
684 return 1;
685 }
686
687 if (usbirq & bVBUSIRQ) {
688 spi_wr8(udc, MAX3420_REG_USBIRQ, bVBUSIRQ);
689 dev_dbg(udc->dev, "Cable plugged in\n");
690 g_dnl_clear_detach();
691 return 1;
692 }
693
694 if (usbirq & bNOVBUSIRQ) {
695 spi_wr8(udc, MAX3420_REG_USBIRQ, bNOVBUSIRQ);
696 dev_dbg(udc->dev, "Cable pulled out\n");
697 g_dnl_trigger_detach();
698 return 1;
699 }
700
701 if (usbirq & bURESIRQ) {
702 spi_wr8(udc, MAX3420_REG_USBIRQ, bURESIRQ);
703 return 1;
704 }
705
706 if (usbirq & bURESDNIRQ) {
707 spi_wr8(udc, MAX3420_REG_USBIRQ, bURESDNIRQ);
708 spi_wr8(udc, MAX3420_REG_USBIEN, bURESDNIRQ | bURESIRQ);
709 spi_wr8(udc, MAX3420_REG_EPIEN, bSUDAVIRQ
710 | bIN0BAVIRQ | bOUT0DAVIRQ);
711 return 1;
712 }
713
714 if (usbirq & bSUSPIRQ) {
715 spi_wr8(udc, MAX3420_REG_USBIRQ, bSUSPIRQ);
716 dev_dbg(udc->dev, "USB Suspend - Enter\n");
717 udc->suspended = true;
718 return 1;
719 }
720
721 if (usbirq & bBUSACTIRQ) {
722 spi_wr8(udc, MAX3420_REG_USBIRQ, bBUSACTIRQ);
723 dev_dbg(udc->dev, "USB Suspend - Exit\n");
724 udc->suspended = false;
725 return 1;
726 }
727
728 if (usbirq & bRWUDNIRQ) {
729 spi_wr8(udc, MAX3420_REG_USBIRQ, bRWUDNIRQ);
730 dev_dbg(udc->dev, "Asked Host to wakeup\n");
731 return 1;
732 }
733
734 if (usbirq & bOSCOKIRQ) {
735 spi_wr8(udc, MAX3420_REG_USBIRQ, bOSCOKIRQ);
736 dev_dbg(udc->dev, "Osc stabilized, start work\n");
737 return 1;
738 }
739
740 if (epirq & bOUT0DAVIRQ && do_data(udc, 0, 0)) {
741 spi_wr8_ack(udc, MAX3420_REG_EPIRQ, bOUT0DAVIRQ, 1);
742 ret = 1;
743 }
744
745 if (epirq & bIN0BAVIRQ && do_data(udc, 0, 1))
746 ret = 1;
747
748 if (epirq & bOUT1DAVIRQ && do_data(udc, 1, 0)) {
749 spi_wr8_ack(udc, MAX3420_REG_EPIRQ, bOUT1DAVIRQ, 1);
750 ret = 1;
751 }
752
753 if (epirq & bIN2BAVIRQ && do_data(udc, 2, 1))
754 ret = 1;
755
756 if (epirq & bIN3BAVIRQ && do_data(udc, 3, 1))
757 ret = 1;
758
759 return ret;
760 }
761
max3420_irq(struct max3420_udc * udc)762 static int max3420_irq(struct max3420_udc *udc)
763 {
764 do_data(udc, 0, 1); /* get done with the EP0 ZLP */
765
766 return max3420_handle_irqs(udc);
767 }
768
max3420_setup_eps(struct max3420_udc * udc)769 static void max3420_setup_eps(struct max3420_udc *udc)
770 {
771 int i;
772
773 INIT_LIST_HEAD(&udc->gadget.ep_list);
774 INIT_LIST_HEAD(&udc->ep[0].ep_usb.ep_list);
775
776 for (i = 0; i < MAX3420_MAX_EPS; i++) {
777 struct max3420_ep *ep = &udc->ep[i];
778
779 INIT_LIST_HEAD(&ep->queue);
780
781 ep->id = i;
782 ep->udc = udc;
783 ep->ep_usb.ops = &max3420_ep_ops;
784 ep->ep_usb.name = ep->name;
785 ep->ep_usb.maxpacket = EP_MAX_PACKET;
786
787 if (i == 0) {
788 ep->ep_usb.desc = &ep0_desc;
789 snprintf(ep->name, EPNAME_SIZE, "ep0");
790 continue;
791 }
792
793 list_add_tail(&ep->ep_usb.ep_list, &udc->gadget.ep_list);
794
795 if (i == 1)
796 snprintf(ep->name, EPNAME_SIZE, "ep1out-bulk");
797 else
798 snprintf(ep->name, EPNAME_SIZE, "ep%din-bulk", i);
799 };
800 }
801
max3420_setup_spi(struct max3420_udc * udc)802 static void max3420_setup_spi(struct max3420_udc *udc)
803 {
804 u8 reg[8];
805
806 spi_claim_bus(udc->slave);
807 spi_rd_buf(udc, MAX3420_REG_EPIRQ, reg, 8);
808 /* configure SPI */
809 spi_wr8(udc, MAX3420_REG_PINCTL, bFDUPSPI);
810 }
811
dm_usb_gadget_handle_interrupts(struct udevice * dev)812 int dm_usb_gadget_handle_interrupts(struct udevice *dev)
813 {
814 struct max3420_udc *udc = dev_get_priv(dev);
815
816 return max3420_irq(udc);
817 }
818
max3420_udc_probe(struct udevice * dev)819 static int max3420_udc_probe(struct udevice *dev)
820 {
821 struct max3420_udc *udc = dev_get_priv(dev);
822 struct dm_spi_slave_plat *slave_pdata;
823 struct udevice *bus = dev->parent;
824 int busnum = dev_seq(bus);
825 unsigned int cs;
826 uint speed, mode;
827 struct udevice *spid;
828
829 slave_pdata = dev_get_parent_plat(dev);
830 cs = slave_pdata->cs;
831 speed = slave_pdata->max_hz;
832 mode = slave_pdata->mode;
833 spi_get_bus_and_cs(busnum, cs, speed, mode, "spi_generic_drv",
834 NULL, &spid, &udc->slave);
835
836 udc->dev = dev;
837 udc->gadget.ep0 = &udc->ep[0].ep_usb;
838 udc->gadget.max_speed = USB_SPEED_FULL;
839 udc->gadget.speed = USB_SPEED_FULL;
840 udc->gadget.is_dualspeed = 0;
841 udc->gadget.ops = &max3420_udc_ops;
842 udc->gadget.name = "max3420-udc";
843
844 max3420_setup_eps(udc);
845 max3420_setup_spi(udc);
846
847 usb_add_gadget_udc((struct device *)dev, &udc->gadget);
848
849 return 0;
850 }
851
max3420_udc_remove(struct udevice * dev)852 static int max3420_udc_remove(struct udevice *dev)
853 {
854 struct max3420_udc *udc = dev_get_priv(dev);
855
856 usb_del_gadget_udc(&udc->gadget);
857
858 spi_release_bus(udc->slave);
859
860 return 0;
861 }
862
863 static const struct udevice_id max3420_ids[] = {
864 { .compatible = "maxim,max3421-udc" },
865 { }
866 };
867
868 U_BOOT_DRIVER(max3420_generic_udc) = {
869 .name = "max3420-udc",
870 .id = UCLASS_USB_GADGET_GENERIC,
871 .of_match = max3420_ids,
872 .probe = max3420_udc_probe,
873 .remove = max3420_udc_remove,
874 .priv_auto = sizeof(struct max3420_udc),
875 };
876