Page MenuHomeFreeBSD

D57767.diff
No OneTemporary

D57767.diff

diff --git a/sys/dev/usb/video/uvideo.c b/sys/dev/usb/video/uvideo.c
--- a/sys/dev/usb/video/uvideo.c
+++ b/sys/dev/usb/video/uvideo.c
@@ -54,6 +54,12 @@
#include "usbdevs.h"
#include <dev/usb/video/uvideo.h>
+#include "opt_acpi.h"
+
+#ifdef DEV_ACPI
+#include <contrib/dev/acpica/include/acpi.h>
+#include <dev/acpica/acpivar.h>
+#endif
#define USB_DEBUG_VAR uvideo_debug
#include <dev/usb/usb_debug.h>
@@ -277,6 +283,13 @@
struct selinfo sc_selinfo;
+#ifdef DEV_ACPI
+#define ACPI_PLD_SIZE 20
+ ACPI_HANDLE sc_acpihandle;
+ uint8_t sc_pld[ACPI_PLD_SIZE];
+ char *sc_acpiname;
+#endif
+
void (*sc_decode_stream_header)(
struct uvideo_softc *, uint8_t *, int);
};
@@ -690,6 +703,147 @@
return (usbd_lookup_id_by_uaa(uvideo_devs, sizeof(uvideo_devs), uaa));
}
+#ifdef DEV_ACPI
+/* Find USB Camera interface device */
+static ACPI_STATUS
+uvideo_acpi_cb(ACPI_HANDLE ah, UINT32 lv, void *ctx, void **ahp)
+{
+ ACPI_DEVICE_INFO *devinfo;
+ ACPI_STATUS ret;
+ ACPI_INTEGER *camadr = ctx;
+
+ *ahp = NULL;
+ ret = AcpiGetObjectInfo(ah, &devinfo);
+ if (ACPI_SUCCESS(ret)) {
+ if ((devinfo->Valid & ACPI_VALID_ADR) &&
+ (devinfo->Address == *camadr)){
+ ret = AE_CTRL_TERMINATE;
+ *ahp = ah;
+ }
+ AcpiOsFree(devinfo);
+ }
+
+ return (ret);
+
+}
+
+static void uvideo_acpi_attach(device_t dev, int port, int iface_index)
+{
+ ACPI_HANDLE ah;
+ ACPI_HANDLE devah = acpi_get_handle(dev);
+ ACPI_BUFFER buf;
+ struct uvideo_softc *sc = device_get_softc(dev);
+ size_t len,rawlen;
+ ACPI_INTEGER camadr = port + iface_index; /* Camera device address under port device*/
+
+ if (devah == NULL)
+ return;
+
+ if (ACPI_SUCCESS(AcpiWalkNamespace(ACPI_TYPE_DEVICE,
+ devah, 1, uvideo_acpi_cb,
+ NULL, &camadr, &ah) ) && ah){
+ if (bootverbose)
+ device_printf(dev, "ACPI_HANDLE %s\n", acpi_name(ah));
+
+ sc->sc_acpihandle = ah;
+
+ buf.Pointer = NULL;
+ buf.Length = ACPI_ALLOCATE_BUFFER;
+ if(ACPI_SUCCESS(AcpiGetName(ah, ACPI_FULL_PATHNAME, &buf))) {
+ sc->sc_acpiname = buf.Pointer;
+ SYSCTL_ADD_STRING(device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "acpi_handle", CTLFLAG_RD|CTLFLAG_MPSAFE,
+ sc->sc_acpiname, buf.Length, "Camera Handle");
+ }
+
+ buf.Pointer = NULL;
+ buf.Length = ACPI_ALLOCATE_BUFFER;
+ if (sc->sc_acpihandle
+ && AcpiEvaluateObject(ah, "_PLD", NULL, &buf) == AE_OK) {
+ ACPI_OBJECT *obj;
+ unsigned char *resbuf;
+
+ obj = buf.Pointer;
+
+ if (obj->Type == ACPI_TYPE_PACKAGE
+ && obj->Package.Count >0
+ && obj->Package.Elements[0].Type == ACPI_TYPE_BUFFER) {
+ ACPI_OBJECT *obj1;
+
+ obj1 = &obj->Package.Elements[0];
+ rawlen = obj1->Buffer.Length;
+ resbuf = obj1->Buffer.Pointer;
+ } else if (obj->Type == ACPI_TYPE_BUFFER) {
+ rawlen = obj->Buffer.Length;
+ resbuf = obj->Buffer.Pointer;
+ } else {
+ goto skip;
+ }
+ len = (rawlen < ACPI_PLD_SIZE) ? rawlen : ACPI_PLD_SIZE;
+ memcpy(sc->sc_pld, resbuf, len);
+ SYSCTL_ADD_OPAQUE(
+ device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "pldraw", CTLFLAG_RD | CTLFLAG_MPSAFE,
+ sc->sc_pld, len, "A", "Raw PLD value");
+
+ if (bootverbose) {
+ ACPI_PLD_INFO *pld;
+ if (ACPI_SUCCESS(AcpiDecodePldBuffer(resbuf, rawlen, &pld))){
+ device_printf(dev, "Revision:%d\n", pld->Revision);
+ if (!pld->IgnoreColor){
+ device_printf(dev,
+ "Color:#%02x%02x%02x\n",
+ pld->Red,pld->Green, pld->Blue);
+ }
+ device_printf(dev, "Width %d mm Height %d mm\n",
+ pld->Width, pld->Height);
+ if (pld->UserVisible)
+ device_printf(dev, "Visible\n");
+ if (pld->Dock)
+ device_printf(dev, "Dock\n");
+ if (pld->Lid)
+ device_printf(dev, "Lid\n");
+ device_printf(dev, "Panel: %d\n", pld->Panel);
+ device_printf(dev, "VPos: %d\n", pld->VerticalPosition);
+ device_printf(dev, "HPos: %d\n", pld->HorizontalPosition);
+ device_printf(dev, "Shape: %d\n", pld->Shape);
+ device_printf(dev, "GroupOrientation %d\n", pld->GroupOrientation);
+ device_printf(dev, "GroupToken %d\n", pld->GroupToken);
+ device_printf(dev, "GroupPosition %d\n", pld->GroupPosition);
+ device_printf(dev, "Bay %d\n", pld->Bay);
+ device_printf(dev, "Ejectable %d\n", pld->Ejectable);
+ device_printf(dev, "CabinetNumber %d\n", pld->CabinetNumber);
+ device_printf(dev, "CardCageNumber %d\n", pld->CardCageNumber);
+ device_printf(dev, "Reference %d\n", pld->Reference);
+ device_printf(dev, "Rotation %d\n", pld->Rotation);
+ device_printf(dev, "Vertical Offset %d\n", pld->VerticalOffset);
+ device_printf(dev, "Horizontal Offset %d\n", pld->HorizontalOffset);
+ AcpiOsFree(pld);
+ }
+ }
+ skip:
+ AcpiOsFree(buf.Pointer);
+ }
+ }
+}
+static void uvideo_acpi_detach(device_t dev)
+{
+ struct uvideo_softc *sc = device_get_softc(dev);
+ /* Free acpi related resource*/
+ if (sc->sc_acpiname != NULL)
+ AcpiOsFree(sc->sc_acpiname);
+
+}
+#else
+static void uvideo_acpi_attach(device_t dev, int port, int iface_index)
+{
+}
+static void uvideo_acpi_detach(device_t dev)
+{
+}
+#endif
static int
uvideo_attach(device_t dev)
{
@@ -835,6 +989,8 @@
device_printf(dev, "UVC camera on /dev/video%d\n", sc->sc_unit);
+ uvideo_acpi_attach(dev, uaa->port, sc->sc_iface_index);
+
return (0);
detach:
@@ -875,6 +1031,8 @@
knlist_destroy(&sc->sc_selinfo.si_note);
mtx_destroy(&sc->sc_mtx);
+ uvideo_acpi_detach(dev);
+
return (0);
}
diff --git a/sys/modules/usb/uvideo/Makefile b/sys/modules/usb/uvideo/Makefile
--- a/sys/modules/usb/uvideo/Makefile
+++ b/sys/modules/usb/uvideo/Makefile
@@ -4,7 +4,7 @@
KMOD= uvideo
SRCS= opt_bus.h opt_usb.h device_if.h \
- bus_if.h usb_if.h usbdevs.h \
+ bus_if.h usb_if.h usbdevs.h opt_acpi.h acpi_if.h\
uvideo.c
.include <bsd.kmod.mk>

File Metadata

Mime Type
text/plain
Expires
Tue, Sep 8, 9:33 PM (11 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38539437
Default Alt Text
D57767.diff (5 KB)

Event Timeline