karo: tx6ul: rework PMIC support and print PMIC name in boot message
[karo-tx-uboot.git] / board / karo / tx6 / pmic.c
1 /*
2  * Copyright (C) 2015 Lothar WaƟmann <LW@KARO-electronics.de>
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * version 2 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17 #include <common.h>
18 #include <errno.h>
19 #include <i2c.h>
20
21 #include "pmic.h"
22
23 #ifdef CONFIG_SYS_I2C
24 static struct {
25         uchar addr;
26         pmic_setup_func *init;
27         const char *name;
28 } i2c_addrs[] = {
29 #ifdef CONFIG_LTC3676
30         { 0x3c, ltc3676_pmic_setup, "LTC3676", },
31 #endif
32 #ifdef CONFIG_RN5T618
33         { 0x32, rn5t618_pmic_setup, "RN5T618", },
34 #endif
35 #ifdef CONFIG_RN5T567
36         { 0x33, rn5t567_pmic_setup, "RN5T567", },
37 #endif
38 };
39
40 int tx6_pmic_init(int i2c_addr, struct pmic_regs *regs, size_t num_regs)
41 {
42         int ret = -ENODEV;
43         int i;
44         const char *pmic = "N/A";
45
46         printf("PMIC: ");
47
48         for (i = 0; i < ARRAY_SIZE(i2c_addrs); i++) {
49
50                 if (i2c_addrs[i].addr == i2c_addr) {
51                         pmic = i2c_addrs[i].name;
52                         break;
53                 }
54         }
55         printf("%s\n", pmic);
56
57         debug("Probing for I2C dev 0x%02x\n", i2c_addr);
58         ret = i2c_probe(i2c_addr);
59         if (ret == 0) {
60                 debug("Initializing PMIC at I2C addr 0x%02x\n", i2c_addr);
61                 ret = i2c_addrs[i].init(i2c_addr, regs, num_regs);
62         }
63         return ret;
64 }
65 #else
66 int tx6_pmic_init(int i2c_addr, struct pmic_regs *regs, size_t num_regs)
67 {
68         printf("PMIC: N/A\n");
69         return 0;
70 }
71 #endif