hwmon: epm_adc: Add EPM support using PSOC
Add support for communicating with the PSOC
using the supported protocol commands from
the PSOC.
The support includes communicating with the
controller to initiate and start the ADC
conversion for the selected channels. Start
and receive ADC conversion for single measurement,
buffered reads, averaging the samples and returning
the results over the set averaging period.
Other commands supported include setting/receiving
the timestamp, setting reference voltage, toggling
gpio to set triggers on set events.
Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org>
(cherry picked from commit efddea4639f2953375fb822524fcae756ae67dc0)
Change-Id: Id519a5b9033b85953f1d6229a144f9df78910900
Signed-off-by: Sudhir Sharma <sudsha@codeaurora.org>
diff --git a/include/linux/epm_adc.h b/include/linux/epm_adc.h
index 9cf2acf..076302b 100644
--- a/include/linux/epm_adc.h
+++ b/include/linux/epm_adc.h
@@ -13,9 +13,80 @@
int32_t physical;
};
+struct epm_psoc_init_resp {
+ u8 cmd;
+ u8 version;
+ u8 compatible_ver;
+ u8 firm_ver[3];
+ u8 num_dev;
+ u8 num_channel;
+};
+
+struct epm_psoc_channel_configure {
+ u8 cmd;
+ u8 device_num;
+ uint32_t channel_num;
+};
+
+struct epm_psoc_set_avg {
+ u8 cmd;
+ u8 avg_period;
+ u8 return_code;
+};
+
+struct epm_psoc_get_data {
+ u8 cmd;
+ u8 dev_num;
+ u8 chan_num;
+ uint32_t timestamp_resp_value;
+ uint32_t reading_value;
+};
+
+struct epm_psoc_get_buffered_data {
+ u8 cmd;
+ u8 dev_num;
+ u8 status_mask;
+ u8 chan_idx;
+ uint32_t chan_mask;
+ uint32_t timestamp_start;
+ uint32_t timestamp_end;
+ u8 buff_data[48];
+};
+
+struct epm_psoc_system_time_stamp {
+ u8 cmd;
+ uint32_t timestamp;
+};
+
+struct epm_psoc_set_channel {
+ u8 cmd;
+ u8 dev_num;
+ uint32_t channel_mask;
+};
+
+struct epm_psoc_get_avg_buffered_switch_data {
+ u8 cmd;
+ u8 status;
+ uint32_t timestamp_start;
+ uint32_t channel_mask;
+ u8 avg_data[54];
+};
+
+struct epm_psoc_set_channel_switch {
+ u8 cmd;
+ u8 dev;
+ uint32_t delay;
+};
+
+struct epm_psoc_set_vadc {
+ u8 cmd;
+ u8 vadc_dev;
+ uint32_t vadc_voltage;
+};
+
#ifdef __KERNEL__
struct epm_chan_properties {
- uint32_t resistorValue;
+ uint32_t resistorvalue;
uint32_t gain;
};
@@ -41,4 +112,41 @@
#define EPM_ADC_DEINIT _IOR(EPM_ADC_IOCTL_CODE, 3, \
uint32_t)
+
+#define EPM_PSOC_ADC_INIT _IOR(EPM_ADC_IOCTL_CODE, 4, \
+ struct epm_psoc_init_resp)
+
+#define EPM_PSOC_ADC_CHANNEL_ENABLE _IOWR(EPM_ADC_IOCTL_CODE, 5, \
+ struct epm_psoc_channel_configure)
+
+#define EPM_PSOC_ADC_CHANNEL_DISABLE _IOWR(EPM_ADC_IOCTL_CODE, 6, \
+ struct epm_psoc_channel_configure)
+
+#define EPM_PSOC_ADC_SET_AVERAGING _IOWR(EPM_ADC_IOCTL_CODE, 7, \
+ struct epm_psoc_set_avg)
+
+#define EPM_PSOC_ADC_GET_LAST_MEASUREMENT _IOWR(EPM_ADC_IOCTL_CODE, 8, \
+ struct epm_psoc_get_data)
+
+#define EPM_PSOC_ADC_GET_BUFFERED_DATA _IOWR(EPM_ADC_IOCTL_CODE, 9, \
+ struct epm_psoc_get_buffered_data)
+
+#define EPM_PSOC_ADC_GET_SYSTEM_TIMESTAMP _IOWR(EPM_ADC_IOCTL_CODE, 10, \
+ struct epm_psoc_system_time_stamp)
+
+#define EPM_PSOC_ADC_SET_SYSTEM_TIMESTAMP _IOWR(EPM_ADC_IOCTL_CODE, 11, \
+ struct epm_psoc_system_time_stamp)
+
+#define EPM_PSOC_ADC_GET_AVERAGE_DATA _IOWR(EPM_ADC_IOCTL_CODE, 12, \
+ struct epm_psoc_get_avg_buffered_switch_data)
+
+#define EPM_PSOC_SET_CHANNEL_SWITCH _IOWR(EPM_ADC_IOCTL_CODE, 13, \
+ struct epm_psoc_set_channel_switch)
+
+#define EPM_PSOC_CLEAR_BUFFER _IOWR(EPM_ADC_IOCTL_CODE, 14, \
+ uint32_t)
+
+#define EPM_PSOC_ADC_SET_VADC_REFERENCE _IOWR(EPM_ADC_IOCTL_CODE, 15, \
+ struct epm_psoc_set_vadc)
+
#endif /* __EPM_ADC_H */