-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'thermal-v6.6-rc1' of ssh://gitolite.kernel.org/pub/scm/lin…
…ux/kernel/git/thermal/linux Merge ARM and related thermal control updates for 6.6-rc1 from Daniel Lezcano: "- Check if the Tegra BPMP supports the trip points in order to set the .set_trips callback (Mikko Perttunen) - Add the new Loongson-2 thermal sensor along with the DT bindings (Yinbo Zhu) - Use IS_ERR_OR_NULL helper to replace a double test on the TI bandgap sensor (Li Zetao) - Remove the call to platform_set_drvdata() as there is no call to platform_get_drvdata() in a bunch of drivers where that happens (Andrei Coardos) - Switch the Mediatek LVTS mode to filtered in order to enable the interrupts (Nícolas F. R. A. Prado) - Fix Wvoid-pointer-to-enum-cast warning on the Exynos TMU (Krzysztof Kozlowski) - Remove redundant usage of of_match_ptr() as the driver db8500 already depends on CONFIG_OF (Ruan Jinjie) - Remove redundant dev_err_probe() because the underlying function already called it in the Mediatek sensor (Chen Jiahao) - Free calibration nvmem after reading it on sun8i (Mark Brown) - Remove useless comment in the code on sun8i (Yangtao Li) - Make tsens_xxxx_nvmem static to fix sparse warning on QCom tsens (Min-Hua Chen) - Remove error message at probe deferral on imx8mm (Ahmad Fatoum) - Fix parameter check in lvts_debugfs_init with IS_ERR on Mediatek LVTS (Minjie Du) - Fix the interrupt routine and configuratoin for the Mediatek LVTS (Nícolas F. R. A. Prado)" * tag 'thermal-v6.6-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux: (27 commits) thermal/drivers/tegra-bpmp: Check if BPMP supports trip points thermal: dt-bindings: add loongson-2 thermal thermal/drivers/loongson-2: Add thermal management support thermal/drivers/ti-soc-thermal: Use helper function IS_ERR_OR_NULL() thermal/drivers/generic-adc: Removed unneeded call to platform_set_drvdata() thermal/drivers/max77620_thermal: Removed unneeded call to platform_set_drvdata() thermal/drivers/mediatek/auxadc_thermal: Removed call to platform_set_drvdata() thermal/drivers/sun8i_thermal: Remove unneeded call to platform_set_drvdata() thermal/drivers/broadcom/brcstb_thermal: Removed unneeded platform_set_drvdata() thermal/drivers/mediatek/lvts_thermal: Make readings valid in filtered mode thermal/drivers/k3_bandgap: Remove unneeded call to platform_set_drvdata() thermal/drivers/k3_j72xx_bandgap: Removed unneeded call to platform_set_drvdata() thermal/drivers/broadcom/sr-thermal: Removed call to platform_set_drvdata() thermal/drivers/samsung: Fix Wvoid-pointer-to-enum-cast warning thermal/drivers/db8500: Remove redundant of_match_ptr() thermal/drivers/mediatek: Clean up redundant dev_err_probe() thermal/drivers/sun8i: Free calibration nvmem after reading it thermal/drivers/sun8i: Remove unneeded comments thermal/drivers/tsens: Make tsens_xxxx_nvmem static thermal/drivers/imx8mm: Suppress log message on probe deferral ...
- Loading branch information
Showing
21 changed files
with
426 additions
and
73 deletions.
There are no files selected for viewing
44 changes: 44 additions & 0 deletions
44
Documentation/devicetree/bindings/thermal/loongson,ls2k-thermal.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||
%YAML 1.2 | ||
--- | ||
$id: http://devicetree.org/schemas/thermal/loongson,ls2k-thermal.yaml# | ||
$schema: http://devicetree.org/meta-schemas/core.yaml# | ||
|
||
title: Thermal sensors on Loongson-2 SoCs | ||
|
||
maintainers: | ||
- zhanghongchen <zhanghongchen@loongson.cn> | ||
- Yinbo Zhu <zhuyinbo@loongson.cn> | ||
|
||
properties: | ||
compatible: | ||
oneOf: | ||
- enum: | ||
- loongson,ls2k1000-thermal | ||
- items: | ||
- enum: | ||
- loongson,ls2k2000-thermal | ||
- const: loongson,ls2k1000-thermal | ||
|
||
reg: | ||
maxItems: 1 | ||
|
||
interrupts: | ||
maxItems: 1 | ||
|
||
required: | ||
- compatible | ||
- reg | ||
- interrupts | ||
|
||
additionalProperties: false | ||
|
||
examples: | ||
- | | ||
#include <dt-bindings/interrupt-controller/irq.h> | ||
thermal: thermal-sensor@1fe01500 { | ||
compatible = "loongson,ls2k1000-thermal"; | ||
reg = <0x1fe01500 0x30>; | ||
interrupt-parent = <&liointc0>; | ||
interrupts = <7 IRQ_TYPE_LEVEL_LOW>; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Author: zhanghongchen <zhanghongchen@loongson.cn> | ||
* Yinbo Zhu <zhuyinbo@loongson.cn> | ||
* Copyright (C) 2022-2023 Loongson Technology Corporation Limited | ||
*/ | ||
|
||
#include <linux/interrupt.h> | ||
#include <linux/io.h> | ||
#include <linux/minmax.h> | ||
#include <linux/module.h> | ||
#include <linux/of_device.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/thermal.h> | ||
#include <linux/units.h> | ||
#include "thermal_hwmon.h" | ||
|
||
#define LOONGSON2_MAX_SENSOR_SEL_NUM 3 | ||
|
||
#define LOONGSON2_THSENS_CTRL_HI_REG 0x0 | ||
#define LOONGSON2_THSENS_CTRL_LOW_REG 0x8 | ||
#define LOONGSON2_THSENS_STATUS_REG 0x10 | ||
#define LOONGSON2_THSENS_OUT_REG 0x14 | ||
|
||
#define LOONGSON2_THSENS_INT_LO BIT(0) | ||
#define LOONGSON2_THSENS_INT_HIGH BIT(1) | ||
#define LOONGSON2_THSENS_OUT_MASK 0xFF | ||
|
||
struct loongson2_thermal_chip_data { | ||
unsigned int thermal_sensor_sel; | ||
}; | ||
|
||
struct loongson2_thermal_data { | ||
void __iomem *regs; | ||
const struct loongson2_thermal_chip_data *chip_data; | ||
}; | ||
|
||
static int loongson2_thermal_set(struct loongson2_thermal_data *data, | ||
int low, int high, bool enable) | ||
{ | ||
u64 reg_ctrl = 0; | ||
int reg_off = data->chip_data->thermal_sensor_sel * 2; | ||
|
||
low = clamp(-40, low, high); | ||
high = clamp(125, low, high); | ||
|
||
low += HECTO; | ||
high += HECTO; | ||
|
||
reg_ctrl = low; | ||
reg_ctrl |= enable ? 0x100 : 0; | ||
writew(reg_ctrl, data->regs + LOONGSON2_THSENS_CTRL_LOW_REG + reg_off); | ||
|
||
reg_ctrl = high; | ||
reg_ctrl |= enable ? 0x100 : 0; | ||
writew(reg_ctrl, data->regs + LOONGSON2_THSENS_CTRL_HI_REG + reg_off); | ||
|
||
return 0; | ||
} | ||
|
||
static int loongson2_thermal_get_temp(struct thermal_zone_device *tz, int *temp) | ||
{ | ||
u32 reg_val; | ||
struct loongson2_thermal_data *data = thermal_zone_device_priv(tz); | ||
|
||
reg_val = readl(data->regs + LOONGSON2_THSENS_OUT_REG); | ||
*temp = ((reg_val & LOONGSON2_THSENS_OUT_MASK) - HECTO) * KILO; | ||
|
||
return 0; | ||
} | ||
|
||
static irqreturn_t loongson2_thermal_irq_thread(int irq, void *dev) | ||
{ | ||
struct thermal_zone_device *tzd = dev; | ||
struct loongson2_thermal_data *data = thermal_zone_device_priv(tzd); | ||
|
||
writeb(LOONGSON2_THSENS_INT_LO | LOONGSON2_THSENS_INT_HIGH, data->regs + | ||
LOONGSON2_THSENS_STATUS_REG); | ||
|
||
thermal_zone_device_update(tzd, THERMAL_EVENT_UNSPECIFIED); | ||
|
||
return IRQ_HANDLED; | ||
} | ||
|
||
static int loongson2_thermal_set_trips(struct thermal_zone_device *tz, int low, int high) | ||
{ | ||
struct loongson2_thermal_data *data = thermal_zone_device_priv(tz); | ||
|
||
return loongson2_thermal_set(data, low/MILLI, high/MILLI, true); | ||
} | ||
|
||
static const struct thermal_zone_device_ops loongson2_of_thermal_ops = { | ||
.get_temp = loongson2_thermal_get_temp, | ||
.set_trips = loongson2_thermal_set_trips, | ||
}; | ||
|
||
static int loongson2_thermal_probe(struct platform_device *pdev) | ||
{ | ||
struct device *dev = &pdev->dev; | ||
struct loongson2_thermal_data *data; | ||
struct thermal_zone_device *tzd; | ||
int ret, irq, i; | ||
|
||
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); | ||
if (!data) | ||
return -ENOMEM; | ||
|
||
data->chip_data = device_get_match_data(dev); | ||
|
||
data->regs = devm_platform_ioremap_resource(pdev, 0); | ||
if (IS_ERR(data->regs)) | ||
return PTR_ERR(data->regs); | ||
|
||
irq = platform_get_irq(pdev, 0); | ||
if (irq < 0) | ||
return irq; | ||
|
||
writeb(LOONGSON2_THSENS_INT_LO | LOONGSON2_THSENS_INT_HIGH, data->regs + | ||
LOONGSON2_THSENS_STATUS_REG); | ||
|
||
loongson2_thermal_set(data, 0, 0, false); | ||
|
||
for (i = 0; i <= LOONGSON2_MAX_SENSOR_SEL_NUM; i++) { | ||
tzd = devm_thermal_of_zone_register(dev, i, data, | ||
&loongson2_of_thermal_ops); | ||
|
||
if (!IS_ERR(tzd)) | ||
break; | ||
|
||
if (PTR_ERR(tzd) != ENODEV) | ||
continue; | ||
|
||
return dev_err_probe(dev, PTR_ERR(tzd), "failed to register"); | ||
} | ||
|
||
ret = devm_request_threaded_irq(dev, irq, NULL, loongson2_thermal_irq_thread, | ||
IRQF_ONESHOT, "loongson2_thermal", tzd); | ||
if (ret < 0) | ||
return dev_err_probe(dev, ret, "failed to request alarm irq\n"); | ||
|
||
devm_thermal_add_hwmon_sysfs(dev, tzd); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct loongson2_thermal_chip_data loongson2_thermal_ls2k1000_data = { | ||
.thermal_sensor_sel = 0, | ||
}; | ||
|
||
static const struct of_device_id of_loongson2_thermal_match[] = { | ||
{ | ||
.compatible = "loongson,ls2k1000-thermal", | ||
.data = &loongson2_thermal_ls2k1000_data, | ||
}, | ||
{ /* end */ } | ||
}; | ||
MODULE_DEVICE_TABLE(of, of_loongson2_thermal_match); | ||
|
||
static struct platform_driver loongson2_thermal_driver = { | ||
.driver = { | ||
.name = "loongson2_thermal", | ||
.of_match_table = of_loongson2_thermal_match, | ||
}, | ||
.probe = loongson2_thermal_probe, | ||
}; | ||
module_platform_driver(loongson2_thermal_driver); | ||
|
||
MODULE_DESCRIPTION("Loongson2 thermal driver"); | ||
MODULE_LICENSE("GPL"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.