brintos

brintos / linux-shallow public Read only

0
0
Text · 7.4 KiB · 93b8dd5 Raw
248 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2020 BAIKAL ELECTRONICS, JSC4 *5 * Baikal-T1 Process, Voltage, Temperature sensor driver6 */7#ifndef __HWMON_BT1_PVT_H__8#define __HWMON_BT1_PVT_H__9 10#include <linux/completion.h>11#include <linux/hwmon.h>12#include <linux/kernel.h>13#include <linux/ktime.h>14#include <linux/mutex.h>15#include <linux/seqlock.h>16 17/* Baikal-T1 PVT registers and their bitfields */18#define PVT_CTRL			0x0019#define PVT_CTRL_EN			BIT(0)20#define PVT_CTRL_MODE_FLD		121#define PVT_CTRL_MODE_MASK		GENMASK(3, PVT_CTRL_MODE_FLD)22#define PVT_CTRL_MODE_TEMP		0x023#define PVT_CTRL_MODE_VOLT		0x124#define PVT_CTRL_MODE_LVT		0x225#define PVT_CTRL_MODE_HVT		0x426#define PVT_CTRL_MODE_SVT		0x627#define PVT_CTRL_TRIM_FLD		428#define PVT_CTRL_TRIM_MASK		GENMASK(8, PVT_CTRL_TRIM_FLD)29#define PVT_DATA			0x0430#define PVT_DATA_VALID			BIT(10)31#define PVT_DATA_DATA_FLD		032#define PVT_DATA_DATA_MASK		GENMASK(9, PVT_DATA_DATA_FLD)33#define PVT_TTHRES			0x0834#define PVT_VTHRES			0x0C35#define PVT_LTHRES			0x1036#define PVT_HTHRES			0x1437#define PVT_STHRES			0x1838#define PVT_THRES_LO_FLD		039#define PVT_THRES_LO_MASK		GENMASK(9, PVT_THRES_LO_FLD)40#define PVT_THRES_HI_FLD		1041#define PVT_THRES_HI_MASK		GENMASK(19, PVT_THRES_HI_FLD)42#define PVT_TTIMEOUT			0x1C43#define PVT_INTR_STAT			0x2044#define PVT_INTR_MASK			0x2445#define PVT_RAW_INTR_STAT		0x2846#define PVT_INTR_DVALID			BIT(0)47#define PVT_INTR_TTHRES_LO		BIT(1)48#define PVT_INTR_TTHRES_HI		BIT(2)49#define PVT_INTR_VTHRES_LO		BIT(3)50#define PVT_INTR_VTHRES_HI		BIT(4)51#define PVT_INTR_LTHRES_LO		BIT(5)52#define PVT_INTR_LTHRES_HI		BIT(6)53#define PVT_INTR_HTHRES_LO		BIT(7)54#define PVT_INTR_HTHRES_HI		BIT(8)55#define PVT_INTR_STHRES_LO		BIT(9)56#define PVT_INTR_STHRES_HI		BIT(10)57#define PVT_INTR_ALL			GENMASK(10, 0)58#define PVT_CLR_INTR			0x2C59 60/*61 * PVT sensors-related limits and default values62 * @PVT_TEMP_MIN: Minimal temperature in millidegrees of Celsius.63 * @PVT_TEMP_MAX: Maximal temperature in millidegrees of Celsius.64 * @PVT_TEMP_CHS: Number of temperature hwmon channels.65 * @PVT_VOLT_MIN: Minimal voltage in mV.66 * @PVT_VOLT_MAX: Maximal voltage in mV.67 * @PVT_VOLT_CHS: Number of voltage hwmon channels.68 * @PVT_DATA_MIN: Minimal PVT raw data value.69 * @PVT_DATA_MAX: Maximal PVT raw data value.70 * @PVT_TRIM_MIN: Minimal temperature sensor trim value.71 * @PVT_TRIM_MAX: Maximal temperature sensor trim value.72 * @PVT_TRIM_DEF: Default temperature sensor trim value (set a proper value73 *		  when one is determined for Baikal-T1 SoC).74 * @PVT_TRIM_TEMP: Maximum temperature encoded by the trim factor.75 * @PVT_TRIM_STEP: Temperature stride corresponding to the trim value.76 * @PVT_TOUT_MIN: Minimal timeout between samples in nanoseconds.77 * @PVT_TOUT_DEF: Default data measurements timeout. In case if alarms are78 *		  activated the PVT IRQ is enabled to be raised after each79 *		  conversion in order to have the thresholds checked and the80 *		  converted value cached. Too frequent conversions may cause81 *		  the system CPU overload. Lets set the 50ms delay between82 *		  them by default to prevent this.83 */84#define PVT_TEMP_MIN		-48380L85#define PVT_TEMP_MAX		147438L86#define PVT_TEMP_CHS		187#define PVT_VOLT_MIN		620L88#define PVT_VOLT_MAX		1168L89#define PVT_VOLT_CHS		490#define PVT_DATA_MIN		091#define PVT_DATA_MAX		(PVT_DATA_DATA_MASK >> PVT_DATA_DATA_FLD)92#define PVT_TRIM_MIN		093#define PVT_TRIM_MAX		(PVT_CTRL_TRIM_MASK >> PVT_CTRL_TRIM_FLD)94#define PVT_TRIM_TEMP		713095#define PVT_TRIM_STEP		(PVT_TRIM_TEMP / PVT_TRIM_MAX)96#define PVT_TRIM_DEF		097#define PVT_TOUT_MIN		(NSEC_PER_SEC / 3000)98#if defined(CONFIG_SENSORS_BT1_PVT_ALARMS)99# define PVT_TOUT_DEF		60000100#else101# define PVT_TOUT_DEF		0102#endif103 104/*105 * enum pvt_sensor_type - Baikal-T1 PVT sensor types (correspond to each PVT106 *			  sampling mode)107 * @PVT_SENSOR*: helpers to traverse the sensors in loops.108 * @PVT_TEMP: PVT Temperature sensor.109 * @PVT_VOLT: PVT Voltage sensor.110 * @PVT_LVT: PVT Low-Voltage threshold sensor.111 * @PVT_HVT: PVT High-Voltage threshold sensor.112 * @PVT_SVT: PVT Standard-Voltage threshold sensor.113 */114enum pvt_sensor_type {115	PVT_SENSOR_FIRST,116	PVT_TEMP = PVT_SENSOR_FIRST,117	PVT_VOLT,118	PVT_LVT,119	PVT_HVT,120	PVT_SVT,121	PVT_SENSOR_LAST = PVT_SVT,122	PVT_SENSORS_NUM123};124 125/*126 * enum pvt_clock_type - Baikal-T1 PVT clocks.127 * @PVT_CLOCK_APB: APB clock.128 * @PVT_CLOCK_REF: PVT reference clock.129 */130enum pvt_clock_type {131	PVT_CLOCK_APB,132	PVT_CLOCK_REF,133	PVT_CLOCK_NUM134};135 136/*137 * struct pvt_sensor_info - Baikal-T1 PVT sensor informational structure138 * @channel: Sensor channel ID.139 * @label: hwmon sensor label.140 * @mode: PVT mode corresponding to the channel.141 * @thres_base: upper and lower threshold values of the sensor.142 * @thres_sts_lo: low threshold status bitfield.143 * @thres_sts_hi: high threshold status bitfield.144 * @type: Sensor type.145 * @attr_min_alarm: Min alarm attribute ID.146 * @attr_min_alarm: Max alarm attribute ID.147 */148struct pvt_sensor_info {149	int channel;150	const char *label;151	u32 mode;152	unsigned long thres_base;153	u32 thres_sts_lo;154	u32 thres_sts_hi;155	enum hwmon_sensor_types type;156	u32 attr_min_alarm;157	u32 attr_max_alarm;158};159 160#define PVT_SENSOR_INFO(_ch, _label, _type, _mode, _thres)	\161	{							\162		.channel = _ch,					\163		.label = _label,				\164		.mode = PVT_CTRL_MODE_ ##_mode,			\165		.thres_base = PVT_ ##_thres,			\166		.thres_sts_lo = PVT_INTR_ ##_thres## _LO,	\167		.thres_sts_hi = PVT_INTR_ ##_thres## _HI,	\168		.type = _type,					\169		.attr_min_alarm = _type## _min,			\170		.attr_max_alarm = _type## _max,			\171	}172 173/*174 * struct pvt_cache - PVT sensors data cache175 * @data: data cache in raw format.176 * @thres_sts_lo: low threshold status saved on the previous data conversion.177 * @thres_sts_hi: high threshold status saved on the previous data conversion.178 * @data_seqlock: cached data seq-lock.179 * @conversion: data conversion completion.180 */181struct pvt_cache {182	u32 data;183#if defined(CONFIG_SENSORS_BT1_PVT_ALARMS)184	seqlock_t data_seqlock;185	u32 thres_sts_lo;186	u32 thres_sts_hi;187#else188	struct completion conversion;189#endif190};191 192/*193 * struct pvt_hwmon - Baikal-T1 PVT private data194 * @dev: device structure of the PVT platform device.195 * @hwmon: hwmon device structure.196 * @regs: pointer to the Baikal-T1 PVT registers region.197 * @irq: PVT events IRQ number.198 * @clks: Array of the PVT clocks descriptor (APB/ref clocks).199 * @ref_clk: Pointer to the reference clocks descriptor.200 * @iface_mtx: Generic interface mutex (used to lock the alarm registers201 *	       when the alarms enabled, or the data conversion interface202 *	       if alarms are disabled).203 * @sensor: current PVT sensor the data conversion is being performed for.204 * @cache: data cache descriptor.205 * @timeout: conversion timeout cache.206 */207struct pvt_hwmon {208	struct device *dev;209	struct device *hwmon;210 211	void __iomem *regs;212	int irq;213 214	struct clk_bulk_data clks[PVT_CLOCK_NUM];215 216	struct mutex iface_mtx;217	enum pvt_sensor_type sensor;218	struct pvt_cache cache[PVT_SENSORS_NUM];219	ktime_t timeout;220};221 222/*223 * struct pvt_poly_term - a term descriptor of the PVT data translation224 *			  polynomial225 * @deg: degree of the term.226 * @coef: multiplication factor of the term.227 * @divider: distributed divider per each degree.228 * @divider_leftover: divider leftover, which couldn't be redistributed.229 */230struct pvt_poly_term {231	unsigned int deg;232	long coef;233	long divider;234	long divider_leftover;235};236 237/*238 * struct pvt_poly - PVT data translation polynomial descriptor239 * @total_divider: total data divider.240 * @terms: polynomial terms up to a free one.241 */242struct pvt_poly {243	long total_divider;244	struct pvt_poly_term terms[];245};246 247#endif /* __HWMON_BT1_PVT_H__ */248