diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/ibmasm/command.c | 12 | ||||
-rw-r--r-- | drivers/misc/ibmasm/ibmasm.h | 10 |
2 files changed, 9 insertions, 13 deletions
diff --git a/drivers/misc/ibmasm/command.c b/drivers/misc/ibmasm/command.c index 6497872df524..1a0e7978226a 100644 --- a/drivers/misc/ibmasm/command.c +++ b/drivers/misc/ibmasm/command.c | |||
@@ -26,11 +26,6 @@ | |||
26 | #include "lowlevel.h" | 26 | #include "lowlevel.h" |
27 | 27 | ||
28 | static void exec_next_command(struct service_processor *sp); | 28 | static void exec_next_command(struct service_processor *sp); |
29 | static void free_command(struct kobject *kobj); | ||
30 | |||
31 | static struct kobj_type ibmasm_cmd_kobj_type = { | ||
32 | .release = free_command, | ||
33 | }; | ||
34 | 29 | ||
35 | static atomic_t command_count = ATOMIC_INIT(0); | 30 | static atomic_t command_count = ATOMIC_INIT(0); |
36 | 31 | ||
@@ -53,8 +48,7 @@ struct command *ibmasm_new_command(struct service_processor *sp, size_t buffer_s | |||
53 | } | 48 | } |
54 | cmd->buffer_size = buffer_size; | 49 | cmd->buffer_size = buffer_size; |
55 | 50 | ||
56 | kobject_init(&cmd->kobj); | 51 | kref_init(&cmd->kref); |
57 | cmd->kobj.ktype = &ibmasm_cmd_kobj_type; | ||
58 | cmd->lock = &sp->lock; | 52 | cmd->lock = &sp->lock; |
59 | 53 | ||
60 | cmd->status = IBMASM_CMD_PENDING; | 54 | cmd->status = IBMASM_CMD_PENDING; |
@@ -67,9 +61,9 @@ struct command *ibmasm_new_command(struct service_processor *sp, size_t buffer_s | |||
67 | return cmd; | 61 | return cmd; |
68 | } | 62 | } |
69 | 63 | ||
70 | static void free_command(struct kobject *kobj) | 64 | void ibmasm_free_command(struct kref *kref) |
71 | { | 65 | { |
72 | struct command *cmd = to_command(kobj); | 66 | struct command *cmd = to_command(kref); |
73 | 67 | ||
74 | list_del(&cmd->queue_node); | 68 | list_del(&cmd->queue_node); |
75 | atomic_dec(&command_count); | 69 | atomic_dec(&command_count); |
diff --git a/drivers/misc/ibmasm/ibmasm.h b/drivers/misc/ibmasm/ibmasm.h index de860bc6d3f5..4d8a4e248b34 100644 --- a/drivers/misc/ibmasm/ibmasm.h +++ b/drivers/misc/ibmasm/ibmasm.h | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
34 | #include <linux/kref.h> | ||
34 | #include <linux/device.h> | 35 | #include <linux/device.h> |
35 | #include <linux/input.h> | 36 | #include <linux/input.h> |
36 | 37 | ||
@@ -92,24 +93,25 @@ struct command { | |||
92 | unsigned char *buffer; | 93 | unsigned char *buffer; |
93 | size_t buffer_size; | 94 | size_t buffer_size; |
94 | int status; | 95 | int status; |
95 | struct kobject kobj; | 96 | struct kref kref; |
96 | spinlock_t *lock; | 97 | spinlock_t *lock; |
97 | }; | 98 | }; |
98 | #define to_command(c) container_of(c, struct command, kobj) | 99 | #define to_command(c) container_of(c, struct command, kref) |
99 | 100 | ||
101 | void ibmasm_free_command(struct kref *kref); | ||
100 | static inline void command_put(struct command *cmd) | 102 | static inline void command_put(struct command *cmd) |
101 | { | 103 | { |
102 | unsigned long flags; | 104 | unsigned long flags; |
103 | spinlock_t *lock = cmd->lock; | 105 | spinlock_t *lock = cmd->lock; |
104 | 106 | ||
105 | spin_lock_irqsave(lock, flags); | 107 | spin_lock_irqsave(lock, flags); |
106 | kobject_put(&cmd->kobj); | 108 | kref_put(&cmd->kref, ibmasm_free_command); |
107 | spin_unlock_irqrestore(lock, flags); | 109 | spin_unlock_irqrestore(lock, flags); |
108 | } | 110 | } |
109 | 111 | ||
110 | static inline void command_get(struct command *cmd) | 112 | static inline void command_get(struct command *cmd) |
111 | { | 113 | { |
112 | kobject_get(&cmd->kobj); | 114 | kref_get(&cmd->kref); |
113 | } | 115 | } |
114 | 116 | ||
115 | 117 | ||