Пример #1
0
/*
 * System power profile may have changed; fetch and notify the
 * thermal zone accordingly.
 *
 * Since this can be called from an arbitrary eventhandler, it needs
 * to get the ACPI lock itself.
 */
static void
acpi_tz_power_profile(void *arg)
{
    ACPI_STATUS			status;
    struct acpi_tz_softc	*sc = (struct acpi_tz_softc *)arg;
    int				state;

    state = power_profile_get_state();
    if (state != POWER_PROFILE_PERFORMANCE && state != POWER_PROFILE_ECONOMY)
	return;

    /* check that we haven't decided there's no _SCP method */
    if ((sc->tz_flags & TZ_FLAG_NO_SCP) == 0) {

	/* Call _SCP to set the new profile */
	status = acpi_SetInteger(sc->tz_handle, "_SCP",
	    (state == POWER_PROFILE_PERFORMANCE) ? 0 : 1);
	if (ACPI_FAILURE(status)) {
	    if (status != AE_NOT_FOUND)
		ACPI_VPRINT(sc->tz_dev,
			    acpi_device_get_parent_softc(sc->tz_dev),
			    "can't evaluate %s._SCP - %s\n",
			    acpi_name(sc->tz_handle),
			    AcpiFormatException(status));
	    sc->tz_flags |= TZ_FLAG_NO_SCP;
	} else {
	    /* We have to re-evaluate the entire zone now */
	    acpi_tz_signal(sc, TZ_FLAG_GETSETTINGS);
	}
    }
}
Пример #2
0
static ACPI_STATUS
acpi_dock_eject_child(ACPI_HANDLE handle, UINT32 level, void *context,
    void **status)
{
	device_t	dock_dev, dev;
	ACPI_HANDLE	dock_handle;

	dock_dev = *(device_t *)context;
	dock_handle = acpi_get_handle(dock_dev);

	if (!acpi_dock_is_ejd_device(dock_handle, handle))
		goto out;

	ACPI_VPRINT(dock_dev, acpi_device_get_parent_softc(dock_dev),
	    "ejecting device for %s\n", acpi_name(handle));

	dev = acpi_get_device(handle);
	if (dev != NULL && device_is_attached(dev)) {
		mtx_lock(&Giant);
		device_detach(dev);
		mtx_unlock(&Giant);
	}

	acpi_SetInteger(handle, "_EJ0", 0);
out:
	return (AE_OK);
}
Пример #3
0
/* Lock devices while docked to prevent surprise removal. */
static void
acpi_dock_execute_lck(device_t dev, int lock)
{
	ACPI_HANDLE	h;

	h = acpi_get_handle(dev);
	acpi_SetInteger(h, "_LCK", lock);
}
Пример #4
0
static int
acpi_fujitsu_method_set(struct acpi_fujitsu_softc *sc, int method, int value)
{
	struct int_nameval	nv;
	ACPI_STATUS		status;
	char			*control;
	int			changed;

	ACPI_SERIAL_ASSERT(fujitsu);

	switch (method) {
		case METHOD_GBLL:
			changed = BRIGHT_CHANGED;
			control = "SBLL";
			nv = sc->gbll;
			break;
		case METHOD_GBLS:
			changed = BRIGHT_CHANGED;
			control = "SBL2";
			nv = sc->gbls;
			break;
		case METHOD_GMOU:
			changed = MOUSE_CHANGED;
			control = "SMOU";
			nv = sc->gmou;
			break;
		case METHOD_GVOL:
		case METHOD_MUTE:
			changed = VOLUME_CHANGED;
			control = "SVOL";
			nv = sc->gvol;
			break;
		default:
			return (EINVAL);
	}

	if(!nv.exists)
		return (EINVAL);

	if (method == METHOD_MUTE) {
		if (value == 1)
			value = nv.value | VOLUME_MUTE_BIT;
		else if (value == 0)
			value = nv.value & ~VOLUME_MUTE_BIT;
		else
			return (EINVAL);
	}

	status = acpi_SetInteger(sc->handle, control, value);
	if (ACPI_FAILURE(status)) {
		device_printf(sc->dev, "Couldn't update %s\n", control);
		return (FALSE);
	}

	sc->lastValChanged = changed;
	return (0);
}
Пример #5
0
/* Eject a device (i.e., motorized). */
static int
acpi_dock_execute_ejx(device_t dev, int eject, int state)
{
	ACPI_HANDLE	h;
	ACPI_STATUS	status;
	char		ejx[5];

	h = acpi_get_handle(dev);
	snprintf(ejx, sizeof(ejx), "_EJ%d", state);
	status = acpi_SetInteger(h, ejx, eject);
	if (ACPI_SUCCESS(status))
		return (0);

	return (-1);
}
Пример #6
0
static int 
sysctl_acpi_sony_gen_handler(SYSCTL_HANDLER_ARGS)
{
	device_t	dev = arg1;
	int 	function = oidp->oid_arg2;
	int		error = 0, val;

	acpi_GetInteger(acpi_get_handle(dev),
	    acpi_sony_oids[function].getmethod, &val);
	error = sysctl_handle_int(oidp, &val, 0, req);
	if (error || !req->newptr || !acpi_sony_oids[function].setmethod)
		return (error);
	acpi_SetInteger(acpi_get_handle(dev),
	    acpi_sony_oids[function].setmethod, val);
	return (0);
}
Пример #7
0
static int
acpi_fujitsu_resume(device_t dev)
{
	struct acpi_fujitsu_softc   *sc;
	ACPI_STATUS		    status;

	sc = device_get_softc(dev);

	/*
	 * The pointer needs to be re-enabled for
	 * some revisions of the P series (2120).
	 */
	ACPI_SERIAL_BEGIN(fujitsu);

	if(sc->gmou.exists) {
		status = acpi_SetInteger(sc->handle, "SMOU", 1);
		if (ACPI_FAILURE(status))
			device_printf(sc->dev, "Couldn't enable pointer\n");
	}
	ACPI_SERIAL_END(fujitsu);

	return (0);
}