#include <linux/module.h>
#include <linux/err.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/mfd/palmas.h>
#include <linux/completion.h>
#include <linux/of.h>
#include <linux/iio/events.h>
#include <linux/iio/iio.h>
#include <linux/iio/machine.h>
#include <linux/iio/driver.h>
#define MOD_NAME …
#define PALMAS_ADC_CONVERSION_TIMEOUT …
#define PALMAS_TO_BE_CALCULATED …
#define PALMAS_GPADC_TRIMINVALID …
struct palmas_gpadc_info { … };
#define PALMAS_ADC_INFO(_chan, _x1, _x2, _v1, _v2, _t1, _t2, _is_uncalibrated) …
static struct palmas_gpadc_info palmas_gpadc_info[] = …;
struct palmas_adc_event { … };
struct palmas_gpadc_thresholds { … };
struct palmas_gpadc { … };
static struct palmas_adc_event *palmas_gpadc_get_event(struct palmas_gpadc *adc,
int adc_chan,
enum iio_event_direction dir)
{ … }
static bool palmas_gpadc_channel_is_freerunning(struct palmas_gpadc *adc,
int adc_chan)
{ … }
static int palmas_disable_auto_conversion(struct palmas_gpadc *adc)
{ … }
static irqreturn_t palmas_gpadc_irq(int irq, void *data)
{ … }
static irqreturn_t palmas_gpadc_irq_auto(int irq, void *data)
{ … }
static int palmas_gpadc_start_mask_interrupt(struct palmas_gpadc *adc,
bool mask)
{ … }
static int palmas_gpadc_enable(struct palmas_gpadc *adc, int adc_chan,
int enable)
{ … }
static int palmas_gpadc_read_prepare(struct palmas_gpadc *adc, int adc_chan)
{ … }
static void palmas_gpadc_read_done(struct palmas_gpadc *adc, int adc_chan)
{ … }
static int palmas_gpadc_calibrate(struct palmas_gpadc *adc, int adc_chan)
{ … }
static int palmas_gpadc_start_conversion(struct palmas_gpadc *adc, int adc_chan)
{ … }
static int palmas_gpadc_get_calibrated_code(struct palmas_gpadc *adc,
int adc_chan, int val)
{ … }
static int palmas_gpadc_threshold_with_tolerance(int val, const int INL,
const int gain_error,
const int offset_error)
{ … }
static int palmas_gpadc_get_high_threshold_raw(struct palmas_gpadc *adc,
struct palmas_adc_event *ev)
{ … }
static int palmas_gpadc_get_low_threshold_raw(struct palmas_gpadc *adc,
struct palmas_adc_event *ev)
{ … }
static int palmas_gpadc_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ … }
static int palmas_gpadc_read_event_config(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
enum iio_event_type type,
enum iio_event_direction dir)
{ … }
static int palmas_adc_configure_events(struct palmas_gpadc *adc);
static int palmas_adc_reset_events(struct palmas_gpadc *adc);
static int palmas_gpadc_reconfigure_event_channels(struct palmas_gpadc *adc)
{ … }
static int palmas_gpadc_enable_event_config(struct palmas_gpadc *adc,
const struct iio_chan_spec *chan,
enum iio_event_direction dir)
{ … }
static int palmas_gpadc_disable_event_config(struct palmas_gpadc *adc,
const struct iio_chan_spec *chan,
enum iio_event_direction dir)
{ … }
static int palmas_gpadc_write_event_config(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
enum iio_event_type type,
enum iio_event_direction dir,
int state)
{ … }
static int palmas_gpadc_read_event_value(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
enum iio_event_type type,
enum iio_event_direction dir,
enum iio_event_info info,
int *val, int *val2)
{ … }
static int palmas_gpadc_write_event_value(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
enum iio_event_type type,
enum iio_event_direction dir,
enum iio_event_info info,
int val, int val2)
{ … }
static const struct iio_info palmas_gpadc_iio_info = …;
static const struct iio_event_spec palmas_gpadc_events[] = …;
#define PALMAS_ADC_CHAN_IIO(chan, _type, chan_info) …
static const struct iio_chan_spec palmas_gpadc_iio_channel[] = …;
static int palmas_gpadc_get_adc_dt_data(struct platform_device *pdev,
struct palmas_gpadc_platform_data **gpadc_pdata)
{ … }
static void palmas_gpadc_reset(void *data)
{ … }
static int palmas_gpadc_probe(struct platform_device *pdev)
{ … }
static int palmas_adc_configure_events(struct palmas_gpadc *adc)
{ … }
static int palmas_adc_reset_events(struct palmas_gpadc *adc)
{ … }
static int palmas_gpadc_suspend(struct device *dev)
{ … }
static int palmas_gpadc_resume(struct device *dev)
{
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct palmas_gpadc *adc = iio_priv(indio_dev);
if (!device_may_wakeup(dev))
return 0;
if (adc->event0.enabled)
disable_irq_wake(adc->irq_auto_0);
if (adc->event1.enabled)
disable_irq_wake(adc->irq_auto_1);
return 0;
};
static DEFINE_SIMPLE_DEV_PM_OPS(palmas_pm_ops, palmas_gpadc_suspend,
palmas_gpadc_resume);
static const struct of_device_id of_palmas_gpadc_match_tbl[] = …;
MODULE_DEVICE_TABLE(of, of_palmas_gpadc_match_tbl);
static struct platform_driver palmas_gpadc_driver = …;
module_platform_driver(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_ALIAS(…) …;
MODULE_LICENSE(…) …;