Skip to content

Commit

Permalink
[ARM] S3C: ADC: Expose number of remaining conversions to
Browse files Browse the repository at this point in the history
convert callback

This patch allow us to efficiently modify the number of
remaining conversions from the client side. This us useful
when we do not know in advance how many conversions we will
need or when we need to cancel pending conversions.

This change is simple enough to be compatible with existing
code that can just define the new pointer in the callback
and ignore it.

Sample usage:

http://tinyurl.com/s3c2410-ts-c (function stylus_adc_action).

Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
  • Loading branch information
Nelson Castillo authored and Ben Dooks committed May 16, 2009
1 parent b57f0fe commit 3f7ea46
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
3 changes: 2 additions & 1 deletion arch/arm/plat-s3c/include/plat/adc.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ extern int s3c_adc_start(struct s3c_adc_client *client,
extern struct s3c_adc_client *
s3c_adc_register(struct platform_device *pdev,
void (*select)(unsigned selected),
void (*conv)(unsigned d0, unsigned d1),
void (*conv)(unsigned d0, unsigned d1,
unsigned *samples_left),
unsigned int is_ts);

extern void s3c_adc_release(struct s3c_adc_client *client);
Expand Down
11 changes: 7 additions & 4 deletions arch/arm/plat-s3c24xx/adc.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ struct s3c_adc_client {
unsigned char channel;

void (*select_cb)(unsigned selected);
void (*convert_cb)(unsigned val1, unsigned val2);
void (*convert_cb)(unsigned val1, unsigned val2,
unsigned *samples_left);
};

struct adc_device {
Expand Down Expand Up @@ -158,7 +159,8 @@ static void s3c_adc_default_select(unsigned select)

struct s3c_adc_client *s3c_adc_register(struct platform_device *pdev,
void (*select)(unsigned int selected),
void (*conv)(unsigned d0, unsigned d1),
void (*conv)(unsigned d0, unsigned d1,
unsigned *samples_left),
unsigned int is_ts)
{
struct s3c_adc_client *client;
Expand Down Expand Up @@ -227,9 +229,10 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
data1 = readl(adc->regs + S3C2410_ADCDAT1);
adc_dbg(adc, "read %d: 0x%04x, 0x%04x\n", client->nr_samples, data0, data1);

(client->convert_cb)(data0 & 0x3ff, data1 & 0x3ff);
client->nr_samples--;
(client->convert_cb)(data0 & 0x3ff, data1 & 0x3ff, &client->nr_samples);

if (--client->nr_samples > 0) {
if (client->nr_samples > 0) {
/* fire another conversion for this */

client->select_cb(1);
Expand Down

0 comments on commit 3f7ea46

Please sign in to comment.