xref: /rk3399_rockchip-uboot/drivers/power/pmic/pmic_max77686.c (revision 8ff43b03e9f38a6e136e2e20eec4e8b2eb4a1d3d)
1 /*
2  *  Copyright (C) 2012 Samsung Electronics
3  *  Rajeshwari Shinde <rajeshwari.s@samsung.com>
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23 
24 #include <common.h>
25 #include <fdtdec.h>
26 #include <i2c.h>
27 #include <power/pmic.h>
28 #include <power/max77686_pmic.h>
29 #include <errno.h>
30 
31 DECLARE_GLOBAL_DATA_PTR;
32 
33 int pmic_init(unsigned char bus)
34 {
35 	static const char name[] = "MAX77686_PMIC";
36 	struct pmic *p = pmic_alloc();
37 
38 	if (!p) {
39 		printf("%s: POWER allocation error!\n", __func__);
40 		return -ENOMEM;
41 	}
42 
43 #ifdef CONFIG_OF_CONTROL
44 	const void *blob = gd->fdt_blob;
45 	int node, parent;
46 
47 	node = fdtdec_next_compatible(blob, 0, COMPAT_MAXIM_MAX77686_PMIC);
48 	if (node < 0) {
49 		debug("PMIC: No node for PMIC Chip in device tree\n");
50 		debug("node = %d\n", node);
51 		return -1;
52 	}
53 
54 	parent = fdt_parent_offset(blob, node);
55 	if (parent < 0) {
56 		debug("%s: Cannot find node parent\n", __func__);
57 		return -1;
58 	}
59 
60 	p->bus = i2c_get_bus_num_fdt(parent);
61 	if (p->bus < 0) {
62 		debug("%s: Cannot find I2C bus\n", __func__);
63 		return -1;
64 	}
65 	p->hw.i2c.addr = fdtdec_get_int(blob, node, "reg", 9);
66 #else
67 	p->bus = bus;
68 	p->hw.i2c.addr = MAX77686_I2C_ADDR;
69 #endif
70 
71 	p->name = name;
72 	p->interface = PMIC_I2C;
73 	p->number_of_regs = PMIC_NUM_OF_REGS;
74 	p->hw.i2c.tx_num = 1;
75 
76 	puts("Board PMIC init\n");
77 
78 	return 0;
79 }
80