Deleted Added
sdiff udiff text old ( 227849 ) new ( 228483 )
full compact
1/*-
2 * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
3 * All rights reserved.
4 *
5 * Developed by Semihalf.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 20 unchanged lines hidden (view full) ---

29 * SUCH DAMAGE.
30 */
31
32/*
33 * FDT attachment driver for the USB Enhanced Host Controller.
34 */
35
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD: head/sys/dev/usb/controller/ehci_mv.c 227849 2011-11-22 21:56:55Z hselasky $");
38
39#include "opt_bus.h"
40
41#include <sys/stdint.h>
42#include <sys/stddef.h>
43#include <sys/param.h>
44#include <sys/queue.h>
45#include <sys/types.h>

--- 30 unchanged lines hidden (view full) ---

76#include <arm/mv/mvreg.h>
77#include <arm/mv/mvvar.h>
78
79#define EHCI_VENDORID_MRVL 0x1286
80#define EHCI_HC_DEVSTR "Marvell Integrated USB 2.0 controller"
81
82static device_attach_t mv_ehci_attach;
83static device_detach_t mv_ehci_detach;
84static device_shutdown_t mv_ehci_shutdown;
85static device_suspend_t mv_ehci_suspend;
86static device_resume_t mv_ehci_resume;
87
88static int err_intr(void *arg);
89
90static struct resource *irq_err;
91static void *ih_err;
92
93/* EHCI HC regs start at this offset within USB range */
94#define MV_USB_HOST_OFST 0x0100
95
96#define USB_BRIDGE_INTR_CAUSE 0x210
97#define USB_BRIDGE_INTR_MASK 0x214
98#define USB_BRIDGE_ERR_ADDR 0x21C
99
100#define MV_USB_ADDR_DECODE_ERR (1 << 0)
101#define MV_USB_HOST_UNDERFLOW (1 << 1)
102#define MV_USB_HOST_OVERFLOW (1 << 2)
103#define MV_USB_DEVICE_UNDERFLOW (1 << 3)
104
105static int
106mv_ehci_suspend(device_t self)
107{
108 ehci_softc_t *sc = device_get_softc(self);
109 int err;
110
111 err = bus_generic_suspend(self);
112 if (err)
113 return (err);
114 ehci_suspend(sc);
115 return (0);
116}
117
118static int
119mv_ehci_resume(device_t self)
120{
121 ehci_softc_t *sc = device_get_softc(self);
122
123 ehci_resume(sc);
124
125 bus_generic_resume(self);
126
127 return (0);
128}
129
130static int
131mv_ehci_shutdown(device_t self)
132{
133 ehci_softc_t *sc = device_get_softc(self);
134 int err;
135
136 err = bus_generic_shutdown(self);
137 if (err)
138 return (err);
139 ehci_shutdown(sc);
140
141 return (0);
142}
143
144static int
145mv_ehci_probe(device_t self)
146{
147
148 if (!ofw_bus_is_compatible(self, "mrvl,usb-ehci"))
149 return (ENXIO);
150
151 device_set_desc(self, EHCI_HC_DEVSTR);
152

--- 214 unchanged lines hidden (view full) ---

367 return (FILTER_HANDLED);
368}
369
370static device_method_t ehci_methods[] = {
371 /* Device interface */
372 DEVMETHOD(device_probe, mv_ehci_probe),
373 DEVMETHOD(device_attach, mv_ehci_attach),
374 DEVMETHOD(device_detach, mv_ehci_detach),
375 DEVMETHOD(device_suspend, mv_ehci_suspend),
376 DEVMETHOD(device_resume, mv_ehci_resume),
377 DEVMETHOD(device_shutdown, mv_ehci_shutdown),
378
379 DEVMETHOD_END
380};
381
382static driver_t ehci_driver = {
383 "ehci",
384 ehci_methods,
385 sizeof(ehci_softc_t),
386};
387
388static devclass_t ehci_devclass;
389
390DRIVER_MODULE(ehci, simplebus, ehci_driver, ehci_devclass, 0, 0);
391MODULE_DEPEND(ehci, usb, 1, 1, 1);