1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
6 #include <linux/module.h>
7 #include <linux/of_address.h>
8 #include <linux/platform_device.h>
9 #include <linux/thermal.h>
12 void __iomem
*mmio_base
;
13 u32 (*read_mmio
)(void __iomem
*mmio_base
);
18 static u32
thermal_mmio_readb(void __iomem
*mmio_base
)
20 return readb(mmio_base
);
23 static int thermal_mmio_get_temperature(void *private, int *temp
)
26 struct thermal_mmio
*sensor
=
27 (struct thermal_mmio
*)private;
29 t
= sensor
->read_mmio(sensor
->mmio_base
) & sensor
->mask
;
37 static struct thermal_zone_of_device_ops thermal_mmio_ops
= {
38 .get_temp
= thermal_mmio_get_temperature
,
41 static int thermal_mmio_probe(struct platform_device
*pdev
)
43 struct resource
*resource
;
44 struct thermal_mmio
*sensor
;
45 int (*sensor_init_func
)(struct platform_device
*pdev
,
46 struct thermal_mmio
*sensor
);
47 struct thermal_zone_device
*thermal_zone
;
51 sensor
= devm_kzalloc(&pdev
->dev
, sizeof(*sensor
), GFP_KERNEL
);
55 resource
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
56 sensor
->mmio_base
= devm_ioremap_resource(&pdev
->dev
, resource
);
57 if (IS_ERR(sensor
->mmio_base
)) {
58 dev_err(&pdev
->dev
, "failed to ioremap memory (%ld)\n",
59 PTR_ERR(sensor
->mmio_base
));
60 return PTR_ERR(sensor
->mmio_base
);
63 sensor_init_func
= device_get_match_data(&pdev
->dev
);
64 if (sensor_init_func
) {
65 ret
= sensor_init_func(pdev
, sensor
);
68 "failed to initialize sensor (%d)\n",
74 thermal_zone
= devm_thermal_zone_of_sensor_register(&pdev
->dev
,
78 if (IS_ERR(thermal_zone
)) {
80 "failed to register sensor (%ld)\n",
81 PTR_ERR(thermal_zone
));
82 return PTR_ERR(thermal_zone
);
85 thermal_mmio_get_temperature(sensor
, &temperature
);
87 "thermal mmio sensor %s registered, current temperature: %d\n",
88 pdev
->name
, temperature
);
93 static int al_thermal_init(struct platform_device
*pdev
,
94 struct thermal_mmio
*sensor
)
96 sensor
->read_mmio
= thermal_mmio_readb
;
98 sensor
->factor
= 1000;
103 static const struct of_device_id thermal_mmio_id_table
[] = {
104 { .compatible
= "amazon,al-thermal", .data
= al_thermal_init
},
107 MODULE_DEVICE_TABLE(of
, thermal_mmio_id_table
);
109 static struct platform_driver thermal_mmio_driver
= {
110 .probe
= thermal_mmio_probe
,
112 .name
= "thermal-mmio",
113 .owner
= THIS_MODULE
,
114 .of_match_table
= of_match_ptr(thermal_mmio_id_table
),
118 module_platform_driver(thermal_mmio_driver
);
120 MODULE_AUTHOR("Talel Shenhar <talel@amazon.com>");
121 MODULE_DESCRIPTION("Thermal MMIO Driver");
122 MODULE_LICENSE("GPL v2");