Merge branch 'CR_1131_PCIE_kevin.xie' into 'jh7110-5.15.y-devel'
[platform/kernel/linux-starfive.git] / drivers / soc / starfive / jh7110_pmic.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * PMIC driver for the StarFive JH7110 SoC
4  *
5  * Copyright (C) 2022 changhuang <changhuang.liang@starfivetech.com>
6  */
7
8 #include <linux/i2c.h>
9 #include <linux/init.h>
10 #include <linux/module.h>
11 #include <linux/device.h>
12 #include <soc/starfive/jh7110_pmic.h>
13
14 static struct pmic_dev *pmic_dev;
15
16 static int pmic_read_reg(struct pmic_dev *pmic_dev, u8 reg)
17 {
18         struct i2c_client *client = pmic_dev->i2c_client;
19         int ret = i2c_smbus_read_byte_data(client, reg);
20
21         if (ret < 0)
22                 dev_err(&client->dev, "Read Error\n");
23
24         return ret;
25 }
26
27 static int pmic_write_reg(struct pmic_dev *pmic_dev, u8 reg, u8 val)
28 {
29         struct i2c_client *client = pmic_dev->i2c_client;
30         int ret = i2c_smbus_write_byte_data(client, reg, val);
31
32         if (ret < 0)
33                 dev_err(&client->dev, "Write Error\n");
34
35         return ret;
36 }
37
38 static void pmic_set_bit(struct pmic_dev *pmic_dev, u8 reg, u8 mask, u8 val)
39 {
40         u8 value;
41
42         value = pmic_read_reg(pmic_dev, reg) & ~mask;
43         val &= mask;
44         val |= value;
45         pmic_write_reg(pmic_dev, reg, val);
46 }
47
48 void pmic_set_domain(u8 reg, u8 domain, u8 on)
49 {
50         pmic_set_bit(pmic_dev, reg, BIT(domain), on<<domain);
51 }
52 EXPORT_SYMBOL(pmic_set_domain);
53
54 static int pmic_probe(struct i2c_client *client)
55 {
56         struct device *dev = &client->dev;
57
58         pmic_dev = devm_kzalloc(dev, sizeof(*pmic_dev), GFP_KERNEL);
59         if (!pmic_dev)
60                 return -ENOMEM;
61
62         pmic_dev->i2c_client = client;
63
64         dev_info(dev, "pmic init success!");
65
66         return 0;
67 }
68
69 static int pmic_remove(struct i2c_client *client)
70 {
71         return 0;
72 }
73
74 static const struct i2c_device_id pmic_id[] = {
75         {"pmic", 0},
76         {},
77 };
78 MODULE_DEVICE_TABLE(i2c, pmic_id);
79
80 static const struct of_device_id pmic_dt_ids[] = {
81         { .compatible = "starfive,pmic" },
82         { /* sentinel */ }
83 };
84 MODULE_DEVICE_TABLE(of, pmic_dt_ids);
85
86 static struct i2c_driver pmic_i2c_driver = {
87         .driver = {
88                 .name  = "pmic",
89                 .of_match_table = pmic_dt_ids,
90         },
91         .id_table = pmic_id,
92         .probe_new = pmic_probe,
93         .remove   = pmic_remove,
94 };
95
96 static __init int pmic_init(void)
97 {
98         return i2c_add_driver(&pmic_i2c_driver);
99 }
100
101 static __exit void pmic_exit(void)
102 {
103         i2c_del_driver(&pmic_i2c_driver);
104 }
105
106 fs_initcall(pmic_init);
107 module_exit(pmic_exit);
108
109 MODULE_AUTHOR("changhuang <changhuang.liang@starfivetech.com>");
110 MODULE_DESCRIPTION("StarFive JH7110 PMIC Device Driver");
111 MODULE_LICENSE("GPL v2");