[ARM] S3C24XX: ADC: Check pending queue before freeing adc client
authorRamax Lo <ramaxlo@gmail.com>
Tue, 14 Apr 2009 15:56:18 +0000 (23:56 +0800)
committerBen Dooks <ben-linux@fluff.org>
Fri, 17 Apr 2009 11:46:36 +0000 (12:46 +0100)
Check pending queue and remove the adc client being released.

Signed-off-by: Ramax Lo <ramaxlo@gmail.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
arch/arm/plat-s3c24xx/adc.c

index bc6f6a1..91adfa7 100644 (file)
@@ -190,6 +190,23 @@ EXPORT_SYMBOL_GPL(s3c_adc_register);
 void s3c_adc_release(struct s3c_adc_client *client)
 {
        /* We should really check that nothing is in progress. */
+       if (adc_dev->cur == client)
+               adc_dev->cur = NULL;
+       if (adc_dev->ts_pend == client)
+               adc_dev->ts_pend = NULL;
+       else {
+               struct list_head *p, *n;
+               struct s3c_adc_client *tmp;
+
+               list_for_each_safe(p, n, &adc_pending) {
+                       tmp = list_entry(p, struct s3c_adc_client, pend);
+                       if (tmp == client)
+                               list_del(&tmp->pend);
+               }
+       }
+
+       if (adc_dev->cur == NULL)
+               s3c_adc_try(adc_dev);
        kfree(client);
 }
 EXPORT_SYMBOL_GPL(s3c_adc_release);