blob: 5d35957bf40586e84f6f8259b16481baaf559435 [file] [log] [blame]
Svyatoslav Ryhel9c58dd62024-10-06 14:50:02 +03001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright(C) 2024 Svyatoslav Ryhel <clamor95@gmail.com>
4 */
5
6#include <dm.h>
7#include <dm/lists.h>
8#include <power/pmic.h>
Svyatoslav Ryhel8df7d472024-10-06 14:59:54 +03009#include <power/max8907.h>
10
11static const struct pmic_child_info pmic_children_info[] = {
12 { .prefix = "ldo", .driver = MAX8907_LDO_DRIVER },
13 { .prefix = "sd", .driver = MAX8907_SD_DRIVER },
14 { },
15};
Svyatoslav Ryhel9c58dd62024-10-06 14:50:02 +030016
17static int max8907_write(struct udevice *dev, uint reg, const uint8_t *buff, int len)
18{
19 int ret;
20
21 ret = dm_i2c_write(dev, reg, buff, len);
22 if (ret) {
23 log_debug("%s: write error to device: %p register: %#x!\n",
24 __func__, dev, reg);
25 return ret;
26 }
27
28 return 0;
29}
30
31static int max8907_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
32{
33 int ret;
34
35 ret = dm_i2c_read(dev, reg, buff, len);
36 if (ret) {
37 log_debug("%s: read error from device: %p register: %#x!\n",
38 __func__, dev, reg);
39 return ret;
40 }
41
Svyatoslav Ryhel8df7d472024-10-06 14:59:54 +030042 return 0;
43}
44
45static int max8907_bind(struct udevice *dev)
46{
47 ofnode regulators_node;
48 int children;
49
50 regulators_node = dev_read_subnode(dev, "regulators");
51 if (!ofnode_valid(regulators_node)) {
52 log_err("%s regulators subnode not found!\n", dev->name);
53 return -ENXIO;
54 }
55
56 log_debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
57
58 children = pmic_bind_children(dev, regulators_node, pmic_children_info);
59 if (!children)
60 log_err("%s - no child found\n", dev->name);
61
62 /* Always return success for this device */
Svyatoslav Ryhel9c58dd62024-10-06 14:50:02 +030063 return 0;
64}
65
66static struct dm_pmic_ops max8907_ops = {
67 .read = max8907_read,
68 .write = max8907_write,
69};
70
71static const struct udevice_id max8907_ids[] = {
72 { .compatible = "maxim,max8907" },
73 { }
74};
75
76U_BOOT_DRIVER(pmic_max8907) = {
77 .name = "max8907_pmic",
78 .id = UCLASS_PMIC,
79 .of_match = max8907_ids,
Svyatoslav Ryhel8df7d472024-10-06 14:59:54 +030080 .bind = max8907_bind,
Svyatoslav Ryhel9c58dd62024-10-06 14:50:02 +030081 .ops = &max8907_ops,
82};