Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 205894
b: refs/heads/master
c: 59883ba
h: refs/heads/master
v: v3
  • Loading branch information
Jonathan Cameron authored and Greg Kroah-Hartman committed Jul 22, 2010
1 parent 28e7ecf commit 8b852b4
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 43c11b4373f6fcaf8ce02ea5ea95d764edd87040
refs/heads/master: 59883ba170bc280787ad9d5decd7677cf6c38ef8
44 changes: 44 additions & 0 deletions trunk/drivers/staging/iio/ring_sw.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <linux/device.h>
#include <linux/workqueue.h>
#include "ring_sw.h"
#include "trigger.h"

static inline int __iio_allocate_sw_ring_buffer(struct iio_sw_ring_buffer *ring,
int bytes_per_datum, int length)
Expand Down Expand Up @@ -456,5 +457,48 @@ int iio_sw_ring_preenable(struct iio_dev *indio_dev)
}
EXPORT_SYMBOL(iio_sw_ring_preenable);

void iio_sw_trigger_bh_to_ring(struct work_struct *work_s)
{
struct iio_sw_ring_helper_state *st
= container_of(work_s, struct iio_sw_ring_helper_state,
work_trigger_to_ring);
int len = 0;
size_t datasize = st->indio_dev
->ring->access.get_bpd(st->indio_dev->ring);
char *data = kmalloc(datasize, GFP_KERNEL);

if (data == NULL) {
dev_err(st->indio_dev->dev.parent,
"memory alloc failed in ring bh");
return;
}

if (st->indio_dev->scan_count)
len = st->get_ring_element(st, data);

/* Guaranteed to be aligned with 8 byte boundary */
if (st->indio_dev->scan_timestamp)
*(s64 *)(((u32)data + len
+ sizeof(s64) - 1) & ~(sizeof(s64) - 1))
= st->last_timestamp;
st->indio_dev->ring->access.store_to(st->indio_dev->ring,
(u8 *)data,
st->last_timestamp);

iio_trigger_notify_done(st->indio_dev->trig);
kfree(data);

return;
}
EXPORT_SYMBOL(iio_sw_trigger_bh_to_ring);

void iio_sw_poll_func_th(struct iio_dev *indio_dev, s64 time)
{ struct iio_sw_ring_helper_state *h
= iio_dev_get_devdata(indio_dev);
h->last_timestamp = time;
schedule_work(&h->work_trigger_to_ring);
}
EXPORT_SYMBOL(iio_sw_poll_func_th);

MODULE_DESCRIPTION("Industrialio I/O software ring buffer");
MODULE_LICENSE("GPL");
10 changes: 10 additions & 0 deletions trunk/drivers/staging/iio/ring_sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,16 @@ void iio_sw_rb_free(struct iio_ring_buffer *ring);

int iio_sw_ring_preenable(struct iio_dev *indio_dev);

struct iio_sw_ring_helper_state {
struct work_struct work_trigger_to_ring;
struct iio_dev *indio_dev;
int (*get_ring_element)(struct iio_sw_ring_helper_state *st, u8 *buf);
s64 last_timestamp;
};

void iio_sw_poll_func_th(struct iio_dev *indio_dev, s64 time);
void iio_sw_trigger_bh_to_ring(struct work_struct *work_s);

#else /* CONFIG_IIO_RING_BUFFER*/
static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs *ra)
{};
Expand Down

0 comments on commit 8b852b4

Please sign in to comment.