cregit-Linux how code gets into the kernel

Release 4.7 drivers/usb/host/ehci-ppc-of.c

Directory: drivers/usb/host
/*
 * EHCI HCD (Host Controller Driver) for USB.
 *
 * Bus Glue for PPC On-Chip EHCI driver on the of_platform bus
 * Tested on AMCC PPC 440EPx
 *
 * Valentine Barshak <vbarshak@ru.mvista.com>
 *
 * Based on "ehci-ppc-soc.c" by Stefan Roese <sr@denx.de>
 * and "ohci-ppc-of.c" by Sylvain Munaut <tnt@246tNt.com>
 *
 * This file is licenced under the GPL.
 */

#include <linux/err.h>
#include <linux/signal.h>

#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>



static const struct hc_driver ehci_ppc_of_hc_driver = {
	.description		= hcd_name,
	.product_desc		= "OF EHCI",
	.hcd_priv_size		= sizeof(struct ehci_hcd),

	/*
         * generic hardware linkage
         */
	.irq			= ehci_irq,
	.flags			= HCD_MEMORY | HCD_USB2 | HCD_BH,

	/*
         * basic lifecycle operations
         */
	.reset			= ehci_setup,
	.start			= ehci_run,
	.stop			= ehci_stop,
	.shutdown		= ehci_shutdown,

	/*
         * managing i/o requests and associated device resources
         */
	.urb_enqueue		= ehci_urb_enqueue,
	.urb_dequeue		= ehci_urb_dequeue,
	.endpoint_disable	= ehci_endpoint_disable,
	.endpoint_reset		= ehci_endpoint_reset,

	/*
         * scheduling support
         */
	.get_frame_number	= ehci_get_frame,

	/*
         * root hub support
         */
	.hub_status_data	= ehci_hub_status_data,
	.hub_control		= ehci_hub_control,
#ifdef	CONFIG_PM
	.bus_suspend		= ehci_bus_suspend,
	.bus_resume		= ehci_bus_resume,
#endif
	.relinquish_port	= ehci_relinquish_port,
	.port_handed_over	= ehci_port_handed_over,

	.clear_tt_buffer_complete	= ehci_clear_tt_buffer_complete,
};


/*
 * 440EPx Errata USBH_3
 * Fix: Enable Break Memory Transfer (BMT) in INSNREG3
 */

#define PPC440EPX_EHCI0_INSREG_BMT	(0x1 << 0)

static int ppc44x_enable_bmt(struct device_node *dn) { __iomem u32 *insreg_virt; insreg_virt = of_iomap(dn, 1); if (!insreg_virt) return -EINVAL; out_be32(insreg_virt + 3, PPC440EPX_EHCI0_INSREG_BMT); iounmap(insreg_virt); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
valentine barshakvalentine barshak51100.00%1100.00%
Total51100.00%1100.00%


static int ehci_hcd_ppc_of_probe(struct platform_device *op) { struct device_node *dn = op->dev.of_node; struct usb_hcd *hcd; struct ehci_hcd *ehci = NULL; struct resource res; int irq; int rv; struct device_node *np; if (usb_disabled()) return -ENODEV; dev_dbg(&op->dev, "initializing PPC-OF USB Controller\n"); rv = of_address_to_resource(dn, 0, &res); if (rv) return rv; hcd = usb_create_hcd(&ehci_ppc_of_hc_driver, &op->dev, "PPC-OF USB"); if (!hcd) return -ENOMEM; hcd->rsrc_start = res.start; hcd->rsrc_len = resource_size(&res); irq = irq_of_parse_and_map(dn, 0); if (irq == NO_IRQ) { dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", __FILE__); rv = -EBUSY; goto err_irq; } hcd->regs = devm_ioremap_resource(&op->dev, &res); if (IS_ERR(hcd->regs)) { rv = PTR_ERR(hcd->regs); goto err_ioremap; } ehci = hcd_to_ehci(hcd); np = of_find_compatible_node(NULL, NULL, "ibm,usb-ohci-440epx"); if (np != NULL) { /* claim we really affected by usb23 erratum */ if (!of_address_to_resource(np, 0, &res)) ehci->ohci_hcctrl_reg = devm_ioremap(&op->dev, res.start + OHCI_HCCTRL_OFFSET, OHCI_HCCTRL_LEN); else pr_debug("%s: no ohci offset in fdt\n", __FILE__); if (!ehci->ohci_hcctrl_reg) { pr_debug("%s: ioremap for ohci hcctrl failed\n", __FILE__); } else { ehci->has_amcc_usb23 = 1; } } if (of_get_property(dn, "big-endian", NULL)) { ehci->big_endian_mmio = 1; ehci->big_endian_desc = 1; } if (of_get_property(dn, "big-endian-regs", NULL)) ehci->big_endian_mmio = 1; if (of_get_property(dn, "big-endian-desc", NULL)) ehci->big_endian_desc = 1; ehci->caps = hcd->regs; if (of_device_is_compatible(dn, "ibm,usb-ehci-440epx")) { rv = ppc44x_enable_bmt(dn); ehci_dbg(ehci, "Break Memory Transfer (BMT) is %senabled!\n", rv ? "NOT ": ""); } rv = usb_add_hcd(hcd, irq, 0); if (rv) goto err_ioremap; device_wakeup_enable(hcd->self.controller); return 0; err_ioremap: irq_dispose_mapping(irq); err_irq: usb_put_hcd(hcd); return rv; }

Contributors

PersonTokensPropCommitsCommitProp
valentine barshakvalentine barshak30468.78%19.09%
vitaly bordugvitaly bordug8318.78%19.09%
julia lawalljulia lawall122.71%19.09%
joe perchesjoe perches122.71%218.18%
thierry redingthierry reding102.26%19.09%
peter chenpeter chen92.04%19.09%
jingoo hanjingoo han61.36%19.09%
grant likelygrant likely40.90%218.18%
dan carpenterdan carpenter20.45%19.09%
Total442100.00%11100.00%


static int ehci_hcd_ppc_of_remove(struct platform_device *op) { struct usb_hcd *hcd = platform_get_drvdata(op); struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct device_node *np; struct resource res; dev_dbg(&op->dev, "stopping PPC-OF USB Controller\n"); usb_remove_hcd(hcd); irq_dispose_mapping(hcd->irq); /* use request_mem_region to test if the ohci driver is loaded. if so * ensure the ohci core is operational. */ if (ehci->has_amcc_usb23) { np = of_find_compatible_node(NULL, NULL, "ibm,usb-ohci-440epx"); if (np != NULL) { if (!of_address_to_resource(np, 0, &res)) if (!request_mem_region(res.start, 0x4, hcd_name)) set_ohci_hcfs(ehci, 1); else release_mem_region(res.start, 0x4); else pr_debug("%s: no ohci offset in fdt\n", __FILE__); of_node_put(np); } } usb_put_hcd(hcd); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
vitaly bordugvitaly bordug10265.81%120.00%
valentine barshakvalentine barshak4931.61%120.00%
joe perchesjoe perches21.29%120.00%
jingoo hanjingoo han10.65%120.00%
grant likelygrant likely10.65%120.00%
Total155100.00%5100.00%

static const struct of_device_id ehci_hcd_ppc_of_match[] = { { .compatible = "usb-ehci", }, {}, }; MODULE_DEVICE_TABLE(of, ehci_hcd_ppc_of_match); static struct platform_driver ehci_hcd_ppc_of_driver = { .probe = ehci_hcd_ppc_of_probe, .remove = ehci_hcd_ppc_of_remove, .shutdown = usb_hcd_platform_shutdown, .driver = { .name = "ppc-of-ehci", .of_match_table = ehci_hcd_ppc_of_match, }, };

Overall Contributors

PersonTokensPropCommitsCommitProp
valentine barshakvalentine barshak58367.40%14.35%
vitaly bordugvitaly bordug18521.39%14.35%
alan sternalan stern212.43%521.74%
joe perchesjoe perches141.62%28.70%
thierry redingthierry reding131.50%14.35%
julia lawalljulia lawall121.39%14.35%
peter chenpeter chen91.04%14.35%
grant likelygrant likely91.04%417.39%
jingoo hanjingoo han70.81%28.70%
rob herringrob herring60.69%14.35%
dan carpenterdan carpenter20.23%14.35%
greg kroah-hartmangreg kroah-hartman20.23%14.35%
roger quadrosroger quadros10.12%14.35%
marton nemethmarton nemeth10.12%14.35%
Total865100.00%23100.00%
Directory: drivers/usb/host
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}