136 lines
3.7 KiB
C
136 lines
3.7 KiB
C
/*
|
|
* STMicroelectronics lps22hb driver
|
|
*
|
|
* Copyright 2016 STMicroelectronics Inc.
|
|
*
|
|
* Authors: HESA BU - Application Team
|
|
* : Adalberto Muhuho (adalberto.muhuho@st.com)
|
|
* : Mario Tesi (mario.tesi@st.com)
|
|
*
|
|
* The structure of this driver is based on reference code previously delivered
|
|
* by Lorenzo Sarchi
|
|
*
|
|
* Version: 0.0.3
|
|
* Date : 2016/May/16
|
|
*
|
|
********************************************************************************
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
|
|
* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
|
|
* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
|
|
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
|
|
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
|
|
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
|
|
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
*/
|
|
/******************************************************************************
|
|
Revision history:
|
|
|
|
Revision 0.0.1 2015/Dec/11:
|
|
first (BETA) release
|
|
|
|
Revision 0.0.2 2016/Apr/19:
|
|
Revision 0.0.2 downgrades previous License to GPLv2
|
|
|
|
Revision 0.0.3 2016/May/16:
|
|
Added SPI support
|
|
******************************************************************************/
|
|
#ifndef __LPS22_H__
|
|
#define __LPS22_H__
|
|
|
|
#define LPS22_PRS_MIN_POLL_PERIOD_MS 13
|
|
#define LPS22_PRS_DEV_NAME "lps22hb"
|
|
#define LPS22_HD_PRS_DEV_NAME "lps22hd"
|
|
|
|
/* input define mappings */
|
|
#define ABS_PR ABS_PRESSURE
|
|
#define ABS_TEMP ABS_GAS
|
|
|
|
/* Output conversion factors */
|
|
#define LPS22HB_SENSITIVITY_T 100 /* = LSB/degrC */
|
|
#define LPS22HB_SENSITIVITY_P 4096 /* = LSB/mbar */
|
|
|
|
#define LPS22HB_TEMPERATURE_OFFSET 0
|
|
|
|
#define LPS22HB_RX_MAX_LENGTH 500
|
|
#define LPS22HB_TX_MAX_LENGTH 500
|
|
|
|
#define RESUME_ENTRIES 16
|
|
|
|
#ifdef __KERNEL__
|
|
struct lps22_prs_data;
|
|
|
|
struct lps22_prs_platform_data {
|
|
int (*init)(void);
|
|
void (*exit)(void);
|
|
int (*power_on)(void);
|
|
int (*power_off)(void);
|
|
|
|
unsigned int poll_interval;
|
|
unsigned int min_interval;
|
|
};
|
|
|
|
struct lps22_prs_transfer_buffer {
|
|
struct mutex buf_lock;
|
|
u8 rx_buf[LPS22HB_RX_MAX_LENGTH];
|
|
u8 tx_buf[LPS22HB_TX_MAX_LENGTH] ____cacheline_aligned;
|
|
};
|
|
|
|
struct lps22_prs_transfer_function {
|
|
int (*write) (struct lps22_prs_data *cdata, u8 reg_addr, int len, u8 *data);
|
|
int (*read) (struct lps22_prs_data *cdata, u8 reg_addr, int len, u8 *data);
|
|
};
|
|
|
|
struct lps22_prs_data {
|
|
const char *name;
|
|
struct lps22_prs_platform_data *pdata;
|
|
|
|
struct mutex lock;
|
|
struct workqueue_struct *workqueue;
|
|
struct hrtimer hr_timer;
|
|
ktime_t delta_ts;
|
|
struct work_struct input_work;
|
|
struct input_dev *input_dev_pres;
|
|
|
|
struct device *dev;
|
|
struct device *factory_dev;
|
|
|
|
int hw_initialized;
|
|
/* hw_working=-1 means not tested yet */
|
|
int hw_working;
|
|
u16 bustype;
|
|
int irq;
|
|
atomic_t enabled;
|
|
int on_before_suspend;
|
|
|
|
u8 resume_state[RESUME_ENTRIES];
|
|
|
|
#ifdef DEBUG
|
|
u8 reg_addr;
|
|
#endif
|
|
const struct lps22_prs_transfer_function *tf;
|
|
struct lps22_prs_transfer_buffer tb;
|
|
};
|
|
|
|
#define INPUT_EVENT_TYPE EV_MSC
|
|
#define INPUT_EVENT_X MSC_SERIAL
|
|
#define INPUT_EVENT_Y MSC_PULSELED
|
|
#define INPUT_EVENT_Z MSC_GESTURE
|
|
#define INPUT_EVENT_TIME_MSB MSC_SCAN
|
|
#define INPUT_EVENT_TIME_LSB MSC_MAX
|
|
|
|
int lps22hb_common_probe(struct lps22_prs_data *prs);
|
|
int lps22hb_common_remove(struct lps22_prs_data *prs);
|
|
void lps22hb_common_shutdown(struct lps22_prs_data *prs);
|
|
#ifdef CONFIG_PM
|
|
int lps22hb_common_resume(struct lps22_prs_data *prs);
|
|
int lps22hb_common_suspend(struct lps22_prs_data *prs);
|
|
#endif /* CONFIG_PM */
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* __LPS22_H__ */
|