cregit-Linux how code gets into the kernel

Release 4.11 drivers/usb/host/ohci-spear.c

Directory: drivers/usb/host
/*
* OHCI HCD (Host Controller Driver) for USB.
*
* Copyright (C) 2010 ST Microelectronics.
* Deepak Sikri<deepak.sikri@st.com>
*
* Based on various ohci-*.c drivers
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/

#include <linux/clk.h>
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/signal.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>

#include "ohci.h"


#define DRIVER_DESC "OHCI SPEAr driver"


static const char hcd_name[] = "SPEAr-ohci";

struct spear_ohci {
	
struct clk *clk;
};


#define to_spear_ohci(hcd)     (struct spear_ohci *)(hcd_to_ohci(hcd)->priv)


static struct hc_driver __read_mostly ohci_spear_hc_driver;


static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) { const struct hc_driver *driver = &ohci_spear_hc_driver; struct ohci_hcd *ohci; struct usb_hcd *hcd = NULL; struct clk *usbh_clk; struct spear_ohci *sohci_p; struct resource *res; int retval, irq; irq = platform_get_irq(pdev, 0); if (irq < 0) { retval = irq; goto fail; } /* * Right now device-tree probed devices don't get dma_mask set. * Since shared usb code relies on it, set it here for now. * Once we have dma capability bindings this can go away. */ retval = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (retval) goto fail; usbh_clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(usbh_clk)) { dev_err(&pdev->dev, "Error getting interface clock\n"); retval = PTR_ERR(usbh_clk); goto fail; } hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) { retval = -ENOMEM; goto fail; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); hcd->regs = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(hcd->regs)) { retval = PTR_ERR(hcd->regs); goto err_put_hcd; } hcd->rsrc_start = pdev->resource[0].start; hcd->rsrc_len = resource_size(res); sohci_p = to_spear_ohci(hcd); sohci_p->clk = usbh_clk; clk_prepare_enable(sohci_p->clk); ohci = hcd_to_ohci(hcd); retval = usb_add_hcd(hcd, platform_get_irq(pdev, 0), 0); if (retval == 0) { device_wakeup_enable(hcd->self.controller); return retval; } clk_disable_unprepare(sohci_p->clk); err_put_hcd: usb_put_hcd(hcd); fail: dev_err(&pdev->dev, "init fail, %d\n", retval); return retval; }

Contributors

PersonTokensPropCommitsCommitProp
Deepak Sikri23669.62%18.33%
Varka Bhadram226.49%18.33%
Manjunath Goudar195.60%18.33%
Russell King123.54%216.67%
Viresh Kumar123.54%18.33%
Peter Chen113.24%18.33%
Jingoo Han102.95%18.33%
Stephen Warren72.06%18.33%
Amardeep Rai51.47%18.33%
Stefan Roese41.18%18.33%
Yong Zhang10.29%18.33%
Total339100.00%12100.00%


static int spear_ohci_hcd_drv_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct spear_ohci *sohci_p = to_spear_ohci(hcd); usb_remove_hcd(hcd); if (sohci_p->clk) clk_disable_unprepare(sohci_p->clk); usb_put_hcd(hcd); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Deepak Sikri5189.47%150.00%
Manjunath Goudar610.53%150.00%
Total57100.00%2100.00%

#if defined(CONFIG_PM)
static int spear_ohci_hcd_drv_suspend(struct platform_device *pdev, pm_message_t message) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct spear_ohci *sohci_p = to_spear_ohci(hcd); bool do_wakeup = device_may_wakeup(&pdev->dev); int ret; if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; ret = ohci_suspend(hcd, do_wakeup); if (ret) return ret; clk_disable_unprepare(sohci_p->clk); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Deepak Sikri6864.15%133.33%
Majunath Goudar3331.13%133.33%
Manjunath Goudar54.72%133.33%
Total106100.00%3100.00%


static int spear_ohci_hcd_drv_resume(struct platform_device *dev) { struct usb_hcd *hcd = platform_get_drvdata(dev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct spear_ohci *sohci_p = to_spear_ohci(hcd); if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; clk_prepare_enable(sohci_p->clk); ohci_resume(hcd, false); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Deepak Sikri7290.00%133.33%
Manjunath Goudar56.25%133.33%
Florian Fainelli33.75%133.33%
Total80100.00%3100.00%

#endif static const struct of_device_id spear_ohci_id_table[] = { { .compatible = "st,spear600-ohci", }, { }, }; MODULE_DEVICE_TABLE(of, spear_ohci_id_table); /* Driver definition to register with the platform bus */ static struct platform_driver spear_ohci_hcd_driver = { .probe = spear_ohci_hcd_drv_probe, .remove = spear_ohci_hcd_drv_remove, #ifdef CONFIG_PM .suspend = spear_ohci_hcd_drv_suspend, .resume = spear_ohci_hcd_drv_resume, #endif .driver = { .name = "spear-ohci", .of_match_table = spear_ohci_id_table, }, }; static const struct ohci_driver_overrides spear_overrides __initconst = { .extra_priv_size = sizeof(struct spear_ohci), };
static int __init ohci_spear_init(void) { if (usb_disabled()) return -ENODEV; pr_info("%s: " DRIVER_DESC "\n", hcd_name); ohci_init_driver(&ohci_spear_hc_driver, &spear_overrides); return platform_driver_register(&spear_ohci_hcd_driver); }

Contributors

PersonTokensPropCommitsCommitProp
Manjunath Goudar43100.00%1100.00%
Total43100.00%1100.00%

module_init(ohci_spear_init);
static void __exit ohci_spear_cleanup(void) { platform_driver_unregister(&spear_ohci_hcd_driver); }

Contributors

PersonTokensPropCommitsCommitProp
Manjunath Goudar15100.00%1100.00%
Total15100.00%1100.00%

module_exit(ohci_spear_cleanup); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_AUTHOR("Deepak Sikri"); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("platform:spear-ohci");

Overall Contributors

PersonTokensPropCommitsCommitProp
Deepak Sikri51160.98%16.25%
Manjunath Goudar17420.76%16.25%
Majunath Goudar333.94%16.25%
Stefan Roese293.46%16.25%
Varka Bhadram222.63%16.25%
Viresh Kumar121.43%16.25%
Russell King121.43%212.50%
Peter Chen111.31%16.25%
Jingoo Han111.31%212.50%
Luis de Bethencourt70.84%16.25%
Stephen Warren70.84%16.25%
Amardeep Rai50.60%16.25%
Florian Fainelli30.36%16.25%
Yong Zhang10.12%16.25%
Bill Pemberton0.00%00.00%
Total838100.00%16100.00%
Directory: drivers/usb/host
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.