Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/uart/uart_bus_acpi.c
Show All 21 Lines | |||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include "opt_acpi.h" | |||||
imp: not needed. | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/conf.h> | #include <sys/conf.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/module.h> | #include <sys/module.h> | ||||
#include <machine/bus.h> | #include <machine/bus.h> | ||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <machine/resource.h> | #include <machine/resource.h> | ||||
#include <isa/isavar.h> | |||||
#include <dev/uart/uart.h> | #include <dev/uart/uart.h> | ||||
#include <dev/uart/uart_bus.h> | #include <dev/uart/uart_bus.h> | ||||
#include <dev/uart/uart_cpu_acpi.h> | #include <dev/uart/uart_cpu_acpi.h> | ||||
#ifdef __aarch64__ | |||||
#include <contrib/dev/acpica/include/acpi.h> | #include <contrib/dev/acpica/include/acpi.h> | ||||
Not Done Inline Actionsnot needed. imp: not needed.
https://reviews.freebsd.org/P209 for the proper fix | |||||
#include <contrib/dev/acpica/include/accommon.h> | #include <contrib/dev/acpica/include/accommon.h> | ||||
#include <dev/acpica/acpivar.h> | #include <dev/acpica/acpivar.h> | ||||
#endif | |||||
static int uart_acpi_probe(device_t dev); | static int uart_acpi_probe(device_t dev); | ||||
static device_method_t uart_acpi_methods[] = { | static device_method_t uart_acpi_methods[] = { | ||||
/* Device interface */ | /* Device interface */ | ||||
DEVMETHOD(device_probe, uart_acpi_probe), | DEVMETHOD(device_probe, uart_acpi_probe), | ||||
DEVMETHOD(device_attach, uart_bus_attach), | DEVMETHOD(device_attach, uart_bus_attach), | ||||
DEVMETHOD(device_detach, uart_bus_detach), | DEVMETHOD(device_detach, uart_bus_detach), | ||||
DEVMETHOD(device_resume, uart_bus_resume), | DEVMETHOD(device_resume, uart_bus_resume), | ||||
{ 0, 0 } | { 0, 0 } | ||||
}; | }; | ||||
static driver_t uart_acpi_driver = { | static driver_t uart_acpi_driver = { | ||||
uart_driver_name, | uart_driver_name, | ||||
uart_acpi_methods, | uart_acpi_methods, | ||||
sizeof(struct uart_softc), | sizeof(struct uart_softc), | ||||
}; | }; | ||||
#if defined(__i386__) || defined(__amd64__) | static struct acpi_uart_compat_data * | ||||
static struct isa_pnp_id acpi_ns8250_ids[] = { | |||||
{0x0005d041, "Standard PC COM port"}, /* PNP0500 */ | |||||
{0x0105d041, "16550A-compatible COM port"}, /* PNP0501 */ | |||||
{0x0205d041, "Multiport serial device (non-intelligent 16550)"}, /* PNP0502 */ | |||||
{0x1005d041, "Generic IRDA-compatible device"}, /* PNP0510 */ | |||||
{0x1105d041, "Generic IRDA-compatible device"}, /* PNP0511 */ | |||||
{0x04f0235c, "Wacom Tablet PC Screen"}, /* WACF004 */ | |||||
{0x0ef0235c, "Wacom Tablet PC Screen 00e"}, /* WACF00e */ | |||||
{0xe502aa1a, "Wacom Tablet at FuS Lifebook T"}, /* FUJ02E5 */ | |||||
{0} | |||||
}; | |||||
#endif | |||||
#ifdef __aarch64__ | |||||
static struct uart_class * | |||||
uart_acpi_find_device(device_t dev) | uart_acpi_find_device(device_t dev) | ||||
{ | { | ||||
struct acpi_uart_compat_data **cd; | struct acpi_uart_compat_data **cd, *cd_it; | ||||
ACPI_HANDLE h; | ACPI_HANDLE h; | ||||
if ((h = acpi_get_handle(dev)) == NULL) | if ((h = acpi_get_handle(dev)) == NULL) | ||||
return (NULL); | return (NULL); | ||||
SET_FOREACH(cd, uart_acpi_class_and_device_set) { | SET_FOREACH(cd, uart_acpi_class_and_device_set) { | ||||
if (acpi_MatchHid(h, (*cd)->hid)) { | for (cd_it = *cd; cd_it->cd_hid != NULL; cd_it++) { | ||||
return ((*cd)->clas); | if (acpi_MatchHid(h, cd_it->cd_hid)) | ||||
return (cd_it); | |||||
Done Inline ActionsDebug no longer needed? jhb: Debug no longer needed? | |||||
} | } | ||||
} | } | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
#endif | |||||
static int | static int | ||||
uart_acpi_probe(device_t dev) | uart_acpi_probe(device_t dev) | ||||
{ | { | ||||
struct uart_softc *sc; | struct uart_softc *sc; | ||||
struct acpi_uart_compat_data *cd; | |||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
#if defined(__i386__) || defined(__amd64__) | if ((cd = uart_acpi_find_device(dev)) != NULL) { | ||||
if (!ISA_PNP_PROBE(device_get_parent(dev), dev, acpi_ns8250_ids)) { | sc->sc_class = cd->cd_class; | ||||
Done Inline ActionsDebug no longer needed? jhb: Debug no longer needed? | |||||
sc->sc_class = &uart_ns8250_class; | if (cd->cd_desc != NULL) | ||||
Done Inline ActionsTo make the 'desc' stuff work, add this before the call to uart_bus_probe(): if (cd->cd_desc != NULL) device_set_desc(dev, cd->cd_desc); This would mean that entries could also leave cd_desc as NULL to use the generic name. jhb: To make the 'desc' stuff work, add this before the call to uart_bus_probe():
```
if (cd… | |||||
return (uart_bus_probe(dev, 0, 0, 0, 0, 0)); | device_set_desc(dev, cd->cd_desc); | ||||
return (uart_bus_probe(dev, cd->cd_regshft, cd->cd_regiowidth, | |||||
cd->cd_rclk, 0, 0)); | |||||
} | } | ||||
/* Add checks for non-ns8250 IDs here. */ | |||||
#elif defined(__aarch64__) | |||||
if ((sc->sc_class = uart_acpi_find_device(dev)) != NULL) | |||||
return (uart_bus_probe(dev, 2, 0, 0, 0, 0)); | |||||
#endif | |||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
DRIVER_MODULE(uart, acpi, uart_acpi_driver, uart_devclass, 0, 0); | DRIVER_MODULE(uart, acpi, uart_acpi_driver, uart_devclass, 0, 0); | ||||
Not Done Inline Actionsnot needed imp: not needed |
not needed.