Lines Matching full:info
150 void (*init_hw)(struct exynos_adc *info);
151 void (*exit_hw)(struct exynos_adc *info);
152 void (*clear_irq)(struct exynos_adc *info);
153 void (*start_conv)(struct exynos_adc *info, unsigned long addr);
156 static void exynos_adc_unprepare_clk(struct exynos_adc *info) in exynos_adc_unprepare_clk() argument
158 if (info->data->needs_sclk) in exynos_adc_unprepare_clk()
159 clk_unprepare(info->sclk); in exynos_adc_unprepare_clk()
160 clk_unprepare(info->clk); in exynos_adc_unprepare_clk()
163 static int exynos_adc_prepare_clk(struct exynos_adc *info) in exynos_adc_prepare_clk() argument
167 ret = clk_prepare(info->clk); in exynos_adc_prepare_clk()
169 dev_err(info->dev, "failed preparing adc clock: %d\n", ret); in exynos_adc_prepare_clk()
173 if (info->data->needs_sclk) { in exynos_adc_prepare_clk()
174 ret = clk_prepare(info->sclk); in exynos_adc_prepare_clk()
176 clk_unprepare(info->clk); in exynos_adc_prepare_clk()
177 dev_err(info->dev, in exynos_adc_prepare_clk()
186 static void exynos_adc_disable_clk(struct exynos_adc *info) in exynos_adc_disable_clk() argument
188 if (info->data->needs_sclk) in exynos_adc_disable_clk()
189 clk_disable(info->sclk); in exynos_adc_disable_clk()
190 clk_disable(info->clk); in exynos_adc_disable_clk()
193 static int exynos_adc_enable_clk(struct exynos_adc *info) in exynos_adc_enable_clk() argument
197 ret = clk_enable(info->clk); in exynos_adc_enable_clk()
199 dev_err(info->dev, "failed enabling adc clock: %d\n", ret); in exynos_adc_enable_clk()
203 if (info->data->needs_sclk) { in exynos_adc_enable_clk()
204 ret = clk_enable(info->sclk); in exynos_adc_enable_clk()
206 clk_disable(info->clk); in exynos_adc_enable_clk()
207 dev_err(info->dev, in exynos_adc_enable_clk()
216 static void exynos_adc_v1_init_hw(struct exynos_adc *info) in exynos_adc_v1_init_hw() argument
220 if (info->data->needs_adc_phy) in exynos_adc_v1_init_hw()
221 regmap_write(info->pmu_map, info->data->phy_offset, 1); in exynos_adc_v1_init_hw()
228 writel(con1, ADC_V1_CON(info->regs)); in exynos_adc_v1_init_hw()
231 writel(info->delay, ADC_V1_DLY(info->regs)); in exynos_adc_v1_init_hw()
234 static void exynos_adc_v1_exit_hw(struct exynos_adc *info) in exynos_adc_v1_exit_hw() argument
238 if (info->data->needs_adc_phy) in exynos_adc_v1_exit_hw()
239 regmap_write(info->pmu_map, info->data->phy_offset, 0); in exynos_adc_v1_exit_hw()
241 con = readl(ADC_V1_CON(info->regs)); in exynos_adc_v1_exit_hw()
243 writel(con, ADC_V1_CON(info->regs)); in exynos_adc_v1_exit_hw()
246 static void exynos_adc_v1_clear_irq(struct exynos_adc *info) in exynos_adc_v1_clear_irq() argument
248 writel(1, ADC_V1_INTCLR(info->regs)); in exynos_adc_v1_clear_irq()
251 static void exynos_adc_v1_start_conv(struct exynos_adc *info, in exynos_adc_v1_start_conv() argument
256 writel(addr, ADC_V1_MUX(info->regs)); in exynos_adc_v1_start_conv()
258 con1 = readl(ADC_V1_CON(info->regs)); in exynos_adc_v1_start_conv()
259 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); in exynos_adc_v1_start_conv()
297 static void exynos_adc_s3c2416_start_conv(struct exynos_adc *info, in exynos_adc_s3c2416_start_conv() argument
303 con1 = readl(ADC_V1_CON(info->regs)); in exynos_adc_s3c2416_start_conv()
305 writel(con1, ADC_V1_CON(info->regs)); in exynos_adc_s3c2416_start_conv()
308 writel(addr, ADC_S3C2410_MUX(info->regs)); in exynos_adc_s3c2416_start_conv()
310 con1 = readl(ADC_V1_CON(info->regs)); in exynos_adc_s3c2416_start_conv()
311 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); in exynos_adc_s3c2416_start_conv()
323 static void exynos_adc_s3c2443_start_conv(struct exynos_adc *info, in exynos_adc_s3c2443_start_conv() argument
329 writel(addr, ADC_S3C2410_MUX(info->regs)); in exynos_adc_s3c2443_start_conv()
331 con1 = readl(ADC_V1_CON(info->regs)); in exynos_adc_s3c2443_start_conv()
332 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); in exynos_adc_s3c2443_start_conv()
344 static void exynos_adc_s3c64xx_start_conv(struct exynos_adc *info, in exynos_adc_s3c64xx_start_conv() argument
349 con1 = readl(ADC_V1_CON(info->regs)); in exynos_adc_s3c64xx_start_conv()
352 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); in exynos_adc_s3c64xx_start_conv()
374 static void exynos_adc_v2_init_hw(struct exynos_adc *info) in exynos_adc_v2_init_hw() argument
378 if (info->data->needs_adc_phy) in exynos_adc_v2_init_hw()
379 regmap_write(info->pmu_map, info->data->phy_offset, 1); in exynos_adc_v2_init_hw()
382 writel(con1, ADC_V2_CON1(info->regs)); in exynos_adc_v2_init_hw()
386 writel(con2, ADC_V2_CON2(info->regs)); in exynos_adc_v2_init_hw()
389 writel(1, ADC_V2_INT_EN(info->regs)); in exynos_adc_v2_init_hw()
392 static void exynos_adc_v2_exit_hw(struct exynos_adc *info) in exynos_adc_v2_exit_hw() argument
396 if (info->data->needs_adc_phy) in exynos_adc_v2_exit_hw()
397 regmap_write(info->pmu_map, info->data->phy_offset, 0); in exynos_adc_v2_exit_hw()
399 con = readl(ADC_V2_CON1(info->regs)); in exynos_adc_v2_exit_hw()
401 writel(con, ADC_V2_CON1(info->regs)); in exynos_adc_v2_exit_hw()
404 static void exynos_adc_v2_clear_irq(struct exynos_adc *info) in exynos_adc_v2_clear_irq() argument
406 writel(1, ADC_V2_INT_ST(info->regs)); in exynos_adc_v2_clear_irq()
409 static void exynos_adc_v2_start_conv(struct exynos_adc *info, in exynos_adc_v2_start_conv() argument
414 con2 = readl(ADC_V2_CON2(info->regs)); in exynos_adc_v2_start_conv()
417 writel(con2, ADC_V2_CON2(info->regs)); in exynos_adc_v2_start_conv()
419 con1 = readl(ADC_V2_CON1(info->regs)); in exynos_adc_v2_start_conv()
420 writel(con1 | ADC_CON_EN_START, ADC_V2_CON1(info->regs)); in exynos_adc_v2_start_conv()
448 static void exynos_adc_exynos7_init_hw(struct exynos_adc *info) in exynos_adc_exynos7_init_hw() argument
452 if (info->data->needs_adc_phy) in exynos_adc_exynos7_init_hw()
453 regmap_write(info->pmu_map, info->data->phy_offset, 1); in exynos_adc_exynos7_init_hw()
456 writel(con1, ADC_V2_CON1(info->regs)); in exynos_adc_exynos7_init_hw()
458 con2 = readl(ADC_V2_CON2(info->regs)); in exynos_adc_exynos7_init_hw()
461 writel(con2, ADC_V2_CON2(info->regs)); in exynos_adc_exynos7_init_hw()
464 writel(1, ADC_V2_INT_EN(info->regs)); in exynos_adc_exynos7_init_hw()
530 struct exynos_adc *info = iio_priv(indio_dev); in exynos_read_raw() local
538 reinit_completion(&info->completion); in exynos_read_raw()
541 if (info->data->start_conv) in exynos_read_raw()
542 info->data->start_conv(info, chan->address); in exynos_read_raw()
544 timeout = wait_for_completion_timeout(&info->completion, in exynos_read_raw()
548 if (info->data->init_hw) in exynos_read_raw()
549 info->data->init_hw(info); in exynos_read_raw()
552 *val = info->value; in exynos_read_raw()
564 struct exynos_adc *info = iio_priv(indio_dev); in exynos_read_s3c64xx_ts() local
569 info->read_ts = true; in exynos_read_s3c64xx_ts()
571 reinit_completion(&info->completion); in exynos_read_s3c64xx_ts()
574 ADC_V1_TSC(info->regs)); in exynos_read_s3c64xx_ts()
577 info->data->start_conv(info, ADC_S3C2410_MUX_TS); in exynos_read_s3c64xx_ts()
579 timeout = wait_for_completion_timeout(&info->completion, in exynos_read_s3c64xx_ts()
583 if (info->data->init_hw) in exynos_read_s3c64xx_ts()
584 info->data->init_hw(info); in exynos_read_s3c64xx_ts()
587 *x = info->ts_x; in exynos_read_s3c64xx_ts()
588 *y = info->ts_y; in exynos_read_s3c64xx_ts()
592 info->read_ts = false; in exynos_read_s3c64xx_ts()
600 struct exynos_adc *info = dev_id; in exynos_adc_isr() local
601 u32 mask = info->data->mask; in exynos_adc_isr()
604 if (info->read_ts) { in exynos_adc_isr()
605 info->ts_x = readl(ADC_V1_DATX(info->regs)); in exynos_adc_isr()
606 info->ts_y = readl(ADC_V1_DATY(info->regs)); in exynos_adc_isr()
607 writel(ADC_TSC_WAIT4INT | ADC_S3C2443_TSC_UD_SEN, ADC_V1_TSC(info->regs)); in exynos_adc_isr()
609 info->value = readl(ADC_V1_DATX(info->regs)) & mask; in exynos_adc_isr()
613 if (info->data->clear_irq) in exynos_adc_isr()
614 info->data->clear_irq(info); in exynos_adc_isr()
616 complete(&info->completion); in exynos_adc_isr()
630 struct exynos_adc *info = dev_id; in exynos_ts_isr() local
631 struct iio_dev *dev = dev_get_drvdata(info->dev); in exynos_ts_isr()
636 while (info->input->users) { in exynos_ts_isr()
643 input_report_key(info->input, BTN_TOUCH, 0); in exynos_ts_isr()
644 input_sync(info->input); in exynos_ts_isr()
648 input_report_abs(info->input, ABS_X, x & ADC_DATX_MASK); in exynos_ts_isr()
649 input_report_abs(info->input, ABS_Y, y & ADC_DATY_MASK); in exynos_ts_isr()
650 input_report_key(info->input, BTN_TOUCH, 1); in exynos_ts_isr()
651 input_sync(info->input); in exynos_ts_isr()
656 writel(0, ADC_V1_CLRINTPNDNUP(info->regs)); in exynos_ts_isr()
665 struct exynos_adc *info = iio_priv(indio_dev); in exynos_adc_reg_access() local
670 *readval = readl(info->regs + reg); in exynos_adc_reg_access()
713 struct exynos_adc *info = input_get_drvdata(dev); in exynos_adc_ts_open() local
715 enable_irq(info->tsirq); in exynos_adc_ts_open()
722 struct exynos_adc *info = input_get_drvdata(dev); in exynos_adc_ts_close() local
724 disable_irq(info->tsirq); in exynos_adc_ts_close()
727 static int exynos_adc_ts_init(struct exynos_adc *info) in exynos_adc_ts_init() argument
731 if (info->tsirq <= 0) in exynos_adc_ts_init()
734 info->input = input_allocate_device(); in exynos_adc_ts_init()
735 if (!info->input) in exynos_adc_ts_init()
738 info->input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); in exynos_adc_ts_init()
739 info->input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); in exynos_adc_ts_init()
741 input_set_abs_params(info->input, ABS_X, 0, 0x3FF, 0, 0); in exynos_adc_ts_init()
742 input_set_abs_params(info->input, ABS_Y, 0, 0x3FF, 0, 0); in exynos_adc_ts_init()
744 info->input->name = "S3C24xx TouchScreen"; in exynos_adc_ts_init()
745 info->input->id.bustype = BUS_HOST; in exynos_adc_ts_init()
746 info->input->open = exynos_adc_ts_open; in exynos_adc_ts_init()
747 info->input->close = exynos_adc_ts_close; in exynos_adc_ts_init()
749 input_set_drvdata(info->input, info); in exynos_adc_ts_init()
751 ret = input_register_device(info->input); in exynos_adc_ts_init()
753 input_free_device(info->input); in exynos_adc_ts_init()
757 disable_irq(info->tsirq); in exynos_adc_ts_init()
758 ret = request_threaded_irq(info->tsirq, NULL, exynos_ts_isr, in exynos_adc_ts_init()
759 IRQF_ONESHOT, "touchscreen", info); in exynos_adc_ts_init()
761 input_unregister_device(info->input); in exynos_adc_ts_init()
768 struct exynos_adc *info = NULL; in exynos_adc_probe() local
783 info = iio_priv(indio_dev); in exynos_adc_probe()
785 info->data = exynos_adc_get_data(pdev); in exynos_adc_probe()
786 if (!info->data) { in exynos_adc_probe()
792 info->regs = devm_ioremap_resource(&pdev->dev, mem); in exynos_adc_probe()
793 if (IS_ERR(info->regs)) in exynos_adc_probe()
794 return PTR_ERR(info->regs); in exynos_adc_probe()
797 if (info->data->needs_adc_phy) { in exynos_adc_probe()
798 info->pmu_map = syscon_regmap_lookup_by_phandle( in exynos_adc_probe()
801 if (IS_ERR(info->pmu_map)) { in exynos_adc_probe()
803 return PTR_ERR(info->pmu_map); in exynos_adc_probe()
810 info->irq = irq; in exynos_adc_probe()
816 info->tsirq = irq; in exynos_adc_probe()
818 info->dev = &pdev->dev; in exynos_adc_probe()
820 init_completion(&info->completion); in exynos_adc_probe()
822 info->clk = devm_clk_get(&pdev->dev, "adc"); in exynos_adc_probe()
823 if (IS_ERR(info->clk)) { in exynos_adc_probe()
825 PTR_ERR(info->clk)); in exynos_adc_probe()
826 return PTR_ERR(info->clk); in exynos_adc_probe()
829 if (info->data->needs_sclk) { in exynos_adc_probe()
830 info->sclk = devm_clk_get(&pdev->dev, "sclk"); in exynos_adc_probe()
831 if (IS_ERR(info->sclk)) { in exynos_adc_probe()
834 PTR_ERR(info->sclk)); in exynos_adc_probe()
835 return PTR_ERR(info->sclk); in exynos_adc_probe()
839 info->vdd = devm_regulator_get(&pdev->dev, "vdd"); in exynos_adc_probe()
840 if (IS_ERR(info->vdd)) { in exynos_adc_probe()
842 PTR_ERR(info->vdd)); in exynos_adc_probe()
843 return PTR_ERR(info->vdd); in exynos_adc_probe()
846 ret = regulator_enable(info->vdd); in exynos_adc_probe()
850 ret = exynos_adc_prepare_clk(info); in exynos_adc_probe()
854 ret = exynos_adc_enable_clk(info); in exynos_adc_probe()
863 indio_dev->info = &exynos_adc_iio_info; in exynos_adc_probe()
866 indio_dev->num_channels = info->data->num_channels; in exynos_adc_probe()
868 ret = request_irq(info->irq, exynos_adc_isr, in exynos_adc_probe()
869 0, dev_name(&pdev->dev), info); in exynos_adc_probe()
872 info->irq); in exynos_adc_probe()
880 if (info->data->init_hw) in exynos_adc_probe()
881 info->data->init_hw(info); in exynos_adc_probe()
890 info->delay = pdata->delay; in exynos_adc_probe()
892 info->delay = 10000; in exynos_adc_probe()
895 ret = exynos_adc_ts_init(info); in exynos_adc_probe()
911 input_unregister_device(info->input); in exynos_adc_probe()
912 free_irq(info->tsirq, info); in exynos_adc_probe()
917 free_irq(info->irq, info); in exynos_adc_probe()
919 if (info->data->exit_hw) in exynos_adc_probe()
920 info->data->exit_hw(info); in exynos_adc_probe()
921 exynos_adc_disable_clk(info); in exynos_adc_probe()
923 exynos_adc_unprepare_clk(info); in exynos_adc_probe()
925 regulator_disable(info->vdd); in exynos_adc_probe()
932 struct exynos_adc *info = iio_priv(indio_dev); in exynos_adc_remove() local
934 if (IS_REACHABLE(CONFIG_INPUT) && info->input) { in exynos_adc_remove()
935 free_irq(info->tsirq, info); in exynos_adc_remove()
936 input_unregister_device(info->input); in exynos_adc_remove()
941 free_irq(info->irq, info); in exynos_adc_remove()
942 if (info->data->exit_hw) in exynos_adc_remove()
943 info->data->exit_hw(info); in exynos_adc_remove()
944 exynos_adc_disable_clk(info); in exynos_adc_remove()
945 exynos_adc_unprepare_clk(info); in exynos_adc_remove()
946 regulator_disable(info->vdd); in exynos_adc_remove()
955 struct exynos_adc *info = iio_priv(indio_dev); in exynos_adc_suspend() local
957 if (info->data->exit_hw) in exynos_adc_suspend()
958 info->data->exit_hw(info); in exynos_adc_suspend()
959 exynos_adc_disable_clk(info); in exynos_adc_suspend()
960 regulator_disable(info->vdd); in exynos_adc_suspend()
968 struct exynos_adc *info = iio_priv(indio_dev); in exynos_adc_resume() local
971 ret = regulator_enable(info->vdd); in exynos_adc_resume()
975 ret = exynos_adc_enable_clk(info); in exynos_adc_resume()
979 if (info->data->init_hw) in exynos_adc_resume()
980 info->data->init_hw(info); in exynos_adc_resume()