blob: ec2d59230d8441ddfd4ba9b0dce01f27ba85c54c [file] [log] [blame]
Siddartha Mohanadosscd8aa0b2017-04-06 15:17:46 -07001/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -08002 *
Siddartha Mohanadosscd8aa0b2017-04-06 15:17:46 -07003 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -08006 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
Siddartha Mohanadosscd8aa0b2017-04-06 15:17:46 -070011 *
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080012 */
13#ifndef __QCOM_TSENS_H__
14#define __QCOM_TSENS_H__
15
16#include <linux/kernel.h>
17#include <linux/thermal.h>
18#include <linux/interrupt.h>
19#include <linux/types.h>
20#include <linux/workqueue.h>
21#include <linux/io.h>
22#include <linux/delay.h>
23
24#define DEBUG_SIZE 10
25#define TSENS_MAX_SENSORS 16
Siddartha Mohanadoss07b10612017-04-07 14:53:45 -070026#define TSENS_CONTROLLER_ID(n) (n)
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080027#define TSENS_CTRL_ADDR(n) (n)
Siddartha Mohanadoss07b10612017-04-07 14:53:45 -070028#define TSENS_TM_SN_STATUS(n) ((n) + 0xa0)
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080029
30enum tsens_dbg_type {
31 TSENS_DBG_POLL,
32 TSENS_DBG_LOG_TEMP_READS,
33 TSENS_DBG_LOG_INTERRUPT_TIMESTAMP,
Siddartha Mohanadoss64a5da32017-05-09 11:09:51 -070034 TSENS_DBG_LOG_BUS_ID_DATA,
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080035 TSENS_DBG_LOG_MAX
36};
37
38#define tsens_sec_to_msec_value 1000
39
40struct tsens_device;
41
42#if defined(CONFIG_THERMAL_TSENS)
43int tsens2xxx_dbg(struct tsens_device *data, u32 id, u32 dbg_type, int *temp);
44#else
45static inline int tsens2xxx_dbg(struct tsens_device *data, u32 id,
46 u32 dbg_type, int *temp)
47{ return -ENXIO; }
48#endif
49
50struct tsens_dbg {
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080051 u32 idx;
52 unsigned long long time_stmp[DEBUG_SIZE];
53 unsigned long temp[DEBUG_SIZE];
54};
55
56struct tsens_dbg_context {
57 struct tsens_device *tmdev;
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080058 struct tsens_dbg sensor_dbg_info[TSENS_MAX_SENSORS];
59 int tsens_critical_wd_cnt;
Rama Krishna Phani A6ad66332017-10-25 21:20:04 +053060 u32 irq_idx;
61 unsigned long long irq_time_stmp[DEBUG_SIZE];
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080062 struct delayed_work tsens_critical_poll_test;
63};
64
65struct tsens_context {
66 enum thermal_device_mode high_th_state;
67 enum thermal_device_mode low_th_state;
68 enum thermal_device_mode crit_th_state;
69 int high_temp;
70 int low_temp;
71 int crit_temp;
72};
73
74struct tsens_sensor {
75 struct tsens_device *tmdev;
76 struct thermal_zone_device *tzd;
77 u32 hw_id;
78 u32 id;
79 const char *sensor_name;
80 struct tsens_context thr_state;
81};
82
83/**
84 * struct tsens_ops - operations as supported by the tsens device
85 * @init: Function to initialize the tsens device
86 * @get_temp: Function which returns the temp in millidegC
87 */
88struct tsens_ops {
89 int (*hw_init)(struct tsens_device *);
90 int (*get_temp)(struct tsens_sensor *, int *);
Siddartha Mohanadoss07b10612017-04-07 14:53:45 -070091 int (*set_trips)(struct tsens_sensor *, int, int);
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080092 int (*interrupts_reg)(struct tsens_device *);
93 int (*dbg)(struct tsens_device *, u32, u32, int *);
Siddartha Mohanadossf86413d2017-07-18 13:44:31 -070094 int (*sensor_en)(struct tsens_device *, u32);
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -080095};
96
97struct tsens_irqs {
98 const char *name;
99 irqreturn_t (*handler)(int, void *);
100};
101
102/**
103 * struct tsens_data - tsens instance specific data
104 * @num_sensors: Max number of sensors supported by platform
105 * @ops: operations the tsens instance supports
106 * @hw_ids: Subset of sensors ids supported by platform, if not the first n
107 */
108struct tsens_data {
109 const u32 num_sensors;
110 const struct tsens_ops *ops;
111 unsigned int *hw_ids;
112 u32 temp_factor;
113 bool cycle_monitor;
Siddartha Mohanadoss64a5da32017-05-09 11:09:51 -0700114 u32 cycle_compltn_monitor_mask;
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -0800115 bool wd_bark;
Siddartha Mohanadoss64a5da32017-05-09 11:09:51 -0700116 u32 wd_bark_mask;
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -0800117};
118
119struct tsens_device {
120 struct device *dev;
121 struct platform_device *pdev;
122 struct list_head list;
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -0800123 struct regmap *map;
124 struct regmap_field *status_field;
Siddartha Mohanadoss07b10612017-04-07 14:53:45 -0700125 void __iomem *tsens_srot_addr;
126 void __iomem *tsens_tm_addr;
Siddartha Mohanadoss41b4cd92017-02-21 14:34:23 -0800127 const struct tsens_ops *ops;
128 struct tsens_dbg_context tsens_dbg;
129 spinlock_t tsens_crit_lock;
130 spinlock_t tsens_upp_low_lock;
131 const struct tsens_data *ctrl_data;
132 struct tsens_sensor sensor[0];
133};
134
135extern const struct tsens_data data_tsens2xxx, data_tsens23xx, data_tsens24xx;
136
137#endif /* __QCOM_TSENS_H__ */