Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 221856
b: refs/heads/master
c: b50b521
h: refs/heads/master
v: v3
  • Loading branch information
Dmitry Torokhov committed Nov 3, 2010
1 parent 3d1fb88 commit af45330
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 95716c0decb2ed3ff94998b6390cc8f8d6d1e748
refs/heads/master: b50b521694cb7093640879d3279b88d2873f6183
50 changes: 35 additions & 15 deletions trunk/drivers/input/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -1565,8 +1565,7 @@ static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env)
} \
} while (0)

#ifdef CONFIG_PM
static void input_dev_reset(struct input_dev *dev, bool activate)
static void input_dev_toggle(struct input_dev *dev, bool activate)
{
if (!dev->event)
return;
Expand All @@ -1580,12 +1579,44 @@ static void input_dev_reset(struct input_dev *dev, bool activate)
}
}

/**
* input_reset_device() - reset/restore the state of input device
* @dev: input device whose state needs to be reset
*
* This function tries to reset the state of an opened input device and
* bring internal state and state if the hardware in sync with each other.
* We mark all keys as released, restore LED state, repeat rate, etc.
*/
void input_reset_device(struct input_dev *dev)
{
mutex_lock(&dev->mutex);

if (dev->users) {
input_dev_toggle(dev, true);

/*
* Keys that have been pressed at suspend time are unlikely
* to be still pressed when we resume.
*/
spin_lock_irq(&dev->event_lock);
input_dev_release_keys(dev);
spin_unlock_irq(&dev->event_lock);
}

mutex_unlock(&dev->mutex);
}
EXPORT_SYMBOL(input_reset_device);

#ifdef CONFIG_PM
static int input_dev_suspend(struct device *dev)
{
struct input_dev *input_dev = to_input_dev(dev);

mutex_lock(&input_dev->mutex);
input_dev_reset(input_dev, false);

if (input_dev->users)
input_dev_toggle(input_dev, false);

mutex_unlock(&input_dev->mutex);

return 0;
Expand All @@ -1595,18 +1626,7 @@ static int input_dev_resume(struct device *dev)
{
struct input_dev *input_dev = to_input_dev(dev);

mutex_lock(&input_dev->mutex);
input_dev_reset(input_dev, true);

/*
* Keys that have been pressed at suspend time are unlikely
* to be still pressed when we resume.
*/
spin_lock_irq(&input_dev->event_lock);
input_dev_release_keys(input_dev);
spin_unlock_irq(&input_dev->event_lock);

mutex_unlock(&input_dev->mutex);
input_reset_device(input_dev);

return 0;
}
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/linux/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -1406,6 +1406,8 @@ static inline void input_set_drvdata(struct input_dev *dev, void *data)
int __must_check input_register_device(struct input_dev *);
void input_unregister_device(struct input_dev *);

void input_reset_device(struct input_dev *);

int __must_check input_register_handler(struct input_handler *);
void input_unregister_handler(struct input_handler *);

Expand All @@ -1421,7 +1423,7 @@ void input_release_device(struct input_handle *);
int input_open_device(struct input_handle *);
void input_close_device(struct input_handle *);

int input_flush_device(struct input_handle* handle, struct file* file);
int input_flush_device(struct input_handle *handle, struct file *file);

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value);
Expand Down

0 comments on commit af45330

Please sign in to comment.