This source file includes following definitions.
- cdns3_set_register_bit
- cdns3_ep_addr_to_index
- cdns3_get_dma_pos
- cdns3_next_request
- cdns3_next_align_buf
- cdns3_next_priv_request
- cdns3_select_ep
- cdns3_trb_virt_to_dma
- cdns3_ring_size
- cdns3_allocate_trb_pool
- cdns3_free_trb_pool
- cdns3_ep_stall_flush
- cdns3_hw_reset_eps_config
- cdns3_ep_inc_trb
- cdns3_ep_inc_enq
- cdns3_ep_inc_deq
- cdns3_move_deq_to_next_trb
- cdns3_allow_enable_l1
- cdns3_get_speed
- cdns3_start_all_request
- cdns3_wa2_descmiss_copy_data
- cdns3_wa2_gadget_giveback
- cdns3_wa2_gadget_ep_queue
- cdns3_wa2_remove_old_request
- cdns3_wa2_descmissing_packet
- cdns3_gadget_giveback
- cdns3_wa1_restore_cycle_bit
- cdns3_free_aligned_request_buf
- cdns3_prepare_aligned_request_buf
- cdns3_wa1_update_guard
- cdns3_wa1_tray_restore_cycle_bit
- cdns3_ep_run_transfer
- cdns3_set_hw_configuration
- cdns3_request_handled
- cdns3_transfer_completed
- cdns3_rearm_transfer
- cdns3_check_ep_interrupt_proceed
- cdns3_disconnect_gadget
- cdns3_check_usb_interrupt_proceed
- cdns3_device_irq_handler
- cdns3_device_thread_irq_handler
- cdns3_ep_onchip_buffer_reserve
- cdns3_configure_dmult
- cdns3_ep_config
- cdns3_ep_dir_is_correct
- cdns3_find_available_ep
- cdns3_gadget_match_ep
- cdns3_gadget_ep_alloc_request
- cdns3_gadget_ep_free_request
- cdns3_gadget_ep_enable
- cdns3_gadget_ep_disable
- __cdns3_gadget_ep_queue
- cdns3_gadget_ep_queue
- cdns3_gadget_ep_dequeue
- __cdns3_gadget_ep_set_halt
- __cdns3_gadget_ep_clear_halt
- cdns3_gadget_ep_set_halt
- cdns3_gadget_get_frame
- __cdns3_gadget_wakeup
- cdns3_gadget_wakeup
- cdns3_gadget_set_selfpowered
- cdns3_gadget_pullup
- cdns3_gadget_config
- cdns3_gadget_udc_start
- cdns3_gadget_udc_stop
- cdns3_free_all_eps
- cdns3_init_eps
- cdns3_gadget_exit
- cdns3_gadget_start
- __cdns3_gadget_init
- cdns3_gadget_suspend
- cdns3_gadget_resume
- cdns3_gadget_init
   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 #include <linux/dma-mapping.h>
  60 #include <linux/usb/gadget.h>
  61 #include <linux/module.h>
  62 #include <linux/iopoll.h>
  63 
  64 #include "core.h"
  65 #include "gadget-export.h"
  66 #include "gadget.h"
  67 #include "trace.h"
  68 #include "drd.h"
  69 
  70 static int __cdns3_gadget_ep_queue(struct usb_ep *ep,
  71                                    struct usb_request *request,
  72                                    gfp_t gfp_flags);
  73 
  74 
  75 
  76 
  77 
  78 
  79 void cdns3_set_register_bit(void __iomem *ptr, u32 mask)
  80 {
  81         mask = readl(ptr) | mask;
  82         writel(mask, ptr);
  83 }
  84 
  85 
  86 
  87 
  88 
  89 
  90 
  91 u8 cdns3_ep_addr_to_index(u8 ep_addr)
  92 {
  93         return (((ep_addr & 0x7F)) + ((ep_addr & USB_DIR_IN) ? 16 : 0));
  94 }
  95 
  96 static int cdns3_get_dma_pos(struct cdns3_device *priv_dev,
  97                              struct cdns3_endpoint *priv_ep)
  98 {
  99         int dma_index;
 100 
 101         dma_index = readl(&priv_dev->regs->ep_traddr) - priv_ep->trb_pool_dma;
 102 
 103         return dma_index / TRB_SIZE;
 104 }
 105 
 106 
 107 
 108 
 109 
 110 
 111 
 112 struct usb_request *cdns3_next_request(struct list_head *list)
 113 {
 114         return list_first_entry_or_null(list, struct usb_request, list);
 115 }
 116 
 117 
 118 
 119 
 120 
 121 
 122 
 123 struct cdns3_aligned_buf *cdns3_next_align_buf(struct list_head *list)
 124 {
 125         return list_first_entry_or_null(list, struct cdns3_aligned_buf, list);
 126 }
 127 
 128 
 129 
 130 
 131 
 132 
 133 
 134 struct cdns3_request *cdns3_next_priv_request(struct list_head *list)
 135 {
 136         return list_first_entry_or_null(list, struct cdns3_request, list);
 137 }
 138 
 139 
 140 
 141 
 142 
 143 
 144 void cdns3_select_ep(struct cdns3_device *priv_dev, u32 ep)
 145 {
 146         if (priv_dev->selected_ep == ep)
 147                 return;
 148 
 149         priv_dev->selected_ep = ep;
 150         writel(ep, &priv_dev->regs->ep_sel);
 151 }
 152 
 153 dma_addr_t cdns3_trb_virt_to_dma(struct cdns3_endpoint *priv_ep,
 154                                  struct cdns3_trb *trb)
 155 {
 156         u32 offset = (char *)trb - (char *)priv_ep->trb_pool;
 157 
 158         return priv_ep->trb_pool_dma + offset;
 159 }
 160 
 161 int cdns3_ring_size(struct cdns3_endpoint *priv_ep)
 162 {
 163         switch (priv_ep->type) {
 164         case USB_ENDPOINT_XFER_ISOC:
 165                 return TRB_ISO_RING_SIZE;
 166         case USB_ENDPOINT_XFER_CONTROL:
 167                 return TRB_CTRL_RING_SIZE;
 168         default:
 169                 return TRB_RING_SIZE;
 170         }
 171 }
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 int cdns3_allocate_trb_pool(struct cdns3_endpoint *priv_ep)
 180 {
 181         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 182         int ring_size = cdns3_ring_size(priv_ep);
 183         struct cdns3_trb *link_trb;
 184 
 185         if (!priv_ep->trb_pool) {
 186                 priv_ep->trb_pool = dma_alloc_coherent(priv_dev->sysdev,
 187                                                        ring_size,
 188                                                        &priv_ep->trb_pool_dma,
 189                                                        GFP_DMA32 | GFP_ATOMIC);
 190                 if (!priv_ep->trb_pool)
 191                         return -ENOMEM;
 192         } else {
 193                 memset(priv_ep->trb_pool, 0, ring_size);
 194         }
 195 
 196         if (!priv_ep->num)
 197                 return 0;
 198 
 199         priv_ep->num_trbs = ring_size / TRB_SIZE;
 200         
 201         link_trb = (priv_ep->trb_pool + (priv_ep->num_trbs - 1));
 202         link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma);
 203         link_trb->control = TRB_CYCLE | TRB_TYPE(TRB_LINK) | TRB_TOGGLE;
 204 
 205         return 0;
 206 }
 207 
 208 static void cdns3_free_trb_pool(struct cdns3_endpoint *priv_ep)
 209 {
 210         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 211 
 212         if (priv_ep->trb_pool) {
 213                 dma_free_coherent(priv_dev->sysdev,
 214                                   cdns3_ring_size(priv_ep),
 215                                   priv_ep->trb_pool, priv_ep->trb_pool_dma);
 216                 priv_ep->trb_pool = NULL;
 217         }
 218 }
 219 
 220 
 221 
 222 
 223 
 224 
 225 
 226 static void cdns3_ep_stall_flush(struct cdns3_endpoint *priv_ep)
 227 {
 228         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 229         int val;
 230 
 231         trace_cdns3_halt(priv_ep, 1, 1);
 232 
 233         writel(EP_CMD_DFLUSH | EP_CMD_ERDY | EP_CMD_SSTALL,
 234                &priv_dev->regs->ep_cmd);
 235 
 236         
 237         readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val,
 238                                   !(val & EP_CMD_DFLUSH), 1, 1000);
 239         priv_ep->flags |= EP_STALLED;
 240         priv_ep->flags &= ~EP_STALL_PENDING;
 241 }
 242 
 243 
 244 
 245 
 246 
 247 void cdns3_hw_reset_eps_config(struct cdns3_device *priv_dev)
 248 {
 249         writel(USB_CONF_CFGRST, &priv_dev->regs->usb_conf);
 250 
 251         cdns3_allow_enable_l1(priv_dev, 0);
 252         priv_dev->hw_configured_flag = 0;
 253         priv_dev->onchip_used_size = 0;
 254         priv_dev->out_mem_is_allocated = 0;
 255         priv_dev->wait_for_setup = 0;
 256 }
 257 
 258 
 259 
 260 
 261 
 262 
 263 
 264 
 265 
 266 
 267 
 268 
 269 static void cdns3_ep_inc_trb(int *index, u8 *cs, int trb_in_seg)
 270 {
 271         (*index)++;
 272         if (*index == (trb_in_seg - 1)) {
 273                 *index = 0;
 274                 *cs ^=  1;
 275         }
 276 }
 277 
 278 
 279 
 280 
 281 
 282 static void cdns3_ep_inc_enq(struct cdns3_endpoint *priv_ep)
 283 {
 284         priv_ep->free_trbs--;
 285         cdns3_ep_inc_trb(&priv_ep->enqueue, &priv_ep->pcs, priv_ep->num_trbs);
 286 }
 287 
 288 
 289 
 290 
 291 
 292 static void cdns3_ep_inc_deq(struct cdns3_endpoint *priv_ep)
 293 {
 294         priv_ep->free_trbs++;
 295         cdns3_ep_inc_trb(&priv_ep->dequeue, &priv_ep->ccs, priv_ep->num_trbs);
 296 }
 297 
 298 void cdns3_move_deq_to_next_trb(struct cdns3_request *priv_req)
 299 {
 300         struct cdns3_endpoint *priv_ep = priv_req->priv_ep;
 301         int current_trb = priv_req->start_trb;
 302 
 303         while (current_trb != priv_req->end_trb) {
 304                 cdns3_ep_inc_deq(priv_ep);
 305                 current_trb = priv_ep->dequeue;
 306         }
 307 
 308         cdns3_ep_inc_deq(priv_ep);
 309 }
 310 
 311 
 312 
 313 
 314 
 315 
 316 
 317 
 318 
 319 
 320 
 321 void cdns3_allow_enable_l1(struct cdns3_device *priv_dev, int enable)
 322 {
 323         if (enable)
 324                 writel(USB_CONF_L1EN, &priv_dev->regs->usb_conf);
 325         else
 326                 writel(USB_CONF_L1DS, &priv_dev->regs->usb_conf);
 327 }
 328 
 329 enum usb_device_speed cdns3_get_speed(struct cdns3_device *priv_dev)
 330 {
 331         u32 reg;
 332 
 333         reg = readl(&priv_dev->regs->usb_sts);
 334 
 335         if (DEV_SUPERSPEED(reg))
 336                 return USB_SPEED_SUPER;
 337         else if (DEV_HIGHSPEED(reg))
 338                 return USB_SPEED_HIGH;
 339         else if (DEV_FULLSPEED(reg))
 340                 return USB_SPEED_FULL;
 341         else if (DEV_LOWSPEED(reg))
 342                 return USB_SPEED_LOW;
 343         return USB_SPEED_UNKNOWN;
 344 }
 345 
 346 
 347 
 348 
 349 
 350 
 351 
 352 
 353 
 354 static int cdns3_start_all_request(struct cdns3_device *priv_dev,
 355                                    struct cdns3_endpoint *priv_ep)
 356 {
 357         struct usb_request *request;
 358         int ret = 0;
 359 
 360         while (!list_empty(&priv_ep->deferred_req_list)) {
 361                 request = cdns3_next_request(&priv_ep->deferred_req_list);
 362 
 363                 ret = cdns3_ep_run_transfer(priv_ep, request);
 364                 if (ret)
 365                         return ret;
 366 
 367                 list_del(&request->list);
 368                 list_add_tail(&request->list,
 369                               &priv_ep->pending_req_list);
 370         }
 371 
 372         priv_ep->flags &= ~EP_RING_FULL;
 373         return ret;
 374 }
 375 
 376 
 377 
 378 
 379 
 380 
 381 
 382 #define cdns3_wa2_enable_detection(priv_dev, ep_priv, reg) do { \
 383         if (!priv_ep->dir && priv_ep->type != USB_ENDPOINT_XFER_ISOC) { \
 384                 priv_ep->flags |= EP_QUIRK_EXTRA_BUF_DET; \
 385                 (reg) |= EP_STS_EN_DESCMISEN; \
 386         } } while (0)
 387 
 388 
 389 
 390 
 391 
 392 
 393 
 394 static void cdns3_wa2_descmiss_copy_data(struct cdns3_endpoint *priv_ep,
 395                                          struct usb_request *request)
 396 {
 397         struct usb_request *descmiss_req;
 398         struct cdns3_request *descmiss_priv_req;
 399 
 400         while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
 401                 int chunk_end;
 402                 int length;
 403 
 404                 descmiss_priv_req =
 405                         cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
 406                 descmiss_req = &descmiss_priv_req->request;
 407 
 408                 
 409                 if (descmiss_priv_req->flags & REQUEST_PENDING)
 410                         break;
 411 
 412                 chunk_end = descmiss_priv_req->flags & REQUEST_INTERNAL_CH;
 413                 length = request->actual + descmiss_req->actual;
 414 
 415                 request->status = descmiss_req->status;
 416 
 417                 if (length <= request->length) {
 418                         memcpy(&((u8 *)request->buf)[request->actual],
 419                                descmiss_req->buf,
 420                                descmiss_req->actual);
 421                         request->actual = length;
 422                 } else {
 423                         
 424                         request->status = -ENOMEM;
 425                 }
 426 
 427                 list_del_init(&descmiss_priv_req->list);
 428 
 429                 kfree(descmiss_req->buf);
 430                 cdns3_gadget_ep_free_request(&priv_ep->endpoint, descmiss_req);
 431                 --priv_ep->wa2_counter;
 432 
 433                 if (!chunk_end)
 434                         break;
 435         }
 436 }
 437 
 438 struct usb_request *cdns3_wa2_gadget_giveback(struct cdns3_device *priv_dev,
 439                                               struct cdns3_endpoint *priv_ep,
 440                                               struct cdns3_request *priv_req)
 441 {
 442         if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN &&
 443             priv_req->flags & REQUEST_INTERNAL) {
 444                 struct usb_request *req;
 445 
 446                 req = cdns3_next_request(&priv_ep->deferred_req_list);
 447 
 448                 priv_ep->descmis_req = NULL;
 449 
 450                 if (!req)
 451                         return NULL;
 452 
 453                 cdns3_wa2_descmiss_copy_data(priv_ep, req);
 454                 if (!(priv_ep->flags & EP_QUIRK_END_TRANSFER) &&
 455                     req->length != req->actual) {
 456                         
 457                         return NULL;
 458                 }
 459 
 460                 if (req->status == -EINPROGRESS)
 461                         req->status = 0;
 462 
 463                 list_del_init(&req->list);
 464                 cdns3_start_all_request(priv_dev, priv_ep);
 465                 return req;
 466         }
 467 
 468         return &priv_req->request;
 469 }
 470 
 471 int cdns3_wa2_gadget_ep_queue(struct cdns3_device *priv_dev,
 472                               struct cdns3_endpoint *priv_ep,
 473                               struct cdns3_request *priv_req)
 474 {
 475         int deferred = 0;
 476 
 477         
 478 
 479 
 480 
 481 
 482         if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_DET) {
 483                 u32 reg;
 484 
 485                 cdns3_select_ep(priv_dev, priv_ep->num | priv_ep->dir);
 486                 priv_ep->flags &= ~EP_QUIRK_EXTRA_BUF_DET;
 487                 reg = readl(&priv_dev->regs->ep_sts_en);
 488                 reg &= ~EP_STS_EN_DESCMISEN;
 489                 trace_cdns3_wa2(priv_ep, "workaround disabled\n");
 490                 writel(reg, &priv_dev->regs->ep_sts_en);
 491         }
 492 
 493         if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN) {
 494                 u8 pending_empty = list_empty(&priv_ep->pending_req_list);
 495                 u8 descmiss_empty = list_empty(&priv_ep->wa2_descmiss_req_list);
 496 
 497                 
 498 
 499 
 500 
 501 
 502                 if (pending_empty && !descmiss_empty &&
 503                     !(priv_req->flags & REQUEST_INTERNAL)) {
 504                         cdns3_wa2_descmiss_copy_data(priv_ep,
 505                                                      &priv_req->request);
 506 
 507                         trace_cdns3_wa2(priv_ep, "get internal stored data");
 508 
 509                         list_add_tail(&priv_req->request.list,
 510                                       &priv_ep->pending_req_list);
 511                         cdns3_gadget_giveback(priv_ep, priv_req,
 512                                               priv_req->request.status);
 513 
 514                         
 515 
 516 
 517 
 518 
 519                         return EINPROGRESS;
 520                 }
 521 
 522                 
 523 
 524 
 525 
 526                 if (!pending_empty && !descmiss_empty) {
 527                         trace_cdns3_wa2(priv_ep, "wait for pending transfer\n");
 528                         deferred = 1;
 529                 }
 530 
 531                 if (priv_req->flags & REQUEST_INTERNAL)
 532                         list_add_tail(&priv_req->list,
 533                                       &priv_ep->wa2_descmiss_req_list);
 534         }
 535 
 536         return deferred;
 537 }
 538 
 539 static void cdns3_wa2_remove_old_request(struct cdns3_endpoint *priv_ep)
 540 {
 541         struct cdns3_request *priv_req;
 542 
 543         while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
 544                 u8 chain;
 545 
 546                 priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
 547                 chain = !!(priv_req->flags & REQUEST_INTERNAL_CH);
 548 
 549                 trace_cdns3_wa2(priv_ep, "removes eldest request");
 550 
 551                 kfree(priv_req->request.buf);
 552                 cdns3_gadget_ep_free_request(&priv_ep->endpoint,
 553                                              &priv_req->request);
 554                 list_del_init(&priv_req->list);
 555                 --priv_ep->wa2_counter;
 556 
 557                 if (!chain)
 558                         break;
 559         }
 560 }
 561 
 562 
 563 
 564 
 565 
 566 
 567 
 568 
 569 static void cdns3_wa2_descmissing_packet(struct cdns3_endpoint *priv_ep)
 570 {
 571         struct cdns3_request *priv_req;
 572         struct usb_request *request;
 573 
 574         if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_DET) {
 575                 priv_ep->flags &= ~EP_QUIRK_EXTRA_BUF_DET;
 576                 priv_ep->flags |= EP_QUIRK_EXTRA_BUF_EN;
 577         }
 578 
 579         trace_cdns3_wa2(priv_ep, "Description Missing detected\n");
 580 
 581         if (priv_ep->wa2_counter >= CDNS3_WA2_NUM_BUFFERS)
 582                 cdns3_wa2_remove_old_request(priv_ep);
 583 
 584         request = cdns3_gadget_ep_alloc_request(&priv_ep->endpoint,
 585                                                 GFP_ATOMIC);
 586         if (!request)
 587                 goto err;
 588 
 589         priv_req = to_cdns3_request(request);
 590         priv_req->flags |= REQUEST_INTERNAL;
 591 
 592         
 593 
 594 
 595 
 596 
 597 
 598         if (priv_ep->descmis_req)
 599                 priv_ep->descmis_req->flags |= REQUEST_INTERNAL_CH;
 600 
 601         priv_req->request.buf = kzalloc(CDNS3_DESCMIS_BUF_SIZE,
 602                                         GFP_ATOMIC);
 603         priv_ep->wa2_counter++;
 604 
 605         if (!priv_req->request.buf) {
 606                 cdns3_gadget_ep_free_request(&priv_ep->endpoint, request);
 607                 goto err;
 608         }
 609 
 610         priv_req->request.length = CDNS3_DESCMIS_BUF_SIZE;
 611         priv_ep->descmis_req = priv_req;
 612 
 613         __cdns3_gadget_ep_queue(&priv_ep->endpoint,
 614                                 &priv_ep->descmis_req->request,
 615                                 GFP_ATOMIC);
 616 
 617         return;
 618 
 619 err:
 620         dev_err(priv_ep->cdns3_dev->dev,
 621                 "Failed: No sufficient memory for DESCMIS\n");
 622 }
 623 
 624 
 625 
 626 
 627 
 628 
 629 
 630 
 631 
 632 
 633 
 634 void cdns3_gadget_giveback(struct cdns3_endpoint *priv_ep,
 635                            struct cdns3_request *priv_req,
 636                            int status)
 637 {
 638         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 639         struct usb_request *request = &priv_req->request;
 640 
 641         list_del_init(&request->list);
 642 
 643         if (request->status == -EINPROGRESS)
 644                 request->status = status;
 645 
 646         usb_gadget_unmap_request_by_dev(priv_dev->sysdev, request,
 647                                         priv_ep->dir);
 648 
 649         if ((priv_req->flags & REQUEST_UNALIGNED) &&
 650             priv_ep->dir == USB_DIR_OUT && !request->status)
 651                 memcpy(request->buf, priv_req->aligned_buf->buf,
 652                        request->length);
 653 
 654         priv_req->flags &= ~(REQUEST_PENDING | REQUEST_UNALIGNED);
 655         trace_cdns3_gadget_giveback(priv_req);
 656 
 657         if (priv_dev->dev_ver < DEV_VER_V2) {
 658                 request = cdns3_wa2_gadget_giveback(priv_dev, priv_ep,
 659                                                     priv_req);
 660                 if (!request)
 661                         return;
 662         }
 663 
 664         if (request->complete) {
 665                 spin_unlock(&priv_dev->lock);
 666                 usb_gadget_giveback_request(&priv_ep->endpoint,
 667                                             request);
 668                 spin_lock(&priv_dev->lock);
 669         }
 670 
 671         if (request->buf == priv_dev->zlp_buf)
 672                 cdns3_gadget_ep_free_request(&priv_ep->endpoint, request);
 673 }
 674 
 675 void cdns3_wa1_restore_cycle_bit(struct cdns3_endpoint *priv_ep)
 676 {
 677         
 678         if (priv_ep->wa1_set) {
 679                 trace_cdns3_wa1(priv_ep, "restore cycle bit");
 680 
 681                 priv_ep->wa1_set = 0;
 682                 priv_ep->wa1_trb_index = 0xFFFF;
 683                 if (priv_ep->wa1_cycle_bit) {
 684                         priv_ep->wa1_trb->control =
 685                                 priv_ep->wa1_trb->control | 0x1;
 686                 } else {
 687                         priv_ep->wa1_trb->control =
 688                                 priv_ep->wa1_trb->control & ~0x1;
 689                 }
 690         }
 691 }
 692 
 693 static void cdns3_free_aligned_request_buf(struct work_struct *work)
 694 {
 695         struct cdns3_device *priv_dev = container_of(work, struct cdns3_device,
 696                                         aligned_buf_wq);
 697         struct cdns3_aligned_buf *buf, *tmp;
 698         unsigned long flags;
 699 
 700         spin_lock_irqsave(&priv_dev->lock, flags);
 701 
 702         list_for_each_entry_safe(buf, tmp, &priv_dev->aligned_buf_list, list) {
 703                 if (!buf->in_use) {
 704                         list_del(&buf->list);
 705 
 706                         
 707 
 708 
 709 
 710 
 711                         spin_unlock_irqrestore(&priv_dev->lock, flags);
 712                         dma_free_coherent(priv_dev->sysdev, buf->size,
 713                                           buf->buf, buf->dma);
 714                         kfree(buf);
 715                         spin_lock_irqsave(&priv_dev->lock, flags);
 716                 }
 717         }
 718 
 719         spin_unlock_irqrestore(&priv_dev->lock, flags);
 720 }
 721 
 722 static int cdns3_prepare_aligned_request_buf(struct cdns3_request *priv_req)
 723 {
 724         struct cdns3_endpoint *priv_ep = priv_req->priv_ep;
 725         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 726         struct cdns3_aligned_buf *buf;
 727 
 728         
 729         if (!((uintptr_t)priv_req->request.buf & 0x7))
 730                 return 0;
 731 
 732         buf = priv_req->aligned_buf;
 733 
 734         if (!buf || priv_req->request.length > buf->size) {
 735                 buf = kzalloc(sizeof(*buf), GFP_ATOMIC);
 736                 if (!buf)
 737                         return -ENOMEM;
 738 
 739                 buf->size = priv_req->request.length;
 740 
 741                 buf->buf = dma_alloc_coherent(priv_dev->sysdev,
 742                                               buf->size,
 743                                               &buf->dma,
 744                                               GFP_ATOMIC);
 745                 if (!buf->buf) {
 746                         kfree(buf);
 747                         return -ENOMEM;
 748                 }
 749 
 750                 if (priv_req->aligned_buf) {
 751                         trace_cdns3_free_aligned_request(priv_req);
 752                         priv_req->aligned_buf->in_use = 0;
 753                         queue_work(system_freezable_wq,
 754                                    &priv_dev->aligned_buf_wq);
 755                 }
 756 
 757                 buf->in_use = 1;
 758                 priv_req->aligned_buf = buf;
 759 
 760                 list_add_tail(&buf->list,
 761                               &priv_dev->aligned_buf_list);
 762         }
 763 
 764         if (priv_ep->dir == USB_DIR_IN) {
 765                 memcpy(buf->buf, priv_req->request.buf,
 766                        priv_req->request.length);
 767         }
 768 
 769         priv_req->flags |= REQUEST_UNALIGNED;
 770         trace_cdns3_prepare_aligned_request(priv_req);
 771 
 772         return 0;
 773 }
 774 
 775 static int cdns3_wa1_update_guard(struct cdns3_endpoint *priv_ep,
 776                                   struct cdns3_trb *trb)
 777 {
 778         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 779 
 780         if (!priv_ep->wa1_set) {
 781                 u32 doorbell;
 782 
 783                 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY);
 784 
 785                 if (doorbell) {
 786                         priv_ep->wa1_cycle_bit = priv_ep->pcs ? TRB_CYCLE : 0;
 787                         priv_ep->wa1_set = 1;
 788                         priv_ep->wa1_trb = trb;
 789                         priv_ep->wa1_trb_index = priv_ep->enqueue;
 790                         trace_cdns3_wa1(priv_ep, "set guard");
 791                         return 0;
 792                 }
 793         }
 794         return 1;
 795 }
 796 
 797 static void cdns3_wa1_tray_restore_cycle_bit(struct cdns3_device *priv_dev,
 798                                              struct cdns3_endpoint *priv_ep)
 799 {
 800         int dma_index;
 801         u32 doorbell;
 802 
 803         doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY);
 804         dma_index = cdns3_get_dma_pos(priv_dev, priv_ep);
 805 
 806         if (!doorbell || dma_index != priv_ep->wa1_trb_index)
 807                 cdns3_wa1_restore_cycle_bit(priv_ep);
 808 }
 809 
 810 
 811 
 812 
 813 
 814 
 815 
 816 int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
 817                           struct usb_request *request)
 818 {
 819         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
 820         struct cdns3_request *priv_req;
 821         struct cdns3_trb *trb;
 822         dma_addr_t trb_dma;
 823         u32 togle_pcs = 1;
 824         int sg_iter = 0;
 825         int num_trb;
 826         int address;
 827         u32 control;
 828         int pcs;
 829 
 830         if (priv_ep->type == USB_ENDPOINT_XFER_ISOC)
 831                 num_trb = priv_ep->interval;
 832         else
 833                 num_trb = request->num_sgs ? request->num_sgs : 1;
 834 
 835         if (num_trb > priv_ep->free_trbs) {
 836                 priv_ep->flags |= EP_RING_FULL;
 837                 return -ENOBUFS;
 838         }
 839 
 840         priv_req = to_cdns3_request(request);
 841         address = priv_ep->endpoint.desc->bEndpointAddress;
 842 
 843         priv_ep->flags |= EP_PENDING_REQUEST;
 844 
 845         
 846         if (priv_req->flags & REQUEST_UNALIGNED)
 847                 trb_dma = priv_req->aligned_buf->dma;
 848         else
 849                 trb_dma = request->dma;
 850 
 851         trb = priv_ep->trb_pool + priv_ep->enqueue;
 852         priv_req->start_trb = priv_ep->enqueue;
 853         priv_req->trb = trb;
 854 
 855         cdns3_select_ep(priv_ep->cdns3_dev, address);
 856 
 857         
 858         if ((priv_ep->enqueue + num_trb)  >= (priv_ep->num_trbs - 1)) {
 859                 struct cdns3_trb *link_trb;
 860                 int doorbell, dma_index;
 861                 u32 ch_bit = 0;
 862 
 863                 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY);
 864                 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep);
 865 
 866                 
 867                 if (doorbell && dma_index == priv_ep->num_trbs - 1) {
 868                         priv_ep->flags |= EP_DEFERRED_DRDY;
 869                         return -ENOBUFS;
 870                 }
 871 
 872                 
 873                 link_trb = priv_ep->trb_pool + (priv_ep->num_trbs - 1);
 874                 
 875 
 876 
 877 
 878 
 879 
 880 
 881 
 882                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC ||
 883                     TRBS_PER_SEGMENT > 2)
 884                         ch_bit = TRB_CHAIN;
 885 
 886                 link_trb->control = ((priv_ep->pcs) ? TRB_CYCLE : 0) |
 887                                     TRB_TYPE(TRB_LINK) | TRB_TOGGLE | ch_bit;
 888         }
 889 
 890         if (priv_dev->dev_ver <= DEV_VER_V2)
 891                 togle_pcs = cdns3_wa1_update_guard(priv_ep, trb);
 892 
 893         
 894         control = priv_ep->pcs ? 0 : TRB_CYCLE;
 895 
 896         do {
 897                 u32 length;
 898                 u16 td_size = 0;
 899 
 900                 
 901                 control |= TRB_TYPE(TRB_NORMAL);
 902                 trb->buffer = TRB_BUFFER(request->num_sgs == 0
 903                                 ? trb_dma : request->sg[sg_iter].dma_address);
 904 
 905                 if (likely(!request->num_sgs))
 906                         length = request->length;
 907                 else
 908                         length = request->sg[sg_iter].length;
 909 
 910                 if (likely(priv_dev->dev_ver >= DEV_VER_V2))
 911                         td_size = DIV_ROUND_UP(length,
 912                                                priv_ep->endpoint.maxpacket);
 913 
 914                 trb->length = TRB_BURST_LEN(priv_ep->trb_burst_size) |
 915                                         TRB_LEN(length);
 916                 if (priv_dev->gadget.speed == USB_SPEED_SUPER)
 917                         trb->length |= TRB_TDL_SS_SIZE(td_size);
 918                 else
 919                         control |= TRB_TDL_HS_SIZE(td_size);
 920 
 921                 pcs = priv_ep->pcs ? TRB_CYCLE : 0;
 922 
 923                 
 924 
 925 
 926 
 927                 if (sg_iter != 0)
 928                         control |= pcs;
 929 
 930                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC  && !priv_ep->dir) {
 931                         control |= TRB_IOC | TRB_ISP;
 932                 } else {
 933                         
 934                         if (sg_iter == (num_trb - 1) && sg_iter != 0)
 935                                 control |= pcs | TRB_IOC | TRB_ISP;
 936                 }
 937 
 938                 if (sg_iter)
 939                         trb->control = control;
 940                 else
 941                         priv_req->trb->control = control;
 942 
 943                 control = 0;
 944                 ++sg_iter;
 945                 priv_req->end_trb = priv_ep->enqueue;
 946                 cdns3_ep_inc_enq(priv_ep);
 947                 trb = priv_ep->trb_pool + priv_ep->enqueue;
 948         } while (sg_iter < num_trb);
 949 
 950         trb = priv_req->trb;
 951 
 952         priv_req->flags |= REQUEST_PENDING;
 953 
 954         if (sg_iter == 1)
 955                 trb->control |= TRB_IOC | TRB_ISP;
 956 
 957         
 958 
 959 
 960         wmb();
 961 
 962         
 963         if (togle_pcs)
 964                 trb->control =  trb->control ^ 1;
 965 
 966         if (priv_dev->dev_ver <= DEV_VER_V2)
 967                 cdns3_wa1_tray_restore_cycle_bit(priv_dev, priv_ep);
 968 
 969         trace_cdns3_prepare_trb(priv_ep, priv_req->trb);
 970 
 971         
 972 
 973 
 974 
 975         wmb();
 976 
 977         
 978 
 979 
 980 
 981         if (priv_ep->flags & EP_UPDATE_EP_TRBADDR) {
 982                 
 983 
 984 
 985 
 986 
 987                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC  && !priv_ep->dir &&
 988                     !(priv_ep->flags & EP_QUIRK_ISO_OUT_EN)) {
 989                         priv_ep->flags |= EP_QUIRK_ISO_OUT_EN;
 990                         cdns3_set_register_bit(&priv_dev->regs->ep_cfg,
 991                                                EP_CFG_ENABLE);
 992                 }
 993 
 994                 writel(EP_TRADDR_TRADDR(priv_ep->trb_pool_dma +
 995                                         priv_req->start_trb * TRB_SIZE),
 996                                         &priv_dev->regs->ep_traddr);
 997 
 998                 priv_ep->flags &= ~EP_UPDATE_EP_TRBADDR;
 999         }
1000 
1001         if (!priv_ep->wa1_set && !(priv_ep->flags & EP_STALLED)) {
1002                 trace_cdns3_ring(priv_ep);
1003                 
1004                 writel(EP_STS_TRBERR | EP_STS_DESCMIS, &priv_dev->regs->ep_sts);
1005                 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
1006                 trace_cdns3_doorbell_epx(priv_ep->name,
1007                                          readl(&priv_dev->regs->ep_traddr));
1008         }
1009 
1010         
1011         __cdns3_gadget_wakeup(priv_dev);
1012 
1013         return 0;
1014 }
1015 
1016 void cdns3_set_hw_configuration(struct cdns3_device *priv_dev)
1017 {
1018         struct cdns3_endpoint *priv_ep;
1019         struct usb_ep *ep;
1020         int val;
1021 
1022         if (priv_dev->hw_configured_flag)
1023                 return;
1024 
1025         writel(USB_CONF_CFGSET, &priv_dev->regs->usb_conf);
1026         writel(EP_CMD_ERDY | EP_CMD_REQ_CMPL, &priv_dev->regs->ep_cmd);
1027 
1028         cdns3_set_register_bit(&priv_dev->regs->usb_conf,
1029                                USB_CONF_U1EN | USB_CONF_U2EN);
1030 
1031         
1032         readl_poll_timeout_atomic(&priv_dev->regs->usb_sts, val,
1033                                   val & USB_STS_CFGSTS_MASK, 1, 100);
1034 
1035         priv_dev->hw_configured_flag = 1;
1036 
1037         list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) {
1038                 if (ep->enabled) {
1039                         priv_ep = ep_to_cdns3_ep(ep);
1040                         cdns3_start_all_request(priv_dev, priv_ep);
1041                 }
1042         }
1043 }
1044 
1045 
1046 
1047 
1048 
1049 
1050 
1051 
1052 
1053 
1054 
1055 
1056 
1057 
1058 
1059 
1060 
1061 
1062 
1063 
1064 
1065 
1066 
1067 
1068 
1069 
1070 
1071 
1072 
1073 
1074 
1075 
1076 
1077 
1078 
1079 
1080 
1081 
1082 
1083 
1084 
1085 
1086 
1087 
1088 static bool cdns3_request_handled(struct cdns3_endpoint *priv_ep,
1089                                   struct cdns3_request *priv_req)
1090 {
1091         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1092         struct cdns3_trb *trb = priv_req->trb;
1093         int current_index = 0;
1094         int handled = 0;
1095         int doorbell;
1096 
1097         current_index = cdns3_get_dma_pos(priv_dev, priv_ep);
1098         doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY);
1099 
1100         trb = &priv_ep->trb_pool[priv_req->start_trb];
1101 
1102         if ((trb->control  & TRB_CYCLE) != priv_ep->ccs)
1103                 goto finish;
1104 
1105         if (doorbell == 1 && current_index == priv_ep->dequeue)
1106                 goto finish;
1107 
1108         
1109         if (TRBS_PER_SEGMENT == 2 && priv_ep->type != USB_ENDPOINT_XFER_ISOC) {
1110                 handled = 1;
1111                 goto finish;
1112         }
1113 
1114         if (priv_ep->enqueue == priv_ep->dequeue &&
1115             priv_ep->free_trbs == 0) {
1116                 handled = 1;
1117         } else if (priv_ep->dequeue < current_index) {
1118                 if ((current_index == (priv_ep->num_trbs - 1)) &&
1119                     !priv_ep->dequeue)
1120                         goto finish;
1121 
1122                 if (priv_req->end_trb >= priv_ep->dequeue &&
1123                     priv_req->end_trb < current_index)
1124                         handled = 1;
1125         } else if (priv_ep->dequeue  > current_index) {
1126                 if (priv_req->end_trb  < current_index ||
1127                     priv_req->end_trb >= priv_ep->dequeue)
1128                         handled = 1;
1129         }
1130 
1131 finish:
1132         trace_cdns3_request_handled(priv_req, current_index, handled);
1133 
1134         return handled;
1135 }
1136 
1137 static void cdns3_transfer_completed(struct cdns3_device *priv_dev,
1138                                      struct cdns3_endpoint *priv_ep)
1139 {
1140         struct cdns3_request *priv_req;
1141         struct usb_request *request;
1142         struct cdns3_trb *trb;
1143 
1144         while (!list_empty(&priv_ep->pending_req_list)) {
1145                 request = cdns3_next_request(&priv_ep->pending_req_list);
1146                 priv_req = to_cdns3_request(request);
1147 
1148                 trb = priv_ep->trb_pool + priv_ep->dequeue;
1149 
1150                 
1151                 if (TRB_FIELD_TO_TYPE(trb->control) == TRB_LINK) {
1152                         trace_cdns3_complete_trb(priv_ep, trb);
1153                         cdns3_move_deq_to_next_trb(priv_req);
1154                 }
1155 
1156                 
1157 
1158 
1159                 cdns3_select_ep(priv_dev, priv_ep->endpoint.address);
1160 
1161                 if (!cdns3_request_handled(priv_ep, priv_req))
1162                         goto prepare_next_td;
1163 
1164                 trb = priv_ep->trb_pool + priv_ep->dequeue;
1165                 trace_cdns3_complete_trb(priv_ep, trb);
1166 
1167                 if (trb != priv_req->trb)
1168                         dev_warn(priv_dev->dev,
1169                                  "request_trb=0x%p, queue_trb=0x%p\n",
1170                                  priv_req->trb, trb);
1171 
1172                 request->actual = TRB_LEN(le32_to_cpu(trb->length));
1173                 cdns3_move_deq_to_next_trb(priv_req);
1174                 cdns3_gadget_giveback(priv_ep, priv_req, 0);
1175 
1176                 if (priv_ep->type != USB_ENDPOINT_XFER_ISOC &&
1177                     TRBS_PER_SEGMENT == 2)
1178                         break;
1179         }
1180         priv_ep->flags &= ~EP_PENDING_REQUEST;
1181 
1182 prepare_next_td:
1183         if (!(priv_ep->flags & EP_STALLED) &&
1184             !(priv_ep->flags & EP_STALL_PENDING))
1185                 cdns3_start_all_request(priv_dev, priv_ep);
1186 }
1187 
1188 void cdns3_rearm_transfer(struct cdns3_endpoint *priv_ep, u8 rearm)
1189 {
1190         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1191 
1192         cdns3_wa1_restore_cycle_bit(priv_ep);
1193 
1194         if (rearm) {
1195                 trace_cdns3_ring(priv_ep);
1196 
1197                 
1198                 wmb();
1199                 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
1200 
1201                 __cdns3_gadget_wakeup(priv_dev);
1202 
1203                 trace_cdns3_doorbell_epx(priv_ep->name,
1204                                          readl(&priv_dev->regs->ep_traddr));
1205         }
1206 }
1207 
1208 
1209 
1210 
1211 
1212 
1213 
1214 static int cdns3_check_ep_interrupt_proceed(struct cdns3_endpoint *priv_ep)
1215 {
1216         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1217         u32 ep_sts_reg;
1218 
1219         cdns3_select_ep(priv_dev, priv_ep->endpoint.address);
1220 
1221         trace_cdns3_epx_irq(priv_dev, priv_ep);
1222 
1223         ep_sts_reg = readl(&priv_dev->regs->ep_sts);
1224         writel(ep_sts_reg, &priv_dev->regs->ep_sts);
1225 
1226         if (ep_sts_reg & EP_STS_TRBERR) {
1227                 if (priv_ep->flags & EP_STALL_PENDING &&
1228                     !(ep_sts_reg & EP_STS_DESCMIS &&
1229                     priv_dev->dev_ver < DEV_VER_V2)) {
1230                         cdns3_ep_stall_flush(priv_ep);
1231                 }
1232 
1233                 
1234 
1235 
1236 
1237 
1238 
1239 
1240                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC &&
1241                     !priv_ep->wa1_set) {
1242                         if (!priv_ep->dir) {
1243                                 u32 ep_cfg = readl(&priv_dev->regs->ep_cfg);
1244 
1245                                 ep_cfg &= ~EP_CFG_ENABLE;
1246                                 writel(ep_cfg, &priv_dev->regs->ep_cfg);
1247                                 priv_ep->flags &= ~EP_QUIRK_ISO_OUT_EN;
1248                         }
1249                         cdns3_transfer_completed(priv_dev, priv_ep);
1250                 } else if (!(priv_ep->flags & EP_STALLED) &&
1251                           !(priv_ep->flags & EP_STALL_PENDING)) {
1252                         if (priv_ep->flags & EP_DEFERRED_DRDY) {
1253                                 priv_ep->flags &= ~EP_DEFERRED_DRDY;
1254                                 cdns3_start_all_request(priv_dev, priv_ep);
1255                         } else {
1256                                 cdns3_rearm_transfer(priv_ep,
1257                                                      priv_ep->wa1_set);
1258                         }
1259                 }
1260         }
1261 
1262         if ((ep_sts_reg & EP_STS_IOC) || (ep_sts_reg & EP_STS_ISP)) {
1263                 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN) {
1264                         if (ep_sts_reg & EP_STS_ISP)
1265                                 priv_ep->flags |= EP_QUIRK_END_TRANSFER;
1266                         else
1267                                 priv_ep->flags &= ~EP_QUIRK_END_TRANSFER;
1268                 }
1269 
1270                 cdns3_transfer_completed(priv_dev, priv_ep);
1271         }
1272 
1273         
1274 
1275 
1276 
1277 
1278 
1279         if (ep_sts_reg & EP_STS_DESCMIS && priv_dev->dev_ver < DEV_VER_V2 &&
1280             !(priv_ep->flags & EP_STALLED))
1281                 cdns3_wa2_descmissing_packet(priv_ep);
1282 
1283         return 0;
1284 }
1285 
1286 static void cdns3_disconnect_gadget(struct cdns3_device *priv_dev)
1287 {
1288         if (priv_dev->gadget_driver && priv_dev->gadget_driver->disconnect) {
1289                 spin_unlock(&priv_dev->lock);
1290                 priv_dev->gadget_driver->disconnect(&priv_dev->gadget);
1291                 spin_lock(&priv_dev->lock);
1292         }
1293 }
1294 
1295 
1296 
1297 
1298 
1299 
1300 
1301 static void cdns3_check_usb_interrupt_proceed(struct cdns3_device *priv_dev,
1302                                               u32 usb_ists)
1303 {
1304         int speed = 0;
1305 
1306         trace_cdns3_usb_irq(priv_dev, usb_ists);
1307         if (usb_ists & USB_ISTS_L1ENTI) {
1308                 
1309 
1310 
1311 
1312 
1313                 if (readl(&priv_dev->regs->drbl))
1314                         __cdns3_gadget_wakeup(priv_dev);
1315         }
1316 
1317         
1318         if (usb_ists & (USB_ISTS_CON2I | USB_ISTS_CONI)) {
1319                 speed = cdns3_get_speed(priv_dev);
1320                 priv_dev->gadget.speed = speed;
1321                 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_POWERED);
1322                 cdns3_ep0_config(priv_dev);
1323         }
1324 
1325         
1326         if (usb_ists & (USB_ISTS_DIS2I | USB_ISTS_DISI)) {
1327                 cdns3_disconnect_gadget(priv_dev);
1328                 priv_dev->gadget.speed = USB_SPEED_UNKNOWN;
1329                 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_NOTATTACHED);
1330                 cdns3_hw_reset_eps_config(priv_dev);
1331         }
1332 
1333         if (usb_ists & (USB_ISTS_L2ENTI | USB_ISTS_U3ENTI)) {
1334                 if (priv_dev->gadget_driver &&
1335                     priv_dev->gadget_driver->suspend) {
1336                         spin_unlock(&priv_dev->lock);
1337                         priv_dev->gadget_driver->suspend(&priv_dev->gadget);
1338                         spin_lock(&priv_dev->lock);
1339                 }
1340         }
1341 
1342         if (usb_ists & (USB_ISTS_L2EXTI | USB_ISTS_U3EXTI)) {
1343                 if (priv_dev->gadget_driver &&
1344                     priv_dev->gadget_driver->resume) {
1345                         spin_unlock(&priv_dev->lock);
1346                         priv_dev->gadget_driver->resume(&priv_dev->gadget);
1347                         spin_lock(&priv_dev->lock);
1348                 }
1349         }
1350 
1351         
1352         if (usb_ists & (USB_ISTS_UWRESI | USB_ISTS_UHRESI | USB_ISTS_U2RESI)) {
1353                 if (priv_dev->gadget_driver) {
1354                         spin_unlock(&priv_dev->lock);
1355                         usb_gadget_udc_reset(&priv_dev->gadget,
1356                                              priv_dev->gadget_driver);
1357                         spin_lock(&priv_dev->lock);
1358 
1359                         
1360                         speed = cdns3_get_speed(priv_dev);
1361                         priv_dev->gadget.speed = speed;
1362                         cdns3_hw_reset_eps_config(priv_dev);
1363                         cdns3_ep0_config(priv_dev);
1364                 }
1365         }
1366 }
1367 
1368 
1369 
1370 
1371 
1372 
1373 
1374 
1375 
1376 static irqreturn_t cdns3_device_irq_handler(int irq, void *data)
1377 {
1378         struct cdns3_device *priv_dev = data;
1379         irqreturn_t ret = IRQ_NONE;
1380         u32 reg;
1381 
1382         
1383         reg = readl(&priv_dev->regs->usb_ists);
1384         if (reg) {
1385                 
1386 
1387 
1388 
1389 
1390 
1391 
1392                 reg = ~reg & readl(&priv_dev->regs->usb_ien);
1393                 
1394                 writel(reg, &priv_dev->regs->usb_ien);
1395                 ret = IRQ_WAKE_THREAD;
1396         }
1397 
1398         
1399         reg = readl(&priv_dev->regs->ep_ists);
1400         if (reg) {
1401                 writel(0, &priv_dev->regs->ep_ien);
1402                 ret = IRQ_WAKE_THREAD;
1403         }
1404 
1405         return ret;
1406 }
1407 
1408 
1409 
1410 
1411 
1412 
1413 
1414 
1415 
1416 
1417 static irqreturn_t cdns3_device_thread_irq_handler(int irq, void *data)
1418 {
1419         struct cdns3_device *priv_dev = data;
1420         irqreturn_t ret = IRQ_NONE;
1421         unsigned long flags;
1422         int bit;
1423         u32 reg;
1424 
1425         spin_lock_irqsave(&priv_dev->lock, flags);
1426 
1427         reg = readl(&priv_dev->regs->usb_ists);
1428         if (reg) {
1429                 writel(reg, &priv_dev->regs->usb_ists);
1430                 writel(USB_IEN_INIT, &priv_dev->regs->usb_ien);
1431                 cdns3_check_usb_interrupt_proceed(priv_dev, reg);
1432                 ret = IRQ_HANDLED;
1433         }
1434 
1435         reg = readl(&priv_dev->regs->ep_ists);
1436 
1437         
1438         if (reg & EP_ISTS_EP_OUT0) {
1439                 cdns3_check_ep0_interrupt_proceed(priv_dev, USB_DIR_OUT);
1440                 ret = IRQ_HANDLED;
1441         }
1442 
1443         
1444         if (reg & EP_ISTS_EP_IN0) {
1445                 cdns3_check_ep0_interrupt_proceed(priv_dev, USB_DIR_IN);
1446                 ret = IRQ_HANDLED;
1447         }
1448 
1449         
1450         reg &= ~(EP_ISTS_EP_OUT0 | EP_ISTS_EP_IN0);
1451         if (!reg)
1452                 goto irqend;
1453 
1454         for_each_set_bit(bit, (unsigned long *)®,
1455                          sizeof(u32) * BITS_PER_BYTE) {
1456                 cdns3_check_ep_interrupt_proceed(priv_dev->eps[bit]);
1457                 ret = IRQ_HANDLED;
1458         }
1459 
1460 irqend:
1461         writel(~0, &priv_dev->regs->ep_ien);
1462         spin_unlock_irqrestore(&priv_dev->lock, flags);
1463 
1464         return ret;
1465 }
1466 
1467 
1468 
1469 
1470 
1471 
1472 
1473 
1474 
1475 
1476 
1477 
1478 
1479 static int cdns3_ep_onchip_buffer_reserve(struct cdns3_device *priv_dev,
1480                                           int size, int is_in)
1481 {
1482         int remained;
1483 
1484         
1485         remained = priv_dev->onchip_buffers - priv_dev->onchip_used_size - 2;
1486 
1487         if (is_in) {
1488                 if (remained < size)
1489                         return -EPERM;
1490 
1491                 priv_dev->onchip_used_size += size;
1492         } else {
1493                 int required;
1494 
1495                 
1496 
1497 
1498 
1499                 if (priv_dev->out_mem_is_allocated >= size)
1500                         return 0;
1501 
1502                 required = size - priv_dev->out_mem_is_allocated;
1503 
1504                 if (required > remained)
1505                         return -EPERM;
1506 
1507                 priv_dev->out_mem_is_allocated += required;
1508                 priv_dev->onchip_used_size += required;
1509         }
1510 
1511         return 0;
1512 }
1513 
1514 void cdns3_configure_dmult(struct cdns3_device *priv_dev,
1515                            struct cdns3_endpoint *priv_ep)
1516 {
1517         struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
1518 
1519         
1520         if (priv_dev->dev_ver <= DEV_VER_V2)
1521                 writel(USB_CONF_DMULT, ®s->usb_conf);
1522 
1523         if (priv_dev->dev_ver == DEV_VER_V2)
1524                 writel(USB_CONF2_EN_TDL_TRB, ®s->usb_conf2);
1525 
1526         if (priv_dev->dev_ver >= DEV_VER_V3 && priv_ep) {
1527                 u32 mask;
1528 
1529                 if (priv_ep->dir)
1530                         mask = BIT(priv_ep->num + 16);
1531                 else
1532                         mask = BIT(priv_ep->num);
1533 
1534                 if (priv_ep->type != USB_ENDPOINT_XFER_ISOC) {
1535                         cdns3_set_register_bit(®s->tdl_from_trb, mask);
1536                         cdns3_set_register_bit(®s->tdl_beh, mask);
1537                         cdns3_set_register_bit(®s->tdl_beh2, mask);
1538                         cdns3_set_register_bit(®s->dma_adv_td, mask);
1539                 }
1540 
1541                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir)
1542                         cdns3_set_register_bit(®s->tdl_from_trb, mask);
1543 
1544                 cdns3_set_register_bit(®s->dtrans, mask);
1545         }
1546 }
1547 
1548 
1549 
1550 
1551 
1552 void cdns3_ep_config(struct cdns3_endpoint *priv_ep)
1553 {
1554         bool is_iso_ep = (priv_ep->type == USB_ENDPOINT_XFER_ISOC);
1555         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1556         u32 bEndpointAddress = priv_ep->num | priv_ep->dir;
1557         u32 max_packet_size = 0;
1558         u8 maxburst = 0;
1559         u32 ep_cfg = 0;
1560         u8 buffering;
1561         u8 mult = 0;
1562         int ret;
1563 
1564         buffering = CDNS3_EP_BUF_SIZE - 1;
1565 
1566         cdns3_configure_dmult(priv_dev, priv_ep);
1567 
1568         switch (priv_ep->type) {
1569         case USB_ENDPOINT_XFER_INT:
1570                 ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_INT);
1571 
1572                 if ((priv_dev->dev_ver == DEV_VER_V2 && !priv_ep->dir) ||
1573                     priv_dev->dev_ver > DEV_VER_V2)
1574                         ep_cfg |= EP_CFG_TDL_CHK;
1575                 break;
1576         case USB_ENDPOINT_XFER_BULK:
1577                 ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_BULK);
1578 
1579                 if ((priv_dev->dev_ver == DEV_VER_V2  && !priv_ep->dir) ||
1580                     priv_dev->dev_ver > DEV_VER_V2)
1581                         ep_cfg |= EP_CFG_TDL_CHK;
1582                 break;
1583         default:
1584                 ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_ISOC);
1585                 mult = CDNS3_EP_ISO_HS_MULT - 1;
1586                 buffering = mult + 1;
1587         }
1588 
1589         switch (priv_dev->gadget.speed) {
1590         case USB_SPEED_FULL:
1591                 max_packet_size = is_iso_ep ? 1023 : 64;
1592                 break;
1593         case USB_SPEED_HIGH:
1594                 max_packet_size = is_iso_ep ? 1024 : 512;
1595                 break;
1596         case USB_SPEED_SUPER:
1597                 
1598                 mult = 0;
1599                 max_packet_size = 1024;
1600                 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) {
1601                         maxburst = CDNS3_EP_ISO_SS_BURST - 1;
1602                         buffering = (mult + 1) *
1603                                     (maxburst + 1);
1604 
1605                         if (priv_ep->interval > 1)
1606                                 buffering++;
1607                 } else {
1608                         maxburst = CDNS3_EP_BUF_SIZE - 1;
1609                 }
1610                 break;
1611         default:
1612                 
1613                 return;
1614         }
1615 
1616         if (max_packet_size == 1024)
1617                 priv_ep->trb_burst_size = 128;
1618         else if (max_packet_size >= 512)
1619                 priv_ep->trb_burst_size = 64;
1620         else
1621                 priv_ep->trb_burst_size = 16;
1622 
1623         ret = cdns3_ep_onchip_buffer_reserve(priv_dev, buffering + 1,
1624                                              !!priv_ep->dir);
1625         if (ret) {
1626                 dev_err(priv_dev->dev, "onchip mem is full, ep is invalid\n");
1627                 return;
1628         }
1629 
1630         ep_cfg |= EP_CFG_MAXPKTSIZE(max_packet_size) |
1631                   EP_CFG_MULT(mult) |
1632                   EP_CFG_BUFFERING(buffering) |
1633                   EP_CFG_MAXBURST(maxburst);
1634 
1635         cdns3_select_ep(priv_dev, bEndpointAddress);
1636         writel(ep_cfg, &priv_dev->regs->ep_cfg);
1637 
1638         dev_dbg(priv_dev->dev, "Configure %s: with val %08x\n",
1639                 priv_ep->name, ep_cfg);
1640 }
1641 
1642 
1643 static int cdns3_ep_dir_is_correct(struct usb_endpoint_descriptor *desc,
1644                                    struct cdns3_endpoint *priv_ep)
1645 {
1646         return (priv_ep->endpoint.caps.dir_in && usb_endpoint_dir_in(desc)) ||
1647                (priv_ep->endpoint.caps.dir_out && usb_endpoint_dir_out(desc));
1648 }
1649 
1650 static struct
1651 cdns3_endpoint *cdns3_find_available_ep(struct cdns3_device *priv_dev,
1652                                         struct usb_endpoint_descriptor *desc)
1653 {
1654         struct usb_ep *ep;
1655         struct cdns3_endpoint *priv_ep;
1656 
1657         list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) {
1658                 unsigned long num;
1659                 int ret;
1660                 
1661                 char c[2] = {ep->name[2], '\0'};
1662 
1663                 ret = kstrtoul(c, 10, &num);
1664                 if (ret)
1665                         return ERR_PTR(ret);
1666 
1667                 priv_ep = ep_to_cdns3_ep(ep);
1668                 if (cdns3_ep_dir_is_correct(desc, priv_ep)) {
1669                         if (!(priv_ep->flags & EP_CLAIMED)) {
1670                                 priv_ep->num  = num;
1671                                 return priv_ep;
1672                         }
1673                 }
1674         }
1675 
1676         return ERR_PTR(-ENOENT);
1677 }
1678 
1679 
1680 
1681 
1682 
1683 
1684 
1685 
1686 
1687 
1688 
1689 
1690 
1691 
1692 
1693 
1694 
1695 static struct
1696 usb_ep *cdns3_gadget_match_ep(struct usb_gadget *gadget,
1697                               struct usb_endpoint_descriptor *desc,
1698                               struct usb_ss_ep_comp_descriptor *comp_desc)
1699 {
1700         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
1701         struct cdns3_endpoint *priv_ep;
1702         unsigned long flags;
1703 
1704         priv_ep = cdns3_find_available_ep(priv_dev, desc);
1705         if (IS_ERR(priv_ep)) {
1706                 dev_err(priv_dev->dev, "no available ep\n");
1707                 return NULL;
1708         }
1709 
1710         dev_dbg(priv_dev->dev, "match endpoint: %s\n", priv_ep->name);
1711 
1712         spin_lock_irqsave(&priv_dev->lock, flags);
1713         priv_ep->endpoint.desc = desc;
1714         priv_ep->dir  = usb_endpoint_dir_in(desc) ? USB_DIR_IN : USB_DIR_OUT;
1715         priv_ep->type = usb_endpoint_type(desc);
1716         priv_ep->flags |= EP_CLAIMED;
1717         priv_ep->interval = desc->bInterval ? BIT(desc->bInterval - 1) : 0;
1718 
1719         spin_unlock_irqrestore(&priv_dev->lock, flags);
1720         return &priv_ep->endpoint;
1721 }
1722 
1723 
1724 
1725 
1726 
1727 
1728 
1729 
1730 struct usb_request *cdns3_gadget_ep_alloc_request(struct usb_ep *ep,
1731                                                   gfp_t gfp_flags)
1732 {
1733         struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
1734         struct cdns3_request *priv_req;
1735 
1736         priv_req = kzalloc(sizeof(*priv_req), gfp_flags);
1737         if (!priv_req)
1738                 return NULL;
1739 
1740         priv_req->priv_ep = priv_ep;
1741 
1742         trace_cdns3_alloc_request(priv_req);
1743         return &priv_req->request;
1744 }
1745 
1746 
1747 
1748 
1749 
1750 
1751 void cdns3_gadget_ep_free_request(struct usb_ep *ep,
1752                                   struct usb_request *request)
1753 {
1754         struct cdns3_request *priv_req = to_cdns3_request(request);
1755 
1756         if (priv_req->aligned_buf)
1757                 priv_req->aligned_buf->in_use = 0;
1758 
1759         trace_cdns3_free_request(priv_req);
1760         kfree(priv_req);
1761 }
1762 
1763 
1764 
1765 
1766 
1767 
1768 
1769 
1770 static int cdns3_gadget_ep_enable(struct usb_ep *ep,
1771                                   const struct usb_endpoint_descriptor *desc)
1772 {
1773         struct cdns3_endpoint *priv_ep;
1774         struct cdns3_device *priv_dev;
1775         u32 reg = EP_STS_EN_TRBERREN;
1776         u32 bEndpointAddress;
1777         unsigned long flags;
1778         int enable = 1;
1779         int ret;
1780         int val;
1781 
1782         priv_ep = ep_to_cdns3_ep(ep);
1783         priv_dev = priv_ep->cdns3_dev;
1784 
1785         if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) {
1786                 dev_dbg(priv_dev->dev, "usbss: invalid parameters\n");
1787                 return -EINVAL;
1788         }
1789 
1790         if (!desc->wMaxPacketSize) {
1791                 dev_err(priv_dev->dev, "usbss: missing wMaxPacketSize\n");
1792                 return -EINVAL;
1793         }
1794 
1795         if (dev_WARN_ONCE(priv_dev->dev, priv_ep->flags & EP_ENABLED,
1796                           "%s is already enabled\n", priv_ep->name))
1797                 return 0;
1798 
1799         spin_lock_irqsave(&priv_dev->lock, flags);
1800 
1801         priv_ep->endpoint.desc = desc;
1802         priv_ep->type = usb_endpoint_type(desc);
1803         priv_ep->interval = desc->bInterval ? BIT(desc->bInterval - 1) : 0;
1804 
1805         if (priv_ep->interval > ISO_MAX_INTERVAL &&
1806             priv_ep->type == USB_ENDPOINT_XFER_ISOC) {
1807                 dev_err(priv_dev->dev, "Driver is limited to %d period\n",
1808                         ISO_MAX_INTERVAL);
1809 
1810                 ret =  -EINVAL;
1811                 goto exit;
1812         }
1813 
1814         ret = cdns3_allocate_trb_pool(priv_ep);
1815 
1816         if (ret)
1817                 goto exit;
1818 
1819         bEndpointAddress = priv_ep->num | priv_ep->dir;
1820         cdns3_select_ep(priv_dev, bEndpointAddress);
1821 
1822         trace_cdns3_gadget_ep_enable(priv_ep);
1823 
1824         writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd);
1825 
1826         ret = readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val,
1827                                         !(val & (EP_CMD_CSTALL | EP_CMD_EPRST)),
1828                                         1, 1000);
1829 
1830         if (unlikely(ret)) {
1831                 cdns3_free_trb_pool(priv_ep);
1832                 ret =  -EINVAL;
1833                 goto exit;
1834         }
1835 
1836         
1837         cdns3_set_register_bit(&priv_dev->regs->ep_ien,
1838                                BIT(cdns3_ep_addr_to_index(bEndpointAddress)));
1839 
1840         if (priv_dev->dev_ver < DEV_VER_V2)
1841                 cdns3_wa2_enable_detection(priv_dev, priv_ep, reg);
1842 
1843         writel(reg, &priv_dev->regs->ep_sts_en);
1844 
1845         
1846 
1847 
1848 
1849 
1850 
1851 
1852 
1853         if (priv_ep->type == USB_ENDPOINT_XFER_ISOC  && !priv_ep->dir)
1854                 enable = 0;
1855 
1856         if (enable)
1857                 cdns3_set_register_bit(&priv_dev->regs->ep_cfg, EP_CFG_ENABLE);
1858 
1859         ep->desc = desc;
1860         priv_ep->flags &= ~(EP_PENDING_REQUEST | EP_STALLED | EP_STALL_PENDING |
1861                             EP_QUIRK_ISO_OUT_EN | EP_QUIRK_EXTRA_BUF_EN);
1862         priv_ep->flags |= EP_ENABLED | EP_UPDATE_EP_TRBADDR;
1863         priv_ep->wa1_set = 0;
1864         priv_ep->enqueue = 0;
1865         priv_ep->dequeue = 0;
1866         reg = readl(&priv_dev->regs->ep_sts);
1867         priv_ep->pcs = !!EP_STS_CCS(reg);
1868         priv_ep->ccs = !!EP_STS_CCS(reg);
1869         
1870         priv_ep->free_trbs = priv_ep->num_trbs - 1;
1871 exit:
1872         spin_unlock_irqrestore(&priv_dev->lock, flags);
1873 
1874         return ret;
1875 }
1876 
1877 
1878 
1879 
1880 
1881 
1882 
1883 static int cdns3_gadget_ep_disable(struct usb_ep *ep)
1884 {
1885         struct cdns3_endpoint *priv_ep;
1886         struct cdns3_request *priv_req;
1887         struct cdns3_device *priv_dev;
1888         struct usb_request *request;
1889         unsigned long flags;
1890         int ret = 0;
1891         u32 ep_cfg;
1892         int val;
1893 
1894         if (!ep) {
1895                 pr_err("usbss: invalid parameters\n");
1896                 return -EINVAL;
1897         }
1898 
1899         priv_ep = ep_to_cdns3_ep(ep);
1900         priv_dev = priv_ep->cdns3_dev;
1901 
1902         if (dev_WARN_ONCE(priv_dev->dev, !(priv_ep->flags & EP_ENABLED),
1903                           "%s is already disabled\n", priv_ep->name))
1904                 return 0;
1905 
1906         spin_lock_irqsave(&priv_dev->lock, flags);
1907 
1908         trace_cdns3_gadget_ep_disable(priv_ep);
1909 
1910         cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress);
1911 
1912         ep_cfg = readl(&priv_dev->regs->ep_cfg);
1913         ep_cfg &= ~EP_CFG_ENABLE;
1914         writel(ep_cfg, &priv_dev->regs->ep_cfg);
1915 
1916         
1917 
1918 
1919 
1920 
1921         readl_poll_timeout_atomic(&priv_dev->regs->ep_sts, val,
1922                                   !(val & EP_STS_DBUSY), 1, 10);
1923         writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd);
1924 
1925         readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val,
1926                                   !(val & (EP_CMD_CSTALL | EP_CMD_EPRST)),
1927                                   1, 1000);
1928         if (unlikely(ret))
1929                 dev_err(priv_dev->dev, "Timeout: %s resetting failed.\n",
1930                         priv_ep->name);
1931 
1932         while (!list_empty(&priv_ep->pending_req_list)) {
1933                 request = cdns3_next_request(&priv_ep->pending_req_list);
1934 
1935                 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request),
1936                                       -ESHUTDOWN);
1937         }
1938 
1939         while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
1940                 priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
1941 
1942                 kfree(priv_req->request.buf);
1943                 cdns3_gadget_ep_free_request(&priv_ep->endpoint,
1944                                              &priv_req->request);
1945                 list_del_init(&priv_req->list);
1946                 --priv_ep->wa2_counter;
1947         }
1948 
1949         while (!list_empty(&priv_ep->deferred_req_list)) {
1950                 request = cdns3_next_request(&priv_ep->deferred_req_list);
1951 
1952                 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request),
1953                                       -ESHUTDOWN);
1954         }
1955 
1956         priv_ep->descmis_req = NULL;
1957 
1958         ep->desc = NULL;
1959         priv_ep->flags &= ~EP_ENABLED;
1960 
1961         spin_unlock_irqrestore(&priv_dev->lock, flags);
1962 
1963         return ret;
1964 }
1965 
1966 
1967 
1968 
1969 
1970 
1971 
1972 
1973 
1974 static int __cdns3_gadget_ep_queue(struct usb_ep *ep,
1975                                    struct usb_request *request,
1976                                    gfp_t gfp_flags)
1977 {
1978         struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
1979         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1980         struct cdns3_request *priv_req;
1981         int ret = 0;
1982 
1983         request->actual = 0;
1984         request->status = -EINPROGRESS;
1985         priv_req = to_cdns3_request(request);
1986         trace_cdns3_ep_queue(priv_req);
1987 
1988         if (priv_dev->dev_ver < DEV_VER_V2) {
1989                 ret = cdns3_wa2_gadget_ep_queue(priv_dev, priv_ep,
1990                                                 priv_req);
1991 
1992                 if (ret == EINPROGRESS)
1993                         return 0;
1994         }
1995 
1996         ret = cdns3_prepare_aligned_request_buf(priv_req);
1997         if (ret < 0)
1998                 return ret;
1999 
2000         ret = usb_gadget_map_request_by_dev(priv_dev->sysdev, request,
2001                                             usb_endpoint_dir_in(ep->desc));
2002         if (ret)
2003                 return ret;
2004 
2005         list_add_tail(&request->list, &priv_ep->deferred_req_list);
2006 
2007         
2008 
2009 
2010 
2011 
2012         if (priv_dev->hw_configured_flag && !(priv_ep->flags & EP_STALLED) &&
2013             !(priv_ep->flags & EP_STALL_PENDING))
2014                 cdns3_start_all_request(priv_dev, priv_ep);
2015 
2016         return 0;
2017 }
2018 
2019 static int cdns3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
2020                                  gfp_t gfp_flags)
2021 {
2022         struct usb_request *zlp_request;
2023         struct cdns3_endpoint *priv_ep;
2024         struct cdns3_device *priv_dev;
2025         unsigned long flags;
2026         int ret;
2027 
2028         if (!request || !ep)
2029                 return -EINVAL;
2030 
2031         priv_ep = ep_to_cdns3_ep(ep);
2032         priv_dev = priv_ep->cdns3_dev;
2033 
2034         spin_lock_irqsave(&priv_dev->lock, flags);
2035 
2036         ret = __cdns3_gadget_ep_queue(ep, request, gfp_flags);
2037 
2038         if (ret == 0 && request->zero && request->length &&
2039             (request->length % ep->maxpacket == 0)) {
2040                 struct cdns3_request *priv_req;
2041 
2042                 zlp_request = cdns3_gadget_ep_alloc_request(ep, GFP_ATOMIC);
2043                 zlp_request->buf = priv_dev->zlp_buf;
2044                 zlp_request->length = 0;
2045 
2046                 priv_req = to_cdns3_request(zlp_request);
2047                 priv_req->flags |= REQUEST_ZLP;
2048 
2049                 dev_dbg(priv_dev->dev, "Queuing ZLP for endpoint: %s\n",
2050                         priv_ep->name);
2051                 ret = __cdns3_gadget_ep_queue(ep, zlp_request, gfp_flags);
2052         }
2053 
2054         spin_unlock_irqrestore(&priv_dev->lock, flags);
2055         return ret;
2056 }
2057 
2058 
2059 
2060 
2061 
2062 
2063 
2064 
2065 int cdns3_gadget_ep_dequeue(struct usb_ep *ep,
2066                             struct usb_request *request)
2067 {
2068         struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
2069         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
2070         struct usb_request *req, *req_temp;
2071         struct cdns3_request *priv_req;
2072         struct cdns3_trb *link_trb;
2073         u8 req_on_hw_ring = 0;
2074         unsigned long flags;
2075         int ret = 0;
2076 
2077         if (!ep || !request || !ep->desc)
2078                 return -EINVAL;
2079 
2080         spin_lock_irqsave(&priv_dev->lock, flags);
2081 
2082         priv_req = to_cdns3_request(request);
2083 
2084         trace_cdns3_ep_dequeue(priv_req);
2085 
2086         cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress);
2087 
2088         list_for_each_entry_safe(req, req_temp, &priv_ep->pending_req_list,
2089                                  list) {
2090                 if (request == req) {
2091                         req_on_hw_ring = 1;
2092                         goto found;
2093                 }
2094         }
2095 
2096         list_for_each_entry_safe(req, req_temp, &priv_ep->deferred_req_list,
2097                                  list) {
2098                 if (request == req)
2099                         goto found;
2100         }
2101 
2102         goto not_found;
2103 
2104 found:
2105         link_trb = priv_req->trb;
2106 
2107         
2108         if (req_on_hw_ring && link_trb) {
2109                 link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma +
2110                         ((priv_req->end_trb + 1) * TRB_SIZE));
2111                 link_trb->control = (link_trb->control & TRB_CYCLE) |
2112                                     TRB_TYPE(TRB_LINK) | TRB_CHAIN;
2113 
2114                 if (priv_ep->wa1_trb == priv_req->trb)
2115                         cdns3_wa1_restore_cycle_bit(priv_ep);
2116         }
2117 
2118         cdns3_gadget_giveback(priv_ep, priv_req, -ECONNRESET);
2119 
2120 not_found:
2121         spin_unlock_irqrestore(&priv_dev->lock, flags);
2122         return ret;
2123 }
2124 
2125 
2126 
2127 
2128 
2129 
2130 void __cdns3_gadget_ep_set_halt(struct cdns3_endpoint *priv_ep)
2131 {
2132         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
2133 
2134         trace_cdns3_halt(priv_ep, 1, 0);
2135 
2136         if (!(priv_ep->flags & EP_STALLED)) {
2137                 u32 ep_sts_reg = readl(&priv_dev->regs->ep_sts);
2138 
2139                 if (!(ep_sts_reg & EP_STS_DBUSY))
2140                         cdns3_ep_stall_flush(priv_ep);
2141                 else
2142                         priv_ep->flags |= EP_STALL_PENDING;
2143         }
2144 }
2145 
2146 
2147 
2148 
2149 
2150 
2151 int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep)
2152 {
2153         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
2154         struct usb_request *request;
2155         struct cdns3_request *priv_req;
2156         struct cdns3_trb *trb = NULL;
2157         int ret;
2158         int val;
2159 
2160         trace_cdns3_halt(priv_ep, 0, 0);
2161 
2162         request = cdns3_next_request(&priv_ep->pending_req_list);
2163         if (request) {
2164                 priv_req = to_cdns3_request(request);
2165                 trb = priv_req->trb;
2166                 if (trb)
2167                         trb->control = trb->control ^ TRB_CYCLE;
2168         }
2169 
2170         writel(EP_CMD_CSTALL | EP_CMD_EPRST, &priv_dev->regs->ep_cmd);
2171 
2172         
2173         ret = readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val,
2174                                         !(val & EP_CMD_EPRST), 1, 100);
2175         if (ret)
2176                 return -EINVAL;
2177 
2178         priv_ep->flags &= ~(EP_STALLED | EP_STALL_PENDING);
2179 
2180         if (request) {
2181                 if (trb)
2182                         trb->control = trb->control ^ TRB_CYCLE;
2183                 cdns3_rearm_transfer(priv_ep, 1);
2184         }
2185 
2186         cdns3_start_all_request(priv_dev, priv_ep);
2187         return ret;
2188 }
2189 
2190 
2191 
2192 
2193 
2194 
2195 
2196 
2197 int cdns3_gadget_ep_set_halt(struct usb_ep *ep, int value)
2198 {
2199         struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep);
2200         struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
2201         unsigned long flags;
2202         int ret = 0;
2203 
2204         if (!(priv_ep->flags & EP_ENABLED))
2205                 return -EPERM;
2206 
2207         spin_lock_irqsave(&priv_dev->lock, flags);
2208 
2209         cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress);
2210 
2211         if (!value) {
2212                 priv_ep->flags &= ~EP_WEDGE;
2213                 ret = __cdns3_gadget_ep_clear_halt(priv_ep);
2214         } else {
2215                 __cdns3_gadget_ep_set_halt(priv_ep);
2216         }
2217 
2218         spin_unlock_irqrestore(&priv_dev->lock, flags);
2219 
2220         return ret;
2221 }
2222 
2223 extern const struct usb_ep_ops cdns3_gadget_ep0_ops;
2224 
2225 static const struct usb_ep_ops cdns3_gadget_ep_ops = {
2226         .enable = cdns3_gadget_ep_enable,
2227         .disable = cdns3_gadget_ep_disable,
2228         .alloc_request = cdns3_gadget_ep_alloc_request,
2229         .free_request = cdns3_gadget_ep_free_request,
2230         .queue = cdns3_gadget_ep_queue,
2231         .dequeue = cdns3_gadget_ep_dequeue,
2232         .set_halt = cdns3_gadget_ep_set_halt,
2233         .set_wedge = cdns3_gadget_ep_set_wedge,
2234 };
2235 
2236 
2237 
2238 
2239 
2240 
2241 
2242 static int cdns3_gadget_get_frame(struct usb_gadget *gadget)
2243 {
2244         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2245 
2246         return readl(&priv_dev->regs->usb_itpn);
2247 }
2248 
2249 int __cdns3_gadget_wakeup(struct cdns3_device *priv_dev)
2250 {
2251         enum usb_device_speed speed;
2252 
2253         speed = cdns3_get_speed(priv_dev);
2254 
2255         if (speed >= USB_SPEED_SUPER)
2256                 return 0;
2257 
2258         
2259         writel(USB_CONF_LGO_L0, &priv_dev->regs->usb_conf);
2260 
2261         return 0;
2262 }
2263 
2264 static int cdns3_gadget_wakeup(struct usb_gadget *gadget)
2265 {
2266         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2267         unsigned long flags;
2268         int ret = 0;
2269 
2270         spin_lock_irqsave(&priv_dev->lock, flags);
2271         ret = __cdns3_gadget_wakeup(priv_dev);
2272         spin_unlock_irqrestore(&priv_dev->lock, flags);
2273         return ret;
2274 }
2275 
2276 static int cdns3_gadget_set_selfpowered(struct usb_gadget *gadget,
2277                                         int is_selfpowered)
2278 {
2279         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2280         unsigned long flags;
2281 
2282         spin_lock_irqsave(&priv_dev->lock, flags);
2283         priv_dev->is_selfpowered = !!is_selfpowered;
2284         spin_unlock_irqrestore(&priv_dev->lock, flags);
2285         return 0;
2286 }
2287 
2288 static int cdns3_gadget_pullup(struct usb_gadget *gadget, int is_on)
2289 {
2290         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2291 
2292         if (is_on)
2293                 writel(USB_CONF_DEVEN, &priv_dev->regs->usb_conf);
2294         else
2295                 writel(USB_CONF_DEVDS, &priv_dev->regs->usb_conf);
2296 
2297         return 0;
2298 }
2299 
2300 static void cdns3_gadget_config(struct cdns3_device *priv_dev)
2301 {
2302         struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
2303         u32 reg;
2304 
2305         cdns3_ep0_config(priv_dev);
2306 
2307         
2308         writel(EP_IEN_EP_OUT0 | EP_IEN_EP_IN0, ®s->ep_ien);
2309 
2310         
2311 
2312 
2313 
2314         if (priv_dev->dev_ver == DEV_VER_TI_V1) {
2315                 reg = readl(®s->dbg_link1);
2316 
2317                 reg &= ~DBG_LINK1_LFPS_MIN_GEN_U1_EXIT_MASK;
2318                 reg |= DBG_LINK1_LFPS_MIN_GEN_U1_EXIT(0x55) |
2319                        DBG_LINK1_LFPS_MIN_GEN_U1_EXIT_SET;
2320                 writel(reg, ®s->dbg_link1);
2321         }
2322 
2323         
2324 
2325 
2326 
2327 
2328         reg = readl(®s->dma_axi_ctrl);
2329         reg |= DMA_AXI_CTRL_MARPROT(DMA_AXI_CTRL_NON_SECURE) |
2330                DMA_AXI_CTRL_MAWPROT(DMA_AXI_CTRL_NON_SECURE);
2331         writel(reg, ®s->dma_axi_ctrl);
2332 
2333         
2334         writel(USB_IEN_INIT, ®s->usb_ien);
2335         writel(USB_CONF_CLK2OFFDS | USB_CONF_L1DS, ®s->usb_conf);
2336 
2337         cdns3_configure_dmult(priv_dev, NULL);
2338 }
2339 
2340 
2341 
2342 
2343 
2344 
2345 
2346 
2347 static int cdns3_gadget_udc_start(struct usb_gadget *gadget,
2348                                   struct usb_gadget_driver *driver)
2349 {
2350         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2351         unsigned long flags;
2352         enum usb_device_speed max_speed = driver->max_speed;
2353 
2354         spin_lock_irqsave(&priv_dev->lock, flags);
2355         priv_dev->gadget_driver = driver;
2356 
2357         
2358         max_speed = min(driver->max_speed, gadget->max_speed);
2359 
2360         switch (max_speed) {
2361         case USB_SPEED_FULL:
2362                 writel(USB_CONF_SFORCE_FS, &priv_dev->regs->usb_conf);
2363                 writel(USB_CONF_USB3DIS, &priv_dev->regs->usb_conf);
2364                 break;
2365         case USB_SPEED_HIGH:
2366                 writel(USB_CONF_USB3DIS, &priv_dev->regs->usb_conf);
2367                 break;
2368         case USB_SPEED_SUPER:
2369                 break;
2370         default:
2371                 dev_err(priv_dev->dev,
2372                         "invalid maximum_speed parameter %d\n",
2373                         max_speed);
2374                 
2375         case USB_SPEED_UNKNOWN:
2376                 
2377                 max_speed = USB_SPEED_SUPER;
2378                 break;
2379         }
2380 
2381         cdns3_gadget_config(priv_dev);
2382         spin_unlock_irqrestore(&priv_dev->lock, flags);
2383         return 0;
2384 }
2385 
2386 
2387 
2388 
2389 
2390 
2391 
2392 static int cdns3_gadget_udc_stop(struct usb_gadget *gadget)
2393 {
2394         struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget);
2395         struct cdns3_endpoint *priv_ep;
2396         u32 bEndpointAddress;
2397         struct usb_ep *ep;
2398         int ret = 0;
2399         int val;
2400 
2401         priv_dev->gadget_driver = NULL;
2402 
2403         priv_dev->onchip_used_size = 0;
2404         priv_dev->out_mem_is_allocated = 0;
2405         priv_dev->gadget.speed = USB_SPEED_UNKNOWN;
2406 
2407         list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) {
2408                 priv_ep = ep_to_cdns3_ep(ep);
2409                 bEndpointAddress = priv_ep->num | priv_ep->dir;
2410                 cdns3_select_ep(priv_dev, bEndpointAddress);
2411                 writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd);
2412                 readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val,
2413                                           !(val & EP_CMD_EPRST), 1, 100);
2414 
2415                 priv_ep->flags &= ~EP_CLAIMED;
2416         }
2417 
2418         
2419         writel(0, &priv_dev->regs->usb_ien);
2420         writel(USB_CONF_DEVDS, &priv_dev->regs->usb_conf);
2421 
2422         return ret;
2423 }
2424 
2425 static const struct usb_gadget_ops cdns3_gadget_ops = {
2426         .get_frame = cdns3_gadget_get_frame,
2427         .wakeup = cdns3_gadget_wakeup,
2428         .set_selfpowered = cdns3_gadget_set_selfpowered,
2429         .pullup = cdns3_gadget_pullup,
2430         .udc_start = cdns3_gadget_udc_start,
2431         .udc_stop = cdns3_gadget_udc_stop,
2432         .match_ep = cdns3_gadget_match_ep,
2433 };
2434 
2435 static void cdns3_free_all_eps(struct cdns3_device *priv_dev)
2436 {
2437         int i;
2438 
2439         
2440         priv_dev->eps[16] = NULL;
2441 
2442         for (i = 0; i < CDNS3_ENDPOINTS_MAX_COUNT; i++)
2443                 if (priv_dev->eps[i]) {
2444                         cdns3_free_trb_pool(priv_dev->eps[i]);
2445                         devm_kfree(priv_dev->dev, priv_dev->eps[i]);
2446                 }
2447 }
2448 
2449 
2450 
2451 
2452 
2453 
2454 
2455 static int cdns3_init_eps(struct cdns3_device *priv_dev)
2456 {
2457         u32 ep_enabled_reg, iso_ep_reg;
2458         struct cdns3_endpoint *priv_ep;
2459         int ep_dir, ep_number;
2460         u32 ep_mask;
2461         int ret = 0;
2462         int i;
2463 
2464         
2465         ep_enabled_reg = readl(&priv_dev->regs->usb_cap3);
2466         iso_ep_reg = readl(&priv_dev->regs->usb_cap4);
2467 
2468         dev_dbg(priv_dev->dev, "Initializing non-zero endpoints\n");
2469 
2470         for (i = 0; i < CDNS3_ENDPOINTS_MAX_COUNT; i++) {
2471                 ep_dir = i >> 4;        
2472                 ep_number = i & 0xF;    
2473                 ep_mask = BIT(i);
2474 
2475                 if (!(ep_enabled_reg & ep_mask))
2476                         continue;
2477 
2478                 if (ep_dir && !ep_number) {
2479                         priv_dev->eps[i] = priv_dev->eps[0];
2480                         continue;
2481                 }
2482 
2483                 priv_ep = devm_kzalloc(priv_dev->dev, sizeof(*priv_ep),
2484                                        GFP_KERNEL);
2485                 if (!priv_ep)
2486                         goto err;
2487 
2488                 
2489                 priv_ep->cdns3_dev = priv_dev;
2490                 priv_dev->eps[i] = priv_ep;
2491                 priv_ep->num = ep_number;
2492                 priv_ep->dir = ep_dir ? USB_DIR_IN : USB_DIR_OUT;
2493 
2494                 if (!ep_number) {
2495                         ret = cdns3_init_ep0(priv_dev, priv_ep);
2496                         if (ret) {
2497                                 dev_err(priv_dev->dev, "Failed to init ep0\n");
2498                                 goto err;
2499                         }
2500                 } else {
2501                         snprintf(priv_ep->name, sizeof(priv_ep->name), "ep%d%s",
2502                                  ep_number, !!ep_dir ? "in" : "out");
2503                         priv_ep->endpoint.name = priv_ep->name;
2504 
2505                         usb_ep_set_maxpacket_limit(&priv_ep->endpoint,
2506                                                    CDNS3_EP_MAX_PACKET_LIMIT);
2507                         priv_ep->endpoint.max_streams = CDNS3_EP_MAX_STREAMS;
2508                         priv_ep->endpoint.ops = &cdns3_gadget_ep_ops;
2509                         if (ep_dir)
2510                                 priv_ep->endpoint.caps.dir_in = 1;
2511                         else
2512                                 priv_ep->endpoint.caps.dir_out = 1;
2513 
2514                         if (iso_ep_reg & ep_mask)
2515                                 priv_ep->endpoint.caps.type_iso = 1;
2516 
2517                         priv_ep->endpoint.caps.type_bulk = 1;
2518                         priv_ep->endpoint.caps.type_int = 1;
2519 
2520                         list_add_tail(&priv_ep->endpoint.ep_list,
2521                                       &priv_dev->gadget.ep_list);
2522                 }
2523 
2524                 priv_ep->flags = 0;
2525 
2526                 dev_info(priv_dev->dev, "Initialized  %s support: %s %s\n",
2527                          priv_ep->name,
2528                          priv_ep->endpoint.caps.type_bulk ? "BULK, INT" : "",
2529                          priv_ep->endpoint.caps.type_iso ? "ISO" : "");
2530 
2531                 INIT_LIST_HEAD(&priv_ep->pending_req_list);
2532                 INIT_LIST_HEAD(&priv_ep->deferred_req_list);
2533                 INIT_LIST_HEAD(&priv_ep->wa2_descmiss_req_list);
2534         }
2535 
2536         return 0;
2537 err:
2538         cdns3_free_all_eps(priv_dev);
2539         return -ENOMEM;
2540 }
2541 
2542 void cdns3_gadget_exit(struct cdns3 *cdns)
2543 {
2544         struct cdns3_device *priv_dev;
2545 
2546         priv_dev = cdns->gadget_dev;
2547 
2548         devm_free_irq(cdns->dev, cdns->dev_irq, priv_dev);
2549 
2550         pm_runtime_mark_last_busy(cdns->dev);
2551         pm_runtime_put_autosuspend(cdns->dev);
2552 
2553         usb_del_gadget_udc(&priv_dev->gadget);
2554 
2555         cdns3_free_all_eps(priv_dev);
2556 
2557         while (!list_empty(&priv_dev->aligned_buf_list)) {
2558                 struct cdns3_aligned_buf *buf;
2559 
2560                 buf = cdns3_next_align_buf(&priv_dev->aligned_buf_list);
2561                 dma_free_coherent(priv_dev->sysdev, buf->size,
2562                                   buf->buf,
2563                                   buf->dma);
2564 
2565                 list_del(&buf->list);
2566                 kfree(buf);
2567         }
2568 
2569         dma_free_coherent(priv_dev->sysdev, 8, priv_dev->setup_buf,
2570                           priv_dev->setup_dma);
2571 
2572         kfree(priv_dev->zlp_buf);
2573         kfree(priv_dev);
2574         cdns->gadget_dev = NULL;
2575         cdns3_drd_switch_gadget(cdns, 0);
2576 }
2577 
2578 static int cdns3_gadget_start(struct cdns3 *cdns)
2579 {
2580         struct cdns3_device *priv_dev;
2581         u32 max_speed;
2582         int ret;
2583 
2584         priv_dev = kzalloc(sizeof(*priv_dev), GFP_KERNEL);
2585         if (!priv_dev)
2586                 return -ENOMEM;
2587 
2588         cdns->gadget_dev = priv_dev;
2589         priv_dev->sysdev = cdns->dev;
2590         priv_dev->dev = cdns->dev;
2591         priv_dev->regs = cdns->dev_regs;
2592 
2593         device_property_read_u16(priv_dev->dev, "cdns,on-chip-buff-size",
2594                                  &priv_dev->onchip_buffers);
2595 
2596         if (priv_dev->onchip_buffers <=  0) {
2597                 u32 reg = readl(&priv_dev->regs->usb_cap2);
2598 
2599                 priv_dev->onchip_buffers = USB_CAP2_ACTUAL_MEM_SIZE(reg);
2600         }
2601 
2602         if (!priv_dev->onchip_buffers)
2603                 priv_dev->onchip_buffers = 256;
2604 
2605         max_speed = usb_get_maximum_speed(cdns->dev);
2606 
2607         
2608         switch (max_speed) {
2609         case USB_SPEED_FULL:
2610         case USB_SPEED_HIGH:
2611         case USB_SPEED_SUPER:
2612                 break;
2613         default:
2614                 dev_err(cdns->dev, "invalid maximum_speed parameter %d\n",
2615                         max_speed);
2616                 
2617         case USB_SPEED_UNKNOWN:
2618                 
2619                 max_speed = USB_SPEED_SUPER;
2620                 break;
2621         }
2622 
2623         
2624         priv_dev->gadget.max_speed = max_speed;
2625         priv_dev->gadget.speed = USB_SPEED_UNKNOWN;
2626         priv_dev->gadget.ops = &cdns3_gadget_ops;
2627         priv_dev->gadget.name = "usb-ss-gadget";
2628         priv_dev->gadget.sg_supported = 1;
2629         priv_dev->gadget.quirk_avoids_skb_reserve = 1;
2630 
2631         spin_lock_init(&priv_dev->lock);
2632         INIT_WORK(&priv_dev->pending_status_wq,
2633                   cdns3_pending_setup_status_handler);
2634 
2635         INIT_WORK(&priv_dev->aligned_buf_wq,
2636                   cdns3_free_aligned_request_buf);
2637 
2638         
2639         INIT_LIST_HEAD(&priv_dev->gadget.ep_list);
2640         INIT_LIST_HEAD(&priv_dev->aligned_buf_list);
2641 
2642         ret = cdns3_init_eps(priv_dev);
2643         if (ret) {
2644                 dev_err(priv_dev->dev, "Failed to create endpoints\n");
2645                 goto err1;
2646         }
2647 
2648         
2649         priv_dev->setup_buf = dma_alloc_coherent(priv_dev->sysdev, 8,
2650                                                  &priv_dev->setup_dma, GFP_DMA);
2651         if (!priv_dev->setup_buf) {
2652                 ret = -ENOMEM;
2653                 goto err2;
2654         }
2655 
2656         priv_dev->dev_ver = readl(&priv_dev->regs->usb_cap6);
2657 
2658         dev_dbg(priv_dev->dev, "Device Controller version: %08x\n",
2659                 readl(&priv_dev->regs->usb_cap6));
2660         dev_dbg(priv_dev->dev, "USB Capabilities:: %08x\n",
2661                 readl(&priv_dev->regs->usb_cap1));
2662         dev_dbg(priv_dev->dev, "On-Chip memory configuration: %08x\n",
2663                 readl(&priv_dev->regs->usb_cap2));
2664 
2665         priv_dev->dev_ver = GET_DEV_BASE_VERSION(priv_dev->dev_ver);
2666 
2667         priv_dev->zlp_buf = kzalloc(CDNS3_EP_ZLP_BUF_SIZE, GFP_KERNEL);
2668         if (!priv_dev->zlp_buf) {
2669                 ret = -ENOMEM;
2670                 goto err3;
2671         }
2672 
2673         
2674         ret = usb_add_gadget_udc(priv_dev->dev, &priv_dev->gadget);
2675         if (ret < 0) {
2676                 dev_err(priv_dev->dev,
2677                         "Failed to register USB device controller\n");
2678                 goto err4;
2679         }
2680 
2681         return 0;
2682 err4:
2683         kfree(priv_dev->zlp_buf);
2684 err3:
2685         dma_free_coherent(priv_dev->sysdev, 8, priv_dev->setup_buf,
2686                           priv_dev->setup_dma);
2687 err2:
2688         cdns3_free_all_eps(priv_dev);
2689 err1:
2690         cdns->gadget_dev = NULL;
2691         return ret;
2692 }
2693 
2694 static int __cdns3_gadget_init(struct cdns3 *cdns)
2695 {
2696         int ret = 0;
2697 
2698         
2699         ret = dma_set_mask_and_coherent(cdns->dev, DMA_BIT_MASK(32));
2700         if (ret) {
2701                 dev_err(cdns->dev, "Failed to set dma mask: %d\n", ret);
2702                 return ret;
2703         }
2704 
2705         cdns3_drd_switch_gadget(cdns, 1);
2706         pm_runtime_get_sync(cdns->dev);
2707 
2708         ret = cdns3_gadget_start(cdns);
2709         if (ret)
2710                 return ret;
2711 
2712         
2713 
2714 
2715 
2716         ret = devm_request_threaded_irq(cdns->dev, cdns->dev_irq,
2717                                         cdns3_device_irq_handler,
2718                                         cdns3_device_thread_irq_handler,
2719                                         IRQF_SHARED, dev_name(cdns->dev),
2720                                         cdns->gadget_dev);
2721 
2722         if (ret)
2723                 goto err0;
2724 
2725         return 0;
2726 err0:
2727         cdns3_gadget_exit(cdns);
2728         return ret;
2729 }
2730 
2731 static int cdns3_gadget_suspend(struct cdns3 *cdns, bool do_wakeup)
2732 {
2733         struct cdns3_device *priv_dev = cdns->gadget_dev;
2734 
2735         cdns3_disconnect_gadget(priv_dev);
2736 
2737         priv_dev->gadget.speed = USB_SPEED_UNKNOWN;
2738         usb_gadget_set_state(&priv_dev->gadget, USB_STATE_NOTATTACHED);
2739         cdns3_hw_reset_eps_config(priv_dev);
2740 
2741         
2742         writel(0, &priv_dev->regs->usb_ien);
2743 
2744         return 0;
2745 }
2746 
2747 static int cdns3_gadget_resume(struct cdns3 *cdns, bool hibernated)
2748 {
2749         struct cdns3_device *priv_dev = cdns->gadget_dev;
2750 
2751         if (!priv_dev->gadget_driver)
2752                 return 0;
2753 
2754         cdns3_gadget_config(priv_dev);
2755 
2756         return 0;
2757 }
2758 
2759 
2760 
2761 
2762 
2763 
2764 
2765 
2766 int cdns3_gadget_init(struct cdns3 *cdns)
2767 {
2768         struct cdns3_role_driver *rdrv;
2769 
2770         rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL);
2771         if (!rdrv)
2772                 return -ENOMEM;
2773 
2774         rdrv->start     = __cdns3_gadget_init;
2775         rdrv->stop      = cdns3_gadget_exit;
2776         rdrv->suspend   = cdns3_gadget_suspend;
2777         rdrv->resume    = cdns3_gadget_resume;
2778         rdrv->state     = CDNS3_ROLE_STATE_INACTIVE;
2779         rdrv->name      = "gadget";
2780         cdns->roles[USB_ROLE_DEVICE] = rdrv;
2781 
2782         return 0;
2783 }