/* Probe number of ports if not already provided by DT */ if (!uhci->rh_numports)
uhci->rh_numports = uhci_count_ports(hcd);
/* Set up pointers to to generic functions */
uhci->reset_hc = uhci_generic_reset_hc;
uhci->check_and_reset_hc = uhci_generic_check_and_reset_hc;
/* No special actions need to be taken for the functions below */
uhci->configure_hc = NULL;
uhci->resume_detect_interrupts_are_broken = NULL;
uhci->global_suspend_mode_is_broken = NULL;
/* Reset if the controller isn't already safely quiescent. */
check_and_reset_hc(uhci); return 0;
}
/* * 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.
*/
ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret;
hcd = usb_create_hcd(&uhci_platform_hc_driver, &pdev->dev,
pdev->name); if (!hcd) return -ENOMEM;
uhci = hcd_to_uhci(hcd);
hcd->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); if (IS_ERR(hcd->regs)) {
ret = PTR_ERR(hcd->regs); goto err_rmr;
}
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
uhci->regs = hcd->regs;
/* Grab some things from the device-tree */ if (np) {
u32 num_ports;
/* Get and enable clock if any specified */
uhci->clk = devm_clk_get_optional(&pdev->dev, NULL); if (IS_ERR(uhci->clk)) {
ret = PTR_ERR(uhci->clk); goto err_rmr;
}
ret = clk_prepare_enable(uhci->clk); if (ret) {
dev_err(&pdev->dev, "Error couldn't enable clock (%d)\n", ret); goto err_rmr;
}
ret = platform_get_irq(pdev, 0); if (ret < 0) goto err_clk;
ret = usb_add_hcd(hcd, ret, IRQF_SHARED); if (ret) goto err_clk;
/* Make sure the controller is quiescent and that we're not using it * any more. This is mainly for the benefit of programs which, like kexec, * expect the hardware to be idle: not doing DMA or generating IRQs. * * This routine may be called in a damaged or failing kernel. Hence we * do not acquire the spinlock before shutting down the controller.
*/ staticvoid uhci_hcd_platform_shutdown(struct platform_device *op)
{ struct usb_hcd *hcd = platform_get_drvdata(op);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.