/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2015, The Linux Foundation. All rights reserved. */ #ifndef __QCOM_TSENS_H__ #define __QCOM_TSENS_H__ #define NO_PT_CALIB … #define ONE_PT_CALIB … #define ONE_PT_CALIB2 … #define TWO_PT_CALIB … #define ONE_PT_CALIB2_NO_OFFSET … #define TWO_PT_CALIB_NO_OFFSET … #define CAL_DEGC_PT1 … #define CAL_DEGC_PT2 … #define SLOPE_FACTOR … #define SLOPE_DEFAULT … #define TIMEOUT_US … #define THRESHOLD_MAX_ADC_CODE … #define THRESHOLD_MIN_ADC_CODE … #define MAX_SENSORS … #include <linux/interrupt.h> #include <linux/thermal.h> #include <linux/regmap.h> #include <linux/slab.h> struct tsens_priv; /* IP version numbers in ascending order */ enum tsens_ver { … }; enum tsens_irq_type { … }; /** * struct tsens_sensor - data for each sensor connected to the tsens device * @priv: tsens device instance that this sensor is connected to * @tzd: pointer to the thermal zone that this sensor is in * @offset: offset of temperature adjustment curve * @hw_id: HW ID can be used in case of platform-specific IDs * @slope: slope of temperature adjustment curve * @status: 8960-specific variable to track 8960 and 8660 status register offset */ struct tsens_sensor { … }; /** * struct tsens_ops - operations as supported by the tsens device * @init: Function to initialize the tsens device * @calibrate: Function to calibrate the tsens device * @get_temp: Function which returns the temp in millidegC * @enable: Function to enable (clocks/power) tsens device * @disable: Function to disable the tsens device * @suspend: Function to suspend the tsens device * @resume: Function to resume the tsens device */ struct tsens_ops { … }; #define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) … #define REG_FIELD_FOR_EACH_SENSOR16(_name, _offset, _startbit, _stopbit) … #define REG_FIELD_SPLIT_BITS_0_15(_name, _offset) … #define REG_FIELD_SPLIT_BITS_16_31(_name, _offset) … /* * reg_field IDs to use as an index into an array * If you change the order of the entries, check the devm_regmap_field_alloc() * calls in init_common() */ enum regfield_ids { … }; /** * struct tsens_features - Features supported by the IP * @ver_major: Major number of IP version * @crit_int: does the IP support critical interrupts? * @combo_int: does the IP use one IRQ for up, low and critical thresholds? * @adc: do the sensors only output adc code (instead of temperature)? * @srot_split: does the IP neatly splits the register space into SROT and TM, * with SROT only being available to secure boot firmware? * @has_watchdog: does this IP support watchdog functionality? * @max_sensors: maximum sensors supported by this version of the IP * @trip_min_temp: minimum trip temperature supported by this version of the IP * @trip_max_temp: maximum trip temperature supported by this version of the IP */ struct tsens_features { … }; /** * struct tsens_plat_data - tsens compile-time platform data * @num_sensors: Number of sensors supported by platform * @ops: operations the tsens instance supports * @hw_ids: Subset of sensors ids supported by platform, if not the first n * @feat: features of the IP * @fields: bitfield locations */ struct tsens_plat_data { … }; /** * struct tsens_context - Registers to be saved/restored across a context loss * @threshold: Threshold register value * @control: Control register value */ struct tsens_context { … }; /** * struct tsens_priv - private data for each instance of the tsens IP * @dev: pointer to struct device * @num_sensors: number of sensors enabled on this device * @tm_map: pointer to TM register address space * @srot_map: pointer to SROT register address space * @tm_offset: deal with old device trees that don't address TM and SROT * address space separately * @ul_lock: lock while processing upper/lower threshold interrupts * @crit_lock: lock while processing critical threshold interrupts * @rf: array of regmap_fields used to store value of the field * @ctx: registers to be saved and restored during suspend/resume * @feat: features of the IP * @fields: bitfield locations * @ops: pointer to list of callbacks supported by this device * @debug_root: pointer to debugfs dentry for all tsens * @debug: pointer to debugfs dentry for tsens controller * @sensor: list of sensors attached to this device */ struct tsens_priv { … }; /** * struct tsens_single_value - internal representation of a single field inside nvmem calibration data * @idx: index into the u32 data array * @shift: the shift of the first bit in the value * @blob: index of the data blob to use for this cell */ struct tsens_single_value { … }; /** * struct tsens_legacy_calibration_format - description of calibration data used when parsing the legacy nvmem blob * @base_len: the length of the base fields inside calibration data * @base_shift: the shift to be applied to base data * @sp_len: the length of the sN_pM fields inside calibration data * @mode: descriptor of the calibration mode field * @invalid: descriptor of the calibration mode invalid field * @base: descriptors of the base0 and base1 fields * @sp: descriptors of the sN_pM fields */ struct tsens_legacy_calibration_format { … }; char *qfprom_read(struct device *dev, const char *cname); int tsens_read_calibration_legacy(struct tsens_priv *priv, const struct tsens_legacy_calibration_format *format, u32 *p1, u32 *p2, u32 *cdata, u32 *csel); int tsens_read_calibration(struct tsens_priv *priv, int shift, u32 *p1, u32 *p2, bool backup); int tsens_calibrate_nvmem(struct tsens_priv *priv, int shift); int tsens_calibrate_common(struct tsens_priv *priv); void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode); int init_common(struct tsens_priv *priv); int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp); int get_temp_common(const struct tsens_sensor *s, int *temp); #ifdef CONFIG_SUSPEND int tsens_resume_common(struct tsens_priv *priv); #else #define tsens_resume_common … #endif /* TSENS target */ extern struct tsens_plat_data data_8960; /* TSENS v0.1 targets */ extern struct tsens_plat_data data_8226, data_8909, data_8916, data_8939, data_8974, data_9607; /* TSENS v1 targets */ extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956; /* TSENS v2 targets */ extern struct tsens_plat_data data_8996, data_ipq8074, data_tsens_v2; #endif /* __QCOM_TSENS_H__ */