aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Kaehlcke <matthias.kaehlcke@gmail.com>2007-05-08 03:32:02 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 14:15:15 -0400
commitd081d470446900473f2f32b9203827809b8134f0 (patch)
tree82ea52ec3c101593779349b1c6c4ca507cdcfe56
parent69f545ea6aa9cf0a1b2e31b287e17f4cd9eb6d93 (diff)
use mutex instead of semaphore in TPM driver
The TPM driver uses two semaphores as mutexes. Use the mutex API instead of the (binary) semaphores. Signed-off-by: Matthias Kaehlcke <matthias.kaehlcke@gmail.com> Cc: Kylene Hall <kjhall@us.ibm.com> Cc: Marcel Selhorst <tpm@selhorst.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/char/tpm/tpm.c24
-rw-r--r--drivers/char/tpm/tpm.h5
2 files changed, 16 insertions, 13 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index ef991cd8c024..9bb542913b86 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -24,7 +24,9 @@
24 */ 24 */
25 25
26#include <linux/poll.h> 26#include <linux/poll.h>
27#include <linux/mutex.h>
27#include <linux/spinlock.h> 28#include <linux/spinlock.h>
29
28#include "tpm.h" 30#include "tpm.h"
29 31
30enum tpm_const { 32enum tpm_const {
@@ -328,10 +330,10 @@ static void timeout_work(struct work_struct *work)
328{ 330{
329 struct tpm_chip *chip = container_of(work, struct tpm_chip, work); 331 struct tpm_chip *chip = container_of(work, struct tpm_chip, work);
330 332
331 down(&chip->buffer_mutex); 333 mutex_lock(&chip->buffer_mutex);
332 atomic_set(&chip->data_pending, 0); 334 atomic_set(&chip->data_pending, 0);
333 memset(chip->data_buffer, 0, TPM_BUFSIZE); 335 memset(chip->data_buffer, 0, TPM_BUFSIZE);
334 up(&chip->buffer_mutex); 336 mutex_unlock(&chip->buffer_mutex);
335} 337}
336 338
337/* 339/*
@@ -380,7 +382,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
380 return -E2BIG; 382 return -E2BIG;
381 } 383 }
382 384
383 down(&chip->tpm_mutex); 385 mutex_lock(&chip->tpm_mutex);
384 386
385 if ((rc = chip->vendor.send(chip, (u8 *) buf, count)) < 0) { 387 if ((rc = chip->vendor.send(chip, (u8 *) buf, count)) < 0) {
386 dev_err(chip->dev, 388 dev_err(chip->dev,
@@ -419,7 +421,7 @@ out_recv:
419 dev_err(chip->dev, 421 dev_err(chip->dev,
420 "tpm_transmit: tpm_recv: error %zd\n", rc); 422 "tpm_transmit: tpm_recv: error %zd\n", rc);
421out: 423out:
422 up(&chip->tpm_mutex); 424 mutex_unlock(&chip->tpm_mutex);
423 return rc; 425 return rc;
424} 426}
425 427
@@ -966,14 +968,14 @@ ssize_t tpm_write(struct file *file, const char __user *buf,
966 while (atomic_read(&chip->data_pending) != 0) 968 while (atomic_read(&chip->data_pending) != 0)
967 msleep(TPM_TIMEOUT); 969 msleep(TPM_TIMEOUT);
968 970
969 down(&chip->buffer_mutex); 971 mutex_lock(&chip->buffer_mutex);
970 972
971 if (in_size > TPM_BUFSIZE) 973 if (in_size > TPM_BUFSIZE)
972 in_size = TPM_BUFSIZE; 974 in_size = TPM_BUFSIZE;
973 975
974 if (copy_from_user 976 if (copy_from_user
975 (chip->data_buffer, (void __user *) buf, in_size)) { 977 (chip->data_buffer, (void __user *) buf, in_size)) {
976 up(&chip->buffer_mutex); 978 mutex_unlock(&chip->buffer_mutex);
977 return -EFAULT; 979 return -EFAULT;
978 } 980 }
979 981
@@ -981,7 +983,7 @@ ssize_t tpm_write(struct file *file, const char __user *buf,
981 out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE); 983 out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE);
982 984
983 atomic_set(&chip->data_pending, out_size); 985 atomic_set(&chip->data_pending, out_size);
984 up(&chip->buffer_mutex); 986 mutex_unlock(&chip->buffer_mutex);
985 987
986 /* Set a timeout by which the reader must come claim the result */ 988 /* Set a timeout by which the reader must come claim the result */
987 mod_timer(&chip->user_read_timer, jiffies + (60 * HZ)); 989 mod_timer(&chip->user_read_timer, jiffies + (60 * HZ));
@@ -1004,10 +1006,10 @@ ssize_t tpm_read(struct file *file, char __user *buf,
1004 if (size < ret_size) 1006 if (size < ret_size)
1005 ret_size = size; 1007 ret_size = size;
1006 1008
1007 down(&chip->buffer_mutex); 1009 mutex_lock(&chip->buffer_mutex);
1008 if (copy_to_user(buf, chip->data_buffer, ret_size)) 1010 if (copy_to_user(buf, chip->data_buffer, ret_size))
1009 ret_size = -EFAULT; 1011 ret_size = -EFAULT;
1010 up(&chip->buffer_mutex); 1012 mutex_unlock(&chip->buffer_mutex);
1011 } 1013 }
1012 1014
1013 return ret_size; 1015 return ret_size;
@@ -1105,8 +1107,8 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend
1105 return NULL; 1107 return NULL;
1106 } 1108 }
1107 1109
1108 init_MUTEX(&chip->buffer_mutex); 1110 mutex_init(&chip->buffer_mutex);
1109 init_MUTEX(&chip->tpm_mutex); 1111 mutex_init(&chip->tpm_mutex);
1110 INIT_LIST_HEAD(&chip->list); 1112 INIT_LIST_HEAD(&chip->list);
1111 1113
1112 INIT_WORK(&chip->work, timeout_work); 1114 INIT_WORK(&chip->work, timeout_work);
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 9f273f032b0f..b2e2b002a1bb 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -21,6 +21,7 @@
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/fs.h> 23#include <linux/fs.h>
24#include <linux/mutex.h>
24#include <linux/sched.h> 25#include <linux/sched.h>
25#include <linux/miscdevice.h> 26#include <linux/miscdevice.h>
26#include <linux/platform_device.h> 27#include <linux/platform_device.h>
@@ -94,11 +95,11 @@ struct tpm_chip {
94 /* Data passed to and from the tpm via the read/write calls */ 95 /* Data passed to and from the tpm via the read/write calls */
95 u8 *data_buffer; 96 u8 *data_buffer;
96 atomic_t data_pending; 97 atomic_t data_pending;
97 struct semaphore buffer_mutex; 98 struct mutex buffer_mutex;
98 99
99 struct timer_list user_read_timer; /* user needs to claim result */ 100 struct timer_list user_read_timer; /* user needs to claim result */
100 struct work_struct work; 101 struct work_struct work;
101 struct semaphore tpm_mutex; /* tpm is processing */ 102 struct mutex tpm_mutex; /* tpm is processing */
102 103
103 struct tpm_vendor_specific vendor; 104 struct tpm_vendor_specific vendor;
104 105