10e7ade47SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0 20e7ade47SMauro Carvalho Chehab 30e7ade47SMauro Carvalho Chehab======================= 40e7ade47SMauro Carvalho ChehabKernel driver bh1770glc 50e7ade47SMauro Carvalho Chehab======================= 60e7ade47SMauro Carvalho Chehab 70e7ade47SMauro Carvalho ChehabSupported chips: 80e7ade47SMauro Carvalho Chehab 90e7ade47SMauro Carvalho Chehab- ROHM BH1770GLC 100e7ade47SMauro Carvalho Chehab- OSRAM SFH7770 110e7ade47SMauro Carvalho Chehab 120e7ade47SMauro Carvalho ChehabData sheet: 130e7ade47SMauro Carvalho ChehabNot freely available 140e7ade47SMauro Carvalho Chehab 150e7ade47SMauro Carvalho ChehabAuthor: 160e7ade47SMauro Carvalho ChehabSamu Onkalo <samu.p.onkalo@nokia.com> 170e7ade47SMauro Carvalho Chehab 180e7ade47SMauro Carvalho ChehabDescription 190e7ade47SMauro Carvalho Chehab----------- 200e7ade47SMauro Carvalho ChehabBH1770GLC and SFH7770 are combined ambient light and proximity sensors. 210e7ade47SMauro Carvalho ChehabALS and proximity parts operates on their own, but they shares common I2C 220e7ade47SMauro Carvalho Chehabinterface and interrupt logic. In principle they can run on their own, 230e7ade47SMauro Carvalho Chehabbut ALS side results are used to estimate reliability of the proximity sensor. 240e7ade47SMauro Carvalho Chehab 250e7ade47SMauro Carvalho ChehabALS produces 16 bit lux values. The chip contains interrupt logic to produce 260e7ade47SMauro Carvalho Chehablow and high threshold interrupts. 270e7ade47SMauro Carvalho Chehab 280e7ade47SMauro Carvalho ChehabProximity part contains IR-led driver up to 3 IR leds. The chip measures 290e7ade47SMauro Carvalho Chehabamount of reflected IR light and produces proximity result. Resolution is 300e7ade47SMauro Carvalho Chehab8 bit. Driver supports only one channel. Driver uses ALS results to estimate 310e7ade47SMauro Carvalho Chehabreliability of the proximity results. Thus ALS is always running while 320e7ade47SMauro Carvalho Chehabproximity detection is needed. 330e7ade47SMauro Carvalho Chehab 340e7ade47SMauro Carvalho ChehabDriver uses threshold interrupts to avoid need for polling the values. 350e7ade47SMauro Carvalho ChehabProximity low interrupt doesn't exists in the chip. This is simulated 360e7ade47SMauro Carvalho Chehabby using a delayed work. As long as there is proximity threshold above 370e7ade47SMauro Carvalho Chehabinterrupts the delayed work is pushed forward. So, when proximity level goes 380e7ade47SMauro Carvalho Chehabbelow the threshold value, there is no interrupt and the delayed work will 390e7ade47SMauro Carvalho Chehabfinally run. This is handled as no proximity indication. 400e7ade47SMauro Carvalho Chehab 410e7ade47SMauro Carvalho ChehabChip state is controlled via runtime pm framework when enabled in config. 420e7ade47SMauro Carvalho Chehab 430e7ade47SMauro Carvalho ChehabCalibscale factor is used to hide differences between the chips. By default 440e7ade47SMauro Carvalho Chehabvalue set to neutral state meaning factor of 1.00. To get proper values, 450e7ade47SMauro Carvalho Chehabcalibrated source of light is needed as a reference. Calibscale factor is set 460e7ade47SMauro Carvalho Chehabso that measurement produces about the expected lux value. 470e7ade47SMauro Carvalho Chehab 480e7ade47SMauro Carvalho ChehabSYSFS 490e7ade47SMauro Carvalho Chehab----- 500e7ade47SMauro Carvalho Chehab 510e7ade47SMauro Carvalho Chehabchip_id 520e7ade47SMauro Carvalho Chehab RO - shows detected chip type and version 530e7ade47SMauro Carvalho Chehab 540e7ade47SMauro Carvalho Chehabpower_state 550e7ade47SMauro Carvalho Chehab RW - enable / disable chip 560e7ade47SMauro Carvalho Chehab 570e7ade47SMauro Carvalho Chehab Uses counting logic 580e7ade47SMauro Carvalho Chehab 590e7ade47SMauro Carvalho Chehab - 1 enables the chip 600e7ade47SMauro Carvalho Chehab - 0 disables the chip 610e7ade47SMauro Carvalho Chehab 620e7ade47SMauro Carvalho Chehablux0_input 630e7ade47SMauro Carvalho Chehab RO - measured lux value 640e7ade47SMauro Carvalho Chehab 650e7ade47SMauro Carvalho Chehab sysfs_notify called when threshold interrupt occurs 660e7ade47SMauro Carvalho Chehab 670e7ade47SMauro Carvalho Chehablux0_sensor_range 680e7ade47SMauro Carvalho Chehab RO - lux0_input max value 690e7ade47SMauro Carvalho Chehab 700e7ade47SMauro Carvalho Chehablux0_rate 710e7ade47SMauro Carvalho Chehab RW - measurement rate in Hz 720e7ade47SMauro Carvalho Chehab 730e7ade47SMauro Carvalho Chehablux0_rate_avail 740e7ade47SMauro Carvalho Chehab RO - supported measurement rates 750e7ade47SMauro Carvalho Chehab 760e7ade47SMauro Carvalho Chehablux0_thresh_above_value 770e7ade47SMauro Carvalho Chehab RW - HI level threshold value 780e7ade47SMauro Carvalho Chehab 790e7ade47SMauro Carvalho Chehab All results above the value 800e7ade47SMauro Carvalho Chehab trigs an interrupt. 65535 (i.e. sensor_range) disables the above 810e7ade47SMauro Carvalho Chehab interrupt. 820e7ade47SMauro Carvalho Chehab 830e7ade47SMauro Carvalho Chehablux0_thresh_below_value 840e7ade47SMauro Carvalho Chehab RW - LO level threshold value 850e7ade47SMauro Carvalho Chehab 860e7ade47SMauro Carvalho Chehab All results below the value 870e7ade47SMauro Carvalho Chehab trigs an interrupt. 0 disables the below interrupt. 880e7ade47SMauro Carvalho Chehab 890e7ade47SMauro Carvalho Chehablux0_calibscale 900e7ade47SMauro Carvalho Chehab RW - calibration value 910e7ade47SMauro Carvalho Chehab 920e7ade47SMauro Carvalho Chehab Set to neutral value by default. 930e7ade47SMauro Carvalho Chehab Output results are multiplied with calibscale / calibscale_default 940e7ade47SMauro Carvalho Chehab value. 950e7ade47SMauro Carvalho Chehab 960e7ade47SMauro Carvalho Chehablux0_calibscale_default 970e7ade47SMauro Carvalho Chehab RO - neutral calibration value 980e7ade47SMauro Carvalho Chehab 990e7ade47SMauro Carvalho Chehabprox0_raw 1000e7ade47SMauro Carvalho Chehab RO - measured proximity value 1010e7ade47SMauro Carvalho Chehab 1020e7ade47SMauro Carvalho Chehab sysfs_notify called when threshold interrupt occurs 1030e7ade47SMauro Carvalho Chehab 1040e7ade47SMauro Carvalho Chehabprox0_sensor_range 1050e7ade47SMauro Carvalho Chehab RO - prox0_raw max value 1060e7ade47SMauro Carvalho Chehab 1070e7ade47SMauro Carvalho Chehabprox0_raw_en 1080e7ade47SMauro Carvalho Chehab RW - enable / disable proximity 1090e7ade47SMauro Carvalho Chehab 1100e7ade47SMauro Carvalho Chehab Uses counting logic 1110e7ade47SMauro Carvalho Chehab 1120e7ade47SMauro Carvalho Chehab - 1 enables the proximity 1130e7ade47SMauro Carvalho Chehab - 0 disables the proximity 1140e7ade47SMauro Carvalho Chehab 1150e7ade47SMauro Carvalho Chehabprox0_thresh_above_count 1160e7ade47SMauro Carvalho Chehab RW - number of proximity interrupts needed before triggering the event 1170e7ade47SMauro Carvalho Chehab 1180e7ade47SMauro Carvalho Chehabprox0_rate_above 1190e7ade47SMauro Carvalho Chehab RW - Measurement rate (in Hz) when the level is above threshold 1200e7ade47SMauro Carvalho Chehab i.e. when proximity on has been reported. 1210e7ade47SMauro Carvalho Chehab 1220e7ade47SMauro Carvalho Chehabprox0_rate_below 1230e7ade47SMauro Carvalho Chehab RW - Measurement rate (in Hz) when the level is below threshold 1240e7ade47SMauro Carvalho Chehab i.e. when proximity off has been reported. 1250e7ade47SMauro Carvalho Chehab 1260e7ade47SMauro Carvalho Chehabprox0_rate_avail 1270e7ade47SMauro Carvalho Chehab RO - Supported proximity measurement rates in Hz 1280e7ade47SMauro Carvalho Chehab 1290e7ade47SMauro Carvalho Chehabprox0_thresh_above0_value 1300e7ade47SMauro Carvalho Chehab RW - threshold level which trigs proximity events. 1310e7ade47SMauro Carvalho Chehab 1320e7ade47SMauro Carvalho Chehab Filtered by persistence filter (prox0_thresh_above_count) 1330e7ade47SMauro Carvalho Chehab 1340e7ade47SMauro Carvalho Chehabprox0_thresh_above1_value 1350e7ade47SMauro Carvalho Chehab RW - threshold level which trigs event immediately 136