Commit 636eb9cb authored by Brian Swetland's avatar Brian Swetland Committed by Daniel Walker

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: default avatarBrian Swetland <swetland@google.com>
Signed-off-by: default avatarDaniel Walker <dwalker@codeaurora.org>
parent 1207babd
...@@ -38,6 +38,7 @@ int smd_read(smd_channel_t *ch, void *data, int len); ...@@ -38,6 +38,7 @@ int smd_read(smd_channel_t *ch, void *data, int len);
** it will return the requested length written or an error. ** it will return the requested length written or an error.
*/ */
int smd_write(smd_channel_t *ch, const void *data, int len); int smd_write(smd_channel_t *ch, const void *data, int len);
int smd_write_atomic(smd_channel_t *ch, const void *data, int len);
int smd_write_avail(smd_channel_t *ch); int smd_write_avail(smd_channel_t *ch);
int smd_read_avail(smd_channel_t *ch); int smd_read_avail(smd_channel_t *ch);
......
...@@ -804,6 +804,16 @@ int smd_write(smd_channel_t *ch, const void *data, int len) ...@@ -804,6 +804,16 @@ int smd_write(smd_channel_t *ch, const void *data, int len)
return ch->write(ch, data, len); return ch->write(ch, data, len);
} }
int smd_write_atomic(smd_channel_t *ch, const void *data, int len)
{
unsigned long flags;
int res;
spin_lock_irqsave(&smd_lock, flags);
res = ch->write(ch, data, len);
spin_unlock_irqrestore(&smd_lock, flags);
return res;
}
int smd_read_avail(smd_channel_t *ch) int smd_read_avail(smd_channel_t *ch)
{ {
return ch->read_avail(ch); return ch->read_avail(ch);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment