aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorBrian Swetland <swetland@google.com>2009-12-07 18:28:08 -0500
committerDaniel Walker <dwalker@codeaurora.org>2010-05-12 12:15:31 -0400
commit636eb9cbaef7989ce7809a0d842bf78470a0a1f4 (patch)
tree1a12088ad69cb37d5e3f3f25bdf03c7c9e8a7846 /arch/arm
parent1207babdcdfe5501d1528c86b445a9d1045ecc01 (diff)
msm: smd: provide atomic channel writes
Some smd clients may write from multiple threads, in which case it's not safe to call smd_write without holding a lock. smd_write_atomic() provides the same functionality as smd_write() but obtains the smd lock first. Signed-off-by: Brian Swetland <swetland@google.com> Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-msm/include/mach/msm_smd.h1
-rw-r--r--arch/arm/mach-msm/smd.c10
2 files changed, 11 insertions, 0 deletions
diff --git a/arch/arm/mach-msm/include/mach/msm_smd.h b/arch/arm/mach-msm/include/mach/msm_smd.h
index bdf7731ab680..aa076e466e4c 100644
--- a/arch/arm/mach-msm/include/mach/msm_smd.h
+++ b/arch/arm/mach-msm/include/mach/msm_smd.h
@@ -38,6 +38,7 @@ int smd_read(smd_channel_t *ch, void *data, int len);
38** it will return the requested length written or an error. 38** it will return the requested length written or an error.
39*/ 39*/
40int smd_write(smd_channel_t *ch, const void *data, int len); 40int smd_write(smd_channel_t *ch, const void *data, int len);
41int smd_write_atomic(smd_channel_t *ch, const void *data, int len);
41 42
42int smd_write_avail(smd_channel_t *ch); 43int smd_write_avail(smd_channel_t *ch);
43int smd_read_avail(smd_channel_t *ch); 44int smd_read_avail(smd_channel_t *ch);
diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c
index 655fe42506ca..086fd77dc891 100644
--- a/arch/arm/mach-msm/smd.c
+++ b/arch/arm/mach-msm/smd.c
@@ -804,6 +804,16 @@ int smd_write(smd_channel_t *ch, const void *data, int len)
804 return ch->write(ch, data, len); 804 return ch->write(ch, data, len);
805} 805}
806 806
807int smd_write_atomic(smd_channel_t *ch, const void *data, int len)
808{
809 unsigned long flags;
810 int res;
811 spin_lock_irqsave(&smd_lock, flags);
812 res = ch->write(ch, data, len);
813 spin_unlock_irqrestore(&smd_lock, flags);
814 return res;
815}
816
807int smd_read_avail(smd_channel_t *ch) 817int smd_read_avail(smd_channel_t *ch)
808{ 818{
809 return ch->read_avail(ch); 819 return ch->read_avail(ch);