|
@@ -401,3 +401,133 @@ static int s3c_adc_probe(struct platform_device *pdev)
|
|
tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
|
|
tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
|
|
|
|
|
|
/* Enable 12-bit ADC resolution */
|
|
/* Enable 12-bit ADC resolution */
|
|
|
|
+ if (cpu == TYPE_ADCV12)
|
|
|
|
+ tmp |= S3C2416_ADCCON_RESSEL;
|
|
|
|
+ if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
|
|
|
|
+ tmp |= S3C64XX_ADCCON_RESSEL;
|
|
|
|
+
|
|
|
|
+ writel(tmp, adc->regs + S3C2410_ADCCON);
|
|
|
|
+
|
|
|
|
+ dev_info(dev, "attached adc driver\n");
|
|
|
|
+
|
|
|
|
+ platform_set_drvdata(pdev, adc);
|
|
|
|
+ adc_dev = adc;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int s3c_adc_remove(struct platform_device *pdev)
|
|
|
|
+{
|
|
|
|
+ struct adc_device *adc = platform_get_drvdata(pdev);
|
|
|
|
+
|
|
|
|
+ clk_disable(adc->clk);
|
|
|
|
+ regulator_disable(adc->vdd);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
|
+static int s3c_adc_suspend(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct platform_device *pdev = container_of(dev,
|
|
|
|
+ struct platform_device, dev);
|
|
|
|
+ struct adc_device *adc = platform_get_drvdata(pdev);
|
|
|
|
+ unsigned long flags;
|
|
|
|
+ u32 con;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&adc->lock, flags);
|
|
|
|
+
|
|
|
|
+ con = readl(adc->regs + S3C2410_ADCCON);
|
|
|
|
+ con |= S3C2410_ADCCON_STDBM;
|
|
|
|
+ writel(con, adc->regs + S3C2410_ADCCON);
|
|
|
|
+
|
|
|
|
+ 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 device *dev)
|
|
|
|
+{
|
|
|
|
+ struct platform_device *pdev = container_of(dev,
|
|
|
|
+ struct platform_device, dev);
|
|
|
|
+ struct adc_device *adc = platform_get_drvdata(pdev);
|
|
|
|
+ enum s3c_cpu_type cpu = platform_get_device_id(pdev)->driver_data;
|
|
|
|
+ int ret;
|
|
|
|
+ unsigned long tmp;
|
|
|
|
+
|
|
|
|
+ ret = regulator_enable(adc->vdd);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ clk_enable(adc->clk);
|
|
|
|
+ enable_irq(adc->irq);
|
|
|
|
+
|
|
|
|
+ tmp = adc->prescale | S3C2410_ADCCON_PRSCEN;
|
|
|
|
+
|
|
|
|
+ /* Enable 12-bit ADC resolution */
|
|
|
|
+ if (cpu == TYPE_ADCV12)
|
|
|
|
+ tmp |= S3C2416_ADCCON_RESSEL;
|
|
|
|
+ if (cpu == TYPE_ADCV2 || cpu == TYPE_ADCV3)
|
|
|
|
+ tmp |= S3C64XX_ADCCON_RESSEL;
|
|
|
|
+
|
|
|
|
+ writel(tmp, adc->regs + S3C2410_ADCCON);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#else
|
|
|
|
+#define s3c_adc_suspend NULL
|
|
|
|
+#define s3c_adc_resume NULL
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+static struct platform_device_id s3c_adc_driver_ids[] = {
|
|
|
|
+ {
|
|
|
|
+ .name = "s3c24xx-adc",
|
|
|
|
+ .driver_data = TYPE_ADCV1,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "s3c2443-adc",
|
|
|
|
+ .driver_data = TYPE_ADCV11,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "s3c2416-adc",
|
|
|
|
+ .driver_data = TYPE_ADCV12,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "s3c64xx-adc",
|
|
|
|
+ .driver_data = TYPE_ADCV2,
|
|
|
|
+ }, {
|
|
|
|
+ .name = "samsung-adc-v3",
|
|
|
|
+ .driver_data = TYPE_ADCV3,
|
|
|
|
+ },
|
|
|
|
+ { }
|
|
|
|
+};
|
|
|
|
+MODULE_DEVICE_TABLE(platform, s3c_adc_driver_ids);
|
|
|
|
+
|
|
|
|
+static const struct dev_pm_ops adc_pm_ops = {
|
|
|
|
+ .suspend = s3c_adc_suspend,
|
|
|
|
+ .resume = s3c_adc_resume,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_driver s3c_adc_driver = {
|
|
|
|
+ .id_table = s3c_adc_driver_ids,
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "s3c-adc",
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ .pm = &adc_pm_ops,
|
|
|
|
+ },
|
|
|
|
+ .probe = s3c_adc_probe,
|
|
|
|
+ .remove = s3c_adc_remove,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int __init adc_init(void)
|
|
|
|
+{
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = platform_driver_register(&s3c_adc_driver);
|
|
|
|
+ if (ret)
|
|
|
|
+ printk(KERN_ERR "%s: failed to add adc driver\n", __func__);
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+module_init(adc_init);
|