Version:  2.0.40 2.2.26 2.4.37 2.6.39 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15

Linux/drivers/usb/chipidea/ci_hdrc_msm.c

  1 /* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
  2  *
  3  * This program is free software; you can redistribute it and/or modify
  4  * it under the terms of the GNU General Public License version 2 and
  5  * only version 2 as published by the Free Software Foundation.
  6  */
  7 
  8 #include <linux/module.h>
  9 #include <linux/platform_device.h>
 10 #include <linux/pm_runtime.h>
 11 #include <linux/usb/msm_hsusb_hw.h>
 12 #include <linux/usb/ulpi.h>
 13 #include <linux/usb/gadget.h>
 14 #include <linux/usb/chipidea.h>
 15 
 16 #include "ci.h"
 17 
 18 #define MSM_USB_BASE    (ci->hw_bank.abs)
 19 
 20 static void ci_hdrc_msm_notify_event(struct ci_hdrc *ci, unsigned event)
 21 {
 22         struct device *dev = ci->gadget.dev.parent;
 23         int val;
 24 
 25         switch (event) {
 26         case CI_HDRC_CONTROLLER_RESET_EVENT:
 27                 dev_dbg(dev, "CI_HDRC_CONTROLLER_RESET_EVENT received\n");
 28                 writel(0, USB_AHBBURST);
 29                 writel(0, USB_AHBMODE);
 30                 break;
 31         case CI_HDRC_CONTROLLER_STOPPED_EVENT:
 32                 dev_dbg(dev, "CI_HDRC_CONTROLLER_STOPPED_EVENT received\n");
 33                 /*
 34                  * Put the transceiver in non-driving mode. Otherwise host
 35                  * may not detect soft-disconnection.
 36                  */
 37                 val = usb_phy_io_read(ci->transceiver, ULPI_FUNC_CTRL);
 38                 val &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
 39                 val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
 40                 usb_phy_io_write(ci->transceiver, val, ULPI_FUNC_CTRL);
 41                 break;
 42         default:
 43                 dev_dbg(dev, "unknown ci_hdrc event\n");
 44                 break;
 45         }
 46 }
 47 
 48 static struct ci_hdrc_platform_data ci_hdrc_msm_platdata = {
 49         .name                   = "ci_hdrc_msm",
 50         .flags                  = CI_HDRC_REGS_SHARED |
 51                                   CI_HDRC_REQUIRE_TRANSCEIVER |
 52                                   CI_HDRC_DISABLE_STREAMING,
 53 
 54         .notify_event           = ci_hdrc_msm_notify_event,
 55 };
 56 
 57 static int ci_hdrc_msm_probe(struct platform_device *pdev)
 58 {
 59         struct platform_device *plat_ci;
 60 
 61         dev_dbg(&pdev->dev, "ci_hdrc_msm_probe\n");
 62 
 63         plat_ci = ci_hdrc_add_device(&pdev->dev,
 64                                 pdev->resource, pdev->num_resources,
 65                                 &ci_hdrc_msm_platdata);
 66         if (IS_ERR(plat_ci)) {
 67                 dev_err(&pdev->dev, "ci_hdrc_add_device failed!\n");
 68                 return PTR_ERR(plat_ci);
 69         }
 70 
 71         platform_set_drvdata(pdev, plat_ci);
 72 
 73         pm_runtime_no_callbacks(&pdev->dev);
 74         pm_runtime_enable(&pdev->dev);
 75 
 76         return 0;
 77 }
 78 
 79 static int ci_hdrc_msm_remove(struct platform_device *pdev)
 80 {
 81         struct platform_device *plat_ci = platform_get_drvdata(pdev);
 82 
 83         pm_runtime_disable(&pdev->dev);
 84         ci_hdrc_remove_device(plat_ci);
 85 
 86         return 0;
 87 }
 88 
 89 static struct platform_driver ci_hdrc_msm_driver = {
 90         .probe = ci_hdrc_msm_probe,
 91         .remove = ci_hdrc_msm_remove,
 92         .driver = { .name = "msm_hsusb", },
 93 };
 94 
 95 module_platform_driver(ci_hdrc_msm_driver);
 96 
 97 MODULE_ALIAS("platform:msm_hsusb");
 98 MODULE_ALIAS("platform:ci13xxx_msm");
 99 MODULE_LICENSE("GPL v2");
100 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us