summaryrefslogtreecommitdiff
path: root/drivers/base/interface.c
blob: bd515843a0cbf4e87d5dd483f71e6890ffe67841 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 * drivers/base/interface.c - common driverfs interface that's exported to
 * 	the world for all devices.
 *
 * Copyright (c) 2002-3 Patrick Mochel
 * Copyright (c) 2002-3 Open Source Development Labs
 *
 * This file is released under the GPLv2
 *
 */

#include <linux/device.h>
#include <linux/err.h>
#include <linux/stat.h>
#include <linux/string.h>

/**
 *	detach_state - control the default power state for the device.
 *
 *	This is the state the device enters when it's driver module is
 *	unloaded. The value is an unsigned integer, in the range of 0-4.
 *	'0' indicates 'On', so no action will be taken when the driver is
 *	unloaded. This is the default behavior.
 *	'4' indicates 'Off', meaning the driver core will call the driver's
 *	shutdown method to quiesce the device.
 *	1-3 indicate a low-power state for the device to enter via the
 *	driver's suspend method.
 */

static ssize_t detach_show(struct device * dev, char * buf)
{
	return sprintf(buf, "%u\n", dev->detach_state);
}

static ssize_t detach_store(struct device * dev, const char * buf, size_t n)
{
	u32 state;
	state = simple_strtoul(buf, NULL, 10);
	if (state > 4)
		return -EINVAL;
	dev->detach_state = state;
	return n;
}

static DEVICE_ATTR(detach_state, 0644, detach_show, detach_store);


struct attribute * dev_default_attrs[] = {
	&dev_attr_detach_state.attr,
	NULL,
};