Commit | Line | Data |
---|---|---|
f20b4a93 CH |
1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* | |
3 | * Driver for MPS MPQ8785 Step-Down Converter | |
4 | */ | |
5 | ||
6 | #include <linux/i2c.h> | |
7 | #include <linux/module.h> | |
8 | #include <linux/of_device.h> | |
9 | #include "pmbus.h" | |
10 | ||
11 | static int mpq8785_identify(struct i2c_client *client, | |
12 | struct pmbus_driver_info *info) | |
13 | { | |
14 | int vout_mode; | |
15 | ||
16 | vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); | |
17 | if (vout_mode < 0 || vout_mode == 0xff) | |
18 | return vout_mode < 0 ? vout_mode : -ENODEV; | |
19 | switch (vout_mode >> 5) { | |
20 | case 0: | |
21 | info->format[PSC_VOLTAGE_OUT] = linear; | |
22 | break; | |
23 | case 1: | |
24 | case 2: | |
25 | info->format[PSC_VOLTAGE_OUT] = direct, | |
26 | info->m[PSC_VOLTAGE_OUT] = 64; | |
27 | info->b[PSC_VOLTAGE_OUT] = 0; | |
28 | info->R[PSC_VOLTAGE_OUT] = 1; | |
29 | break; | |
30 | default: | |
31 | return -ENODEV; | |
32 | } | |
33 | ||
34 | return 0; | |
35 | }; | |
36 | ||
37 | static struct pmbus_driver_info mpq8785_info = { | |
38 | .pages = 1, | |
39 | .format[PSC_VOLTAGE_IN] = direct, | |
40 | .format[PSC_CURRENT_OUT] = direct, | |
41 | .format[PSC_TEMPERATURE] = direct, | |
42 | .m[PSC_VOLTAGE_IN] = 4, | |
43 | .b[PSC_VOLTAGE_IN] = 0, | |
44 | .R[PSC_VOLTAGE_IN] = 1, | |
45 | .m[PSC_CURRENT_OUT] = 16, | |
46 | .b[PSC_CURRENT_OUT] = 0, | |
47 | .R[PSC_CURRENT_OUT] = 0, | |
48 | .m[PSC_TEMPERATURE] = 1, | |
49 | .b[PSC_TEMPERATURE] = 0, | |
50 | .R[PSC_TEMPERATURE] = 0, | |
51 | .func[0] = | |
52 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT | | |
53 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | | |
54 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | | |
55 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP, | |
56 | .identify = mpq8785_identify, | |
57 | }; | |
58 | ||
59 | static int mpq8785_probe(struct i2c_client *client) | |
60 | { | |
61 | return pmbus_do_probe(client, &mpq8785_info); | |
62 | }; | |
63 | ||
64 | static const struct i2c_device_id mpq8785_id[] = { | |
d8a66f36 | 65 | { "mpq8785" }, |
f20b4a93 CH |
66 | { }, |
67 | }; | |
68 | MODULE_DEVICE_TABLE(i2c, mpq8785_id); | |
69 | ||
70 | static const struct of_device_id __maybe_unused mpq8785_of_match[] = { | |
71 | { .compatible = "mps,mpq8785" }, | |
72 | {} | |
73 | }; | |
74 | MODULE_DEVICE_TABLE(of, mpq8785_of_match); | |
75 | ||
76 | static struct i2c_driver mpq8785_driver = { | |
77 | .driver = { | |
78 | .name = "mpq8785", | |
79 | .of_match_table = of_match_ptr(mpq8785_of_match), | |
80 | }, | |
81 | .probe = mpq8785_probe, | |
82 | .id_table = mpq8785_id, | |
83 | }; | |
84 | ||
85 | module_i2c_driver(mpq8785_driver); | |
86 | ||
87 | MODULE_AUTHOR("Charles Hsu <ythsu0511@gmail.com>"); | |
88 | MODULE_DESCRIPTION("PMBus driver for MPS MPQ8785"); | |
89 | MODULE_LICENSE("GPL"); | |
90 | MODULE_IMPORT_NS(PMBUS); |