diff options
Diffstat (limited to 'arch/arm/plat-samsung/adc.c')
-rw-r--r-- | arch/arm/plat-samsung/adc.c | 43 |
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 | ||
42 | enum s3c_cpu_type { | 42 | enum 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 | ||
322 | exit: | 328 | exit: |
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 | }, { |