129 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3======================4Kernel driver apds990x5======================6 7Supported chips:8Avago APDS990X9 10Data sheet:11Not freely available12 13Author:14Samu Onkalo <samu.p.onkalo@nokia.com>15 16Description17-----------18 19APDS990x is a combined ambient light and proximity sensor. ALS and proximity20functionality are highly connected. ALS measurement path must be running21while the proximity functionality is enabled.22 23ALS produces raw measurement values for two channels: Clear channel24(infrared + visible light) and IR only. However, threshold comparisons happen25using clear channel only. Lux value and the threshold level on the HW26might vary quite much depending the spectrum of the light source.27 28Driver makes necessary conversions to both directions so that user handles29only lux values. Lux value is calculated using information from the both30channels. HW threshold level is calculated from the given lux value to match31with current type of the lightning. Sometimes inaccuracy of the estimations32lead to false interrupt, but that doesn't harm.33 34ALS contains 4 different gain steps. Driver automatically35selects suitable gain step. After each measurement, reliability of the results36is estimated and new measurement is triggered if necessary.37 38Platform data can provide tuned values to the conversion formulas if39values are known. Otherwise plain sensor default values are used.40 41Proximity side is little bit simpler. There is no need for complex conversions.42It produces directly usable values.43 44Driver controls chip operational state using pm_runtime framework.45Voltage regulators are controlled based on chip operational state.46 47SYSFS48-----49 50 51chip_id52 RO - shows detected chip type and version53 54power_state55 RW - enable / disable chip. Uses counting logic56 57 1 enables the chip58 0 disables the chip59lux0_input60 RO - measured lux value61 62 sysfs_notify called when threshold interrupt occurs63 64lux0_sensor_range65 RO - lux0_input max value.66 67 Actually never reaches since sensor tends68 to saturate much before that. Real max value varies depending69 on the light spectrum etc.70 71lux0_rate72 RW - measurement rate in Hz73 74lux0_rate_avail75 RO - supported measurement rates76 77lux0_calibscale78 RW - calibration value.79 80 Set to neutral value by default.81 Output results are multiplied with calibscale / calibscale_default82 value.83 84lux0_calibscale_default85 RO - neutral calibration value86 87lux0_thresh_above_value88 RW - HI level threshold value.89 90 All results above the value91 trigs an interrupt. 65535 (i.e. sensor_range) disables the above92 interrupt.93 94lux0_thresh_below_value95 RW - LO level threshold value.96 97 All results below the value98 trigs an interrupt. 0 disables the below interrupt.99 100prox0_raw101 RO - measured proximity value102 103 sysfs_notify called when threshold interrupt occurs104 105prox0_sensor_range106 RO - prox0_raw max value (1023)107 108prox0_raw_en109 RW - enable / disable proximity - uses counting logic110 111 - 1 enables the proximity112 - 0 disables the proximity113 114prox0_reporting_mode115 RW - trigger / periodic.116 117 In "trigger" mode the driver tells two possible118 values: 0 or prox0_sensor_range value. 0 means no proximity,119 1023 means proximity. This causes minimal number of interrupts.120 In "periodic" mode the driver reports all values above121 prox0_thresh_above. This causes more interrupts, but it can give122 _rough_ estimate about the distance.123 124prox0_reporting_mode_avail125 RO - accepted values to prox0_reporting_mode (trigger, periodic)126 127prox0_thresh_above_value128 RW - threshold level which trigs proximity events.129