#include <linux/clk.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/regulator/consumer.h>
 
 #include <plat/regs-adc.h>
 #include <plat/adc.h>
        unsigned int             prescale;
 
        int                      irq;
+       struct regulator        *vdd;
 };
 
 static struct adc_device *adc_dev;
        adc->pdev = pdev;
        adc->prescale = S3C2410_ADCCON_PRSCVL(49);
 
+       adc->vdd = regulator_get(dev, "vdd");
+       if (IS_ERR(adc->vdd)) {
+               dev_err(dev, "operating without regulator \"vdd\" .\n");
+               ret = PTR_ERR(adc->vdd);
+               goto err_alloc;
+       }
+
        adc->irq = platform_get_irq(pdev, 1);
        if (adc->irq <= 0) {
                dev_err(dev, "failed to get adc irq\n");
                ret = -ENOENT;
-               goto err_alloc;
+               goto err_reg;
        }
 
        ret = request_irq(adc->irq, s3c_adc_irq, 0, dev_name(dev), adc);
        if (ret < 0) {
                dev_err(dev, "failed to attach adc irq\n");
-               goto err_alloc;
+               goto err_reg;
        }
 
        adc->clk = clk_get(dev, "adc");
                goto err_clk;
        }
 
+       ret = regulator_enable(adc->vdd);
+       if (ret)
+               goto err_ioremap;
+
        clk_enable(adc->clk);
 
        tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
 
        return 0;
 
+ err_ioremap:
+       iounmap(adc->regs);
  err_clk:
        clk_put(adc->clk);
 
  err_irq:
        free_irq(adc->irq, adc);
-
+ err_reg:
+       regulator_put(adc->vdd);
  err_alloc:
        kfree(adc);
        return ret;
        iounmap(adc->regs);
        free_irq(adc->irq, adc);
        clk_disable(adc->clk);
+       regulator_disable(adc->vdd);
+       regulator_put(adc->vdd);
        clk_put(adc->clk);
        kfree(adc);
 
        disable_irq(adc->irq);
        spin_unlock_irqrestore(&adc->lock, flags);
        clk_disable(adc->clk);
+       regulator_disable(adc->vdd);
 
        return 0;
 }
 static int s3c_adc_resume(struct platform_device *pdev)
 {
        struct adc_device *adc = platform_get_drvdata(pdev);
+       int ret;
 
+       ret = regulator_enable(adc->vdd);
+       if (ret)
+               return ret;
        clk_enable(adc->clk);
        enable_irq(adc->irq);
 
        return ret;
 }
 
-arch_initcall(adc_init);
+module_init(adc_init);