// SPDX-License-Identifier: GPL-2.0-only
/*
* BU27034 ROHM Ambient Light Sensor
*
* Copyright (c) 2023, ROHM Semiconductor.
* https://fscdn.rohm.com/en/products/databook/datasheet/ic/sensor/light/bu27034nuc-e.pdf
*/
#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/device.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/units.h>
#include <linux/iio/buffer.h>
#include <linux/iio/iio.h>
#include <linux/iio/iio-gts-helper.h>
#include <linux/iio/kfifo_buf.h>
#define BU27034_REG_SYSTEM_CONTROL 0x40
#define BU27034_MASK_SW_RESET BIT(7)
#define BU27034_MASK_PART_ID GENMASK(5, 0)
#define BU27034_ID 0x19
#define BU27034_REG_MODE_CONTROL1 0x41
#define BU27034_MASK_MEAS_MODE GENMASK(2, 0)
#define BU27034_REG_MODE_CONTROL2 0x42
#define BU27034_MASK_D01_GAIN GENMASK(7, 3)
#define BU27034_MASK_D2_GAIN_HI GENMASK(7, 6)
#define BU27034_MASK_D2_GAIN_LO GENMASK(2, 0)
#define BU27034_REG_MODE_CONTROL3 0x43
#define BU27034_REG_MODE_CONTROL4 0x44
#define BU27034_MASK_MEAS_EN BIT(0)
#define BU27034_MASK_VALID BIT(7)
#define BU27034_REG_DATA0_LO 0x50
#define BU27034_REG_DATA1_LO 0x52
#define BU27034_REG_DATA2_LO 0x54
#define BU27034_REG_DATA2_HI 0x55
#define BU27034_REG_MANUFACTURER_ID 0x92
#define BU27034_REG_MAX BU27034_REG_MANUFACTURER_ID
/*
* The BU27034 does not have interrupt to trigger the data read when a
* measurement has finished. Hence we poll the VALID bit in a thread. We will
* try to wake the thread BU27034_ME