From 235d738c60c0cd40bd5360a3fc88f75d575c8662 Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Mon, 15 Jul 2024 16:21:05 +0800 Subject: [PATCH] drm/rockchip: ebc: Add fitipower fp9931 thermal driver Signed-off-by: Chaoyi Chen Change-Id: Ic3eec14043c3e8c3b6aae5de03f9b952dc3c6e3e --- .../gpu/drm/rockchip/ebc-dev/pmic/Makefile | 2 +- .../drm/rockchip/ebc-dev/pmic/ebc_pmic_mfd.c | 1 + .../rockchip/ebc-dev/pmic/fp9931-thermal.c | 91 +++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/rockchip/ebc-dev/pmic/fp9931-thermal.c diff --git a/drivers/gpu/drm/rockchip/ebc-dev/pmic/Makefile b/drivers/gpu/drm/rockchip/ebc-dev/pmic/Makefile index d79db1b65c1a..9fdad0c86daf 100644 --- a/drivers/gpu/drm/rockchip/ebc-dev/pmic/Makefile +++ b/drivers/gpu/drm/rockchip/ebc-dev/pmic/Makefile @@ -4,4 +4,4 @@ obj-$(CONFIG_ROCKCHIP_EBC_DEV) += ebc_pmic.o obj-$(CONFIG_EPD_TPS65185_SENSOR) += tps65185.o obj-$(CONFIG_ROCKCHIP_EBC_DEV) += ebc_pmic_mfd.o obj-$(CONFIG_EPD_SY7636A_PMIC) += sy7636a-regulator.o sy7636a-thermal.o -obj-$(CONFIG_EPD_FP9931_PMIC) += fp9931-regulator.o +obj-$(CONFIG_EPD_FP9931_PMIC) += fp9931-regulator.o fp9931-thermal.o diff --git a/drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic_mfd.c b/drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic_mfd.c index 57596f6dedeb..6928ed1789b6 100644 --- a/drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic_mfd.c +++ b/drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic_mfd.c @@ -74,6 +74,7 @@ static struct pmic_mfd_data silergy_sy7636a = { static const struct mfd_cell fp9931_cells[] = { { .name = "fp9931-regulator", }, + { .name = "fp9931-thermal", }, }; static struct pmic_mfd_data fitipower_fp9931 = { diff --git a/drivers/gpu/drm/rockchip/ebc-dev/pmic/fp9931-thermal.c b/drivers/gpu/drm/rockchip/ebc-dev/pmic/fp9931-thermal.c new file mode 100644 index 000000000000..e8b41cd4968f --- /dev/null +++ b/drivers/gpu/drm/rockchip/ebc-dev/pmic/fp9931-thermal.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2024 Rockchip Electronics Co., Ltd. + */ + +#include +#include +#include +#include +#include + +#include "fp9931.h" + +struct fp9931_data { + struct regmap *regmap; + struct thermal_zone_device *thermal_zone_dev; + struct regulator *regulator; +}; + +static int fp9931_get_temp(struct thermal_zone_device *dev, int *res) +{ + unsigned int reg_val; + int ret = 0; + struct fp9931_data *data = dev->devdata; + + ret = regulator_is_enabled(data->regulator); + if (ret <= 0) + return -EBUSY; + + ret = regmap_read(data->regmap, FP9931_TMST_VALUE, ®_val); + if (!ret) { + *res = *((signed char *)®_val); + *res *= 1000; + } + + return ret; +} + +static const struct thermal_zone_device_ops ops = { + .get_temp = fp9931_get_temp, +}; + +static int fp9931_thermal_probe(struct platform_device *pdev) +{ + struct regmap *regmap = dev_get_regmap(pdev->dev.parent, NULL); + struct fp9931_data *data; + + if (!regmap) + return -EPROBE_DEFER; + + data = devm_kzalloc(&pdev->dev, sizeof(struct fp9931_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + platform_set_drvdata(pdev, data); + + data->regulator = devm_regulator_get(&pdev->dev, "vcom"); + if (IS_ERR(data->regulator)) { + dev_err(&pdev->dev, "Unable to get fp9931 vcom regulator, returned %ld\n", + PTR_ERR(data->regulator)); + return PTR_ERR(data->regulator); + } + + data->regmap = regmap; + + data->thermal_zone_dev = devm_thermal_of_zone_register(pdev->dev.parent, 0, data, &ops); + if (IS_ERR(data->thermal_zone_dev)) { + dev_err(&pdev->dev, "Fail to create fp9931 thermal zone\n"); + return PTR_ERR(data->thermal_zone_dev); + } + + return 0; +} + +static const struct platform_device_id fp9931_thermal_id_table[] = { + { "fp9931-thermal", }, + { }, +}; +MODULE_DEVICE_TABLE(platform, fp9931_thermal_id_table); + +static struct platform_driver fp9931_thermal_driver = { + .driver = { + .name = "fp9931-thermal", + }, + .probe = fp9931_thermal_probe, + .id_table = fp9931_thermal_id_table, +}; +module_platform_driver(fp9931_thermal_driver); + +MODULE_DESCRIPTION("fp9931 thermal driver"); +MODULE_LICENSE("GPL");