int s3c_adc_get_adc_data(int channel) { int adc_value = 0; int cur_adc_port = 0; #ifdef ADC_WITH_TOUCHSCREEN mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); #else mutex_lock(&adc_mutex); #endif cur_adc_port = adc_port; adc_port = channel; adc_value = s3c_adc_convert(); adc_port = cur_adc_port; #ifdef ADC_WITH_TOUCHSCREEN s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); #else mutex_unlock(&adc_mutex); #endif pr_debug("%s : Converted Value: %03d\n", __FUNCTION__, adc_value); return adc_value; }
static ssize_t s3c_adc_read(struct file *file, char __user * buffer, size_t size, loff_t * pos) { int adc_value = 0; printk(KERN_INFO " s3c_adc_read() entered\n"); #ifdef ADC_WITH_TOUCHSCREEN mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); #endif adc_value = s3c_adc_convert(); #ifdef ADC_WITH_TOUCHSCREEN s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); #endif printk(KERN_INFO " Converted Value: %03d\n", adc_value); if (copy_to_user(buffer, &adc_value, sizeof(unsigned int))) { return -EFAULT; } return sizeof(unsigned int); }
unsigned int get_s3c_adc_convert(int channel) { unsigned int adc_return = 0; unsigned long data0; unsigned long data1; mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); writel((channel & 0x7), base_addr + S3C_ADCMUX); udelay(10); writel(readl(base_addr + S3C_ADCCON) | S3C_ADCCON_ENABLE_START, base_addr + S3C_ADCCON); do { msleep(1); data0 = readl(base_addr + S3C_ADCCON); } while (!(data0 & S3C_ADCCON_ECFLG)); data1 = readl(base_addr + S3C_ADCDAT0); if (plat_data->resolution == 12) adc_return = data1 & S3C_ADCDAT0_XPDATA_MASK_12BIT; else adc_return = data1 & S3C_ADCDAT0_XPDATA_MASK; s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); return adc_return; }
static ssize_t s3c_adc_read(struct file *file, char __user *buffer, size_t size, loff_t *pos) { int adc_value = 0; mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); printk(KERN_INFO "## delay: %d\n", readl(base_addr + S3C_ADCDLY)); adc_value = s3c_adc_convert(); s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); if (copy_to_user(buffer, &adc_value, sizeof(unsigned int))) return -EFAULT; return sizeof(unsigned int); }
int s3c_adc_get_adc_data(int channel) { int adc_value = 0; int cur_adc_port = 0; mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); cur_adc_port = adc_port; adc_port = channel; adc_value = s3c_adc_convert(); adc_port = cur_adc_port; s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); pr_debug("%s : Converted Value: %03d\n", __func__, adc_value); return adc_value; }
int s3c_adc_convert_temp_data() { int temprature; #ifdef ADC_WITH_TOUCHSCREEN mutex_lock(&adc_mutex); s3c_adc_save_SFR_on_ADC(); #else mutex_lock(&adc_mutex); #endif s3c_adc_get_data(); temprature =s3c_adc_convert_data(); #ifdef ADC_WITH_TOUCHSCREEN s3c_adc_restore_SFR_on_ADC(); mutex_unlock(&adc_mutex); #else mutex_unlock(&adc_mutex); #endif return temprature; }
static int __devinit s3c_adc_probe(struct platform_device *pdev) { struct resource *res; struct device *dev; int ret; int size; g_ts0_base = ioremap(0xE1700000, 1024); if (g_ts0_base == NULL) { printk("ts0 base map failed\n"); return -ENOENT; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); dev = &pdev->dev; if (res == NULL) { dev_err(dev, "no memory resource specified\n"); return -ENOENT; } size = (res->end - res->start) + 1; adc_mem = request_mem_region(res->start, size, pdev->name); if (adc_mem == NULL) { dev_err(dev, "failed to get memory region\n"); ret = -ENOENT; goto err_req; } base_addr = ioremap(res->start, size); if (base_addr == NULL) { dev_err(dev, "fail to ioremap() region\n"); ret = -ENOENT; goto err_map; } adc_clock = clk_get(&pdev->dev, "adc"); if (IS_ERR(adc_clock)) { dev_err(dev, "failed to fine ADC clock source\n"); ret = PTR_ERR(adc_clock); goto err_clk; } clk_enable(adc_clock); /* read platform data from device struct */ plat_data = s3c_adc_get_platdata(&pdev->dev); if ((plat_data->presc & 0xff) > 0) writel(S3C_ADCCON_PRSCEN | S3C_ADCCON_PRSCVL(plat_data->presc & 0xff), base_addr + S3C_ADCCON); else writel(0, base_addr + S3C_ADCCON); /* Initialise registers */ if ((plat_data->delay & 0xffff) > 0) writel(plat_data->delay & 0xffff, base_addr + S3C_ADCDLY); if (plat_data->resolution == 12) writel(readl(base_addr + S3C_ADCCON) | S3C_ADCCON_RESSEL_12BIT, base_addr + S3C_ADCCON); //writel((readl(base_addr + S3C_ADCCON) | S3C_ADCCON_STDBM) & ~S3C_ADCCON_PRSCEN, //base_addr + S3C_ADCCON); s3c_adc_restore_SFR_on_ADC(); ret = misc_register(&s3c_adc_miscdev); if (ret) { printk(KERN_ERR "cannot register miscdev on minor=%d (%d)\n", ADC_MINOR, ret); goto err_clk; } return 0; err_clk: clk_disable(adc_clock); clk_put(adc_clock); err_map: iounmap(base_addr); err_req: release_resource(adc_mem); kfree(adc_mem); return ret; }