|
66 | 66 | #define LVTS_TSSEL_CONF 0x13121110
|
67 | 67 | #define LVTS_CALSCALE_CONF 0x300
|
68 | 68 |
|
69 |
| -#define LVTS_MONINT_OFFSET_SENSOR0 0xC |
70 |
| -#define LVTS_MONINT_OFFSET_SENSOR1 0x180 |
71 |
| -#define LVTS_MONINT_OFFSET_SENSOR2 0x3000 |
72 |
| -#define LVTS_MONINT_OFFSET_SENSOR3 0x3000000 |
| 69 | +#define LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR0 BIT(3) |
| 70 | +#define LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR1 BIT(8) |
| 71 | +#define LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR2 BIT(13) |
| 72 | +#define LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR3 BIT(25) |
| 73 | +#define LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR0 BIT(2) |
| 74 | +#define LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR1 BIT(7) |
| 75 | +#define LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR2 BIT(12) |
| 76 | +#define LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR3 BIT(24) |
73 | 77 |
|
74 | 78 | #define LVTS_INT_SENSOR0 0x0009001F
|
75 | 79 | #define LVTS_INT_SENSOR1 0x001203E0
|
@@ -329,23 +333,41 @@ static int lvts_get_temp(struct thermal_zone_device *tz, int *temp)
|
329 | 333 |
|
330 | 334 | static void lvts_update_irq_mask(struct lvts_ctrl *lvts_ctrl)
|
331 | 335 | {
|
332 |
| - u32 masks[] = { |
333 |
| - LVTS_MONINT_OFFSET_SENSOR0, |
334 |
| - LVTS_MONINT_OFFSET_SENSOR1, |
335 |
| - LVTS_MONINT_OFFSET_SENSOR2, |
336 |
| - LVTS_MONINT_OFFSET_SENSOR3, |
| 336 | + static const u32 high_offset_inten_masks[] = { |
| 337 | + LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR0, |
| 338 | + LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR1, |
| 339 | + LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR2, |
| 340 | + LVTS_MONINT_OFFSET_HIGH_INTEN_SENSOR3, |
| 341 | + }; |
| 342 | + static const u32 low_offset_inten_masks[] = { |
| 343 | + LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR0, |
| 344 | + LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR1, |
| 345 | + LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR2, |
| 346 | + LVTS_MONINT_OFFSET_LOW_INTEN_SENSOR3, |
337 | 347 | };
|
338 | 348 | u32 value = 0;
|
339 | 349 | int i;
|
340 | 350 |
|
341 | 351 | value = readl(LVTS_MONINT(lvts_ctrl->base));
|
342 | 352 |
|
343 |
| - for (i = 0; i < ARRAY_SIZE(masks); i++) { |
| 353 | + for (i = 0; i < ARRAY_SIZE(high_offset_inten_masks); i++) { |
344 | 354 | if (lvts_ctrl->sensors[i].high_thresh == lvts_ctrl->high_thresh
|
345 |
| - && lvts_ctrl->sensors[i].low_thresh == lvts_ctrl->low_thresh) |
346 |
| - value |= masks[i]; |
347 |
| - else |
348 |
| - value &= ~masks[i]; |
| 355 | + && lvts_ctrl->sensors[i].low_thresh == lvts_ctrl->low_thresh) { |
| 356 | + /* |
| 357 | + * The minimum threshold needs to be configured in the |
| 358 | + * OFFSETL register to get working interrupts, but we |
| 359 | + * don't actually want to generate interrupts when |
| 360 | + * crossing it. |
| 361 | + */ |
| 362 | + if (lvts_ctrl->low_thresh == -INT_MAX) { |
| 363 | + value &= ~low_offset_inten_masks[i]; |
| 364 | + value |= high_offset_inten_masks[i]; |
| 365 | + } else { |
| 366 | + value |= low_offset_inten_masks[i] | high_offset_inten_masks[i]; |
| 367 | + } |
| 368 | + } else { |
| 369 | + value &= ~(low_offset_inten_masks[i] | high_offset_inten_masks[i]); |
| 370 | + } |
349 | 371 | }
|
350 | 372 |
|
351 | 373 | writel(value, LVTS_MONINT(lvts_ctrl->base));
|
|
0 commit comments