1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Hardware monitoring driver for Infineon Multi-phase Digital VR Controllers
4 *
5 * Copyright (c) 2022 Infineon Technologies. All rights reserved.
6 */
7
8#include <linux/err.h>
9#include <linux/i2c.h>
10#include <linux/init.h>
11#include <linux/kernel.h>
12#include <linux/module.h>
13#include "pmbus.h"
14
15#define XDPE152_PAGE_NUM 2
16
17static struct pmbus_driver_info xdpe152_info = {
18	.pages = XDPE152_PAGE_NUM,
19	.format[PSC_VOLTAGE_IN] = linear,
20	.format[PSC_VOLTAGE_OUT] = linear,
21	.format[PSC_TEMPERATURE] = linear,
22	.format[PSC_CURRENT_IN] = linear,
23	.format[PSC_CURRENT_OUT] = linear,
24	.format[PSC_POWER] = linear,
25	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
26		PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
27		PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP |
28		PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT,
29	.func[1] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
30		PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
31		PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT,
32};
33
34static int xdpe152_probe(struct i2c_client *client)
35{
36	struct pmbus_driver_info *info;
37
38	info = devm_kmemdup(&client->dev, &xdpe152_info, sizeof(*info),
39			    GFP_KERNEL);
40	if (!info)
41		return -ENOMEM;
42
43	return pmbus_do_probe(client, info);
44}
45
46static const struct i2c_device_id xdpe152_id[] = {
47	{"xdpe152c4", 0},
48	{"xdpe15284", 0},
49	{}
50};
51
52MODULE_DEVICE_TABLE(i2c, xdpe152_id);
53
54static const struct of_device_id __maybe_unused xdpe152_of_match[] = {
55	{.compatible = "infineon,xdpe152c4"},
56	{.compatible = "infineon,xdpe15284"},
57	{}
58};
59MODULE_DEVICE_TABLE(of, xdpe152_of_match);
60
61static struct i2c_driver xdpe152_driver = {
62	.driver = {
63		.name = "xdpe152c4",
64		.of_match_table = of_match_ptr(xdpe152_of_match),
65	},
66	.probe = xdpe152_probe,
67	.id_table = xdpe152_id,
68};
69
70module_i2c_driver(xdpe152_driver);
71
72MODULE_AUTHOR("Greg Schwendimann <greg.schwendimann@infineon.com>");
73MODULE_DESCRIPTION("PMBus driver for Infineon XDPE152 family");
74MODULE_LICENSE("GPL");
75MODULE_IMPORT_NS(PMBUS);
76