diff options
| -rw-r--r-- | drivers/input/serio/libps2.c | 3 | ||||
| -rw-r--r-- | drivers/input/serio/serio.c | 6 | ||||
| -rw-r--r-- | include/linux/serio.h | 1 |
3 files changed, 8 insertions, 2 deletions
diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index dcb16b5cbec0..e5b1b60757bb 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c | |||
| @@ -189,7 +189,7 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) | |||
| 189 | return -1; | 189 | return -1; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | mutex_lock_nested(&ps2dev->cmd_mutex, SINGLE_DEPTH_NESTING); | 192 | mutex_lock(&ps2dev->cmd_mutex); |
| 193 | 193 | ||
| 194 | serio_pause_rx(ps2dev->serio); | 194 | serio_pause_rx(ps2dev->serio); |
| 195 | ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; | 195 | ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; |
| @@ -296,6 +296,7 @@ EXPORT_SYMBOL(ps2_schedule_command); | |||
| 296 | void ps2_init(struct ps2dev *ps2dev, struct serio *serio) | 296 | void ps2_init(struct ps2dev *ps2dev, struct serio *serio) |
| 297 | { | 297 | { |
| 298 | mutex_init(&ps2dev->cmd_mutex); | 298 | mutex_init(&ps2dev->cmd_mutex); |
| 299 | lockdep_set_subclass(&ps2dev->cmd_mutex, serio->depth); | ||
| 299 | init_waitqueue_head(&ps2dev->wait); | 300 | init_waitqueue_head(&ps2dev->wait); |
| 300 | ps2dev->serio = serio; | 301 | ps2dev->serio = serio; |
| 301 | } | 302 | } |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 960fae3c3cea..480fdc5d20b3 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
| @@ -538,8 +538,12 @@ static void serio_init_port(struct serio *serio) | |||
| 538 | "serio%ld", (long)atomic_inc_return(&serio_no) - 1); | 538 | "serio%ld", (long)atomic_inc_return(&serio_no) - 1); |
| 539 | serio->dev.bus = &serio_bus; | 539 | serio->dev.bus = &serio_bus; |
| 540 | serio->dev.release = serio_release_port; | 540 | serio->dev.release = serio_release_port; |
| 541 | if (serio->parent) | 541 | if (serio->parent) { |
| 542 | serio->dev.parent = &serio->parent->dev; | 542 | serio->dev.parent = &serio->parent->dev; |
| 543 | serio->depth = serio->parent->depth + 1; | ||
| 544 | } else | ||
| 545 | serio->depth = 0; | ||
| 546 | lockdep_set_subclass(&serio->lock, serio->depth); | ||
| 543 | } | 547 | } |
| 544 | 548 | ||
| 545 | /* | 549 | /* |
diff --git a/include/linux/serio.h b/include/linux/serio.h index 3a697cc6ecae..b99c5ca9708d 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
| @@ -41,6 +41,7 @@ struct serio { | |||
| 41 | void (*stop)(struct serio *); | 41 | void (*stop)(struct serio *); |
| 42 | 42 | ||
| 43 | struct serio *parent, *child; | 43 | struct serio *parent, *child; |
| 44 | unsigned int depth; /* level of nesting in serio hierarchy */ | ||
| 44 | 45 | ||
| 45 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ | 46 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ |
| 46 | struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ | 47 | struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ |
