diff options
Diffstat (limited to 'drivers/thermal/qcom/tsens.c')
-rw-r--r-- | drivers/thermal/qcom/tsens.c | 100 |
1 files changed, 54 insertions, 46 deletions
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c index f1ec9bbe4717..36b0b52db524 100644 --- a/drivers/thermal/qcom/tsens.c +++ b/drivers/thermal/qcom/tsens.c | |||
@@ -15,38 +15,38 @@ | |||
15 | static int tsens_get_temp(void *data, int *temp) | 15 | static int tsens_get_temp(void *data, int *temp) |
16 | { | 16 | { |
17 | const struct tsens_sensor *s = data; | 17 | const struct tsens_sensor *s = data; |
18 | struct tsens_device *tmdev = s->tmdev; | 18 | struct tsens_priv *priv = s->priv; |
19 | 19 | ||
20 | return tmdev->ops->get_temp(tmdev, s->id, temp); | 20 | return priv->ops->get_temp(priv, s->id, temp); |
21 | } | 21 | } |
22 | 22 | ||
23 | static int tsens_get_trend(void *p, int trip, enum thermal_trend *trend) | 23 | static int tsens_get_trend(void *data, int trip, enum thermal_trend *trend) |
24 | { | 24 | { |
25 | const struct tsens_sensor *s = p; | 25 | const struct tsens_sensor *s = data; |
26 | struct tsens_device *tmdev = s->tmdev; | 26 | struct tsens_priv *priv = s->priv; |
27 | 27 | ||
28 | if (tmdev->ops->get_trend) | 28 | if (priv->ops->get_trend) |
29 | return tmdev->ops->get_trend(tmdev, s->id, trend); | 29 | return priv->ops->get_trend(priv, s->id, trend); |
30 | 30 | ||
31 | return -ENOTSUPP; | 31 | return -ENOTSUPP; |
32 | } | 32 | } |
33 | 33 | ||
34 | static int __maybe_unused tsens_suspend(struct device *dev) | 34 | static int __maybe_unused tsens_suspend(struct device *dev) |
35 | { | 35 | { |
36 | struct tsens_device *tmdev = dev_get_drvdata(dev); | 36 | struct tsens_priv *priv = dev_get_drvdata(dev); |
37 | 37 | ||
38 | if (tmdev->ops && tmdev->ops->suspend) | 38 | if (priv->ops && priv->ops->suspend) |
39 | return tmdev->ops->suspend(tmdev); | 39 | return priv->ops->suspend(priv); |
40 | 40 | ||
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | 43 | ||
44 | static int __maybe_unused tsens_resume(struct device *dev) | 44 | static int __maybe_unused tsens_resume(struct device *dev) |
45 | { | 45 | { |
46 | struct tsens_device *tmdev = dev_get_drvdata(dev); | 46 | struct tsens_priv *priv = dev_get_drvdata(dev); |
47 | 47 | ||
48 | if (tmdev->ops && tmdev->ops->resume) | 48 | if (priv->ops && priv->ops->resume) |
49 | return tmdev->ops->resume(tmdev); | 49 | return priv->ops->resume(priv); |
50 | 50 | ||
51 | return 0; | 51 | return 0; |
52 | } | 52 | } |
@@ -64,6 +64,9 @@ static const struct of_device_id tsens_table[] = { | |||
64 | .compatible = "qcom,msm8996-tsens", | 64 | .compatible = "qcom,msm8996-tsens", |
65 | .data = &data_8996, | 65 | .data = &data_8996, |
66 | }, { | 66 | }, { |
67 | .compatible = "qcom,tsens-v1", | ||
68 | .data = &data_tsens_v1, | ||
69 | }, { | ||
67 | .compatible = "qcom,tsens-v2", | 70 | .compatible = "qcom,tsens-v2", |
68 | .data = &data_tsens_v2, | 71 | .data = &data_tsens_v2, |
69 | }, | 72 | }, |
@@ -76,22 +79,27 @@ static const struct thermal_zone_of_device_ops tsens_of_ops = { | |||
76 | .get_trend = tsens_get_trend, | 79 | .get_trend = tsens_get_trend, |
77 | }; | 80 | }; |
78 | 81 | ||
79 | static int tsens_register(struct tsens_device *tmdev) | 82 | static int tsens_register(struct tsens_priv *priv) |
80 | { | 83 | { |
81 | int i; | 84 | int i; |
82 | struct thermal_zone_device *tzd; | 85 | struct thermal_zone_device *tzd; |
83 | 86 | ||
84 | for (i = 0; i < tmdev->num_sensors; i++) { | 87 | for (i = 0; i < priv->num_sensors; i++) { |
85 | tmdev->sensor[i].tmdev = tmdev; | 88 | if (!is_sensor_enabled(priv, priv->sensor[i].hw_id)) { |
86 | tmdev->sensor[i].id = i; | 89 | dev_err(priv->dev, "sensor %d: disabled\n", |
87 | tzd = devm_thermal_zone_of_sensor_register(tmdev->dev, i, | 90 | priv->sensor[i].hw_id); |
88 | &tmdev->sensor[i], | 91 | continue; |
92 | } | ||
93 | priv->sensor[i].priv = priv; | ||
94 | priv->sensor[i].id = i; | ||
95 | tzd = devm_thermal_zone_of_sensor_register(priv->dev, i, | ||
96 | &priv->sensor[i], | ||
89 | &tsens_of_ops); | 97 | &tsens_of_ops); |
90 | if (IS_ERR(tzd)) | 98 | if (IS_ERR(tzd)) |
91 | continue; | 99 | continue; |
92 | tmdev->sensor[i].tzd = tzd; | 100 | priv->sensor[i].tzd = tzd; |
93 | if (tmdev->ops->enable) | 101 | if (priv->ops->enable) |
94 | tmdev->ops->enable(tmdev, i); | 102 | priv->ops->enable(priv, i); |
95 | } | 103 | } |
96 | return 0; | 104 | return 0; |
97 | } | 105 | } |
@@ -101,8 +109,8 @@ static int tsens_probe(struct platform_device *pdev) | |||
101 | int ret, i; | 109 | int ret, i; |
102 | struct device *dev; | 110 | struct device *dev; |
103 | struct device_node *np; | 111 | struct device_node *np; |
104 | struct tsens_device *tmdev; | 112 | struct tsens_priv *priv; |
105 | const struct tsens_data *data; | 113 | const struct tsens_plat_data *data; |
106 | const struct of_device_id *id; | 114 | const struct of_device_id *id; |
107 | u32 num_sensors; | 115 | u32 num_sensors; |
108 | 116 | ||
@@ -129,55 +137,55 @@ static int tsens_probe(struct platform_device *pdev) | |||
129 | return -EINVAL; | 137 | return -EINVAL; |
130 | } | 138 | } |
131 | 139 | ||
132 | tmdev = devm_kzalloc(dev, | 140 | priv = devm_kzalloc(dev, |
133 | struct_size(tmdev, sensor, num_sensors), | 141 | struct_size(priv, sensor, num_sensors), |
134 | GFP_KERNEL); | 142 | GFP_KERNEL); |
135 | if (!tmdev) | 143 | if (!priv) |
136 | return -ENOMEM; | 144 | return -ENOMEM; |
137 | 145 | ||
138 | tmdev->dev = dev; | 146 | priv->dev = dev; |
139 | tmdev->num_sensors = num_sensors; | 147 | priv->num_sensors = num_sensors; |
140 | tmdev->ops = data->ops; | 148 | priv->ops = data->ops; |
141 | for (i = 0; i < tmdev->num_sensors; i++) { | 149 | for (i = 0; i < priv->num_sensors; i++) { |
142 | if (data->hw_ids) | 150 | if (data->hw_ids) |
143 | tmdev->sensor[i].hw_id = data->hw_ids[i]; | 151 | priv->sensor[i].hw_id = data->hw_ids[i]; |
144 | else | 152 | else |
145 | tmdev->sensor[i].hw_id = i; | 153 | priv->sensor[i].hw_id = i; |
146 | } | ||
147 | for (i = 0; i < REG_ARRAY_SIZE; i++) { | ||
148 | tmdev->reg_offsets[i] = data->reg_offsets[i]; | ||
149 | } | 154 | } |
155 | priv->feat = data->feat; | ||
156 | priv->fields = data->fields; | ||
150 | 157 | ||
151 | if (!tmdev->ops || !tmdev->ops->init || !tmdev->ops->get_temp) | 158 | if (!priv->ops || !priv->ops->init || !priv->ops->get_temp) |
152 | return -EINVAL; | 159 | return -EINVAL; |
153 | 160 | ||
154 | ret = tmdev->ops->init(tmdev); | 161 | ret = priv->ops->init(priv); |
155 | if (ret < 0) { | 162 | if (ret < 0) { |
156 | dev_err(dev, "tsens init failed\n"); | 163 | dev_err(dev, "tsens init failed\n"); |
157 | return ret; | 164 | return ret; |
158 | } | 165 | } |
159 | 166 | ||
160 | if (tmdev->ops->calibrate) { | 167 | if (priv->ops->calibrate) { |
161 | ret = tmdev->ops->calibrate(tmdev); | 168 | ret = priv->ops->calibrate(priv); |
162 | if (ret < 0) { | 169 | if (ret < 0) { |
163 | dev_err(dev, "tsens calibration failed\n"); | 170 | if (ret != -EPROBE_DEFER) |
171 | dev_err(dev, "tsens calibration failed\n"); | ||
164 | return ret; | 172 | return ret; |
165 | } | 173 | } |
166 | } | 174 | } |
167 | 175 | ||
168 | ret = tsens_register(tmdev); | 176 | ret = tsens_register(priv); |
169 | 177 | ||
170 | platform_set_drvdata(pdev, tmdev); | 178 | platform_set_drvdata(pdev, priv); |
171 | 179 | ||
172 | return ret; | 180 | return ret; |
173 | } | 181 | } |
174 | 182 | ||
175 | static int tsens_remove(struct platform_device *pdev) | 183 | static int tsens_remove(struct platform_device *pdev) |
176 | { | 184 | { |
177 | struct tsens_device *tmdev = platform_get_drvdata(pdev); | 185 | struct tsens_priv *priv = platform_get_drvdata(pdev); |
178 | 186 | ||
179 | if (tmdev->ops->disable) | 187 | if (priv->ops->disable) |
180 | tmdev->ops->disable(tmdev); | 188 | priv->ops->disable(priv); |
181 | 189 | ||
182 | return 0; | 190 | return 0; |
183 | } | 191 | } |