Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.3-rc7 130 lines 2.9 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/driver/usb/host/ehci-w90x900.c 4 * 5 * Copyright (c) 2008 Nuvoton technology corporation. 6 * 7 * Wan ZongShun <mcuos.com@gmail.com> 8 */ 9 10#include <linux/dma-mapping.h> 11#include <linux/io.h> 12#include <linux/kernel.h> 13#include <linux/module.h> 14#include <linux/of.h> 15#include <linux/platform_device.h> 16#include <linux/usb.h> 17#include <linux/usb/hcd.h> 18 19#include "ehci.h" 20 21/* enable phy0 and phy1 for w90p910 */ 22#define ENPHY (0x01<<8) 23#define PHY0_CTR (0xA4) 24#define PHY1_CTR (0xA8) 25 26#define DRIVER_DESC "EHCI w90x900 driver" 27 28static const char hcd_name[] = "ehci-w90x900 "; 29 30static struct hc_driver __read_mostly ehci_w90x900_hc_driver; 31 32static int ehci_w90x900_probe(struct platform_device *pdev) 33{ 34 struct usb_hcd *hcd; 35 struct ehci_hcd *ehci; 36 struct resource *res; 37 int retval = 0, irq; 38 unsigned long val; 39 40 hcd = usb_create_hcd(&ehci_w90x900_hc_driver, 41 &pdev->dev, "w90x900 EHCI"); 42 if (!hcd) { 43 retval = -ENOMEM; 44 goto err1; 45 } 46 47 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 48 hcd->regs = devm_ioremap_resource(&pdev->dev, res); 49 if (IS_ERR(hcd->regs)) { 50 retval = PTR_ERR(hcd->regs); 51 goto err2; 52 } 53 hcd->rsrc_start = res->start; 54 hcd->rsrc_len = resource_size(res); 55 56 ehci = hcd_to_ehci(hcd); 57 ehci->caps = hcd->regs; 58 ehci->regs = hcd->regs + 59 HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); 60 61 /* enable PHY 0,1,the regs only apply to w90p910 62 * 0xA4,0xA8 were offsets of PHY0 and PHY1 controller of 63 * w90p910 IC relative to ehci->regs. 64 */ 65 val = __raw_readl(ehci->regs+PHY0_CTR); 66 val |= ENPHY; 67 __raw_writel(val, ehci->regs+PHY0_CTR); 68 69 val = __raw_readl(ehci->regs+PHY1_CTR); 70 val |= ENPHY; 71 __raw_writel(val, ehci->regs+PHY1_CTR); 72 73 irq = platform_get_irq(pdev, 0); 74 if (irq < 0) { 75 retval = irq; 76 goto err2; 77 } 78 79 retval = usb_add_hcd(hcd, irq, IRQF_SHARED); 80 if (retval != 0) 81 goto err2; 82 83 device_wakeup_enable(hcd->self.controller); 84 return retval; 85err2: 86 usb_put_hcd(hcd); 87err1: 88 return retval; 89} 90 91static int ehci_w90x900_remove(struct platform_device *pdev) 92{ 93 struct usb_hcd *hcd = platform_get_drvdata(pdev); 94 95 usb_remove_hcd(hcd); 96 usb_put_hcd(hcd); 97 98 return 0; 99} 100 101static struct platform_driver ehci_hcd_w90x900_driver = { 102 .probe = ehci_w90x900_probe, 103 .remove = ehci_w90x900_remove, 104 .driver = { 105 .name = "w90x900-ehci", 106 }, 107}; 108 109static int __init ehci_w90X900_init(void) 110{ 111 if (usb_disabled()) 112 return -ENODEV; 113 114 pr_info("%s: " DRIVER_DESC "\n", hcd_name); 115 116 ehci_init_driver(&ehci_w90x900_hc_driver, NULL); 117 return platform_driver_register(&ehci_hcd_w90x900_driver); 118} 119module_init(ehci_w90X900_init); 120 121static void __exit ehci_w90X900_cleanup(void) 122{ 123 platform_driver_unregister(&ehci_hcd_w90x900_driver); 124} 125module_exit(ehci_w90X900_cleanup); 126 127MODULE_DESCRIPTION(DRIVER_DESC); 128MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>"); 129MODULE_ALIAS("platform:w90p910-ehci"); 130MODULE_LICENSE("GPL v2");