aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-samsung/adc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-samsung/adc.c')
-rw-r--r--arch/arm/plat-samsung/adc.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c
index ee8deef19481..33ecd0c9f0c3 100644
--- a/arch/arm/plat-samsung/adc.c
+++ b/arch/arm/plat-samsung/adc.c
@@ -41,6 +41,8 @@
41 41
42enum s3c_cpu_type { 42enum s3c_cpu_type {
43 TYPE_ADCV1, /* S3C24XX */ 43 TYPE_ADCV1, /* S3C24XX */
44 TYPE_ADCV11, /* S3C2443 */
45 TYPE_ADCV12, /* S3C2416, S3C2450 */
44 TYPE_ADCV2, /* S3C64XX, S5P64X0, S5PC100 */ 46 TYPE_ADCV2, /* S3C64XX, S5P64X0, S5PC100 */
45 TYPE_ADCV3, /* S5PV210, S5PC110, EXYNOS4210 */ 47 TYPE_ADCV3, /* S5PV210, S5PC110, EXYNOS4210 */
46}; 48};
@@ -98,13 +100,17 @@ static inline void s3c_adc_select(struct adc_device *adc,
98 100
99 client->select_cb(client, 1); 101 client->select_cb(client, 1);
100 102
101 con &= ~S3C2410_ADCCON_MUXMASK; 103 if (cpu == TYPE_ADCV1 || cpu == TYPE_ADCV2)
104 con &= ~S3C2410_ADCCON_MUXMASK;
102 con &= ~S3C2410_ADCCON_STDBM; 105 con &= ~S3C2410_ADCCON_STDBM;
103 con &= ~S3C2410_ADCCON_STARTMASK; 106 con &= ~S3C2410_ADCCON_STARTMASK;
104 107
105 if (!client->is_ts) { 108 if (!client->is_ts) {
106 if (cpu == TYPE_ADCV3) 109 if (cpu == TYPE_ADCV3)
107 writel(client->channel & 0xf, adc->regs + S5P_ADCMUX); 110 writel(client->channel & 0xf, adc->regs + S5P_ADCMUX);
111 else if (cpu == TYPE_ADCV11 || cpu == TYPE_ADCV12)
112 writel(client->channel & 0xf,
113 adc->regs + S3C2443_ADCMUX);
108 else 114 else
109 con |= S3C2410_ADCCON_SELMUX(client->channel); 115 con |= S3C2410_ADCCON_SELMUX(client->channel);
110 } 116 }
@@ -293,13 +299,13 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
293 299
294 client->nr_samples--; 300 client->nr_samples--;
295 301
296 if (cpu != TYPE_ADCV1) { 302 if (cpu == TYPE_ADCV1 || cpu == TYPE_ADCV11) {
297 /* S3C64XX/S5P ADC resolution is 12-bit */
298 data0 &= 0xfff;
299 data1 &= 0xfff;
300 } else {
301 data0 &= 0x3ff; 303 data0 &= 0x3ff;
302 data1 &= 0x3ff; 304 data1 &= 0x3ff;
305 } else {
306 /* S3C2416/S3C64XX/S5P ADC resolution is 12-bit */
307 data0 &= 0xfff;
308 data1 &= 0xfff;
303 } 309 }
304 310
305 if (client->convert_cb) 311 if (client->convert_cb)
@@ -320,7 +326,7 @@ static irqreturn_t s3c_adc_irq(int irq, void *pw)
320 } 326 }
321 327
322exit: 328exit:
323 if (cpu != TYPE_ADCV1) { 329 if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3) {
324 /* Clear ADC interrupt */ 330 /* Clear ADC interrupt */
325 writel(0, adc->regs + S3C64XX_ADCCLRINT); 331 writel(0, adc->regs + S3C64XX_ADCCLRINT);
326 } 332 }
@@ -332,6 +338,7 @@ static int s3c_adc_probe(struct platform_device *pdev)
332 struct device *dev = &pdev->dev; 338 struct device *dev = &pdev->dev;
333 struct adc_device *adc; 339 struct adc_device *adc;
334 struct resource *regs; 340 struct resource *regs;
341 enum s3c_cpu_type cpu = platform_get_device_id(pdev)->driver_data;
335 int ret; 342 int ret;
336 unsigned tmp; 343 unsigned tmp;
337 344
@@ -394,10 +401,13 @@ static int s3c_adc_probe(struct platform_device *pdev)
394 clk_enable(adc->clk); 401 clk_enable(adc->clk);
395 402
396 tmp = adc->prescale | S3C2410_ADCCON_PRSCEN; 403 tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
397 if (platform_get_device_id(pdev)->driver_data != TYPE_ADCV1) { 404
398 /* Enable 12-bit ADC resolution */ 405 /* Enable 12-bit ADC resolution */
406 if (cpu == TYPE_ADCV12)
407 tmp |= S3C2416_ADCCON_RESSEL;
408 if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
399 tmp |= S3C64XX_ADCCON_RESSEL; 409 tmp |= S3C64XX_ADCCON_RESSEL;
400 } 410
401 writel(tmp, adc->regs + S3C2410_ADCCON); 411 writel(tmp, adc->regs + S3C2410_ADCCON);
402 412
403 dev_info(dev, "attached adc driver\n"); 413 dev_info(dev, "attached adc driver\n");
@@ -464,6 +474,7 @@ static int s3c_adc_resume(struct device *dev)
464 struct platform_device *pdev = container_of(dev, 474 struct platform_device *pdev = container_of(dev,
465 struct platform_device, dev); 475 struct platform_device, dev);
466 struct adc_device *adc = platform_get_drvdata(pdev); 476 struct adc_device *adc = platform_get_drvdata(pdev);
477 enum s3c_cpu_type cpu = platform_get_device_id(pdev)->driver_data;
467 int ret; 478 int ret;
468 unsigned long tmp; 479 unsigned long tmp;
469 480
@@ -474,9 +485,13 @@ static int s3c_adc_resume(struct device *dev)
474 enable_irq(adc->irq); 485 enable_irq(adc->irq);
475 486
476 tmp = adc->prescale | S3C2410_ADCCON_PRSCEN; 487 tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
488
477 /* Enable 12-bit ADC resolution */ 489 /* Enable 12-bit ADC resolution */
478 if (platform_get_device_id(pdev)->driver_data != TYPE_ADCV1) 490 if (cpu == TYPE_ADCV12)
491 tmp |= S3C2416_ADCCON_RESSEL;
492 if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
479 tmp |= S3C64XX_ADCCON_RESSEL; 493 tmp |= S3C64XX_ADCCON_RESSEL;
494
480 writel(tmp, adc->regs + S3C2410_ADCCON); 495 writel(tmp, adc->regs + S3C2410_ADCCON);
481 496
482 return 0; 497 return 0;
@@ -492,6 +507,12 @@ static struct platform_device_id s3c_adc_driver_ids[] = {
492 .name = "s3c24xx-adc", 507 .name = "s3c24xx-adc",
493 .driver_data = TYPE_ADCV1, 508 .driver_data = TYPE_ADCV1,
494 }, { 509 }, {
510 .name = "s3c2443-adc",
511 .driver_data = TYPE_ADCV11,
512 }, {
513 .name = "s3c2416-adc",
514 .driver_data = TYPE_ADCV12,
515 }, {
495 .name = "s3c64xx-adc", 516 .name = "s3c64xx-adc",
496 .driver_data = TYPE_ADCV2, 517 .driver_data = TYPE_ADCV2,
497 }, { 518 }, {