On Út 27-12-05 12:40:10, Patrick Mochel wrote: > On Tue, 27 Dec 2005, Pavel Machek wrote: > > On Út 27-12-05 11:29:56, Patrick Mochel wrote: > > > But, in some cases, peple are going to care about the intermediate > > > states, and we'll need to support them. It's simple enought to know > > > what states a PCI device supports, so I don't understand where the > > > complexity comes in.. ? > > > > Someone has to test all that... Unless we have in-tree driver that > > wants use intermediate states, I think supporting them is bad idea. > > I don't understand what your issue is; perhaps you could explain it a bit > better. There is no additional work on the part of the core, nor any > additional complication in supporting 4 possible power states vs > supporting 2 vs supporting any arbitrary number that the driver and device > implement. Well, I can do two states today, with the patch below :-). Actually it should work today as-is: writing 0/2 does mostly right think now. > I did not suggest that we make the drivers support intermediate states; I > only stated that there are some drivers and devices that can and will > implement them, and that there are cases in which it will make sense to > enter them from userpsace. Ok. > I admit I made a mistake in suggesting the interface - we wouldn't want to > simply export all the PM states that are present in the device's config > space. We would really only want to export the states that the driver says > it supports. But, that could be any number of states, above and > beyond (or Ok. Pavel diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c @@ -33,15 +33,12 @@ static ssize_t state_show(struct device static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n) { pm_message_t state; - char * rest; - int error = 0; + int error = -EINVAL; - state.event = simple_strtoul(buf, &rest, 10); - if (*rest) - return -EINVAL; - if (state.event) + state.event = PM_EVENT_SUSPEND; + if ((n == 2) && !strncmp(buf, "on", min(n, 2))) error = dpm_runtime_suspend(dev, state); - else + if ((n == 7) && !strncmp(buf, "suspend", min(n, 7))) dpm_runtime_resume(dev); return error ? error : n; } -- Thanks, Sharp!