int xhci_plat_probe之见解
来源:互联网 发布:全国软件开发考试报名 编辑:程序博客网 时间:2024/05/21 17:35
/*
* 在xhci_plat_probe里,两个重量级的函数是usb_create_hcd和usb_add_hcd,
* 用了创建usb_hcd和将usb_hcd添加到系统中。
* 在这里,有两个usb_hcd,一个是main_hcd(或者primary_hcd),一个是shared_hcd。
* hc_driver中的reset函数对应为xhci_plat_setup,其调用的xhci_gen_setup有如下一段。
* 原来xhci为了向下兼容,集成了两个roothub,一个对应usb2.0(main_hcd),一个对应usb3.0及以上(shared_hcd)。
* 怎么区分usb2.0的端口和usb3.0的端口呢?xhci extended capabilities里有:7.2 xHCI Supported Protocol Capability
* 对应的代码在xhci_mem_init里,请读者自行分析.
*/
static int xhci_plat_probe(struct platform_device *pdev)
{
const struct hc_driver*driver;
struct xhci_hcd*xhci;
struct resource *res;
struct usb_hcd*hcd;
int ret;
int irq;
if (usb_disabled())
return -ENODEV;
driver = &xhci_plat_xhci_driver;
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return -ENODEV;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
if (!hcd)
return -ENOMEM;
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
driver->description)) {
dev_dbg(&pdev->dev, "controller already in use\n");
ret = -EBUSY;
goto put_hcd;
}
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
if (!hcd->regs) {
dev_dbg(&pdev->dev, "error mapping memory\n");
ret = -EFAULT;
goto release_mem_region;
}
ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (ret)
goto unmap_registers;
/* USB 2.0 roothub is stored in the platform_device now. */
hcd = dev_get_drvdata(&pdev->dev);
xhci = hcd_to_xhci(hcd);
xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) {
ret = -ENOMEM;
goto dealloc_usb2_hcd;
}
/*
* Set the xHCI pointer before xhci_plat_setup() (aka hcd_driver.reset)
* is called by usb_add_hcd().
*/
*((struct xhci_hcd **) xhci->shared_hcd->hcd_priv) = xhci;
ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
if (ret)
goto put_usb3_hcd;
return 0;
put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
dealloc_usb2_hcd:
usb_remove_hcd(hcd);
unmap_registers:
iounmap(hcd->regs);
release_mem_region:
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
put_hcd:
usb_put_hcd(hcd);
return ret;
}
* 在xhci_plat_probe里,两个重量级的函数是usb_create_hcd和usb_add_hcd,
* 用了创建usb_hcd和将usb_hcd添加到系统中。
* 在这里,有两个usb_hcd,一个是main_hcd(或者primary_hcd),一个是shared_hcd。
* hc_driver中的reset函数对应为xhci_plat_setup,其调用的xhci_gen_setup有如下一段。
* 原来xhci为了向下兼容,集成了两个roothub,一个对应usb2.0(main_hcd),一个对应usb3.0及以上(shared_hcd)。
* 怎么区分usb2.0的端口和usb3.0的端口呢?xhci extended capabilities里有:7.2 xHCI Supported Protocol Capability
* 对应的代码在xhci_mem_init里,请读者自行分析.
*/
static int xhci_plat_probe(struct platform_device *pdev)
{
const struct hc_driver*driver;
struct xhci_hcd*xhci;
struct resource *res;
struct usb_hcd*hcd;
int ret;
int irq;
if (usb_disabled())
return -ENODEV;
driver = &xhci_plat_xhci_driver;
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return -ENODEV;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
if (!hcd)
return -ENOMEM;
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
driver->description)) {
dev_dbg(&pdev->dev, "controller already in use\n");
ret = -EBUSY;
goto put_hcd;
}
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
if (!hcd->regs) {
dev_dbg(&pdev->dev, "error mapping memory\n");
ret = -EFAULT;
goto release_mem_region;
}
ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (ret)
goto unmap_registers;
/* USB 2.0 roothub is stored in the platform_device now. */
hcd = dev_get_drvdata(&pdev->dev);
xhci = hcd_to_xhci(hcd);
xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) {
ret = -ENOMEM;
goto dealloc_usb2_hcd;
}
/*
* Set the xHCI pointer before xhci_plat_setup() (aka hcd_driver.reset)
* is called by usb_add_hcd().
*/
*((struct xhci_hcd **) xhci->shared_hcd->hcd_priv) = xhci;
ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
if (ret)
goto put_usb3_hcd;
return 0;
put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);
dealloc_usb2_hcd:
usb_remove_hcd(hcd);
unmap_registers:
iounmap(hcd->regs);
release_mem_region:
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
put_hcd:
usb_put_hcd(hcd);
return ret;
}
阅读全文
0 0
- int xhci_plat_probe之见解
- 对int整型用法的一点见解
- URL 之见解
- android intent 之见解
- extjs 我之见解
- 我之见解字符串
- javaee之jsp见解
- 人与鱼之见解
- Web 3.0 我之见解
- linux之我的见解
- KMP算法之简单见解
- java内部类之见解
- Android之Activity个人见解
- 性能优化之个人见解
- 面向对象之个人见解
- PHP缓存之我见解
- NSfileManager 之我的见解
- ssl/tls之个人见解
- 简单电路实践——电路与二进制运算
- new对象与Spring对bean的初始化的差别
- 自动化报警的思路
- 极大似然估计
- day-14
- int xhci_plat_probe之见解
- hibernate框架多对多-级联保存(十八)
- WdatePicker选择后事件
- mysql基本sql语句大全(基础用语篇)
- 水仙花数量
- 70.Climbing Stairs
- 有关回文判断
- 初识汇编整体
- 迭代法