3 #include "usbdev_grf_regs.h"
4 #include "dwc_otg_regs.h"
5 static struct dwc_otg_control_usb *control_usb;
7 #ifdef CONFIG_USB20_OTG
8 static void usb20otg_hw_init(void)
10 #ifndef CONFIG_USB20_HOST
12 control_usb->grf_uoc2_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
14 control_usb->grf_uoc2_base->CON3 = 0x2A|(0x3F<<16);
16 /* usb phy config init
17 * usb phy enter usb mode */
18 control_usb->grf_uoc0_base->CON3 = (0x00c0 << 16);
20 /* other haredware init,include:
21 * DRV_VBUS GPIO init */
22 if(gpio_is_valid(control_usb->otg_gpios->gpio)){
23 if(gpio_get_value(control_usb->otg_gpios->gpio)){
24 gpio_set_value(control_usb->otg_gpios->gpio, 0);
29 static void usb20otg_phy_suspend(void* pdata, int suspend)
31 struct dwc_otg_platform_data *usbpdata=pdata;
35 control_usb->grf_uoc0_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
37 control_usb->grf_uoc0_base->CON3 = 0x2A|(0x3F<<16);
38 usbpdata->phy_status = 1;
41 control_usb->grf_uoc0_base->CON2 = ((0x01<<2)<<16);
42 usbpdata->phy_status = 0;
46 static void usb20otg_soft_reset(void)
48 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTG_H, true);
49 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTGPHY, true);
50 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTGC, true);
53 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTG_H, false);
54 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTGPHY, false);
55 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBOTGC, false);
59 static void usb20otg_clock_init(void* pdata)
61 struct dwc_otg_platform_data *usbpdata=pdata;
62 struct clk* ahbclk,*phyclk;
64 ahbclk = devm_clk_get(usbpdata->dev, "hclk_usb0");
66 dev_err(usbpdata->dev, "Failed to get hclk_usb0\n");
70 phyclk = devm_clk_get(usbpdata->dev, "clk_usbphy0");
72 dev_err(usbpdata->dev, "Failed to get clk_usbphy0\n");
76 usbpdata->phyclk = phyclk;
77 usbpdata->ahbclk = ahbclk;
80 static void usb20otg_clock_enable(void* pdata, int enable)
82 struct dwc_otg_platform_data *usbpdata=pdata;
85 clk_prepare_enable(usbpdata->ahbclk);
86 clk_prepare_enable(usbpdata->phyclk);
88 clk_disable_unprepare(usbpdata->ahbclk);
89 clk_disable_unprepare(usbpdata->phyclk);
93 static int usb20otg_get_status(int id)
98 case USB_STATUS_BVABLID:
100 ret = control_usb->grf_soc_status2_rk3288->otg_bvalid;
102 case USB_STATUS_DPDM:
104 ret = control_usb->grf_soc_status2_rk3288->otg_linestate;
108 ret = control_usb->grf_soc_status2_rk3288->otg_iddig;
111 ret = control_usb->chip_id;
113 case USB_REMOTE_WAKEUP:
114 ret = control_usb->remote_wakeup;
117 ret = control_usb->usb_irq_wakeup;
126 #ifdef CONFIG_RK_USB_UART
127 static void dwc_otg_uart_mode(void* pdata, int enter_usb_uart_mode)
129 if(1 == enter_usb_uart_mode){
130 /* bypass dm, enter uart mode*/
131 control_usb->grf_uoc0_base->CON3 = (0x00c0 | (0x00c0 << 16));
133 }else if(0 == enter_usb_uart_mode){
135 control_usb->grf_uoc0_base->CON3 = (0x00c0 << 16);
140 static void usb20otg_power_enable(int enable)
142 if(0 == enable){//disable otg_drv power
143 if(gpio_is_valid(control_usb->otg_gpios->gpio))
144 gpio_set_value(control_usb->otg_gpios->gpio, 0);
145 }else if(1 == enable){//enable otg_drv power
146 if(gpio_is_valid(control_usb->otg_gpios->gpio))
147 gpio_set_value(control_usb->otg_gpios->gpio, 1);
152 struct dwc_otg_platform_data usb20otg_pdata_rk3288 = {
157 .hw_init = usb20otg_hw_init,
158 .phy_suspend = usb20otg_phy_suspend,
159 .soft_reset = usb20otg_soft_reset,
160 .clock_init = usb20otg_clock_init,
161 .clock_enable = usb20otg_clock_enable,
162 .get_status = usb20otg_get_status,
163 .power_enable = usb20otg_power_enable,
164 #ifdef CONFIG_RK_USB_UART
165 .dwc_otg_uart_mode = dwc_otg_uart_mode,
167 .bc_detect_cb=usb20otg_battery_charger_detect_cb,
172 #ifdef CONFIG_USB20_HOST
174 static void usb20host_hw_init(void)
176 /* usb phy config init
177 * set common_on = 0, in suspend mode, host1 PLL blocks remain powered.
178 * for RK3288, hsic and other modules use host1 (DWC_OTG) 480M phy clk.
180 control_usb->grf_uoc2_base->CON0 = (1<<16)|0;
182 /* other haredware init,include:
183 * DRV_VBUS GPIO init */
184 if(gpio_is_valid(control_usb->host_gpios->gpio)){
185 if(!gpio_get_value(control_usb->host_gpios->gpio)){
186 gpio_set_value(control_usb->host_gpios->gpio, 1);
191 static void usb20host_phy_suspend(void* pdata, int suspend)
193 struct dwc_otg_platform_data *usbpdata=pdata;
196 // enable soft control
197 control_usb->grf_uoc2_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
199 control_usb->grf_uoc2_base->CON3 = 0x2A|(0x3F<<16);
200 usbpdata->phy_status = 1;
203 control_usb->grf_uoc2_base->CON2 = ((0x01<<2)<<16);
204 usbpdata->phy_status = 0;
208 static void usb20host_soft_reset(void)
210 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1_H, true);
211 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1PHY, true);
212 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1C, true);
215 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1_H, false);
216 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1PHY, false);
217 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST1C, false);
221 static void usb20host_clock_init(void* pdata)
223 struct dwc_otg_platform_data *usbpdata=pdata;
224 struct clk* ahbclk, *phyclk, *phyclk_480m;
226 ahbclk = devm_clk_get(usbpdata->dev, "hclk_usb1");
227 if (IS_ERR(ahbclk)) {
228 dev_err(usbpdata->dev, "Failed to get hclk_usb1\n");
232 phyclk = devm_clk_get(usbpdata->dev, "clk_usbphy1");
233 if (IS_ERR(phyclk)) {
234 dev_err(usbpdata->dev, "Failed to get clk_usbphy1\n");
238 phyclk_480m = devm_clk_get(usbpdata->dev, "usbphy_480m");
239 if (IS_ERR(phyclk_480m)) {
240 dev_err(usbpdata->dev, "Failed to get usbphy_480m\n");
244 usbpdata->phyclk = phyclk;
245 usbpdata->ahbclk = ahbclk;
246 usbpdata->phyclk_480m = phyclk_480m;
249 static void usb20host_clock_enable(void* pdata, int enable)
251 struct dwc_otg_platform_data *usbpdata=pdata;
254 clk_prepare_enable(usbpdata->ahbclk);
255 clk_prepare_enable(usbpdata->phyclk);
257 clk_disable_unprepare(usbpdata->ahbclk);
258 clk_disable_unprepare(usbpdata->phyclk);
262 static int usb20host_get_status(int id)
267 case USB_STATUS_BVABLID:
269 ret = control_usb->grf_soc_status2_rk3288->host1_bvalid;
271 case USB_STATUS_DPDM:
273 ret = control_usb->grf_soc_status2_rk3288->host1_linestate;
277 ret = control_usb->grf_soc_status2_rk3288->host1_iddig;
280 ret = control_usb->chip_id;
282 case USB_REMOTE_WAKEUP:
283 ret = control_usb->remote_wakeup;
286 ret = control_usb->usb_irq_wakeup;
295 static void usb20host_power_enable(int enable)
297 if(0 == enable){//disable host_drv power
298 //do not disable power in default
299 }else if(1 == enable){//enable host_drv power
300 if(gpio_is_valid(control_usb->host_gpios->gpio))
301 gpio_set_value(control_usb->host_gpios->gpio, 1);
306 struct dwc_otg_platform_data usb20host_pdata_rk3288 = {
311 .hw_init = usb20host_hw_init,
312 .phy_suspend = usb20host_phy_suspend,
313 .soft_reset = usb20host_soft_reset,
314 .clock_init = usb20host_clock_init,
315 .clock_enable = usb20host_clock_enable,
316 .get_status = usb20host_get_status,
317 .power_enable = usb20host_power_enable,
322 #ifdef CONFIG_USB_EHCI_RKHSIC
323 static void rk_hsic_hw_init(void)
325 // usb phy config init
326 // hsic phy config init, set hsicphy_txsrtune
327 control_usb->grf_uoc3_base->CON0 = ((0xf<<6)<<16)|(0xf<<6);
329 /* other haredware init
330 * set common_on = 0, in suspend mode, otg/host PLL blocks remain powered
331 * for RK3288, use host1 (DWC_OTG) 480M phy clk
333 control_usb->grf_uoc2_base->CON0 = (1<<16)|0;
335 /* change INCR to INCR16 or INCR8(beats less than 16)
336 * or INCR4(beats less than 8) or SINGLE(beats less than 4)
338 control_usb->grf_uoc4_base->CON0 = 0x00ff00bc;
341 static void rk_hsic_clock_init(void* pdata)
343 /* By default, hsicphy_480m's parent is otg phy 480MHz clk
344 * rk3188 must use host phy 480MHz clk, because if otg bypass
345 * to uart mode, otg phy 480MHz clk will be closed automatically
347 struct rkehci_platform_data *usbpdata=pdata;
348 struct clk *ahbclk, *phyclk480m_hsic, *phyclk12m_hsic;
350 phyclk480m_hsic = devm_clk_get(usbpdata->dev, "hsicphy_480m");
351 if (IS_ERR(phyclk480m_hsic)) {
352 dev_err(usbpdata->dev, "Failed to get hsicphy_480m\n");
356 phyclk12m_hsic = devm_clk_get(usbpdata->dev, "hsicphy_12m");
357 if (IS_ERR(phyclk12m_hsic)) {
358 dev_err(usbpdata->dev, "Failed to get hsicphy_12m\n");
362 ahbclk = devm_clk_get(usbpdata->dev, "hclk_hsic");
363 if (IS_ERR(ahbclk)) {
364 dev_err(usbpdata->dev, "Failed to get hclk_hsic\n");
368 usbpdata->hclk_hsic = ahbclk;
369 usbpdata->hsic_phy_480m = phyclk480m_hsic;
370 usbpdata->hsic_phy_12m = phyclk12m_hsic;
373 static void rk_hsic_clock_enable(void* pdata, int enable)
375 struct rkehci_platform_data *usbpdata=pdata;
377 if(enable == usbpdata->clk_status)
380 clk_prepare_enable(usbpdata->hclk_hsic);
381 clk_prepare_enable(usbpdata->hsic_phy_480m);
382 clk_prepare_enable(usbpdata->hsic_phy_12m);
383 usbpdata->clk_status = 1;
385 clk_disable_unprepare(usbpdata->hclk_hsic);
386 clk_disable_unprepare(usbpdata->hsic_phy_480m);
387 clk_disable_unprepare(usbpdata->hsic_phy_12m);
388 usbpdata->clk_status = 0;
392 static void rk_hsic_soft_reset(void)
394 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSIC, true);
395 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSIC_AUX, true);
396 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSICPHY, true);
399 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSIC, false);
400 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSIC_AUX, false);
401 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_HSICPHY, false);
404 /* HSIC per-port reset */
405 control_usb->grf_uoc3_base->CON0 = ((1<<10)<<16)|(1<<10);
407 control_usb->grf_uoc3_base->CON0 = ((1<<10)<<16)|(0<<10);
411 struct rkehci_platform_data rkhsic_pdata_rk3288 = {
413 .hsic_phy_12m = NULL,
414 .hsic_phy_480m = NULL,
416 .hw_init = rk_hsic_hw_init,
417 .clock_init = rk_hsic_clock_init,
418 .clock_enable = rk_hsic_clock_enable,
419 .soft_reset = rk_hsic_soft_reset,
423 #ifdef CONFIG_USB_EHCI_RK
424 static void rk_ehci_hw_init(void)
426 /* usb phy config init */
428 /* DRV_VBUS GPIO init */
429 if(gpio_is_valid(control_usb->host_gpios->gpio)){
430 if(!gpio_get_value(control_usb->host_gpios->gpio)){
431 gpio_set_value(control_usb->host_gpios->gpio, 1);
436 static void rk_ehci_phy_suspend(void* pdata, int suspend)
438 struct rkehci_platform_data *usbpdata=pdata;
441 // enable soft control
442 control_usb->grf_uoc1_base->CON2 = (0x01<<2)|((0x01<<2)<<16);
444 control_usb->grf_uoc1_base->CON3 = 0x2A|(0x3F<<16);
445 usbpdata->phy_status = 1;
448 control_usb->grf_uoc1_base->CON2 = ((0x01<<2)<<16);
449 usbpdata->phy_status = 0;
453 static void rk_ehci_clock_init(void* pdata)
455 struct rkehci_platform_data *usbpdata=pdata;
456 struct clk* ahbclk,*phyclk;
458 ahbclk = devm_clk_get(usbpdata->dev, "hclk_usb2");
459 if (IS_ERR(ahbclk)) {
460 dev_err(usbpdata->dev, "Failed to get hclk_usb2\n");
464 phyclk = devm_clk_get(usbpdata->dev, "clk_usbphy2");
465 if (IS_ERR(phyclk)) {
466 dev_err(usbpdata->dev, "Failed to get clk_usbphy2\n");
470 usbpdata->phyclk = phyclk;
471 usbpdata->ahbclk = ahbclk;
474 static void rk_ehci_clock_enable(void* pdata, int enable)
476 struct rkehci_platform_data *usbpdata=pdata;
478 if(enable == usbpdata->clk_status)
481 clk_prepare_enable(usbpdata->ahbclk);
482 clk_prepare_enable(usbpdata->phyclk);
483 usbpdata->clk_status = 1;
485 clk_disable_unprepare(usbpdata->ahbclk);
486 clk_disable_unprepare(usbpdata->phyclk);
487 usbpdata->clk_status = 0;
491 static void rk_ehci_soft_reset(void)
493 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0_H, true);
494 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0PHY, true);
495 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0C, true);
496 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USB_HOST0, true);
499 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0_H, false);
500 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0PHY, false);
501 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USBHOST0C, false);
502 rk3288_cru_set_soft_reset(RK3288_SOFT_RST_USB_HOST0, false);
506 static int rk_ehci_get_status(int id)
511 case USB_STATUS_DPDM:
513 ret = control_usb->grf_soc_status2_rk3288->host0_linestate;
516 ret = control_usb->chip_id;
518 case USB_REMOTE_WAKEUP:
519 ret = control_usb->remote_wakeup;
522 ret = control_usb->usb_irq_wakeup;
531 struct rkehci_platform_data rkehci_pdata_rk3288 = {
536 .hw_init = rk_ehci_hw_init,
537 .phy_suspend = rk_ehci_phy_suspend,
538 .clock_init = rk_ehci_clock_init,
539 .clock_enable = rk_ehci_clock_enable,
540 .soft_reset = rk_ehci_soft_reset,
541 .get_status = rk_ehci_get_status,
545 #ifdef CONFIG_USB_OHCI_HCD_RK
546 static void rk_ohci_hw_init(void)
548 /* usb phy config init */
550 /* DRV_VBUS GPIO init */
551 if(gpio_is_valid(control_usb->host_gpios->gpio)){
552 if(!gpio_get_value(control_usb->host_gpios->gpio)){
553 gpio_set_value(control_usb->host_gpios->gpio, 1);
558 static void rk_ohci_clock_init(void* pdata)
560 struct rkehci_platform_data *usbpdata=pdata;
561 struct clk* ahbclk,*phyclk;
563 ahbclk =devm_clk_get(usbpdata->dev, "hclk_usb3");
564 if (IS_ERR(ahbclk)) {
565 dev_err(usbpdata->dev, "Failed to get hclk_usb3\n");
569 phyclk = devm_clk_get(usbpdata->dev, "clk_usbphy3");;
570 if (IS_ERR(phyclk)) {
571 dev_err(usbpdata->dev, "Failed to get clk_usbphy3\n");
575 usbpdata->phyclk = phyclk;
576 usbpdata->ahbclk = ahbclk;
579 static void rk_ohci_clock_enable(void* pdata, int enable)
581 struct rkehci_platform_data *usbpdata=pdata;
583 if(enable == usbpdata->clk_status)
586 clk_prepare_enable(usbpdata->ahbclk);
587 clk_prepare_enable(usbpdata->phyclk);
588 usbpdata->clk_status = 1;
590 clk_disable_unprepare(usbpdata->ahbclk);
591 clk_disable_unprepare(usbpdata->phyclk);
592 usbpdata->clk_status = 0;
596 static void rk_ohci_soft_reset(void)
600 struct rkehci_platform_data rkohci_pdata_rk3288 = {
604 .hw_init = rk_ohci_hw_init,
605 .clock_init = rk_ohci_clock_init,
606 .clock_enable = rk_ohci_clock_enable,
607 .soft_reset = rk_ohci_soft_reset,
611 /*********************************************************************
612 rk3288 usb detections
613 *********************************************************************/
615 #define WAKE_LOCK_TIMEOUT (HZ * 10)
616 inline static void do_wakeup(struct work_struct *work)
618 rk_send_wakeup_key(); // wake up the system
621 static void usb_battery_charger_detect_work(struct work_struct *work)
623 rk_usb_charger_status = usb_battery_charger_detect(0);
625 /********** handler for bvalid irq **********/
626 static irqreturn_t bvalid_irq_handler(int irq, void *dev_id)
629 control_usb->grf_uoc0_base->CON4 = (0x0008 | (0x0008 << 16));
631 #ifdef CONFIG_RK_USB_UART
632 /* usb otg dp/dm switch to usb phy */
633 dwc_otg_uart_mode(NULL, PHY_USB_MODE);
636 if(control_usb->usb_irq_wakeup){
637 wake_lock_timeout(&control_usb->usb_wakelock, WAKE_LOCK_TIMEOUT);
638 schedule_delayed_work(&control_usb->usb_det_wakeup_work, HZ/10);
641 rk_usb_charger_status = USB_BC_TYPE_SDP;
642 schedule_delayed_work(&control_usb->usb_charger_det_work, HZ/10);
647 /***** handler for otg id rise and fall edge *****/
648 static irqreturn_t id_irq_handler(int irq, void *dev_id)
650 unsigned int uoc_con;
653 uoc_con = control_usb->grf_uoc0_base->CON4;
655 if(uoc_con & (1<<5))//id rise
657 control_usb->grf_uoc0_base->CON4 = ((1<<5)|(1<<21)); //clear id rise irq pandding
660 if(uoc_con & (1<<7))//id fall
662 #ifdef CONFIG_RK_USB_UART
663 /* usb otg dp/dm switch to usb phy */
664 dwc_otg_uart_mode(NULL, PHY_USB_MODE);
666 control_usb->grf_uoc0_base->CON4 = ((1<<7)|(1<<23));//clear id fall irq pandding
669 if(control_usb->usb_irq_wakeup){
670 wake_lock_timeout(&control_usb->usb_wakelock, WAKE_LOCK_TIMEOUT);
671 schedule_delayed_work(&control_usb->usb_det_wakeup_work, HZ/10);
677 /***** handler for otg line status change *****/
679 static irqreturn_t line_irq_handler(int irq, void *dev_id)
683 if(control_usb->grf_uoc0_base->CON0 & 1<<15){
684 control_usb->grf_uoc0_base->CON0 = (1<<15 | 1<<31);
687 if(control_usb->grf_uoc1_base->CON0 & 1<<15){
688 control_usb->grf_uoc1_base->CON0 = (1<<15 | 1<<31);
691 if(control_usb->grf_uoc2_base->CON0 & 1<<15){
692 control_usb->grf_uoc2_base->CON0 = (1<<15 | 1<<31);
695 if(control_usb->usb_irq_wakeup){
696 wake_lock_timeout(&control_usb->usb_wakelock, WAKE_LOCK_TIMEOUT);
697 schedule_delayed_work(&control_usb->usb_det_wakeup_work, HZ/10);
703 /************* register usb detection irqs **************/
704 static int otg_irq_detect_init(struct platform_device *pdev)
709 if(control_usb->usb_irq_wakeup){
710 wake_lock_init(&control_usb->usb_wakelock, WAKE_LOCK_SUSPEND, "usb_detect");
711 INIT_DELAYED_WORK(&control_usb->usb_det_wakeup_work, do_wakeup);
714 /*register otg_bvalid irq*/
715 irq = platform_get_irq_byname(pdev, "otg_bvalid");
717 ret = request_irq(irq, bvalid_irq_handler, 0, "otg_bvalid", NULL);
719 dev_err(&pdev->dev, "request_irq %d failed!\n", irq);
722 control_usb->grf_uoc0_base->CON4 = 0x000c000c;// enable bvalid irq
723 if(control_usb->usb_irq_wakeup){
724 enable_irq_wake(irq);
729 /*register otg_id irq*/
730 irq = platform_get_irq_byname(pdev, "otg_id");
732 ret = request_irq(irq, id_irq_handler, 0, "otg_id", NULL);
734 dev_err(&pdev->dev, "request_irq %d failed!\n", irq);
737 control_usb->grf_uoc0_base->CON4 = 0x00f000f0;
738 if(control_usb->usb_irq_wakeup){
739 enable_irq_wake(irq);
744 /*register otg_linestate irq*/
745 irq = platform_get_irq_byname(pdev, "otg_linestate");
747 ret = request_irq(irq, line_irq_handler, 0, "otg_linestate", NULL);
749 dev_err(&pdev->dev, "request_irq %d failed!\n", irq);
752 control_usb->grf_uoc0_base->CON0 = 0xc000c000;
753 if(control_usb->usb_irq_wakeup){
754 enable_irq_wake(irq);
759 /*register host0_linestate irq*/
760 irq = platform_get_irq_byname(pdev, "host0_linestate");
762 ret = request_irq(irq, line_irq_handler, 0, "host0_linestate", NULL);
764 dev_err(&pdev->dev, "request_irq %d failed!\n", irq);
767 control_usb->grf_uoc1_base->CON0 = 0xc000c000;
768 if(control_usb->usb_irq_wakeup){
769 enable_irq_wake(irq);
774 /*register host1_linestate irq*/
775 irq = platform_get_irq_byname(pdev, "host1_linestate");
777 ret = request_irq(irq, line_irq_handler, 0, "host1_linestate", NULL);
779 dev_err(&pdev->dev, "request_irq %d failed!\n", irq);
782 control_usb->grf_uoc2_base->CON0 = 0xc000c000;
783 if(control_usb->usb_irq_wakeup){
784 enable_irq_wake(irq);
792 /********** end of rk3288 usb detections **********/
794 static int usb_grf_ioremap(struct platform_device *pdev)
797 struct resource *res;
798 void *grf_soc_status1;
799 void *grf_soc_status2;
800 void *grf_soc_status19;
801 void *grf_soc_status21;
808 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
810 grf_soc_status1 = devm_ioremap_resource(&pdev->dev, res);
811 if (IS_ERR(grf_soc_status1)){
812 ret = PTR_ERR(grf_soc_status1);
815 control_usb->grf_soc_status1_rk3288 = (pGRF_SOC_STATUS1_RK3288)grf_soc_status1;
817 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
819 grf_soc_status2 = devm_ioremap_resource(&pdev->dev, res);
820 if (IS_ERR(grf_soc_status2)){
821 ret = PTR_ERR(grf_soc_status2);
824 control_usb->grf_soc_status2_rk3288 = (pGRF_SOC_STATUS2_RK3288)grf_soc_status2;
826 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
828 grf_soc_status19 = devm_ioremap_resource(&pdev->dev, res);
829 if (IS_ERR(grf_soc_status19)){
830 ret = PTR_ERR(grf_soc_status19);
833 control_usb->grf_soc_status19_rk3288 = (pGRF_SOC_STATUS19_RK3288)grf_soc_status19;
835 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
837 grf_soc_status21 = devm_ioremap_resource(&pdev->dev, res);
838 if (IS_ERR(grf_soc_status21)){
839 ret = PTR_ERR(grf_soc_status21);
842 control_usb->grf_soc_status21_rk3288 = (pGRF_SOC_STATUS21_RK3288)grf_soc_status21;
844 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
846 grf_uoc0_base = devm_ioremap_resource(&pdev->dev, res);
847 if (IS_ERR(grf_uoc0_base)){
848 ret = PTR_ERR(grf_uoc0_base);
851 control_usb->grf_uoc0_base = (pGRF_UOC0_REG)grf_uoc0_base;
853 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
855 grf_uoc1_base = devm_ioremap_resource(&pdev->dev, res);
856 if (IS_ERR(grf_uoc1_base)){
857 ret = PTR_ERR(grf_uoc1_base);
860 control_usb->grf_uoc1_base = (pGRF_UOC1_REG)grf_uoc1_base;
862 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
864 grf_uoc2_base = devm_ioremap_resource(&pdev->dev, res);
865 if (IS_ERR(grf_uoc2_base)){
866 ret = PTR_ERR(grf_uoc2_base);
869 control_usb->grf_uoc2_base = (pGRF_UOC2_REG)grf_uoc2_base;
871 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
873 grf_uoc3_base = devm_ioremap_resource(&pdev->dev, res);
874 if (IS_ERR(grf_uoc3_base)){
875 ret = PTR_ERR(grf_uoc3_base);
878 control_usb->grf_uoc3_base = (pGRF_UOC3_REG)grf_uoc3_base;
880 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
882 grf_uoc4_base = devm_ioremap_resource(&pdev->dev, res);
883 if (IS_ERR(grf_uoc4_base)){
884 ret = PTR_ERR(grf_uoc4_base);
887 control_usb->grf_uoc4_base = (pGRF_UOC4_REG)grf_uoc4_base;
894 static const struct of_device_id rk_usb_control_id_table[] = {
896 .compatible = "rockchip,rk3288-usb-control",
903 static int rk_usb_control_probe(struct platform_device *pdev)
906 struct device_node *np = pdev->dev.of_node;
909 control_usb = devm_kzalloc(&pdev->dev, sizeof(*control_usb),GFP_KERNEL);
911 dev_err(&pdev->dev, "unable to alloc memory for control usb\n");
916 control_usb->chip_id = RK3288_USB_CTLR;
917 control_usb->remote_wakeup = of_property_read_bool(np,
918 "rockchip,remote_wakeup");
919 control_usb->usb_irq_wakeup = of_property_read_bool(np,
920 "rockchip,usb_irq_wakeup");
922 INIT_DELAYED_WORK(&control_usb->usb_charger_det_work, usb_battery_charger_detect_work);
925 control_usb->host_gpios = devm_kzalloc(&pdev->dev, sizeof(struct gpio), GFP_KERNEL);
926 if(!control_usb->host_gpios){
927 dev_err(&pdev->dev, "unable to alloc memory for host_gpios\n");
932 gpio = of_get_named_gpio(np, "host_drv_gpio", 0);
933 control_usb->host_gpios->gpio = gpio;
935 if(!gpio_is_valid(gpio)){
936 dev_err(&pdev->dev, "invalid host gpio%d\n", gpio);
938 err = devm_gpio_request(&pdev->dev, gpio, "host_drv_gpio");
941 "failed to request GPIO%d for host_drv\n",
946 gpio_direction_output(control_usb->host_gpios->gpio, 1);
949 control_usb->otg_gpios = devm_kzalloc(&pdev->dev, sizeof(struct gpio), GFP_KERNEL);
950 if(!control_usb->otg_gpios){
951 dev_err(&pdev->dev, "unable to alloc memory for otg_gpios\n");
956 gpio = of_get_named_gpio(np, "otg_drv_gpio", 0);
957 control_usb->otg_gpios->gpio = gpio;
959 if(!gpio_is_valid(gpio)){
960 dev_err(&pdev->dev, "invalid otg gpio%d\n", gpio);
962 err = devm_gpio_request(&pdev->dev, gpio, "otg_drv_gpio");
965 "failed to request GPIO%d for otg_drv\n",
970 gpio_direction_output(control_usb->otg_gpios->gpio, 0);
977 static int rk_usb_control_remove(struct platform_device *pdev)
982 static struct platform_driver rk_usb_control_driver = {
983 .probe = rk_usb_control_probe,
984 .remove = rk_usb_control_remove,
986 .name = "rk3288-usb-control",
987 .owner = THIS_MODULE,
988 .of_match_table = of_match_ptr(rk_usb_control_id_table),
994 static const struct of_device_id dwc_otg_control_usb_id_table[] = {
996 .compatible = "rockchip,rk3288-dwc-control-usb",
1003 static int dwc_otg_control_usb_probe(struct platform_device *pdev)
1005 struct clk* hclk_usb_peri, *phyclk_480m, *phyclk480m_parent;
1009 dev_err(&pdev->dev, "unable to alloc memory for control usb\n");
1014 hclk_usb_peri = devm_clk_get(&pdev->dev, "hclk_usb_peri");
1015 if (IS_ERR(hclk_usb_peri)) {
1016 dev_err(&pdev->dev, "Failed to get hclk_usb_peri\n");
1021 control_usb->hclk_usb_peri = hclk_usb_peri;
1022 clk_prepare_enable(hclk_usb_peri);
1024 phyclk480m_parent = devm_clk_get(&pdev->dev, "usbphy2_480m");
1025 if (IS_ERR(phyclk480m_parent)) {
1026 dev_err(&pdev->dev, "Failed to get usbphy2_480m\n");
1030 phyclk_480m = devm_clk_get(&pdev->dev, "usbphy_480m");
1031 if (IS_ERR(phyclk_480m)) {
1032 dev_err(&pdev->dev, "Failed to get usbphy_480m\n");
1036 clk_set_parent(phyclk_480m, phyclk480m_parent);
1038 ret = usb_grf_ioremap(pdev);
1040 dev_err(&pdev->dev, "Failed to ioremap usb grf\n");
1044 #ifdef CONFIG_USB20_OTG
1045 if(usb20otg_get_status(USB_STATUS_BVABLID)){
1046 rk_usb_charger_status = USB_BC_TYPE_SDP;
1047 schedule_delayed_work(&control_usb->usb_charger_det_work, HZ/10);
1051 ret = otg_irq_detect_init(pdev);
1058 clk_disable_unprepare(hclk_usb_peri);
1063 static int dwc_otg_control_usb_remove(struct platform_device *pdev)
1065 clk_disable_unprepare(control_usb->hclk_usb_peri);
1069 static struct platform_driver dwc_otg_control_usb_driver = {
1070 .probe = dwc_otg_control_usb_probe,
1071 .remove = dwc_otg_control_usb_remove,
1073 .name = "rk3288-dwc-control-usb",
1074 .owner = THIS_MODULE,
1075 .of_match_table = of_match_ptr(dwc_otg_control_usb_id_table),
1079 static int __init dwc_otg_control_usb_init(void)
1083 retval = platform_driver_register(&rk_usb_control_driver);
1085 printk(KERN_ERR "%s retval=%d\n", __func__, retval);
1089 retval = platform_driver_register(&dwc_otg_control_usb_driver);
1092 printk(KERN_ERR "%s retval=%d\n", __func__, retval);
1098 subsys_initcall(dwc_otg_control_usb_init);
1100 static void __exit dwc_otg_control_usb_exit(void)
1102 platform_driver_unregister(&rk_usb_control_driver);
1103 platform_driver_unregister(&dwc_otg_control_usb_driver);
1106 module_exit(dwc_otg_control_usb_exit);
1107 MODULE_ALIAS("platform: dwc_control_usb");
1108 MODULE_AUTHOR("RockChip Inc.");
1109 MODULE_DESCRIPTION("RockChip Control Module USB Driver");
1110 MODULE_LICENSE("GPL v2");