linux/drivers/input/misc/da7280.c

// SPDX-License-Identifier: GPL-2.0+
/*
 * DA7280 Haptic device driver
 *
 * Copyright (c) 2020 Dialog Semiconductor.
 * Author: Roy Im <[email protected]>
 */

#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/pwm.h>
#include <linux/regmap.h>
#include <linux/workqueue.h>
#include <linux/uaccess.h>

/* Registers */
#define DA7280_IRQ_EVENT1
#define DA7280_IRQ_EVENT_WARNING_DIAG
#define DA7280_IRQ_EVENT_SEQ_DIAG
#define DA7280_IRQ_STATUS1
#define DA7280_IRQ_MASK1
#define DA7280_FRQ_LRA_PER_H
#define DA7280_FRQ_LRA_PER_L
#define DA7280_ACTUATOR1
#define DA7280_ACTUATOR2
#define DA7280_ACTUATOR3
#define DA7280_CALIB_V2I_H
#define DA7280_CALIB_V2I_L
#define DA7280_TOP_CFG1
#define DA7280_TOP_CFG2
#define DA7280_TOP_CFG4
#define DA7280_TOP_INT_CFG1
#define DA7280_TOP_CTL1
#define DA7280_TOP_CTL2
#define DA7280_SEQ_CTL2
#define DA7280_GPI_0_CTL
#define DA7280_GPI_1_CTL
#define DA7280_GPI_2_CTL
#define DA7280_MEM_CTL1
#define DA7280_MEM_CTL2
#define DA7280_TOP_CFG5
#define DA7280_IRQ_MASK2
#define DA7280_SNP_MEM_99

/* Register field */

/* DA7280_IRQ_EVENT1 (Address 0x03) */
#define DA7280_E_SEQ_CONTINUE_MASK
#define DA7280_E_UVLO_MASK
#define DA7280_E_SEQ_DONE_MASK
#define DA7280_E_OVERTEMP_CRIT_MASK
#define DA7280_E_SEQ_FAULT_MASK
#define DA7280_E_WARNING_MASK
#define DA7280_E_ACTUATOR_FAULT_MASK
#define DA7280_E_OC_FAULT_MASK

/* DA7280_IRQ_EVENT_WARNING_DIAG (Address 0x04) */
#define DA7280_E_OVERTEMP_WARN_MASK
#define DA7280_E_MEM_TYPE_MASK
#define DA7280_E_LIM_DRIVE_ACC_MASK
#define DA7280_E_LIM_DRIVE_MASK

/* DA7280_IRQ_EVENT_PAT_DIAG (Address 0x05) */
#define DA7280_E_PWM_FAULT_MASK
#define DA7280_E_MEM_FAULT_MASK
#define DA7280_E_SEQ_ID_FAULT_MASK

/* DA7280_IRQ_STATUS1 (Address 0x06) */
#define DA7280_STA_SEQ_CONTINUE_MASK
#define DA7280_STA_UVLO_VBAT_OK_MASK
#define DA7280_STA_SEQ_DONE_MASK
#define DA7280_STA_OVERTEMP_CRIT_MASK
#define DA7280_STA_SEQ_FAULT_MASK
#define DA7280_STA_WARNING_MASK
#define DA7280_STA_ACTUATOR_MASK
#define DA7280_STA_OC_MASK

/* DA7280_IRQ_MASK1 (Address 0x07) */
#define DA7280_SEQ_CONTINUE_M_MASK
#define DA7280_E_UVLO_M_MASK
#define DA7280_SEQ_DONE_M_MASK
#define DA7280_OVERTEMP_CRIT_M_MASK
#define DA7280_SEQ_FAULT_M_MASK
#define DA7280_WARNING_M_MASK
#define DA7280_ACTUATOR_M_MASK
#define DA7280_OC_M_MASK

/* DA7280_ACTUATOR3 (Address 0x0e) */
#define DA7280_IMAX_MASK

/* DA7280_TOP_CFG1 (Address 0x13) */
#define DA7280_AMP_PID_EN_MASK
#define DA7280_RAPID_STOP_EN_MASK
#define DA7280_ACCELERATION_EN_MASK
#define DA7280_FREQ_TRACK_EN_MASK
#define DA7280_BEMF_SENSE_EN_MASK
#define DA7280_ACTUATOR_TYPE_MASK

/* DA7280_TOP_CFG2 (Address 0x14) */
#define DA7280_FULL_BRAKE_THR_MASK
#define DA7280_MEM_DATA_SIGNED_MASK

/* DA7280_TOP_CFG4 (Address 0x16) */
#define DA7280_TST_CALIB_IMPEDANCE_DIS_MASK
#define DA7280_V2I_FACTOR_FREEZE_MASK

/* DA7280_TOP_INT_CFG1 (Address 0x17) */
#define DA7280_BEMF_FAULT_LIM_MASK

/* DA7280_TOP_CTL1 (Address 0x22) */
#define DA7280_OPERATION_MODE_MASK
#define DA7280_STANDBY_EN_MASK
#define DA7280_SEQ_START_MASK

/* DA7280_SEQ_CTL2 (Address 0x28) */
#define DA7280_PS_SEQ_ID_MASK
#define DA7280_PS_SEQ_LOOP_MASK

/* DA7280_GPIO_0_CTL (Address 0x29) */
#define DA7280_GPI0_POLARITY_MASK
#define DA7280_GPI0_MODE_MASK
#define DA7280_GPI0_SEQUENCE_ID_MASK

/* DA7280_GPIO_1_CTL (Address 0x2a) */
#define DA7280_GPI1_POLARITY_MASK
#define DA7280_GPI1_MODE_MASK
#define DA7280_GPI1_SEQUENCE_ID_MASK

/* DA7280_GPIO_2_CTL (Address 0x2b) */
#define DA7280_GPI2_POLARITY_MASK
#define DA7280_GPI2_MODE_MASK
#define DA7280_GPI2_SEQUENCE_ID_MASK

/* DA7280_MEM_CTL2 (Address 0x2d) */
#define DA7280_WAV_MEM_LOCK_MASK

/* DA7280_TOP_CFG5 (Address 0x6e) */
#define DA7280_V2I_FACTOR_OFFSET_EN_MASK

/* DA7280_IRQ_MASK2 (Address 0x83) */
#define DA7280_ADC_SAT_M_MASK

/* Controls */

#define DA7280_VOLTAGE_RATE_MAX
#define DA7280_VOLTAGE_RATE_STEP
#define DA7280_NOMMAX_DFT
#define DA7280_ABSMAX_DFT

#define DA7280_IMPD_MAX
#define DA7280_IMPD_DEFAULT

#define DA7280_IMAX_DEFAULT
#define DA7280_IMAX_STEP
#define DA7280_IMAX_LIMIT

#define DA7280_RESONT_FREQH_DFT
#define DA7280_RESONT_FREQL_DFT
#define DA7280_MIN_RESONAT_FREQ_HZ
#define DA7280_MAX_RESONAT_FREQ_HZ

#define DA7280_SEQ_ID_MAX
#define DA7280_SEQ_LOOP_MAX
#define DA7280_GPI_SEQ_ID_DFT
#define DA7280_GPI_SEQ_ID_MAX

#define DA7280_SNP_MEM_SIZE
#define DA7280_SNP_MEM_MAX

#define DA7280_IRQ_NUM

#define DA7280_SKIP_INIT

#define DA7280_FF_EFFECT_COUNT_MAX

/* Maximum gain is 0x7fff for PWM mode */
#define DA7280_MAX_MAGNITUDE_SHIFT

enum da7280_haptic_dev_t {};

enum da7280_op_mode {};

#define DA7280_FF_CONSTANT_DRO
#define DA7280_FF_PERIODIC_PWM
#define DA7280_FF_PERIODIC_RTWM
#define DA7280_FF_PERIODIC_ETWM

#define DA7280_FF_PERIODIC_MODE
#define DA7280_FF_CONSTANT_MODE

enum da7280_custom_effect_param {};

enum da7280_custom_gpi_effect_param {};

struct da7280_gpi_ctl {};

struct da7280_haptic {};

static bool da7280_volatile_register(struct device *dev, unsigned int reg)
{}

static const struct regmap_config da7280_haptic_regmap_config =;

static int da7280_haptic_mem_update(struct da7280_haptic *haptics)
{}

static int da7280_haptic_set_pwm(struct da7280_haptic *haptics, bool enabled)
{}

static void da7280_haptic_activate(struct da7280_haptic *haptics)
{}

static void da7280_haptic_deactivate(struct da7280_haptic *haptics)
{}

static void da7280_haptic_work(struct work_struct *work)
{}

static int da7280_haptics_upload_effect(struct input_dev *dev,
					struct ff_effect *effect,
					struct ff_effect *old)
{}

static int da7280_haptics_playback(struct input_dev *dev,
				   int effect_id, int val)
{}

static int da7280_haptic_start(struct da7280_haptic *haptics)
{}

static void da7280_haptic_stop(struct da7280_haptic *haptics)
{}

static int da7280_haptic_open(struct input_dev *dev)
{}

static void da7280_haptic_close(struct input_dev *dev)
{}

static u8 da7280_haptic_of_mode_str(struct device *dev,
				    const char *str)
{}

static u8 da7280_haptic_of_gpi_mode_str(struct device *dev,
					const char *str)
{}

static u8 da7280_haptic_of_gpi_pol_str(struct device *dev,
				       const char *str)
{}

static u8 da7280_haptic_of_volt_rating_set(u32 val)
{}

static void da7280_parse_properties(struct device *dev,
				    struct da7280_haptic *haptics)
{}

static irqreturn_t da7280_irq_handler(int irq, void *data)
{}

static int da7280_init(struct da7280_haptic *haptics)
{}

static int da7280_probe(struct i2c_client *client)
{}

static int da7280_suspend(struct device *dev)
{}

static int da7280_resume(struct device *dev)
{}

#ifdef CONFIG_OF
static const struct of_device_id da7280_of_match[] =;
MODULE_DEVICE_TABLE(of, da7280_of_match);
#endif

static const struct i2c_device_id da7280_i2c_id[] =;
MODULE_DEVICE_TABLE(i2c, da7280_i2c_id);

static DEFINE_SIMPLE_DEV_PM_OPS(da7280_pm_ops, da7280_suspend, da7280_resume);

static struct i2c_driver da7280_driver =;
module_i2c_driver();

MODULE_DESCRIPTION();
MODULE_AUTHOR();
MODULE_LICENSE();