Beispiel #1
0
static int tz_osl_proc_write_info (
        struct file		*file, 
        const char		*buffer, 
        unsigned long		count, 
        void			*data)
{
	TZ_CONTEXT		*tz = NULL;
	u32			state = 0;
	u32			size = 0;

	if (!buffer || (count==0) || !data) {
		goto end;
	}

	tz = (TZ_CONTEXT*)data;

	size = strlen(buffer);
	if (size < 4)
		goto end;
	
	/* Cooling preference: "scp=0" (active) or "scp=1" (passive) */
	if (0 == strncmp(buffer, "scp=", 4)) {
		tz_set_cooling_preference(tz, (buffer[4] - '0'));
	}

	/* Polling frequency: "tzp=X" (poll every X [0-9] seconds) */
	else if (0 == strncmp(buffer, "tzp=", 4)) {
		tz->policy.polling_freq = (buffer[4] - '0') * 10;
		tz_policy_check(tz);
	}

end:
        return count;
}
acpi_status
tz_policy_add_device (
	TZ_CONTEXT		*tz)
{
	acpi_status             status = AE_OK;
	TZ_THRESHOLDS           *thresholds = NULL;
	u32                     i,j = 0;

	FUNCTION_TRACE("tz_policy_add_device");

	if (!tz) {
		return_ACPI_STATUS(AE_BAD_PARAMETER);
	}

	ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Adding policy for thermal zone [%02x].\n", tz->device_handle));

	/*
	 * Get Thresholds:
	 * ---------------
	 */
	status = tz_get_thresholds(tz);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}

	/*
	 * Initialize Policies:
	 * --------------------
	 */
	if (tz->policy.thresholds.passive.is_valid) {
		for (i=0; i<tz->policy.thresholds.passive.devices.count; i++)
			set_performance_limit(tz->policy.thresholds.passive.devices.handles[i], PR_PERF_MAX);
		tz_policy_passive(tz);
	}
	if (tz->policy.thresholds.active[0].is_valid)
		tz_policy_active(tz);

	/*
	 * Initialize Policy Timer:
	 * ------------------------
	 */
	init_timer(&(tz->policy.timer));

	/*
	 * Start Policy:
	 * -------------
	 * Run an initial check using this zone's policy.
	 */
	tz_policy_check(tz);

	return_ACPI_STATUS(AE_OK);
}
Beispiel #3
0
acpi_status
tz_notify (
	BM_NOTIFY               notify_type,
	BM_HANDLE               device_handle,
	void                    **context)
{
	acpi_status             status = AE_OK;
	TZ_CONTEXT		*tz = NULL;

	FUNCTION_TRACE("tz_notify");

	if (!context) {
		return_ACPI_STATUS(AE_BAD_PARAMETER);
	}

	tz = (TZ_CONTEXT*)*context;

	switch (notify_type) {

	case BM_NOTIFY_DEVICE_ADDED:
		status = tz_add_device(device_handle, context);
		break;

	case BM_NOTIFY_DEVICE_REMOVED:
		status = tz_remove_device(context);
		break;

	case TZ_NOTIFY_TEMPERATURE_CHANGE:
		ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Temperature (_TMP) change event detected.\n"));
		tz_policy_check(*context);
		status = tz_get_temperature(tz);
		if (ACPI_SUCCESS(status)) {
			status = tz_osl_generate_event(notify_type, tz);
		}
		break;

	case TZ_NOTIFY_THRESHOLD_CHANGE:
		ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Threshold (_SCP) change event detected.\n"));
		status = tz_policy_remove_device(tz);
		if (ACPI_SUCCESS(status)) {
			status = tz_policy_add_device(tz);
		}
		status = tz_osl_generate_event(notify_type, tz);
		break;

	case TZ_NOTIFY_DEVICE_LISTS_CHANGE:
		ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Device lists (_ALx, _PSL, _TZD) change event detected.\n"));
		status = tz_policy_remove_device(tz);
		if (ACPI_SUCCESS(status)) {
			status = tz_policy_add_device(tz);
		}
		status = tz_osl_generate_event(notify_type, tz);
		break;

	default:
		status = AE_SUPPORT;
		break;
	}

	return_ACPI_STATUS(status);
}