Lines Matching refs:gpadc
178 struct ab8500_gpadc *gpadc; in ab8500_gpadc_get() local
180 list_for_each_entry(gpadc, &ab8500_gpadc_list, node) { in ab8500_gpadc_get()
181 if (!strcmp(name, dev_name(gpadc->dev))) in ab8500_gpadc_get()
182 return gpadc; in ab8500_gpadc_get()
192 int ab8500_gpadc_ad_to_voltage(struct ab8500_gpadc *gpadc, u8 channel, in ab8500_gpadc_ad_to_voltage() argument
200 if (!gpadc->cal_data[ADC_INPUT_VMAIN].gain) { in ab8500_gpadc_ad_to_voltage()
207 res = (int) (ad_value * gpadc->cal_data[ADC_INPUT_VMAIN].gain + in ab8500_gpadc_ad_to_voltage()
208 gpadc->cal_data[ADC_INPUT_VMAIN].offset) / CALIB_SCALE; in ab8500_gpadc_ad_to_voltage()
218 if (!gpadc->cal_data[ADC_INPUT_BTEMP].gain) { in ab8500_gpadc_ad_to_voltage()
225 res = (int) (ad_value * gpadc->cal_data[ADC_INPUT_BTEMP].gain + in ab8500_gpadc_ad_to_voltage()
226 gpadc->cal_data[ADC_INPUT_BTEMP].offset) / CALIB_SCALE; in ab8500_gpadc_ad_to_voltage()
232 if (!gpadc->cal_data[ADC_INPUT_VBAT].gain) { in ab8500_gpadc_ad_to_voltage()
239 res = (int) (ad_value * gpadc->cal_data[ADC_INPUT_VBAT].gain + in ab8500_gpadc_ad_to_voltage()
240 gpadc->cal_data[ADC_INPUT_VBAT].offset) / CALIB_SCALE; in ab8500_gpadc_ad_to_voltage()
276 if (!gpadc->cal_data[ADC_INPUT_IBAT].gain) { in ab8500_gpadc_ad_to_voltage()
283 res = (int) (ad_value * gpadc->cal_data[ADC_INPUT_IBAT].gain + in ab8500_gpadc_ad_to_voltage()
284 gpadc->cal_data[ADC_INPUT_IBAT].offset) in ab8500_gpadc_ad_to_voltage()
289 dev_err(gpadc->dev, in ab8500_gpadc_ad_to_voltage()
310 int ab8500_gpadc_sw_hw_convert(struct ab8500_gpadc *gpadc, u8 channel, in ab8500_gpadc_sw_hw_convert() argument
316 ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample, in ab8500_gpadc_sw_hw_convert()
320 ad_value = ab8500_gpadc_read_raw(gpadc, channel, avg_sample, in ab8500_gpadc_sw_hw_convert()
323 dev_err(gpadc->dev, "GPADC raw value failed ch: %d\n", in ab8500_gpadc_sw_hw_convert()
328 voltage = ab8500_gpadc_ad_to_voltage(gpadc, channel, ad_value); in ab8500_gpadc_sw_hw_convert()
330 dev_err(gpadc->dev, "GPADC to voltage conversion failed ch:" in ab8500_gpadc_sw_hw_convert()
348 int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel, in ab8500_gpadc_read_raw() argument
352 raw_data = ab8500_gpadc_double_read_raw(gpadc, channel, in ab8500_gpadc_read_raw()
357 int ab8500_gpadc_double_read_raw(struct ab8500_gpadc *gpadc, u8 channel, in ab8500_gpadc_double_read_raw() argument
370 if (!gpadc) in ab8500_gpadc_double_read_raw()
374 if ((gpadc->irq_sw < 0) && (conv_type == ADC_SW)) in ab8500_gpadc_double_read_raw()
376 if ((gpadc->irq_hw < 0) && (conv_type == ADC_HW)) in ab8500_gpadc_double_read_raw()
379 mutex_lock(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_double_read_raw()
381 pm_runtime_get_sync(gpadc->dev); in ab8500_gpadc_double_read_raw()
385 ret = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
394 dev_err(gpadc->dev, "gpadc_conversion: GPADC busy"); in ab8500_gpadc_double_read_raw()
419 ret = abx500_set_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
426 ret = abx500_set_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
429 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
445 if (!is_ab8500_2p0_or_earlier(gpadc->parent)) { in ab8500_gpadc_double_read_raw()
462 ret = abx500_set_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
465 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
475 ret = abx500_set_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
478 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
487 ret = abx500_mask_and_set_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
491 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
501 if (!wait_for_completion_timeout(&gpadc->ab8500_gpadc_complete, in ab8500_gpadc_double_read_raw()
503 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
510 ret = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
513 dev_err(gpadc->dev, "gpadc_conversion: read low data failed\n"); in ab8500_gpadc_double_read_raw()
517 ret = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
520 dev_err(gpadc->dev, "gpadc_conversion: read high data failed\n"); in ab8500_gpadc_double_read_raw()
533 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
538 ret = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
542 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
547 ret = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_double_read_raw()
551 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
558 dev_warn(gpadc->dev, in ab8500_gpadc_double_read_raw()
566 ret = abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC, in ab8500_gpadc_double_read_raw()
569 dev_err(gpadc->dev, "gpadc_conversion: disable gpadc failed\n"); in ab8500_gpadc_double_read_raw()
574 pm_runtime_mark_last_busy(gpadc->dev); in ab8500_gpadc_double_read_raw()
575 pm_runtime_put_autosuspend(gpadc->dev); in ab8500_gpadc_double_read_raw()
577 mutex_unlock(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_double_read_raw()
588 (void) abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC, in ab8500_gpadc_double_read_raw()
590 pm_runtime_put(gpadc->dev); in ab8500_gpadc_double_read_raw()
591 mutex_unlock(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_double_read_raw()
592 dev_err(gpadc->dev, in ab8500_gpadc_double_read_raw()
610 struct ab8500_gpadc *gpadc = _gpadc; in ab8500_bm_gpadcconvend_handler() local
612 complete(&gpadc->ab8500_gpadc_complete); in ab8500_bm_gpadcconvend_handler()
633 static void ab8500_gpadc_read_calibration_data(struct ab8500_gpadc *gpadc) in ab8500_gpadc_read_calibration_data() argument
647 ab8500 = gpadc->parent; in ab8500_gpadc_read_calibration_data()
651 ret[i] = abx500_get_register_interruptible(gpadc->dev, in ab8500_gpadc_read_calibration_data()
654 dev_err(gpadc->dev, "%s: read otp reg 0x%02x failed\n", in ab8500_gpadc_read_calibration_data()
733 gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_hi = in ab8500_gpadc_read_calibration_data()
735 gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_lo = in ab8500_gpadc_read_calibration_data()
738 gpadc->cal_data[ADC_INPUT_VMAIN].gain = CALIB_SCALE * in ab8500_gpadc_read_calibration_data()
740 gpadc->cal_data[ADC_INPUT_VMAIN].offset = CALIB_SCALE * in ab8500_gpadc_read_calibration_data()
744 gpadc->cal_data[ADC_INPUT_VMAIN].gain = 0; in ab8500_gpadc_read_calibration_data()
750 gpadc->dev, AB8500_OTP_EMUL, in ab8500_gpadc_read_calibration_data()
753 dev_err(gpadc->dev, in ab8500_gpadc_read_calibration_data()
765 gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_hi = in ab8500_gpadc_read_calibration_data()
767 gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_lo = in ab8500_gpadc_read_calibration_data()
788 gpadc->cal_data[ADC_INPUT_IBAT].gain = V_gain * V2A_gain; in ab8500_gpadc_read_calibration_data()
789 gpadc->cal_data[ADC_INPUT_IBAT].offset = V_offset * in ab8500_gpadc_read_calibration_data()
792 gpadc->cal_data[ADC_INPUT_IBAT].gain = 0; in ab8500_gpadc_read_calibration_data()
795 dev_dbg(gpadc->dev, "IBAT gain %llu offset %llu\n", in ab8500_gpadc_read_calibration_data()
796 gpadc->cal_data[ADC_INPUT_IBAT].gain, in ab8500_gpadc_read_calibration_data()
797 gpadc->cal_data[ADC_INPUT_IBAT].offset); in ab8500_gpadc_read_calibration_data()
806 gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_hi = in ab8500_gpadc_read_calibration_data()
808 gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_lo = in ab8500_gpadc_read_calibration_data()
811 gpadc->cal_data[ADC_INPUT_VMAIN].gain = CALIB_SCALE * in ab8500_gpadc_read_calibration_data()
814 gpadc->cal_data[ADC_INPUT_VMAIN].offset = CALIB_SCALE * in ab8500_gpadc_read_calibration_data()
818 gpadc->cal_data[ADC_INPUT_VMAIN].gain = 0; in ab8500_gpadc_read_calibration_data()
828 gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_hi = (u16)btemp_high; in ab8500_gpadc_read_calibration_data()
829 gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_lo = (u16)btemp_low; in ab8500_gpadc_read_calibration_data()
831 gpadc->cal_data[ADC_INPUT_BTEMP].gain = in ab8500_gpadc_read_calibration_data()
833 gpadc->cal_data[ADC_INPUT_BTEMP].offset = CALIB_SCALE * 1300 - in ab8500_gpadc_read_calibration_data()
837 gpadc->cal_data[ADC_INPUT_BTEMP].gain = 0; in ab8500_gpadc_read_calibration_data()
845 gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_hi = (u16)vbat_high; in ab8500_gpadc_read_calibration_data()
846 gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_lo = (u16)vbat_low; in ab8500_gpadc_read_calibration_data()
848 gpadc->cal_data[ADC_INPUT_VBAT].gain = CALIB_SCALE * in ab8500_gpadc_read_calibration_data()
850 gpadc->cal_data[ADC_INPUT_VBAT].offset = CALIB_SCALE * 4700 - in ab8500_gpadc_read_calibration_data()
854 gpadc->cal_data[ADC_INPUT_VBAT].gain = 0; in ab8500_gpadc_read_calibration_data()
857 dev_dbg(gpadc->dev, "VMAIN gain %llu offset %llu\n", in ab8500_gpadc_read_calibration_data()
858 gpadc->cal_data[ADC_INPUT_VMAIN].gain, in ab8500_gpadc_read_calibration_data()
859 gpadc->cal_data[ADC_INPUT_VMAIN].offset); in ab8500_gpadc_read_calibration_data()
861 dev_dbg(gpadc->dev, "BTEMP gain %llu offset %llu\n", in ab8500_gpadc_read_calibration_data()
862 gpadc->cal_data[ADC_INPUT_BTEMP].gain, in ab8500_gpadc_read_calibration_data()
863 gpadc->cal_data[ADC_INPUT_BTEMP].offset); in ab8500_gpadc_read_calibration_data()
865 dev_dbg(gpadc->dev, "VBAT gain %llu offset %llu\n", in ab8500_gpadc_read_calibration_data()
866 gpadc->cal_data[ADC_INPUT_VBAT].gain, in ab8500_gpadc_read_calibration_data()
867 gpadc->cal_data[ADC_INPUT_VBAT].offset); in ab8500_gpadc_read_calibration_data()
873 struct ab8500_gpadc *gpadc = dev_get_drvdata(dev); in ab8500_gpadc_runtime_suspend() local
875 regulator_disable(gpadc->regu); in ab8500_gpadc_runtime_suspend()
881 struct ab8500_gpadc *gpadc = dev_get_drvdata(dev); in ab8500_gpadc_runtime_resume() local
884 ret = regulator_enable(gpadc->regu); in ab8500_gpadc_runtime_resume()
894 struct ab8500_gpadc *gpadc = dev_get_drvdata(dev); in ab8500_gpadc_suspend() local
896 mutex_lock(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_suspend()
900 regulator_disable(gpadc->regu); in ab8500_gpadc_suspend()
906 struct ab8500_gpadc *gpadc = dev_get_drvdata(dev); in ab8500_gpadc_resume() local
909 ret = regulator_enable(gpadc->regu); in ab8500_gpadc_resume()
913 pm_runtime_mark_last_busy(gpadc->dev); in ab8500_gpadc_resume()
914 pm_runtime_put_autosuspend(gpadc->dev); in ab8500_gpadc_resume()
916 mutex_unlock(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_resume()
924 struct ab8500_gpadc *gpadc; in ab8500_gpadc_probe() local
926 gpadc = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_gpadc), GFP_KERNEL); in ab8500_gpadc_probe()
927 if (!gpadc) { in ab8500_gpadc_probe()
932 gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END"); in ab8500_gpadc_probe()
933 if (gpadc->irq_sw < 0) in ab8500_gpadc_probe()
934 dev_err(gpadc->dev, "failed to get platform sw_conv_end irq\n"); in ab8500_gpadc_probe()
936 gpadc->irq_hw = platform_get_irq_byname(pdev, "HW_CONV_END"); in ab8500_gpadc_probe()
937 if (gpadc->irq_hw < 0) in ab8500_gpadc_probe()
938 dev_err(gpadc->dev, "failed to get platform hw_conv_end irq\n"); in ab8500_gpadc_probe()
940 gpadc->dev = &pdev->dev; in ab8500_gpadc_probe()
941 gpadc->parent = dev_get_drvdata(pdev->dev.parent); in ab8500_gpadc_probe()
942 mutex_init(&gpadc->ab8500_gpadc_lock); in ab8500_gpadc_probe()
945 init_completion(&gpadc->ab8500_gpadc_complete); in ab8500_gpadc_probe()
948 if (gpadc->irq_sw >= 0) { in ab8500_gpadc_probe()
949 ret = request_threaded_irq(gpadc->irq_sw, NULL, in ab8500_gpadc_probe()
953 gpadc); in ab8500_gpadc_probe()
955 dev_err(gpadc->dev, in ab8500_gpadc_probe()
957 gpadc->irq_sw); in ab8500_gpadc_probe()
962 if (gpadc->irq_hw >= 0) { in ab8500_gpadc_probe()
963 ret = request_threaded_irq(gpadc->irq_hw, NULL, in ab8500_gpadc_probe()
967 gpadc); in ab8500_gpadc_probe()
969 dev_err(gpadc->dev, in ab8500_gpadc_probe()
971 gpadc->irq_hw); in ab8500_gpadc_probe()
977 gpadc->regu = devm_regulator_get(&pdev->dev, "vddadc"); in ab8500_gpadc_probe()
978 if (IS_ERR(gpadc->regu)) { in ab8500_gpadc_probe()
979 ret = PTR_ERR(gpadc->regu); in ab8500_gpadc_probe()
980 dev_err(gpadc->dev, "failed to get vtvout LDO\n"); in ab8500_gpadc_probe()
984 platform_set_drvdata(pdev, gpadc); in ab8500_gpadc_probe()
986 ret = regulator_enable(gpadc->regu); in ab8500_gpadc_probe()
988 dev_err(gpadc->dev, "Failed to enable vtvout LDO: %d\n", ret); in ab8500_gpadc_probe()
992 pm_runtime_set_autosuspend_delay(gpadc->dev, GPADC_AUDOSUSPEND_DELAY); in ab8500_gpadc_probe()
993 pm_runtime_use_autosuspend(gpadc->dev); in ab8500_gpadc_probe()
994 pm_runtime_set_active(gpadc->dev); in ab8500_gpadc_probe()
995 pm_runtime_enable(gpadc->dev); in ab8500_gpadc_probe()
997 ab8500_gpadc_read_calibration_data(gpadc); in ab8500_gpadc_probe()
998 list_add_tail(&gpadc->node, &ab8500_gpadc_list); in ab8500_gpadc_probe()
999 dev_dbg(gpadc->dev, "probe success\n"); in ab8500_gpadc_probe()
1005 free_irq(gpadc->irq_sw, gpadc); in ab8500_gpadc_probe()
1006 free_irq(gpadc->irq_hw, gpadc); in ab8500_gpadc_probe()
1013 struct ab8500_gpadc *gpadc = platform_get_drvdata(pdev); in ab8500_gpadc_remove() local
1016 list_del(&gpadc->node); in ab8500_gpadc_remove()
1018 if (gpadc->irq_sw >= 0) in ab8500_gpadc_remove()
1019 free_irq(gpadc->irq_sw, gpadc); in ab8500_gpadc_remove()
1020 if (gpadc->irq_hw >= 0) in ab8500_gpadc_remove()
1021 free_irq(gpadc->irq_hw, gpadc); in ab8500_gpadc_remove()
1023 pm_runtime_get_sync(gpadc->dev); in ab8500_gpadc_remove()
1024 pm_runtime_disable(gpadc->dev); in ab8500_gpadc_remove()
1026 regulator_disable(gpadc->regu); in ab8500_gpadc_remove()
1028 pm_runtime_set_suspended(gpadc->dev); in ab8500_gpadc_remove()
1030 pm_runtime_put_noidle(gpadc->dev); in ab8500_gpadc_remove()
1067 void ab8540_gpadc_get_otp(struct ab8500_gpadc *gpadc, in ab8540_gpadc_get_otp() argument
1071 *vmain_l = gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_lo; in ab8540_gpadc_get_otp()
1072 *vmain_h = gpadc->cal_data[ADC_INPUT_VMAIN].otp_calib_hi; in ab8540_gpadc_get_otp()
1073 *btemp_l = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_lo; in ab8540_gpadc_get_otp()
1074 *btemp_h = gpadc->cal_data[ADC_INPUT_BTEMP].otp_calib_hi; in ab8540_gpadc_get_otp()
1075 *vbat_l = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_lo; in ab8540_gpadc_get_otp()
1076 *vbat_h = gpadc->cal_data[ADC_INPUT_VBAT].otp_calib_hi; in ab8540_gpadc_get_otp()
1077 *ibat_l = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_lo; in ab8540_gpadc_get_otp()
1078 *ibat_h = gpadc->cal_data[ADC_INPUT_IBAT].otp_calib_hi; in ab8540_gpadc_get_otp()