diff options
| author | Andres Salomon <dilinger@queued.net> | 2012-07-13 20:10:45 -0400 |
|---|---|---|
| committer | Andres Salomon <dilinger@queued.net> | 2012-07-31 23:27:31 -0400 |
| commit | 99ecb01cdf0378783b317b8f839ac9cc5e128aa5 (patch) | |
| tree | ad946e550be33d0e1d5911abcec5f4c5f7a8df9f | |
| parent | 6cca83d498bda0999302079bd59786370590c5c2 (diff) | |
Platform: OLPC: move global variables into priv struct
Populate olpc_ec_priv with variables that were previously global. This
makes things a tad bit clearer, IMO.
Signed-off-by: Andres Salomon <dilinger@queued.net>
Acked-by: Paul Fox <pgf@laptop.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | drivers/platform/olpc/olpc-ec.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c index 1a15a79fff05..0f9f8596b300 100644 --- a/drivers/platform/olpc/olpc-ec.c +++ b/drivers/platform/olpc/olpc-ec.c | |||
| @@ -31,6 +31,12 @@ struct ec_cmd_desc { | |||
| 31 | 31 | ||
| 32 | struct olpc_ec_priv { | 32 | struct olpc_ec_priv { |
| 33 | struct olpc_ec_driver *drv; | 33 | struct olpc_ec_driver *drv; |
| 34 | struct work_struct worker; | ||
| 35 | struct mutex cmd_lock; | ||
| 36 | |||
| 37 | /* Pending EC commands */ | ||
| 38 | struct list_head cmd_q; | ||
| 39 | spinlock_t cmd_q_lock; | ||
| 34 | 40 | ||
| 35 | struct dentry *dbgfs_dir; | 41 | struct dentry *dbgfs_dir; |
| 36 | 42 | ||
| @@ -46,16 +52,9 @@ struct olpc_ec_priv { | |||
| 46 | bool suspended; | 52 | bool suspended; |
| 47 | }; | 53 | }; |
| 48 | 54 | ||
| 49 | static void olpc_ec_worker(struct work_struct *w); | ||
| 50 | |||
| 51 | static DECLARE_WORK(ec_worker, olpc_ec_worker); | ||
| 52 | static LIST_HEAD(ec_cmd_q); | ||
| 53 | static DEFINE_SPINLOCK(ec_cmd_q_lock); | ||
| 54 | |||
| 55 | static struct olpc_ec_driver *ec_driver; | 55 | static struct olpc_ec_driver *ec_driver; |
| 56 | static struct olpc_ec_priv *ec_priv; | 56 | static struct olpc_ec_priv *ec_priv; |
| 57 | static void *ec_cb_arg; | 57 | static void *ec_cb_arg; |
| 58 | static DEFINE_MUTEX(ec_cb_lock); | ||
| 59 | 58 | ||
| 60 | void olpc_ec_driver_register(struct olpc_ec_driver *drv, void *arg) | 59 | void olpc_ec_driver_register(struct olpc_ec_driver *drv, void *arg) |
| 61 | { | 60 | { |
| @@ -66,49 +65,51 @@ EXPORT_SYMBOL_GPL(olpc_ec_driver_register); | |||
| 66 | 65 | ||
| 67 | static void olpc_ec_worker(struct work_struct *w) | 66 | static void olpc_ec_worker(struct work_struct *w) |
| 68 | { | 67 | { |
| 68 | struct olpc_ec_priv *ec = container_of(w, struct olpc_ec_priv, worker); | ||
| 69 | struct ec_cmd_desc *desc = NULL; | 69 | struct ec_cmd_desc *desc = NULL; |
| 70 | unsigned long flags; | 70 | unsigned long flags; |
| 71 | 71 | ||
| 72 | /* Grab the first pending command from the queue */ | 72 | /* Grab the first pending command from the queue */ |
| 73 | spin_lock_irqsave(&ec_cmd_q_lock, flags); | 73 | spin_lock_irqsave(&ec->cmd_q_lock, flags); |
| 74 | if (!list_empty(&ec_cmd_q)) { | 74 | if (!list_empty(&ec->cmd_q)) { |
| 75 | desc = list_first_entry(&ec_cmd_q, struct ec_cmd_desc, node); | 75 | desc = list_first_entry(&ec->cmd_q, struct ec_cmd_desc, node); |
| 76 | list_del(&desc->node); | 76 | list_del(&desc->node); |
| 77 | } | 77 | } |
| 78 | spin_unlock_irqrestore(&ec_cmd_q_lock, flags); | 78 | spin_unlock_irqrestore(&ec->cmd_q_lock, flags); |
| 79 | 79 | ||
| 80 | /* Do we actually have anything to do? */ | 80 | /* Do we actually have anything to do? */ |
| 81 | if (!desc) | 81 | if (!desc) |
| 82 | return; | 82 | return; |
| 83 | 83 | ||
| 84 | /* Protect the EC hw with a mutex; only run one cmd at a time */ | 84 | /* Protect the EC hw with a mutex; only run one cmd at a time */ |
| 85 | mutex_lock(&ec_cb_lock); | 85 | mutex_lock(&ec->cmd_lock); |
| 86 | desc->err = ec_driver->ec_cmd(desc->cmd, desc->inbuf, desc->inlen, | 86 | desc->err = ec_driver->ec_cmd(desc->cmd, desc->inbuf, desc->inlen, |
| 87 | desc->outbuf, desc->outlen, ec_cb_arg); | 87 | desc->outbuf, desc->outlen, ec_cb_arg); |
| 88 | mutex_unlock(&ec_cb_lock); | 88 | mutex_unlock(&ec->cmd_lock); |
| 89 | 89 | ||
| 90 | /* Finished, wake up olpc_ec_cmd() */ | 90 | /* Finished, wake up olpc_ec_cmd() */ |
| 91 | complete(&desc->finished); | 91 | complete(&desc->finished); |
| 92 | 92 | ||
| 93 | /* Run the worker thread again in case there are more cmds pending */ | 93 | /* Run the worker thread again in case there are more cmds pending */ |
| 94 | schedule_work(&ec_worker); | 94 | schedule_work(&ec->worker); |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | /* | 97 | /* |
| 98 | * Throw a cmd descripter onto the list. We now have SMP OLPC machines, so | 98 | * Throw a cmd descripter onto the list. We now have SMP OLPC machines, so |
| 99 | * locking is pretty critical. | 99 | * locking is pretty critical. |
| 100 | */ | 100 | */ |
| 101 | static void queue_ec_descriptor(struct ec_cmd_desc *desc) | 101 | static void queue_ec_descriptor(struct ec_cmd_desc *desc, |
| 102 | struct olpc_ec_priv *ec) | ||
| 102 | { | 103 | { |
| 103 | unsigned long flags; | 104 | unsigned long flags; |
| 104 | 105 | ||
| 105 | INIT_LIST_HEAD(&desc->node); | 106 | INIT_LIST_HEAD(&desc->node); |
| 106 | 107 | ||
| 107 | spin_lock_irqsave(&ec_cmd_q_lock, flags); | 108 | spin_lock_irqsave(&ec->cmd_q_lock, flags); |
| 108 | list_add_tail(&desc->node, &ec_cmd_q); | 109 | list_add_tail(&desc->node, &ec->cmd_q); |
| 109 | spin_unlock_irqrestore(&ec_cmd_q_lock, flags); | 110 | spin_unlock_irqrestore(&ec->cmd_q_lock, flags); |
| 110 | 111 | ||
| 111 | schedule_work(&ec_worker); | 112 | schedule_work(&ec->worker); |
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf, size_t outlen) | 115 | int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf, size_t outlen) |
| @@ -137,7 +138,7 @@ int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf, size_t outlen) | |||
| 137 | desc.err = 0; | 138 | desc.err = 0; |
| 138 | init_completion(&desc.finished); | 139 | init_completion(&desc.finished); |
| 139 | 140 | ||
| 140 | queue_ec_descriptor(&desc); | 141 | queue_ec_descriptor(&desc, ec); |
| 141 | 142 | ||
| 142 | /* Timeouts must be handled in the platform-specific EC hook */ | 143 | /* Timeouts must be handled in the platform-specific EC hook */ |
| 143 | wait_for_completion(&desc.finished); | 144 | wait_for_completion(&desc.finished); |
| @@ -266,7 +267,14 @@ static int olpc_ec_probe(struct platform_device *pdev) | |||
| 266 | ec = kzalloc(sizeof(*ec), GFP_KERNEL); | 267 | ec = kzalloc(sizeof(*ec), GFP_KERNEL); |
| 267 | if (!ec) | 268 | if (!ec) |
| 268 | return -ENOMEM; | 269 | return -ENOMEM; |
| 270 | |||
| 269 | ec->drv = ec_driver; | 271 | ec->drv = ec_driver; |
| 272 | INIT_WORK(&ec->worker, olpc_ec_worker); | ||
| 273 | mutex_init(&ec->cmd_lock); | ||
| 274 | |||
| 275 | INIT_LIST_HEAD(&ec->cmd_q); | ||
| 276 | spin_lock_init(&ec->cmd_q_lock); | ||
| 277 | |||
| 270 | ec_priv = ec; | 278 | ec_priv = ec; |
| 271 | platform_set_drvdata(pdev, ec); | 279 | platform_set_drvdata(pdev, ec); |
| 272 | 280 | ||
