162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Hardware monitoring driver for the Infineon IRPS5401M PMIC. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2019 SED Systems, a division of Calian Ltd. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * The device supports VOUT_PEAK, IOUT_PEAK, and TEMPERATURE_PEAK, however 862306a36Sopenharmony_ci * this driver does not currently support them. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/err.h> 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/kernel.h> 1562306a36Sopenharmony_ci#include <linux/module.h> 1662306a36Sopenharmony_ci#include "pmbus.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define IRPS5401_SW_FUNC (PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | \ 1962306a36Sopenharmony_ci PMBUS_HAVE_STATUS_INPUT | \ 2062306a36Sopenharmony_ci PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \ 2162306a36Sopenharmony_ci PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \ 2262306a36Sopenharmony_ci PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \ 2362306a36Sopenharmony_ci PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define IRPS5401_LDO_FUNC (PMBUS_HAVE_VIN | \ 2662306a36Sopenharmony_ci PMBUS_HAVE_STATUS_INPUT | \ 2762306a36Sopenharmony_ci PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | \ 2862306a36Sopenharmony_ci PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | \ 2962306a36Sopenharmony_ci PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | \ 3062306a36Sopenharmony_ci PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic struct pmbus_driver_info irps5401_info = { 3362306a36Sopenharmony_ci .pages = 5, 3462306a36Sopenharmony_ci .func[0] = IRPS5401_SW_FUNC, 3562306a36Sopenharmony_ci .func[1] = IRPS5401_SW_FUNC, 3662306a36Sopenharmony_ci .func[2] = IRPS5401_SW_FUNC, 3762306a36Sopenharmony_ci .func[3] = IRPS5401_SW_FUNC, 3862306a36Sopenharmony_ci .func[4] = IRPS5401_LDO_FUNC, 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic int irps5401_probe(struct i2c_client *client) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci return pmbus_do_probe(client, &irps5401_info); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic const struct i2c_device_id irps5401_id[] = { 4762306a36Sopenharmony_ci {"irps5401", 0}, 4862306a36Sopenharmony_ci {} 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, irps5401_id); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic struct i2c_driver irps5401_driver = { 5462306a36Sopenharmony_ci .driver = { 5562306a36Sopenharmony_ci .name = "irps5401", 5662306a36Sopenharmony_ci }, 5762306a36Sopenharmony_ci .probe = irps5401_probe, 5862306a36Sopenharmony_ci .id_table = irps5401_id, 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cimodule_i2c_driver(irps5401_driver); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciMODULE_AUTHOR("Robert Hancock"); 6462306a36Sopenharmony_ciMODULE_DESCRIPTION("PMBus driver for Infineon IRPS5401"); 6562306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 6662306a36Sopenharmony_ciMODULE_IMPORT_NS(PMBUS); 67