#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/delay.h>
#include <linux/iio/iio.h>
#include <linux/iio/buffer.h>
#include <linux/iio/trigger.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
#include <linux/iio/sysfs.h>
#include <linux/pm_runtime.h>
#define RPR0521_REG_SYSTEM_CTRL …
#define RPR0521_REG_MODE_CTRL …
#define RPR0521_REG_ALS_CTRL …
#define RPR0521_REG_PXS_CTRL …
#define RPR0521_REG_PXS_DATA …
#define RPR0521_REG_ALS_DATA0 …
#define RPR0521_REG_ALS_DATA1 …
#define RPR0521_REG_INTERRUPT …
#define RPR0521_REG_PS_OFFSET_LSB …
#define RPR0521_REG_ID …
#define RPR0521_MODE_ALS_MASK …
#define RPR0521_MODE_PXS_MASK …
#define RPR0521_MODE_MEAS_TIME_MASK …
#define RPR0521_ALS_DATA0_GAIN_MASK …
#define RPR0521_ALS_DATA0_GAIN_SHIFT …
#define RPR0521_ALS_DATA1_GAIN_MASK …
#define RPR0521_ALS_DATA1_GAIN_SHIFT …
#define RPR0521_PXS_GAIN_MASK …
#define RPR0521_PXS_GAIN_SHIFT …
#define RPR0521_PXS_PERSISTENCE_MASK …
#define RPR0521_INTERRUPT_INT_TRIG_PS_MASK …
#define RPR0521_INTERRUPT_INT_TRIG_ALS_MASK …
#define RPR0521_INTERRUPT_INT_REASSERT_MASK …
#define RPR0521_INTERRUPT_ALS_INT_STATUS_MASK …
#define RPR0521_INTERRUPT_PS_INT_STATUS_MASK …
#define RPR0521_MODE_ALS_ENABLE …
#define RPR0521_MODE_ALS_DISABLE …
#define RPR0521_MODE_PXS_ENABLE …
#define RPR0521_MODE_PXS_DISABLE …
#define RPR0521_PXS_PERSISTENCE_DRDY …
#define RPR0521_INTERRUPT_INT_TRIG_PS_ENABLE …
#define RPR0521_INTERRUPT_INT_TRIG_PS_DISABLE …
#define RPR0521_INTERRUPT_INT_TRIG_ALS_ENABLE …
#define RPR0521_INTERRUPT_INT_TRIG_ALS_DISABLE …
#define RPR0521_INTERRUPT_INT_REASSERT_ENABLE …
#define RPR0521_INTERRUPT_INT_REASSERT_DISABLE …
#define RPR0521_MANUFACT_ID …
#define RPR0521_DEFAULT_MEAS_TIME …
#define RPR0521_DRV_NAME …
#define RPR0521_IRQ_NAME …
#define RPR0521_REGMAP_NAME …
#define RPR0521_SLEEP_DELAY_MS …
#define RPR0521_ALS_SCALE_AVAIL …
#define RPR0521_PXS_SCALE_AVAIL …
struct rpr0521_gain { … };
static const struct rpr0521_gain rpr0521_als_gain[4] = …;
static const struct rpr0521_gain rpr0521_pxs_gain[3] = …;
enum rpr0521_channel { … };
struct rpr0521_reg_desc { … };
static const struct rpr0521_reg_desc rpr0521_data_reg[] = …;
static const struct rpr0521_gain_info { … } rpr0521_gain[] = …;
struct rpr0521_samp_freq { … };
static const struct rpr0521_samp_freq rpr0521_samp_freq_i[13] = …;
struct rpr0521_data { … };
static IIO_CONST_ATTR(in_intensity_scale_available, RPR0521_ALS_SCALE_AVAIL);
static IIO_CONST_ATTR(in_proximity_scale_available, RPR0521_PXS_SCALE_AVAIL);
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("2.5 10");
static struct attribute *rpr0521_attributes[] = …;
static const struct attribute_group rpr0521_attribute_group = …;
enum rpr0521_scan_index_order { … };
static const unsigned long rpr0521_available_scan_masks[] = …;
static const struct iio_chan_spec rpr0521_channels[] = …;
static int rpr0521_als_enable(struct rpr0521_data *data, u8 status)
{ … }
static int rpr0521_pxs_enable(struct rpr0521_data *data, u8 status)
{ … }
static int rpr0521_set_power_state(struct rpr0521_data *data, bool on,
u8 device_mask)
{ … }
static inline bool rpr0521_is_triggered(struct rpr0521_data *data)
{ … }
static irqreturn_t rpr0521_drdy_irq_handler(int irq, void *private)
{ … }
static irqreturn_t rpr0521_drdy_irq_thread(int irq, void *private)
{ … }
static irqreturn_t rpr0521_trigger_consumer_store_time(int irq, void *p)
{ … }
static irqreturn_t rpr0521_trigger_consumer_handler(int irq, void *p)
{ … }
static int rpr0521_write_int_enable(struct rpr0521_data *data)
{ … }
static int rpr0521_write_int_disable(struct rpr0521_data *data)
{ … }
static int rpr0521_pxs_drdy_set_state(struct iio_trigger *trigger,
bool enable_drdy)
{ … }
static const struct iio_trigger_ops rpr0521_trigger_ops = …;
static int rpr0521_buffer_preenable(struct iio_dev *indio_dev)
{ … }
static int rpr0521_buffer_postdisable(struct iio_dev *indio_dev)
{ … }
static const struct iio_buffer_setup_ops rpr0521_buffer_setup_ops = …;
static int rpr0521_get_gain(struct rpr0521_data *data, int chan,
int *val, int *val2)
{ … }
static int rpr0521_set_gain(struct rpr0521_data *data, int chan,
int val, int val2)
{ … }
static int rpr0521_read_samp_freq(struct rpr0521_data *data,
enum iio_chan_type chan_type,
int *val, int *val2)
{ … }
static int rpr0521_write_samp_freq_common(struct rpr0521_data *data,
enum iio_chan_type chan_type,
int val, int val2)
{ … }
static int rpr0521_read_ps_offset(struct rpr0521_data *data, int *offset)
{ … }
static int rpr0521_write_ps_offset(struct rpr0521_data *data, int offset)
{ … }
static int rpr0521_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan, int *val,
int *val2, long mask)
{ … }
static int rpr0521_write_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan, int val,
int val2, long mask)
{ … }
static const struct iio_info rpr0521_info = …;
static int rpr0521_init(struct rpr0521_data *data)
{ … }
static int rpr0521_poweroff(struct rpr0521_data *data)
{ … }
static bool rpr0521_is_volatile_reg(struct device *dev, unsigned int reg)
{ … }
static const struct regmap_config rpr0521_regmap_config = …;
static int rpr0521_probe(struct i2c_client *client)
{ … }
static void rpr0521_remove(struct i2c_client *client)
{ … }
static int rpr0521_runtime_suspend(struct device *dev)
{ … }
static int rpr0521_runtime_resume(struct device *dev)
{ … }
static const struct dev_pm_ops rpr0521_pm_ops = …;
static const struct acpi_device_id rpr0521_acpi_match[] = …;
MODULE_DEVICE_TABLE(acpi, rpr0521_acpi_match);
static const struct i2c_device_id rpr0521_id[] = …;
MODULE_DEVICE_TABLE(i2c, rpr0521_id);
static struct i2c_driver rpr0521_driver = …;
module_i2c_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;