1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com/ |
4 | * |
5 | * Author: Keerthy <j-keerthy@ti.com> |
6 | */ |
7 | |
8 | #include <linux/interrupt.h> |
9 | #include <linux/mfd/core.h> |
10 | #include <linux/mod_devicetable.h> |
11 | #include <linux/module.h> |
12 | #include <linux/regmap.h> |
13 | |
14 | #include <linux/mfd/lp873x.h> |
15 | |
16 | static const struct regmap_config lp873x_regmap_config = { |
17 | .reg_bits = 8, |
18 | .val_bits = 8, |
19 | .max_register = LP873X_REG_MAX, |
20 | }; |
21 | |
22 | static const struct mfd_cell lp873x_cells[] = { |
23 | { .name = "lp873x-regulator" , }, |
24 | { .name = "lp873x-gpio" , }, |
25 | }; |
26 | |
27 | static int lp873x_probe(struct i2c_client *client) |
28 | { |
29 | struct lp873x *lp873; |
30 | int ret; |
31 | unsigned int otpid; |
32 | |
33 | lp873 = devm_kzalloc(dev: &client->dev, size: sizeof(*lp873), GFP_KERNEL); |
34 | if (!lp873) |
35 | return -ENOMEM; |
36 | |
37 | lp873->dev = &client->dev; |
38 | |
39 | lp873->regmap = devm_regmap_init_i2c(client, &lp873x_regmap_config); |
40 | if (IS_ERR(ptr: lp873->regmap)) { |
41 | ret = PTR_ERR(ptr: lp873->regmap); |
42 | dev_err(lp873->dev, |
43 | "Failed to initialize register map: %d\n" , ret); |
44 | return ret; |
45 | } |
46 | |
47 | ret = regmap_read(map: lp873->regmap, LP873X_REG_OTP_REV, val: &otpid); |
48 | if (ret) { |
49 | dev_err(lp873->dev, "Failed to read OTP ID\n" ); |
50 | return ret; |
51 | } |
52 | |
53 | lp873->rev = otpid & LP873X_OTP_REV_OTP_ID; |
54 | |
55 | i2c_set_clientdata(client, data: lp873); |
56 | |
57 | ret = mfd_add_devices(parent: lp873->dev, PLATFORM_DEVID_AUTO, cells: lp873x_cells, |
58 | ARRAY_SIZE(lp873x_cells), NULL, irq_base: 0, NULL); |
59 | |
60 | return ret; |
61 | } |
62 | |
63 | static const struct of_device_id of_lp873x_match_table[] = { |
64 | { .compatible = "ti,lp8733" , }, |
65 | { .compatible = "ti,lp8732" , }, |
66 | {} |
67 | }; |
68 | MODULE_DEVICE_TABLE(of, of_lp873x_match_table); |
69 | |
70 | static const struct i2c_device_id lp873x_id_table[] = { |
71 | { "lp873x" , 0 }, |
72 | { }, |
73 | }; |
74 | MODULE_DEVICE_TABLE(i2c, lp873x_id_table); |
75 | |
76 | static struct i2c_driver lp873x_driver = { |
77 | .driver = { |
78 | .name = "lp873x" , |
79 | .of_match_table = of_lp873x_match_table, |
80 | }, |
81 | .probe = lp873x_probe, |
82 | .id_table = lp873x_id_table, |
83 | }; |
84 | module_i2c_driver(lp873x_driver); |
85 | |
86 | MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>" ); |
87 | MODULE_DESCRIPTION("LP873X chip family Multi-Function Device driver" ); |
88 | MODULE_LICENSE("GPL v2" ); |
89 | |