phy-mv-usb.c (20643B)
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2011 Marvell International Ltd. All rights reserved. 4 * Author: Chao Xie <chao.xie@marvell.com> 5 * Neil Zhang <zhangwm@marvell.com> 6 */ 7 8#include <linux/module.h> 9#include <linux/kernel.h> 10#include <linux/io.h> 11#include <linux/iopoll.h> 12#include <linux/uaccess.h> 13#include <linux/device.h> 14#include <linux/proc_fs.h> 15#include <linux/clk.h> 16#include <linux/workqueue.h> 17#include <linux/platform_device.h> 18 19#include <linux/usb.h> 20#include <linux/usb/ch9.h> 21#include <linux/usb/otg.h> 22#include <linux/usb/gadget.h> 23#include <linux/usb/hcd.h> 24#include <linux/platform_data/mv_usb.h> 25 26#include "phy-mv-usb.h" 27 28#define DRIVER_DESC "Marvell USB OTG transceiver driver" 29 30MODULE_DESCRIPTION(DRIVER_DESC); 31MODULE_LICENSE("GPL"); 32 33static const char driver_name[] = "mv-otg"; 34 35static char *state_string[] = { 36 "undefined", 37 "b_idle", 38 "b_srp_init", 39 "b_peripheral", 40 "b_wait_acon", 41 "b_host", 42 "a_idle", 43 "a_wait_vrise", 44 "a_wait_bcon", 45 "a_host", 46 "a_suspend", 47 "a_peripheral", 48 "a_wait_vfall", 49 "a_vbus_err" 50}; 51 52static int mv_otg_set_vbus(struct usb_otg *otg, bool on) 53{ 54 struct mv_otg *mvotg = container_of(otg->usb_phy, struct mv_otg, phy); 55 if (mvotg->pdata->set_vbus == NULL) 56 return -ENODEV; 57 58 return mvotg->pdata->set_vbus(on); 59} 60 61static int mv_otg_set_host(struct usb_otg *otg, 62 struct usb_bus *host) 63{ 64 otg->host = host; 65 66 return 0; 67} 68 69static int mv_otg_set_peripheral(struct usb_otg *otg, 70 struct usb_gadget *gadget) 71{ 72 otg->gadget = gadget; 73 74 return 0; 75} 76 77static void mv_otg_run_state_machine(struct mv_otg *mvotg, 78 unsigned long delay) 79{ 80 dev_dbg(&mvotg->pdev->dev, "transceiver is updated\n"); 81 if (!mvotg->qwork) 82 return; 83 84 queue_delayed_work(mvotg->qwork, &mvotg->work, delay); 85} 86 87static void mv_otg_timer_await_bcon(struct timer_list *t) 88{ 89 struct mv_otg *mvotg = from_timer(mvotg, t, 90 otg_ctrl.timer[A_WAIT_BCON_TIMER]); 91 92 mvotg->otg_ctrl.a_wait_bcon_timeout = 1; 93 94 dev_info(&mvotg->pdev->dev, "B Device No Response!\n"); 95 96 if (spin_trylock(&mvotg->wq_lock)) { 97 mv_otg_run_state_machine(mvotg, 0); 98 spin_unlock(&mvotg->wq_lock); 99 } 100} 101 102static int mv_otg_cancel_timer(struct mv_otg *mvotg, unsigned int id) 103{ 104 struct timer_list *timer; 105 106 if (id >= OTG_TIMER_NUM) 107 return -EINVAL; 108 109 timer = &mvotg->otg_ctrl.timer[id]; 110 111 if (timer_pending(timer)) 112 del_timer(timer); 113 114 return 0; 115} 116 117static int mv_otg_set_timer(struct mv_otg *mvotg, unsigned int id, 118 unsigned long interval) 119{ 120 struct timer_list *timer; 121 122 if (id >= OTG_TIMER_NUM) 123 return -EINVAL; 124 125 timer = &mvotg->otg_ctrl.timer[id]; 126 if (timer_pending(timer)) { 127 dev_err(&mvotg->pdev->dev, "Timer%d is already running\n", id); 128 return -EBUSY; 129 } 130 131 timer->expires = jiffies + interval; 132 add_timer(timer); 133 134 return 0; 135} 136 137static int mv_otg_reset(struct mv_otg *mvotg) 138{ 139 u32 tmp; 140 int ret; 141 142 /* Stop the controller */ 143 tmp = readl(&mvotg->op_regs->usbcmd); 144 tmp &= ~USBCMD_RUN_STOP; 145 writel(tmp, &mvotg->op_regs->usbcmd); 146 147 /* Reset the controller to get default values */ 148 writel(USBCMD_CTRL_RESET, &mvotg->op_regs->usbcmd); 149 150 ret = readl_poll_timeout_atomic(&mvotg->op_regs->usbcmd, tmp, 151 (tmp & USBCMD_CTRL_RESET), 10, 10000); 152 if (ret < 0) { 153 dev_err(&mvotg->pdev->dev, 154 "Wait for RESET completed TIMEOUT\n"); 155 return ret; 156 } 157 158 writel(0x0, &mvotg->op_regs->usbintr); 159 tmp = readl(&mvotg->op_regs->usbsts); 160 writel(tmp, &mvotg->op_regs->usbsts); 161 162 return 0; 163} 164 165static void mv_otg_init_irq(struct mv_otg *mvotg) 166{ 167 u32 otgsc; 168 169 mvotg->irq_en = OTGSC_INTR_A_SESSION_VALID 170 | OTGSC_INTR_A_VBUS_VALID; 171 mvotg->irq_status = OTGSC_INTSTS_A_SESSION_VALID 172 | OTGSC_INTSTS_A_VBUS_VALID; 173 174 if (mvotg->pdata->vbus == NULL) { 175 mvotg->irq_en |= OTGSC_INTR_B_SESSION_VALID 176 | OTGSC_INTR_B_SESSION_END; 177 mvotg->irq_status |= OTGSC_INTSTS_B_SESSION_VALID 178 | OTGSC_INTSTS_B_SESSION_END; 179 } 180 181 if (mvotg->pdata->id == NULL) { 182 mvotg->irq_en |= OTGSC_INTR_USB_ID; 183 mvotg->irq_status |= OTGSC_INTSTS_USB_ID; 184 } 185 186 otgsc = readl(&mvotg->op_regs->otgsc); 187 otgsc |= mvotg->irq_en; 188 writel(otgsc, &mvotg->op_regs->otgsc); 189} 190 191static void mv_otg_start_host(struct mv_otg *mvotg, int on) 192{ 193#ifdef CONFIG_USB 194 struct usb_otg *otg = mvotg->phy.otg; 195 struct usb_hcd *hcd; 196 197 if (!otg->host) 198 return; 199 200 dev_info(&mvotg->pdev->dev, "%s host\n", on ? "start" : "stop"); 201 202 hcd = bus_to_hcd(otg->host); 203 204 if (on) { 205 usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); 206 device_wakeup_enable(hcd->self.controller); 207 } else { 208 usb_remove_hcd(hcd); 209 } 210#endif /* CONFIG_USB */ 211} 212 213static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on) 214{ 215 struct usb_otg *otg = mvotg->phy.otg; 216 217 if (!otg->gadget) 218 return; 219 220 dev_info(mvotg->phy.dev, "gadget %s\n", on ? "on" : "off"); 221 222 if (on) 223 usb_gadget_vbus_connect(otg->gadget); 224 else 225 usb_gadget_vbus_disconnect(otg->gadget); 226} 227 228static void otg_clock_enable(struct mv_otg *mvotg) 229{ 230 clk_prepare_enable(mvotg->clk); 231} 232 233static void otg_clock_disable(struct mv_otg *mvotg) 234{ 235 clk_disable_unprepare(mvotg->clk); 236} 237 238static int mv_otg_enable_internal(struct mv_otg *mvotg) 239{ 240 int retval = 0; 241 242 if (mvotg->active) 243 return 0; 244 245 dev_dbg(&mvotg->pdev->dev, "otg enabled\n"); 246 247 otg_clock_enable(mvotg); 248 if (mvotg->pdata->phy_init) { 249 retval = mvotg->pdata->phy_init(mvotg->phy_regs); 250 if (retval) { 251 dev_err(&mvotg->pdev->dev, 252 "init phy error %d\n", retval); 253 otg_clock_disable(mvotg); 254 return retval; 255 } 256 } 257 mvotg->active = 1; 258 259 return 0; 260 261} 262 263static int mv_otg_enable(struct mv_otg *mvotg) 264{ 265 if (mvotg->clock_gating) 266 return mv_otg_enable_internal(mvotg); 267 268 return 0; 269} 270 271static void mv_otg_disable_internal(struct mv_otg *mvotg) 272{ 273 if (mvotg->active) { 274 dev_dbg(&mvotg->pdev->dev, "otg disabled\n"); 275 if (mvotg->pdata->phy_deinit) 276 mvotg->pdata->phy_deinit(mvotg->phy_regs); 277 otg_clock_disable(mvotg); 278 mvotg->active = 0; 279 } 280} 281 282static void mv_otg_disable(struct mv_otg *mvotg) 283{ 284 if (mvotg->clock_gating) 285 mv_otg_disable_internal(mvotg); 286} 287 288static void mv_otg_update_inputs(struct mv_otg *mvotg) 289{ 290 struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; 291 u32 otgsc; 292 293 otgsc = readl(&mvotg->op_regs->otgsc); 294 295 if (mvotg->pdata->vbus) { 296 if (mvotg->pdata->vbus->poll() == VBUS_HIGH) { 297 otg_ctrl->b_sess_vld = 1; 298 otg_ctrl->b_sess_end = 0; 299 } else { 300 otg_ctrl->b_sess_vld = 0; 301 otg_ctrl->b_sess_end = 1; 302 } 303 } else { 304 otg_ctrl->b_sess_vld = !!(otgsc & OTGSC_STS_B_SESSION_VALID); 305 otg_ctrl->b_sess_end = !!(otgsc & OTGSC_STS_B_SESSION_END); 306 } 307 308 if (mvotg->pdata->id) 309 otg_ctrl->id = !!mvotg->pdata->id->poll(); 310 else 311 otg_ctrl->id = !!(otgsc & OTGSC_STS_USB_ID); 312 313 if (mvotg->pdata->otg_force_a_bus_req && !otg_ctrl->id) 314 otg_ctrl->a_bus_req = 1; 315 316 otg_ctrl->a_sess_vld = !!(otgsc & OTGSC_STS_A_SESSION_VALID); 317 otg_ctrl->a_vbus_vld = !!(otgsc & OTGSC_STS_A_VBUS_VALID); 318 319 dev_dbg(&mvotg->pdev->dev, "%s: ", __func__); 320 dev_dbg(&mvotg->pdev->dev, "id %d\n", otg_ctrl->id); 321 dev_dbg(&mvotg->pdev->dev, "b_sess_vld %d\n", otg_ctrl->b_sess_vld); 322 dev_dbg(&mvotg->pdev->dev, "b_sess_end %d\n", otg_ctrl->b_sess_end); 323 dev_dbg(&mvotg->pdev->dev, "a_vbus_vld %d\n", otg_ctrl->a_vbus_vld); 324 dev_dbg(&mvotg->pdev->dev, "a_sess_vld %d\n", otg_ctrl->a_sess_vld); 325} 326 327static void mv_otg_update_state(struct mv_otg *mvotg) 328{ 329 struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; 330 int old_state = mvotg->phy.otg->state; 331 332 switch (old_state) { 333 case OTG_STATE_UNDEFINED: 334 mvotg->phy.otg->state = OTG_STATE_B_IDLE; 335 fallthrough; 336 case OTG_STATE_B_IDLE: 337 if (otg_ctrl->id == 0) 338 mvotg->phy.otg->state = OTG_STATE_A_IDLE; 339 else if (otg_ctrl->b_sess_vld) 340 mvotg->phy.otg->state = OTG_STATE_B_PERIPHERAL; 341 break; 342 case OTG_STATE_B_PERIPHERAL: 343 if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0) 344 mvotg->phy.otg->state = OTG_STATE_B_IDLE; 345 break; 346 case OTG_STATE_A_IDLE: 347 if (otg_ctrl->id) 348 mvotg->phy.otg->state = OTG_STATE_B_IDLE; 349 else if (!(otg_ctrl->a_bus_drop) && 350 (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det)) 351 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VRISE; 352 break; 353 case OTG_STATE_A_WAIT_VRISE: 354 if (otg_ctrl->a_vbus_vld) 355 mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON; 356 break; 357 case OTG_STATE_A_WAIT_BCON: 358 if (otg_ctrl->id || otg_ctrl->a_bus_drop 359 || otg_ctrl->a_wait_bcon_timeout) { 360 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); 361 mvotg->otg_ctrl.a_wait_bcon_timeout = 0; 362 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL; 363 otg_ctrl->a_bus_req = 0; 364 } else if (!otg_ctrl->a_vbus_vld) { 365 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); 366 mvotg->otg_ctrl.a_wait_bcon_timeout = 0; 367 mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR; 368 } else if (otg_ctrl->b_conn) { 369 mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); 370 mvotg->otg_ctrl.a_wait_bcon_timeout = 0; 371 mvotg->phy.otg->state = OTG_STATE_A_HOST; 372 } 373 break; 374 case OTG_STATE_A_HOST: 375 if (otg_ctrl->id || !otg_ctrl->b_conn 376 || otg_ctrl->a_bus_drop) 377 mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON; 378 else if (!otg_ctrl->a_vbus_vld) 379 mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR; 380 break; 381 case OTG_STATE_A_WAIT_VFALL: 382 if (otg_ctrl->id 383 || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld) 384 || otg_ctrl->a_bus_req) 385 mvotg->phy.otg->state = OTG_STATE_A_IDLE; 386 break; 387 case OTG_STATE_A_VBUS_ERR: 388 if (otg_ctrl->id || otg_ctrl->a_clr_err 389 || otg_ctrl->a_bus_drop) { 390 otg_ctrl->a_clr_err = 0; 391 mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL; 392 } 393 break; 394 default: 395 break; 396 } 397} 398 399static void mv_otg_work(struct work_struct *work) 400{ 401 struct mv_otg *mvotg; 402 struct usb_otg *otg; 403 int old_state; 404 405 mvotg = container_of(to_delayed_work(work), struct mv_otg, work); 406 407run: 408 /* work queue is single thread, or we need spin_lock to protect */ 409 otg = mvotg->phy.otg; 410 old_state = otg->state; 411 412 if (!mvotg->active) 413 return; 414 415 mv_otg_update_inputs(mvotg); 416 mv_otg_update_state(mvotg); 417 418 if (old_state != mvotg->phy.otg->state) { 419 dev_info(&mvotg->pdev->dev, "change from state %s to %s\n", 420 state_string[old_state], 421 state_string[mvotg->phy.otg->state]); 422 423 switch (mvotg->phy.otg->state) { 424 case OTG_STATE_B_IDLE: 425 otg->default_a = 0; 426 if (old_state == OTG_STATE_B_PERIPHERAL) 427 mv_otg_start_periphrals(mvotg, 0); 428 mv_otg_reset(mvotg); 429 mv_otg_disable(mvotg); 430 usb_phy_set_event(&mvotg->phy, USB_EVENT_NONE); 431 break; 432 case OTG_STATE_B_PERIPHERAL: 433 mv_otg_enable(mvotg); 434 mv_otg_start_periphrals(mvotg, 1); 435 usb_phy_set_event(&mvotg->phy, USB_EVENT_ENUMERATED); 436 break; 437 case OTG_STATE_A_IDLE: 438 otg->default_a = 1; 439 mv_otg_enable(mvotg); 440 if (old_state == OTG_STATE_A_WAIT_VFALL) 441 mv_otg_start_host(mvotg, 0); 442 mv_otg_reset(mvotg); 443 break; 444 case OTG_STATE_A_WAIT_VRISE: 445 mv_otg_set_vbus(otg, 1); 446 break; 447 case OTG_STATE_A_WAIT_BCON: 448 if (old_state != OTG_STATE_A_HOST) 449 mv_otg_start_host(mvotg, 1); 450 mv_otg_set_timer(mvotg, A_WAIT_BCON_TIMER, 451 T_A_WAIT_BCON); 452 /* 453 * Now, we directly enter A_HOST. So set b_conn = 1 454 * here. In fact, it need host driver to notify us. 455 */ 456 mvotg->otg_ctrl.b_conn = 1; 457 break; 458 case OTG_STATE_A_HOST: 459 break; 460 case OTG_STATE_A_WAIT_VFALL: 461 /* 462 * Now, we has exited A_HOST. So set b_conn = 0 463 * here. In fact, it need host driver to notify us. 464 */ 465 mvotg->otg_ctrl.b_conn = 0; 466 mv_otg_set_vbus(otg, 0); 467 break; 468 case OTG_STATE_A_VBUS_ERR: 469 break; 470 default: 471 break; 472 } 473 goto run; 474 } 475} 476 477static irqreturn_t mv_otg_irq(int irq, void *dev) 478{ 479 struct mv_otg *mvotg = dev; 480 u32 otgsc; 481 482 otgsc = readl(&mvotg->op_regs->otgsc); 483 writel(otgsc, &mvotg->op_regs->otgsc); 484 485 /* 486 * if we have vbus, then the vbus detection for B-device 487 * will be done by mv_otg_inputs_irq(). 488 */ 489 if (mvotg->pdata->vbus) 490 if ((otgsc & OTGSC_STS_USB_ID) && 491 !(otgsc & OTGSC_INTSTS_USB_ID)) 492 return IRQ_NONE; 493 494 if ((otgsc & mvotg->irq_status) == 0) 495 return IRQ_NONE; 496 497 mv_otg_run_state_machine(mvotg, 0); 498 499 return IRQ_HANDLED; 500} 501 502static irqreturn_t mv_otg_inputs_irq(int irq, void *dev) 503{ 504 struct mv_otg *mvotg = dev; 505 506 /* The clock may disabled at this time */ 507 if (!mvotg->active) { 508 mv_otg_enable(mvotg); 509 mv_otg_init_irq(mvotg); 510 } 511 512 mv_otg_run_state_machine(mvotg, 0); 513 514 return IRQ_HANDLED; 515} 516 517static ssize_t 518a_bus_req_show(struct device *dev, struct device_attribute *attr, char *buf) 519{ 520 struct mv_otg *mvotg = dev_get_drvdata(dev); 521 return scnprintf(buf, PAGE_SIZE, "%d\n", 522 mvotg->otg_ctrl.a_bus_req); 523} 524 525static ssize_t 526a_bus_req_store(struct device *dev, struct device_attribute *attr, 527 const char *buf, size_t count) 528{ 529 struct mv_otg *mvotg = dev_get_drvdata(dev); 530 531 if (count > 2) 532 return -1; 533 534 /* We will use this interface to change to A device */ 535 if (mvotg->phy.otg->state != OTG_STATE_B_IDLE 536 && mvotg->phy.otg->state != OTG_STATE_A_IDLE) 537 return -1; 538 539 /* The clock may disabled and we need to set irq for ID detected */ 540 mv_otg_enable(mvotg); 541 mv_otg_init_irq(mvotg); 542 543 if (buf[0] == '1') { 544 mvotg->otg_ctrl.a_bus_req = 1; 545 mvotg->otg_ctrl.a_bus_drop = 0; 546 dev_dbg(&mvotg->pdev->dev, 547 "User request: a_bus_req = 1\n"); 548 549 if (spin_trylock(&mvotg->wq_lock)) { 550 mv_otg_run_state_machine(mvotg, 0); 551 spin_unlock(&mvotg->wq_lock); 552 } 553 } 554 555 return count; 556} 557 558static DEVICE_ATTR_RW(a_bus_req); 559 560static ssize_t 561a_clr_err_store(struct device *dev, struct device_attribute *attr, 562 const char *buf, size_t count) 563{ 564 struct mv_otg *mvotg = dev_get_drvdata(dev); 565 if (!mvotg->phy.otg->default_a) 566 return -1; 567 568 if (count > 2) 569 return -1; 570 571 if (buf[0] == '1') { 572 mvotg->otg_ctrl.a_clr_err = 1; 573 dev_dbg(&mvotg->pdev->dev, 574 "User request: a_clr_err = 1\n"); 575 } 576 577 if (spin_trylock(&mvotg->wq_lock)) { 578 mv_otg_run_state_machine(mvotg, 0); 579 spin_unlock(&mvotg->wq_lock); 580 } 581 582 return count; 583} 584 585static DEVICE_ATTR_WO(a_clr_err); 586 587static ssize_t 588a_bus_drop_show(struct device *dev, struct device_attribute *attr, 589 char *buf) 590{ 591 struct mv_otg *mvotg = dev_get_drvdata(dev); 592 return scnprintf(buf, PAGE_SIZE, "%d\n", 593 mvotg->otg_ctrl.a_bus_drop); 594} 595 596static ssize_t 597a_bus_drop_store(struct device *dev, struct device_attribute *attr, 598 const char *buf, size_t count) 599{ 600 struct mv_otg *mvotg = dev_get_drvdata(dev); 601 if (!mvotg->phy.otg->default_a) 602 return -1; 603 604 if (count > 2) 605 return -1; 606 607 if (buf[0] == '0') { 608 mvotg->otg_ctrl.a_bus_drop = 0; 609 dev_dbg(&mvotg->pdev->dev, 610 "User request: a_bus_drop = 0\n"); 611 } else if (buf[0] == '1') { 612 mvotg->otg_ctrl.a_bus_drop = 1; 613 mvotg->otg_ctrl.a_bus_req = 0; 614 dev_dbg(&mvotg->pdev->dev, 615 "User request: a_bus_drop = 1\n"); 616 dev_dbg(&mvotg->pdev->dev, 617 "User request: and a_bus_req = 0\n"); 618 } 619 620 if (spin_trylock(&mvotg->wq_lock)) { 621 mv_otg_run_state_machine(mvotg, 0); 622 spin_unlock(&mvotg->wq_lock); 623 } 624 625 return count; 626} 627 628static DEVICE_ATTR_RW(a_bus_drop); 629 630static struct attribute *inputs_attrs[] = { 631 &dev_attr_a_bus_req.attr, 632 &dev_attr_a_clr_err.attr, 633 &dev_attr_a_bus_drop.attr, 634 NULL, 635}; 636 637static const struct attribute_group inputs_attr_group = { 638 .name = "inputs", 639 .attrs = inputs_attrs, 640}; 641 642static const struct attribute_group *mv_otg_groups[] = { 643 &inputs_attr_group, 644 NULL, 645}; 646 647static int mv_otg_remove(struct platform_device *pdev) 648{ 649 struct mv_otg *mvotg = platform_get_drvdata(pdev); 650 651 if (mvotg->qwork) 652 destroy_workqueue(mvotg->qwork); 653 654 mv_otg_disable(mvotg); 655 656 usb_remove_phy(&mvotg->phy); 657 658 return 0; 659} 660 661static int mv_otg_probe(struct platform_device *pdev) 662{ 663 struct mv_usb_platform_data *pdata = dev_get_platdata(&pdev->dev); 664 struct mv_otg *mvotg; 665 struct usb_otg *otg; 666 struct resource *r; 667 int retval = 0, i; 668 669 if (pdata == NULL) { 670 dev_err(&pdev->dev, "failed to get platform data\n"); 671 return -ENODEV; 672 } 673 674 mvotg = devm_kzalloc(&pdev->dev, sizeof(*mvotg), GFP_KERNEL); 675 if (!mvotg) 676 return -ENOMEM; 677 678 otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL); 679 if (!otg) 680 return -ENOMEM; 681 682 platform_set_drvdata(pdev, mvotg); 683 684 mvotg->pdev = pdev; 685 mvotg->pdata = pdata; 686 687 mvotg->clk = devm_clk_get(&pdev->dev, NULL); 688 if (IS_ERR(mvotg->clk)) 689 return PTR_ERR(mvotg->clk); 690 691 mvotg->qwork = create_singlethread_workqueue("mv_otg_queue"); 692 if (!mvotg->qwork) { 693 dev_dbg(&pdev->dev, "cannot create workqueue for OTG\n"); 694 return -ENOMEM; 695 } 696 697 INIT_DELAYED_WORK(&mvotg->work, mv_otg_work); 698 699 /* OTG common part */ 700 mvotg->pdev = pdev; 701 mvotg->phy.dev = &pdev->dev; 702 mvotg->phy.otg = otg; 703 mvotg->phy.label = driver_name; 704 705 otg->state = OTG_STATE_UNDEFINED; 706 otg->usb_phy = &mvotg->phy; 707 otg->set_host = mv_otg_set_host; 708 otg->set_peripheral = mv_otg_set_peripheral; 709 otg->set_vbus = mv_otg_set_vbus; 710 711 for (i = 0; i < OTG_TIMER_NUM; i++) 712 timer_setup(&mvotg->otg_ctrl.timer[i], 713 mv_otg_timer_await_bcon, 0); 714 715 r = platform_get_resource_byname(mvotg->pdev, 716 IORESOURCE_MEM, "phyregs"); 717 if (r == NULL) { 718 dev_err(&pdev->dev, "no phy I/O memory resource defined\n"); 719 retval = -ENODEV; 720 goto err_destroy_workqueue; 721 } 722 723 mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r)); 724 if (mvotg->phy_regs == NULL) { 725 dev_err(&pdev->dev, "failed to map phy I/O memory\n"); 726 retval = -EFAULT; 727 goto err_destroy_workqueue; 728 } 729 730 r = platform_get_resource_byname(mvotg->pdev, 731 IORESOURCE_MEM, "capregs"); 732 if (r == NULL) { 733 dev_err(&pdev->dev, "no I/O memory resource defined\n"); 734 retval = -ENODEV; 735 goto err_destroy_workqueue; 736 } 737 738 mvotg->cap_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r)); 739 if (mvotg->cap_regs == NULL) { 740 dev_err(&pdev->dev, "failed to map I/O memory\n"); 741 retval = -EFAULT; 742 goto err_destroy_workqueue; 743 } 744 745 /* we will acces controller register, so enable the udc controller */ 746 retval = mv_otg_enable_internal(mvotg); 747 if (retval) { 748 dev_err(&pdev->dev, "mv otg enable error %d\n", retval); 749 goto err_destroy_workqueue; 750 } 751 752 mvotg->op_regs = 753 (struct mv_otg_regs __iomem *) ((unsigned long) mvotg->cap_regs 754 + (readl(mvotg->cap_regs) & CAPLENGTH_MASK)); 755 756 if (pdata->id) { 757 retval = devm_request_threaded_irq(&pdev->dev, pdata->id->irq, 758 NULL, mv_otg_inputs_irq, 759 IRQF_ONESHOT, "id", mvotg); 760 if (retval) { 761 dev_info(&pdev->dev, 762 "Failed to request irq for ID\n"); 763 pdata->id = NULL; 764 } 765 } 766 767 if (pdata->vbus) { 768 mvotg->clock_gating = 1; 769 retval = devm_request_threaded_irq(&pdev->dev, pdata->vbus->irq, 770 NULL, mv_otg_inputs_irq, 771 IRQF_ONESHOT, "vbus", mvotg); 772 if (retval) { 773 dev_info(&pdev->dev, 774 "Failed to request irq for VBUS, " 775 "disable clock gating\n"); 776 mvotg->clock_gating = 0; 777 pdata->vbus = NULL; 778 } 779 } 780 781 if (pdata->disable_otg_clock_gating) 782 mvotg->clock_gating = 0; 783 784 mv_otg_reset(mvotg); 785 mv_otg_init_irq(mvotg); 786 787 r = platform_get_resource(mvotg->pdev, IORESOURCE_IRQ, 0); 788 if (r == NULL) { 789 dev_err(&pdev->dev, "no IRQ resource defined\n"); 790 retval = -ENODEV; 791 goto err_disable_clk; 792 } 793 794 mvotg->irq = r->start; 795 if (devm_request_irq(&pdev->dev, mvotg->irq, mv_otg_irq, IRQF_SHARED, 796 driver_name, mvotg)) { 797 dev_err(&pdev->dev, "Request irq %d for OTG failed\n", 798 mvotg->irq); 799 mvotg->irq = 0; 800 retval = -ENODEV; 801 goto err_disable_clk; 802 } 803 804 retval = usb_add_phy(&mvotg->phy, USB_PHY_TYPE_USB2); 805 if (retval < 0) { 806 dev_err(&pdev->dev, "can't register transceiver, %d\n", 807 retval); 808 goto err_disable_clk; 809 } 810 811 spin_lock_init(&mvotg->wq_lock); 812 if (spin_trylock(&mvotg->wq_lock)) { 813 mv_otg_run_state_machine(mvotg, 2 * HZ); 814 spin_unlock(&mvotg->wq_lock); 815 } 816 817 dev_info(&pdev->dev, 818 "successful probe OTG device %s clock gating.\n", 819 mvotg->clock_gating ? "with" : "without"); 820 821 return 0; 822 823err_disable_clk: 824 mv_otg_disable_internal(mvotg); 825err_destroy_workqueue: 826 destroy_workqueue(mvotg->qwork); 827 828 return retval; 829} 830 831#ifdef CONFIG_PM 832static int mv_otg_suspend(struct platform_device *pdev, pm_message_t state) 833{ 834 struct mv_otg *mvotg = platform_get_drvdata(pdev); 835 836 if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) { 837 dev_info(&pdev->dev, 838 "OTG state is not B_IDLE, it is %d!\n", 839 mvotg->phy.otg->state); 840 return -EAGAIN; 841 } 842 843 if (!mvotg->clock_gating) 844 mv_otg_disable_internal(mvotg); 845 846 return 0; 847} 848 849static int mv_otg_resume(struct platform_device *pdev) 850{ 851 struct mv_otg *mvotg = platform_get_drvdata(pdev); 852 u32 otgsc; 853 854 if (!mvotg->clock_gating) { 855 mv_otg_enable_internal(mvotg); 856 857 otgsc = readl(&mvotg->op_regs->otgsc); 858 otgsc |= mvotg->irq_en; 859 writel(otgsc, &mvotg->op_regs->otgsc); 860 861 if (spin_trylock(&mvotg->wq_lock)) { 862 mv_otg_run_state_machine(mvotg, 0); 863 spin_unlock(&mvotg->wq_lock); 864 } 865 } 866 return 0; 867} 868#endif 869 870static struct platform_driver mv_otg_driver = { 871 .probe = mv_otg_probe, 872 .remove = mv_otg_remove, 873 .driver = { 874 .name = driver_name, 875 .dev_groups = mv_otg_groups, 876 }, 877#ifdef CONFIG_PM 878 .suspend = mv_otg_suspend, 879 .resume = mv_otg_resume, 880#endif 881}; 882module_platform_driver(mv_otg_driver);