max8998: move power key check routines
[kernel/u-boot.git] / drivers / misc / max8998.c
1 /*
2  * Command for max8998 / lp3974 pmic
3  *
4  * Copyright (C) 2011 Samsung Electrnoics
5  * Minkyu Kang <mk7.kang@samsung.com>
6  * Kyungmin Park <kyungmin.park@samsung.com>
7  */
8
9 #include <common.h>
10 #include <i2c.h>
11 #include <pmic.h>
12
13 unsigned int pmic_bus;
14
15 void pmic_bus_init(int bus_num)
16 {
17         pmic_bus = bus_num;
18 }
19
20 static int pmic_probe(void)
21 {
22         unsigned char addr = 0xCC >> 1;
23
24         i2c_set_bus_num(pmic_bus);
25
26         if (i2c_probe(addr)) {
27                 puts("Can't found pmic\n");
28                 return 1;
29         }
30
31         return 0;
32 }
33
34 #ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
35 #define i2c_read_func(addr, reg, alen, val, len)        \
36                         i2c_read_r(addr, reg, alen, val, len)
37 #else
38 #define i2c_read_func(addr, reg, alen, val, len)        \
39                         i2c_read(addr, reg, alen, val, len)
40 #endif
41
42 unsigned int pmic_get_irq(int irq)
43 {
44         unsigned char addr, val[4];
45         unsigned int ret;
46         unsigned int reg;
47         unsigned int shift;
48
49         addr = 0xCC >> 1;
50         if (pmic_probe())
51                 return 0;
52
53         switch (irq) {
54         case PWRONR:
55                 reg = 0;
56                 shift = 7;
57                 break;
58         case PWRONF:
59                 reg = 0;
60                 shift = 6;
61                 break;
62         case PWRON1S:
63                 reg = 2;
64                 shift = 0;
65                 break;
66         default:
67                 return 0;
68         }
69
70         i2c_read_func(addr, 0x0, 1, val, 4);
71
72         ret = val[reg] & (1 << shift);
73
74         return !!ret;
75 }
76
77 static int pmic_status(void)
78 {
79         unsigned char addr, val[2];
80         int reg, i;
81
82         addr = 0xCC >> 1;
83
84         if (pmic_probe())
85                 return -1;
86
87         reg = 0x11;
88         i2c_read_func(addr, reg, 1, val, 1);
89         for (i = 7; i >= 4; i--)
90                 printf("BUCK%d %s\n", 7 - i + 1,
91                         val[0] & (1 << i) ? "on" : "off");
92         for (; i >= 0; i--)
93                 printf("LDO%d %s\n", 5 - i,
94                         val[0] & (1 << i) ? "on" : "off");
95         reg = 0x12;
96         i2c_read_func(addr, reg, 1, val, 1);
97         for (i = 7; i >= 0; i--)
98                 printf("LDO%d %s\n", 7 - i + 6,
99                         val[0] & (1 << i) ? "on" : "off");
100         reg = 0x13;
101         i2c_read_func(addr, reg, 1, val, 1);
102         for (i = 7; i >= 4; i--)
103                 printf("LDO%d %s\n", 7 - i + 14,
104                         val[0] & (1 << i) ? "on" : "off");
105
106         reg = 0xd;
107         i2c_read_func(addr, reg, 1, val, 1);
108         for (i = 7; i >= 6; i--)
109                 printf("SAFEOUT%d %s\n", 7 - i + 1,
110                         val[0] & (1 << i) ? "on" : "off");
111         return 0;
112 }
113
114 static int pmic_ldo_control(int buck, int ldo, int safeout, int on)
115 {
116         unsigned char addr, val[2];
117         unsigned int reg, shift;
118
119         if (ldo) {
120                 if (ldo < 2)
121                         return -1;
122                 if (ldo <= 5) {
123                         reg = 0x11;
124                         shift = 5 - ldo;
125                 } else if (ldo <= 13) {
126                         reg = 0x12;
127                         shift = 13 - ldo;
128                 } else if (ldo <= 17) {
129                         reg = 0x13;
130                         shift = 17 - ldo + 4;
131                 } else
132                         return -1;
133         } else if (buck) {
134                 if (buck > 4)
135                         return -1;
136                 reg = 0x11;
137                 shift = 4 - buck + 4;
138         } else if (safeout) {
139                 if (safeout > 3)
140                         return -1;
141                 reg = 0xd;
142                 shift = 8 - safeout;
143         } else
144                 return -1;
145
146         addr = 0xCC >> 1;
147
148         if (pmic_probe())
149                 return -1;
150
151         i2c_read_func(addr, reg, 1, val, 1);
152         if (on)
153                 val[0] |= (1 << shift);
154         else
155                 val[0] &= ~(1 << shift);
156         i2c_write(addr, reg, 1, val, 1);
157         i2c_read_func(addr, reg, 1, val, 1);
158
159         return 0;
160 }
161
162 static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
163 {
164         int buck = 0, ldo = 0, safeout = 0, on = -1;
165         int ret;
166
167         switch (argc) {
168         case 2:
169                 if (strncmp(argv[1], "status", 6) == 0)
170                         return pmic_status();
171                 break;
172         case 4:
173                 if (strncmp(argv[1], "ldo", 3) == 0)
174                         ldo = simple_strtoul(argv[2], NULL, 10);
175                 else if (strncmp(argv[1], "buck", 4) == 0)
176                         buck = simple_strtoul(argv[2], NULL, 10);
177                 else if (strncmp(argv[1], "safeout", 7) == 0)
178                         safeout = simple_strtoul(argv[2], NULL, 10);
179                 else
180                         break;
181
182                 if (strncmp(argv[3], "on", 2) == 0)
183                         on = 1;
184                 else if (strncmp(argv[3], "off", 3) == 0)
185                         on = 0;
186                 else
187                         break;
188
189                 ret = pmic_ldo_control(buck, ldo, safeout, on);
190
191                 if (!ret)
192                         printf("%s %s %s\n", argv[1], argv[2], argv[3]);
193                 return ret;
194
195         default:
196                 break;
197         }
198
199         cmd_usage(cmdtp);
200         return 1;
201 }
202
203 U_BOOT_CMD(
204         pmic,           4,      1, do_pmic,
205         "PMIC LDO & BUCK control",
206         "status - Display PMIC LDO & BUCK status\n"
207         "pmic ldo num on/off - Turn on/off the LDO\n"
208         "pmic buck num on/off - Turn on/off the BUCK\n"
209         "pmic safeout num on/off - Turn on/off the SAFEOUT\n"
210 );