⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 Linux Kernel 2.6.9 for OMAP1710
💻 C
📖 第 1 页 / 共 2 页
字号:
	arg.integer.value = 0;		/* Execute PSW */	status = acpi_evaluate_object(dev->handle, "_PSW", &arg_list, NULL);	if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluate _PSW\n"));		dev->wakeup.flags.valid = 0;		return -1;	}	/* Close power resource */	for (i = 0; i < dev->wakeup.resources.count; i++) {		ret = acpi_power_off_device(dev->wakeup.resources.handles[i]);		if (ret) {			ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 				"Error transition power state\n"));			dev->wakeup.flags.valid = 0;			return -1;		}	}	return ret;}/* --------------------------------------------------------------------------                             Device Power Management   -------------------------------------------------------------------------- */intacpi_power_get_inferred_state (	struct acpi_device	*device){	int			result = 0;	struct acpi_handle_list	*list = NULL;	int			list_state = 0;	int			i = 0;	ACPI_FUNCTION_TRACE("acpi_power_get_inferred_state");	if (!device)		return_VALUE(-EINVAL);	device->power.state = ACPI_STATE_UNKNOWN;	/*	 * We know a device's inferred power state when all the resources	 * required for a given D-state are 'on'.	 */	for (i=ACPI_STATE_D0; i<ACPI_STATE_D3; i++) {		list = &device->power.states[i].resources;		if (list->count < 1)			continue;		result = acpi_power_get_list_state(list, &list_state);		if (result)			return_VALUE(result);		if (list_state == ACPI_POWER_RESOURCE_STATE_ON) {			device->power.state = i;			return_VALUE(0);		}	}	device->power.state = ACPI_STATE_D3;	return_VALUE(0);}intacpi_power_transition (	struct acpi_device	*device,	int			state){	int			result = 0;	struct acpi_handle_list	*cl = NULL;	/* Current Resources */	struct acpi_handle_list	*tl = NULL;	/* Target Resources */	int			i = 0;	ACPI_FUNCTION_TRACE("acpi_power_transition");	if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3))		return_VALUE(-EINVAL);	if ((device->power.state < ACPI_STATE_D0) || (device->power.state > ACPI_STATE_D3))		return_VALUE(-ENODEV);	cl = &device->power.states[device->power.state].resources;	tl = &device->power.states[state].resources;	device->power.state = ACPI_STATE_UNKNOWN;	if (!cl->count && !tl->count) {		result = -ENODEV;		goto end;	}	/* TBD: Resources must be ordered. */	/*	 * First we reference all power resources required in the target list	 * (e.g. so the device doesn't lose power while transitioning).	 */	for (i=0; i<tl->count; i++) {		result = acpi_power_on(tl->handles[i]);		if (result)			goto end;	}	/*	 * Then we dereference all power resources used in the current list.	 */	for (i=0; i<cl->count; i++) {		result = acpi_power_off_device(cl->handles[i]);		if (result)			goto end;	}	/* We shouldn't change the state till all above operations succeed */	device->power.state = state;end:	if (result)		ACPI_DEBUG_PRINT((ACPI_DB_WARN, 			"Error transitioning device [%s] to D%d\n",			device->pnp.bus_id, state));	return_VALUE(result);}/* --------------------------------------------------------------------------                              FS Interface (/proc)   -------------------------------------------------------------------------- */struct proc_dir_entry		*acpi_power_dir;static int acpi_power_seq_show(struct seq_file *seq, void *offset){	struct acpi_power_resource *resource = NULL;	ACPI_FUNCTION_TRACE("acpi_power_seq_show");	resource = (struct acpi_power_resource *)seq->private;	if (!resource)		goto end;	seq_puts(seq, "state:                   ");	switch (resource->state) {	case ACPI_POWER_RESOURCE_STATE_ON:		seq_puts(seq, "on\n");		break;	case ACPI_POWER_RESOURCE_STATE_OFF:		seq_puts(seq, "off\n");		break;	default:		seq_puts(seq, "unknown\n");		break;	}	seq_printf(seq, "system level:            S%d\n"			"order:                   %d\n"			"reference count:         %d\n",			resource->system_level,			resource->order,			resource->references);end:	return 0;}static int acpi_power_open_fs(struct inode *inode, struct file *file){	return single_open(file, acpi_power_seq_show, PDE(inode)->data);}static intacpi_power_add_fs (	struct acpi_device	*device){	struct proc_dir_entry	*entry = NULL;	ACPI_FUNCTION_TRACE("acpi_power_add_fs");	if (!device)		return_VALUE(-EINVAL);	if (!acpi_device_dir(device)) {		acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),			acpi_power_dir);		if (!acpi_device_dir(device))			return_VALUE(-ENODEV);	}	/* 'status' [R] */	entry = create_proc_entry(ACPI_POWER_FILE_STATUS,		S_IRUGO, acpi_device_dir(device));	if (!entry)		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,			"Unable to create '%s' fs entry\n",			ACPI_POWER_FILE_STATUS));	else {		entry->proc_fops = &acpi_power_fops;		entry->data = acpi_driver_data(device);	}	return_VALUE(0);}static intacpi_power_remove_fs (	struct acpi_device	*device){	ACPI_FUNCTION_TRACE("acpi_power_remove_fs");	if (acpi_device_dir(device)) {		remove_proc_entry(ACPI_POWER_FILE_STATUS,				  acpi_device_dir(device));		remove_proc_entry(acpi_device_bid(device), acpi_power_dir);		acpi_device_dir(device) = NULL;	}	return_VALUE(0);}/* --------------------------------------------------------------------------                                Driver Interface   -------------------------------------------------------------------------- */intacpi_power_add (	struct acpi_device	*device){	int			result = 0;	acpi_status		status = AE_OK;	struct acpi_power_resource *resource = NULL;	union acpi_object	acpi_object;	struct acpi_buffer	buffer = {sizeof(acpi_object), &acpi_object};	ACPI_FUNCTION_TRACE("acpi_power_add");	if (!device)		return_VALUE(-EINVAL);	resource = kmalloc(sizeof(struct acpi_power_resource), GFP_KERNEL);	if (!resource)		return_VALUE(-ENOMEM);	memset(resource, 0, sizeof(struct acpi_power_resource));	resource->handle = device->handle;	strcpy(resource->name, device->pnp.bus_id);	strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);	strcpy(acpi_device_class(device), ACPI_POWER_CLASS);	acpi_driver_data(device) = resource;	/* Evalute the object to get the system level and resource order. */	status = acpi_evaluate_object(resource->handle, NULL, NULL, &buffer);	if (ACPI_FAILURE(status)) {		result = -ENODEV;		goto end;	}	resource->system_level = acpi_object.power_resource.system_level;	resource->order = acpi_object.power_resource.resource_order;	result = acpi_power_get_state(resource);	if (result)		goto end;	switch (resource->state) {	case ACPI_POWER_RESOURCE_STATE_ON:		device->power.state = ACPI_STATE_D0;		break;	case ACPI_POWER_RESOURCE_STATE_OFF:		device->power.state = ACPI_STATE_D3;		break;	default:		device->power.state = ACPI_STATE_UNKNOWN;		break;	}	result = acpi_power_add_fs(device);	if (result)		goto end;		printk(KERN_INFO PREFIX "%s [%s] (%s)\n", acpi_device_name(device),		acpi_device_bid(device), resource->state?"on":"off");end:	if (result)		kfree(resource);		return_VALUE(result);}intacpi_power_remove (	struct acpi_device	*device,	int			type){	struct acpi_power_resource *resource = NULL;	ACPI_FUNCTION_TRACE("acpi_power_remove");	if (!device || !acpi_driver_data(device))		return_VALUE(-EINVAL);	resource = (struct acpi_power_resource *) acpi_driver_data(device);	acpi_power_remove_fs(device);	kfree(resource);	return_VALUE(0);}static int __init acpi_power_init (void){	int			result = 0;	ACPI_FUNCTION_TRACE("acpi_power_init");	if (acpi_disabled)		return_VALUE(0);	INIT_LIST_HEAD(&acpi_power_resource_list);	acpi_power_dir = proc_mkdir(ACPI_POWER_CLASS, acpi_root_dir);	if (!acpi_power_dir)		return_VALUE(-ENODEV);	result = acpi_bus_register_driver(&acpi_power_driver);	if (result < 0) {		remove_proc_entry(ACPI_POWER_CLASS, acpi_root_dir);		return_VALUE(-ENODEV);	}	return_VALUE(0);}subsys_initcall(acpi_power_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -