Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iicbus/acpi_iicbus.c
Show All 29 Lines | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/endian.h> | #include <sys/endian.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/malloc.h> | #include <sys/malloc.h> | ||||
#include <sys/module.h> | #include <sys/module.h> | ||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <sys/sbuf.h> | |||||
#include <machine/resource.h> | #include <machine/resource.h> | ||||
#include <contrib/dev/acpica/include/acpi.h> | #include <contrib/dev/acpica/include/acpi.h> | ||||
#include <contrib/dev/acpica/include/accommon.h> | #include <contrib/dev/acpica/include/accommon.h> | ||||
#include <contrib/dev/acpica/include/amlcode.h> | #include <contrib/dev/acpica/include/amlcode.h> | ||||
#include <dev/acpica/acpivar.h> | #include <dev/acpica/acpivar.h> | ||||
▲ Show 20 Lines • Show All 658 Lines • ▼ Show 20 Lines | default: | ||||
return (iicbus_write_ivar(bus, child, which, val)); | return (iicbus_write_ivar(bus, child, which, val)); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
/* Location hint for devctl(8). Concatenate IIC and ACPI hints. */ | /* Location hint for devctl(8). Concatenate IIC and ACPI hints. */ | ||||
static int | static int | ||||
acpi_iicbus_child_location_str(device_t bus, device_t child, | acpi_iicbus_child_location(device_t bus, device_t child, struct sbuf *sb) | ||||
char *buf, size_t buflen) | |||||
{ | { | ||||
struct acpi_iicbus_ivars *devi = device_get_ivars(child); | struct acpi_iicbus_ivars *devi = device_get_ivars(child); | ||||
int error; | int error; | ||||
/* read IIC location hint string into the buffer. */ | /* read IIC location hint string into the buffer. */ | ||||
error = iicbus_child_location_str(bus, child, buf, buflen); | error = iicbus_child_location(bus, child, sb); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
/* Place ACPI string right after IIC one's terminating NUL. */ | /* Place ACPI string right after IIC one's terminating NUL. */ | ||||
if (devi->handle != NULL && | if (devi->handle != NULL) | ||||
((buf[0] != '\0' && strlcat(buf, " ", buflen) >= buflen) || | sbuf_printf(sb, " handle=%s", acpi_name(devi->handle)); | ||||
strlcat(buf, "handle=", buflen) >= buflen || | |||||
strlcat(buf, acpi_name(devi->handle), buflen) >= buflen)) | |||||
return (EOVERFLOW); | |||||
return (0); | return (0); | ||||
} | } | ||||
/* PnP information for devctl(8). Concatenate IIC and ACPI info strings. */ | /* PnP information for devctl(8). Concatenate IIC and ACPI info strings. */ | ||||
static int | static int | ||||
acpi_iicbus_child_pnpinfo_str(device_t bus, device_t child, char *buf, | acpi_iicbus_child_pnpinfo(device_t bus, device_t child, struct sbuf *sb) | ||||
size_t buflen) | |||||
{ | { | ||||
struct acpi_iicbus_ivars *devi = device_get_ivars(child); | struct acpi_iicbus_ivars *devi = device_get_ivars(child); | ||||
size_t acpi_offset; | |||||
int error; | int error; | ||||
/* read IIC PnP string into the buffer. */ | /* read IIC PnP string into the buffer. */ | ||||
error = iicbus_child_pnpinfo_str(bus, child, buf, buflen); | error = iicbus_child_pnpinfo(bus, child, sb); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
if (devi->handle == NULL) | if (devi->handle == NULL) | ||||
return (0); | return (0); | ||||
/* Place ACPI string right after IIC one's terminating NUL. */ | error = acpi_pnpinfo(devi->handle, sb); | ||||
acpi_offset = strlen(buf); | |||||
if (acpi_offset != 0) | |||||
acpi_offset++; | |||||
error = acpi_pnpinfo_str(devi->handle, buf + acpi_offset, | |||||
buflen - acpi_offset); | |||||
/* Coalesce both strings if they are not empty. */ | |||||
if (acpi_offset > 0 && acpi_offset < buflen && buf[acpi_offset] != 0) | |||||
buf[acpi_offset - 1] = ' '; | |||||
return (error); | return (error); | ||||
} | } | ||||
static device_method_t acpi_iicbus_methods[] = { | static device_method_t acpi_iicbus_methods[] = { | ||||
/* Device interface */ | /* Device interface */ | ||||
DEVMETHOD(device_probe, acpi_iicbus_probe), | DEVMETHOD(device_probe, acpi_iicbus_probe), | ||||
DEVMETHOD(device_attach, acpi_iicbus_attach), | DEVMETHOD(device_attach, acpi_iicbus_attach), | ||||
DEVMETHOD(device_detach, acpi_iicbus_detach), | DEVMETHOD(device_detach, acpi_iicbus_detach), | ||||
DEVMETHOD(device_suspend, acpi_iicbus_suspend), | DEVMETHOD(device_suspend, acpi_iicbus_suspend), | ||||
DEVMETHOD(device_resume, acpi_iicbus_resume), | DEVMETHOD(device_resume, acpi_iicbus_resume), | ||||
/* Bus interface */ | /* Bus interface */ | ||||
DEVMETHOD(bus_add_child, acpi_iicbus_add_child), | DEVMETHOD(bus_add_child, acpi_iicbus_add_child), | ||||
DEVMETHOD(bus_probe_nomatch, acpi_iicbus_probe_nomatch), | DEVMETHOD(bus_probe_nomatch, acpi_iicbus_probe_nomatch), | ||||
DEVMETHOD(bus_driver_added, acpi_iicbus_driver_added), | DEVMETHOD(bus_driver_added, acpi_iicbus_driver_added), | ||||
DEVMETHOD(bus_child_deleted, acpi_iicbus_child_deleted), | DEVMETHOD(bus_child_deleted, acpi_iicbus_child_deleted), | ||||
DEVMETHOD(bus_read_ivar, acpi_iicbus_read_ivar), | DEVMETHOD(bus_read_ivar, acpi_iicbus_read_ivar), | ||||
DEVMETHOD(bus_write_ivar, acpi_iicbus_write_ivar), | DEVMETHOD(bus_write_ivar, acpi_iicbus_write_ivar), | ||||
DEVMETHOD(bus_child_location_str,acpi_iicbus_child_location_str), | DEVMETHOD(bus_child_location, acpi_iicbus_child_location), | ||||
DEVMETHOD(bus_child_pnpinfo_str,acpi_iicbus_child_pnpinfo_str), | DEVMETHOD(bus_child_pnpinfo, acpi_iicbus_child_pnpinfo), | ||||
DEVMETHOD_END, | DEVMETHOD_END, | ||||
}; | }; | ||||
DEFINE_CLASS_1(iicbus, acpi_iicbus_driver, acpi_iicbus_methods, | DEFINE_CLASS_1(iicbus, acpi_iicbus_driver, acpi_iicbus_methods, | ||||
sizeof(struct acpi_iicbus_softc), iicbus_driver); | sizeof(struct acpi_iicbus_softc), iicbus_driver); | ||||
MODULE_VERSION(acpi_iicbus, 1); | MODULE_VERSION(acpi_iicbus, 1); | ||||
MODULE_DEPEND(acpi_iicbus, acpi, 1, 1, 1); | MODULE_DEPEND(acpi_iicbus, acpi, 1, 1, 1); |