xref: /OK3568_Linux_fs/kernel/drivers/hwmon/pmbus/ir38064.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Hardware monitoring driver for Infineon IR38064
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2017 Google Inc
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * VOUT_MODE is not supported by the device. The driver fakes VOUT linear16
8*4882a593Smuzhiyun  * mode with exponent value -8 as direct mode with m=256/b=0/R=0.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * The device supports VOUT_PEAK, IOUT_PEAK, and TEMPERATURE_PEAK, however
11*4882a593Smuzhiyun  * this driver does not currently support them.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/err.h>
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/init.h>
17*4882a593Smuzhiyun #include <linux/kernel.h>
18*4882a593Smuzhiyun #include <linux/module.h>
19*4882a593Smuzhiyun #include "pmbus.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static struct pmbus_driver_info ir38064_info = {
22*4882a593Smuzhiyun 	.pages = 1,
23*4882a593Smuzhiyun 	.format[PSC_VOLTAGE_IN] = linear,
24*4882a593Smuzhiyun 	.format[PSC_VOLTAGE_OUT] = direct,
25*4882a593Smuzhiyun 	.format[PSC_CURRENT_OUT] = linear,
26*4882a593Smuzhiyun 	.format[PSC_POWER] = linear,
27*4882a593Smuzhiyun 	.format[PSC_TEMPERATURE] = linear,
28*4882a593Smuzhiyun 	.m[PSC_VOLTAGE_OUT] = 256,
29*4882a593Smuzhiyun 	.b[PSC_VOLTAGE_OUT] = 0,
30*4882a593Smuzhiyun 	.R[PSC_VOLTAGE_OUT] = 0,
31*4882a593Smuzhiyun 	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
32*4882a593Smuzhiyun 	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
33*4882a593Smuzhiyun 	    | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
34*4882a593Smuzhiyun 	    | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
35*4882a593Smuzhiyun 	    | PMBUS_HAVE_POUT,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
ir38064_probe(struct i2c_client * client)38*4882a593Smuzhiyun static int ir38064_probe(struct i2c_client *client)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	return pmbus_do_probe(client, &ir38064_info);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static const struct i2c_device_id ir38064_id[] = {
44*4882a593Smuzhiyun 	{"ir38064", 0},
45*4882a593Smuzhiyun 	{}
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, ir38064_id);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /* This is the driver that will be inserted */
51*4882a593Smuzhiyun static struct i2c_driver ir38064_driver = {
52*4882a593Smuzhiyun 	.driver = {
53*4882a593Smuzhiyun 		   .name = "ir38064",
54*4882a593Smuzhiyun 		   },
55*4882a593Smuzhiyun 	.probe_new = ir38064_probe,
56*4882a593Smuzhiyun 	.remove = pmbus_do_remove,
57*4882a593Smuzhiyun 	.id_table = ir38064_id,
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun module_i2c_driver(ir38064_driver);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun MODULE_AUTHOR("Maxim Sloyko <maxims@google.com>");
63*4882a593Smuzhiyun MODULE_DESCRIPTION("PMBus driver for Infineon IR38064");
64*4882a593Smuzhiyun MODULE_LICENSE("GPL");
65