hwmon: (pmbus) Add driver for the TEXAS TPS546D24 Buck Converter.

Add the pmbus driver for TEXAS tps546d24 Buck Converter.
The vout mode of tps546d24 supported relative data format,
which is not supported by the PMBus core.

Signed-off-by: Duke Du <dukedu83@gmail.com>
Link: https://lore.kernel.org/r/1662951668-9849-1-git-send-email-Duke.Du@quantatw.com
[groeck: Add __maybe_unused to tps546d24_of_match declaration]
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Duke Du 2022-09-12 11:01:08 +08:00 committed by Guenter Roeck
parent 5768adcb35
commit cc842bd57e
6 changed files with 124 additions and 0 deletions

View File

@ -206,6 +206,7 @@ Hardware Monitoring Kernel Drivers
tps23861
tps40422
tps53679
tps546d24
twl4030-madc-hwmon
ucd9000
ucd9200

View File

@ -0,0 +1,35 @@
.. SPDX-License-Identifier: GPL-2.0-only
Kernel driver tps546d24
=======================
Supported chips:
* TI TPS546D24
Prefix: 'tps546d24'
Addresses scanned: -
Datasheet: https://www.ti.com/lit/gpn/tps546d24
Author: Duke Du <dukedu83@gmail.com>
Description
-----------
The TPS546D24A is a highly integrated, non-isolated DC/DC converter capable
of high frequency operation and 40-A current output from a 7-mm x 5-mm
package.
Two, three, and four TPS546D24A devices can be interconnected
to provide up to 160 A on a single output. The device has an option to
overdrive the internal 5-V LDO with an external 5-V supply via the VDD5
pin to improve efficiency and reduce power dissipation of the converter.
Platform data support
---------------------
The driver supports standard PMBus driver platform data.

View File

@ -20611,6 +20611,13 @@ Q: https://patchwork.kernel.org/project/linux-integrity/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
F: drivers/char/tpm/
TPS546D24 DRIVER
M: Duke Du <dukedu83@gmail.com>
L: linux-hwmon@vger.kernel.org
S: Maintained
F: Documentation/hwmon/tps546d24.rst
F: drivers/hwmon/pmbus/tps546d24.c
TRACING
M: Steven Rostedt <rostedt@goodmis.org>
M: Ingo Molnar <mingo@redhat.com>

View File

@ -397,6 +397,15 @@ config SENSORS_TPS53679
This driver can also be built as a module. If so, the module will
be called tps53679.
config SENSORS_TPS546D24
tristate "TPS546D24"
help
If you say yes here you get hardware monitoring support for TEXAS
TPS546D24.
This driver can also be built as a module. If so, the module will
be called tps546d24
config SENSORS_UCD9000
tristate "TI UCD90120, UCD90124, UCD90160, UCD90320, UCD9090, UCD90910"
help

View File

@ -41,6 +41,7 @@ obj-$(CONFIG_SENSORS_Q54SJ108A2) += q54sj108a2.o
obj-$(CONFIG_SENSORS_STPDDC60) += stpddc60.o
obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o
obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o
obj-$(CONFIG_SENSORS_TPS546D24) += tps546d24.o
obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o
obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o
obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o

View File

@ -0,0 +1,71 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Hardware monitoring driver for TEXAS TPS546D24 buck converter
*/
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pmbus.h>
#include "pmbus.h"
static struct pmbus_driver_info tps546d24_info = {
.pages = 1,
.format[PSC_VOLTAGE_IN] = linear,
.format[PSC_VOLTAGE_OUT] = linear,
.format[PSC_TEMPERATURE] = linear,
.format[PSC_CURRENT_OUT] = linear,
.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
| PMBUS_HAVE_IOUT | PMBUS_HAVE_VOUT
| PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_STATUS_VOUT
| PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
};
static int tps546d24_probe(struct i2c_client *client)
{
int reg;
reg = i2c_smbus_read_byte_data(client, PMBUS_VOUT_MODE);
if (reg < 0)
return reg;
if (reg & 0x80) {
int err;
err = i2c_smbus_write_byte_data(client, PMBUS_VOUT_MODE, reg & 0x7f);
if (err < 0)
return err;
}
return pmbus_do_probe(client, &tps546d24_info);
}
static const struct i2c_device_id tps546d24_id[] = {
{"tps546d24", 0},
{}
};
MODULE_DEVICE_TABLE(i2c, tps546d24_id);
static const struct of_device_id __maybe_unused tps546d24_of_match[] = {
{.compatible = "ti,tps546d24"},
{}
};
MODULE_DEVICE_TABLE(of, tps546d24_of_match);
/* This is the driver that will be inserted */
static struct i2c_driver tps546d24_driver = {
.driver = {
.name = "tps546d24",
.of_match_table = of_match_ptr(tps546d24_of_match),
},
.probe_new = tps546d24_probe,
.id_table = tps546d24_id,
};
module_i2c_driver(tps546d24_driver);
MODULE_AUTHOR("Duke Du <dukedu83@gmail.com>");
MODULE_DESCRIPTION("PMBus driver for TI tps546d24");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS(PMBUS);