1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2018 Broadcom
6 #include <linux/module.h>
7 #include <linux/of_address.h>
8 #include <linux/platform_device.h>
9 #include <linux/thermal.h>
12 * In stingray thermal IO memory,
13 * Total Number of available TMONs MASK is at offset 0
14 * temperature registers BASE is at 4 byte offset.
15 * Each TMON temperature register size is 4.
17 #define SR_TMON_TEMP_BASE(id) ((id) * 0x4)
19 #define SR_TMON_MAX_LIST 6
22 struct thermal_zone_device
*tz
;
23 unsigned int crit_temp
;
25 struct sr_thermal
*priv
;
30 unsigned int max_crit_temp
;
31 struct sr_tmon tmon
[SR_TMON_MAX_LIST
];
34 static int sr_get_temp(void *data
, int *temp
)
36 struct sr_tmon
*tmon
= data
;
37 struct sr_thermal
*sr_thermal
= tmon
->priv
;
39 *temp
= readl(sr_thermal
->regs
+ SR_TMON_TEMP_BASE(tmon
->tmon_id
));
44 static const struct thermal_zone_of_device_ops sr_tz_ops
= {
45 .get_temp
= sr_get_temp
,
48 static int sr_thermal_probe(struct platform_device
*pdev
)
50 struct device
*dev
= &pdev
->dev
;
51 struct sr_thermal
*sr_thermal
;
58 sr_thermal
= devm_kzalloc(dev
, sizeof(*sr_thermal
), GFP_KERNEL
);
62 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
63 sr_thermal
->regs
= (void __iomem
*)devm_memremap(&pdev
->dev
, res
->start
,
66 if (IS_ERR(sr_thermal
->regs
)) {
67 dev_err(dev
, "failed to get io address\n");
68 return PTR_ERR(sr_thermal
->regs
);
71 ret
= device_property_read_u32(dev
, "brcm,tmon-mask", &sr_tmon_list
);
75 tmon
= sr_thermal
->tmon
;
76 for (i
= 0; i
< SR_TMON_MAX_LIST
; i
++, tmon
++) {
77 if (!(sr_tmon_list
& BIT(i
)))
80 /* Flush temperature registers */
81 writel(0, sr_thermal
->regs
+ SR_TMON_TEMP_BASE(i
));
83 tmon
->priv
= sr_thermal
;
84 tmon
->tz
= devm_thermal_zone_of_sensor_register(dev
, i
, tmon
,
87 return PTR_ERR(tmon
->tz
);
89 dev_dbg(dev
, "thermal sensor %d registered\n", i
);
91 platform_set_drvdata(pdev
, sr_thermal
);
96 static const struct of_device_id sr_thermal_of_match
[] = {
97 { .compatible
= "brcm,sr-thermal", },
100 MODULE_DEVICE_TABLE(of
, sr_thermal_of_match
);
102 static struct platform_driver sr_thermal_driver
= {
103 .probe
= sr_thermal_probe
,
105 .name
= "sr-thermal",
106 .of_match_table
= sr_thermal_of_match
,
109 module_platform_driver(sr_thermal_driver
);
111 MODULE_AUTHOR("Pramod Kumar <pramod.kumar@broadcom.com>");
112 MODULE_DESCRIPTION("Stingray thermal driver");
113 MODULE_LICENSE("GPL v2");