blob: 79c2a9fbaabe47f5ad4992487592cc2bd6ce7455 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13/*
14 * Qualcomm PMIC8058 driver
15 *
16 */
17#include <linux/interrupt.h>
18#include <linux/i2c.h>
David Collins0a911602011-06-15 15:03:13 -070019#include <linux/bitops.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070020#include <linux/slab.h>
21#include <linux/ratelimit.h>
22#include <linux/kthread.h>
23#include <linux/mfd/core.h>
24#include <linux/mfd/pmic8058.h>
25#include <linux/platform_device.h>
26#include <linux/ratelimit.h>
27#include <linux/slab.h>
28#include <linux/debugfs.h>
29#include <linux/irq.h>
30
31/* PMIC8058 Revision */
32#define SSBI_REG_REV 0x002 /* PMIC4 revision */
33
34/* PMIC8058 IRQ */
35#define SSBI_REG_ADDR_IRQ_BASE 0x1BB
36
37#define SSBI_REG_ADDR_IRQ_ROOT (SSBI_REG_ADDR_IRQ_BASE + 0)
38#define SSBI_REG_ADDR_IRQ_M_STATUS1 (SSBI_REG_ADDR_IRQ_BASE + 1)
39#define SSBI_REG_ADDR_IRQ_M_STATUS2 (SSBI_REG_ADDR_IRQ_BASE + 2)
40#define SSBI_REG_ADDR_IRQ_M_STATUS3 (SSBI_REG_ADDR_IRQ_BASE + 3)
41#define SSBI_REG_ADDR_IRQ_M_STATUS4 (SSBI_REG_ADDR_IRQ_BASE + 4)
42#define SSBI_REG_ADDR_IRQ_BLK_SEL (SSBI_REG_ADDR_IRQ_BASE + 5)
43#define SSBI_REG_ADDR_IRQ_IT_STATUS (SSBI_REG_ADDR_IRQ_BASE + 6)
44#define SSBI_REG_ADDR_IRQ_CONFIG (SSBI_REG_ADDR_IRQ_BASE + 7)
45#define SSBI_REG_ADDR_IRQ_RT_STATUS (SSBI_REG_ADDR_IRQ_BASE + 8)
46
47#define PM8058_IRQF_LVL_SEL 0x01 /* level select */
48#define PM8058_IRQF_MASK_FE 0x02 /* mask falling edge */
49#define PM8058_IRQF_MASK_RE 0x04 /* mask rising edge */
50#define PM8058_IRQF_CLR 0x08 /* clear interrupt */
51#define PM8058_IRQF_BITS_MASK 0x70
52#define PM8058_IRQF_BITS_SHIFT 4
53#define PM8058_IRQF_WRITE 0x80
54
55#define PM8058_IRQF_MASK_ALL (PM8058_IRQF_MASK_FE | \
56 PM8058_IRQF_MASK_RE)
57#define PM8058_IRQF_W_C_M (PM8058_IRQF_WRITE | \
58 PM8058_IRQF_CLR | \
59 PM8058_IRQF_MASK_ALL)
60
61/* MISC register */
62#define SSBI_REG_ADDR_MISC 0x1CC
63
64/* PON CNTL 1 register */
65#define SSBI_REG_ADDR_PON_CNTL_1 0x01C
66
67#define PM8058_PON_PUP_MASK 0xF0
68
69#define PM8058_PON_WD_EN_MASK 0x08
70#define PM8058_PON_WD_EN_RESET 0x08
71#define PM8058_PON_WD_EN_PWR_OFF 0x00
72
73/* PON CNTL 4 register */
74#define SSBI_REG_ADDR_PON_CNTL_4 0x98
75#define PM8058_PON_RESET_EN_MASK 0x01
76
77/* PON CNTL 5 register */
78#define SSBI_REG_ADDR_PON_CNTL_5 0x7B
79#define PM8058_HARD_RESET_EN_MASK 0x08
80
David Collins0a911602011-06-15 15:03:13 -070081/* Regulator master enable addresses */
82#define SSBI_REG_ADDR_VREG_EN_MSM 0x018
83#define SSBI_REG_ADDR_VREG_EN_GRP_5_4 0x1C8
84
85/* Regulator control registers for shutdown/reset */
86#define SSBI_REG_ADDR_S0_CTRL 0x004
87#define SSBI_REG_ADDR_S1_CTRL 0x005
88#define SSBI_REG_ADDR_S3_CTRL 0x111
89#define SSBI_REG_ADDR_L21_CTRL 0x120
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070090#define SSBI_REG_ADDR_L22_CTRL 0x121
91
David Collins0a911602011-06-15 15:03:13 -070092#define REGULATOR_ENABLE_MASK 0x80
93#define REGULATOR_ENABLE 0x80
94#define REGULATOR_DISABLE 0x00
95#define REGULATOR_PULL_DOWN_MASK 0x40
96#define REGULATOR_PULL_DOWN_EN 0x40
97#define REGULATOR_PULL_DOWN_DIS 0x00
98
99/* Buck CTRL register */
100#define SMPS_LEGACY_VREF_SEL 0x20
101#define SMPS_LEGACY_VPROG_MASK 0x1F
102#define SMPS_ADVANCED_BAND_MASK 0xC0
103#define SMPS_ADVANCED_BAND_SHIFT 6
104#define SMPS_ADVANCED_VPROG_MASK 0x3F
105
106/* Buck TEST2 registers for shutdown/reset */
107#define SSBI_REG_ADDR_S0_TEST2 0x084
108#define SSBI_REG_ADDR_S1_TEST2 0x085
109#define SSBI_REG_ADDR_S3_TEST2 0x11A
110
111#define REGULATOR_BANK_WRITE 0x80
112#define REGULATOR_BANK_MASK 0x70
113#define REGULATOR_BANK_SHIFT 4
114#define REGULATOR_BANK_SEL(n) ((n) << REGULATOR_BANK_SHIFT)
115
116/* Buck TEST2 register bank 1 */
117#define SMPS_LEGACY_VLOW_SEL 0x01
118
119/* Buck TEST2 register bank 7 */
120#define SMPS_ADVANCED_MODE_MASK 0x02
121#define SMPS_ADVANCED_MODE 0x02
122#define SMPS_LEGACY_MODE 0x00
123
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700124/* SLEEP CNTL register */
125#define SSBI_REG_ADDR_SLEEP_CNTL 0x02B
126
127#define PM8058_SLEEP_SMPL_EN_MASK 0x04
128#define PM8058_SLEEP_SMPL_EN_RESET 0x04
129#define PM8058_SLEEP_SMPL_EN_PWR_OFF 0x00
130
131#define PM8058_SLEEP_SMPL_SEL_MASK 0x03
132#define PM8058_SLEEP_SMPL_SEL_MIN 0
133#define PM8058_SLEEP_SMPL_SEL_MAX 3
134
135#define MAX_PM_IRQ 256
136#define MAX_PM_BLOCKS (MAX_PM_IRQ / 8 + 1)
137#define MAX_PM_MASTERS (MAX_PM_BLOCKS / 8 + 1)
138
139struct pm8058_chip {
140 struct pm8058_platform_data pdata;
141
142 struct i2c_client *dev;
143
144 u8 irqs_allowed[MAX_PM_BLOCKS];
145 u8 blocks_allowed[MAX_PM_MASTERS];
146 u8 masters_allowed;
147 int pm_max_irq;
148 int pm_max_blocks;
149 int pm_max_masters;
150
151 u8 config[MAX_PM_IRQ];
152 u8 bus_unlock_config[MAX_PM_IRQ];
153 u8 wake_enable[MAX_PM_IRQ];
154 u16 count_wakeable;
155
156 u8 revision;
157
158 struct mutex pm_lock;
159};
160
161#if defined(CONFIG_DEBUG_FS)
162struct pm8058_dbg_device {
163 struct mutex dbg_mutex;
164 struct pm8058_chip *pm_chip;
165 struct dentry *dent;
166 int addr;
167};
168
169static struct pm8058_dbg_device *pmic_dbg_device;
170#endif
171
172static struct pm8058_chip *pmic_chip;
173
174/* Helper Functions */
175DEFINE_RATELIMIT_STATE(pm8058_msg_ratelimit, 60 * HZ, 10);
176
177static inline int pm8058_can_print(void)
178{
179 return __ratelimit(&pm8058_msg_ratelimit);
180}
181
182static inline int
183ssbi_write(struct i2c_client *client, u16 addr, const u8 *buf, size_t len)
184{
185 int rc;
186 struct i2c_msg msg = {
187 .addr = addr,
188 .flags = 0x0,
189 .buf = (u8 *)buf,
190 .len = len,
191 };
192
193 rc = i2c_transfer(client->adapter, &msg, 1);
194 return (rc == 1) ? 0 : rc;
195}
196
197static inline int
198ssbi_read(struct i2c_client *client, u16 addr, u8 *buf, size_t len)
199{
200 int rc;
201 struct i2c_msg msg = {
202 .addr = addr,
203 .flags = I2C_M_RD,
204 .buf = buf,
205 .len = len,
206 };
207
208 rc = i2c_transfer(client->adapter, &msg, 1);
209 return (rc == 1) ? 0 : rc;
210}
211
212static int pm8058_masked_write(u16 addr, u8 val, u8 mask)
213{
214 int rc;
215 u8 reg;
216
217 if (pmic_chip == NULL)
218 return -ENODEV;
219
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700220 rc = ssbi_read(pmic_chip->dev, addr, &reg, 1);
221 if (rc) {
222 pr_err("%s: ssbi_read(0x%03X) failed: rc=%d\n", __func__, addr,
223 rc);
224 goto done;
225 }
226
227 reg &= ~mask;
228 reg |= val & mask;
229
230 rc = ssbi_write(pmic_chip->dev, addr, &reg, 1);
231 if (rc)
232 pr_err("%s: ssbi_write(0x%03X)=0x%02X failed: rc=%d\n",
233 __func__, addr, reg, rc);
234done:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700235 return rc;
236}
237
238/* External APIs */
239int pm8058_rev(struct pm8058_chip *chip)
240{
241 if (chip == NULL)
242 return -EINVAL;
243
244 return chip->revision;
245}
246EXPORT_SYMBOL(pm8058_rev);
247
248int pm8058_irq_get_rt_status(struct pm8058_chip *chip, int irq)
249{
250 int rc;
251 u8 block, bits, bit;
252
253 if (chip == NULL || irq < chip->pdata.irq_base ||
254 irq >= chip->pdata.irq_base + MAX_PM_IRQ)
255 return -EINVAL;
256
257 irq -= chip->pdata.irq_base;
258
259 block = irq / 8;
260 bit = irq % 8;
261
262 mutex_lock(&chip->pm_lock);
263
264 rc = ssbi_write(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, &block, 1);
265 if (rc) {
266 pr_err("%s: FAIL ssbi_write(): rc=%d (Select Block)\n",
267 __func__, rc);
268 goto bail_out;
269 }
270
271 rc = ssbi_read(chip->dev, SSBI_REG_ADDR_IRQ_RT_STATUS, &bits, 1);
272 if (rc) {
273 pr_err("%s: FAIL ssbi_read(): rc=%d (Read RT Status)\n",
274 __func__, rc);
275 goto bail_out;
276 }
277
278 rc = (bits & (1 << bit)) ? 1 : 0;
279
280bail_out:
281 mutex_unlock(&chip->pm_lock);
282
283 return rc;
284}
285EXPORT_SYMBOL(pm8058_irq_get_rt_status);
286
287int pm8058_read(struct pm8058_chip *chip, u16 addr, u8 *values,
288 unsigned int len)
289{
290 if (chip == NULL)
291 return -EINVAL;
292
293 return ssbi_read(chip->dev, addr, values, len);
294}
295EXPORT_SYMBOL(pm8058_read);
296
297int pm8058_write(struct pm8058_chip *chip, u16 addr, u8 *values,
298 unsigned int len)
299{
300 if (chip == NULL)
301 return -EINVAL;
302
303 return ssbi_write(chip->dev, addr, values, len);
304}
305EXPORT_SYMBOL(pm8058_write);
306
307int pm8058_misc_control(struct pm8058_chip *chip, int mask, int flag)
308{
309 int rc;
310 u8 misc;
311
312 if (chip == NULL)
313 chip = pmic_chip; /* for calls from non child */
314 if (chip == NULL)
315 return -ENODEV;
316
317 mutex_lock(&chip->pm_lock);
318
319 rc = ssbi_read(chip->dev, SSBI_REG_ADDR_MISC, &misc, 1);
320 if (rc) {
321 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n",
322 __func__, SSBI_REG_ADDR_MISC, rc);
323 goto get_out;
324 }
325
326 misc &= ~mask;
327 misc |= flag;
328
329 rc = ssbi_write(chip->dev, SSBI_REG_ADDR_MISC, &misc, 1);
330 if (rc) {
331 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
332 __func__, SSBI_REG_ADDR_MISC, misc, rc);
333 goto get_out;
334 }
335
336get_out:
337 mutex_unlock(&chip->pm_lock);
338
339 return rc;
340}
341EXPORT_SYMBOL(pm8058_misc_control);
342
343/**
344 * pm8058_smpl_control - enables/disables SMPL detection
345 * @enable: 0 = shutdown PMIC on power loss, 1 = reset PMIC on power loss
346 *
347 * This function enables or disables the Sudden Momentary Power Loss detection
348 * module. If SMPL detection is enabled, then when a sufficiently long power
349 * loss event occurs, the PMIC will automatically reset itself. If SMPL
350 * detection is disabled, then the PMIC will shutdown when power loss occurs.
351 *
352 * RETURNS: an appropriate -ERRNO error value on error, or zero for success.
353 */
354int pm8058_smpl_control(int enable)
355{
356 return pm8058_masked_write(SSBI_REG_ADDR_SLEEP_CNTL,
357 (enable ? PM8058_SLEEP_SMPL_EN_RESET
358 : PM8058_SLEEP_SMPL_EN_PWR_OFF),
359 PM8058_SLEEP_SMPL_EN_MASK);
360}
361EXPORT_SYMBOL(pm8058_smpl_control);
362
363/**
364 * pm8058_smpl_set_delay - sets the SMPL detection time delay
365 * @delay: enum value corresponding to delay time
366 *
367 * This function sets the time delay of the SMPL detection module. If power
368 * is reapplied within this interval, then the PMIC reset automatically. The
369 * SMPL detection module must be enabled for this delay time to take effect.
370 *
371 * RETURNS: an appropriate -ERRNO error value on error, or zero for success.
372 */
373int pm8058_smpl_set_delay(enum pm8058_smpl_delay delay)
374{
375 if (delay < PM8058_SLEEP_SMPL_SEL_MIN
376 || delay > PM8058_SLEEP_SMPL_SEL_MAX) {
377 pr_err("%s: invalid delay specified: %d\n", __func__, delay);
378 return -EINVAL;
379 }
380
381 return pm8058_masked_write(SSBI_REG_ADDR_SLEEP_CNTL, delay,
382 PM8058_SLEEP_SMPL_SEL_MASK);
383}
384EXPORT_SYMBOL(pm8058_smpl_set_delay);
385
386/**
387 * pm8058_watchdog_reset_control - enables/disables watchdog reset detection
388 * @enable: 0 = shutdown when PS_HOLD goes low, 1 = reset when PS_HOLD goes low
389 *
390 * This function enables or disables the PMIC watchdog reset detection feature.
391 * If watchdog reset detection is enabled, then the PMIC will reset itself
392 * when PS_HOLD goes low. If it is not enabled, then the PMIC will shutdown
393 * when PS_HOLD goes low.
394 *
395 * RETURNS: an appropriate -ERRNO error value on error, or zero for success.
396 */
397int pm8058_watchdog_reset_control(int enable)
398{
399 return pm8058_masked_write(SSBI_REG_ADDR_PON_CNTL_1,
400 (enable ? PM8058_PON_WD_EN_RESET
401 : PM8058_PON_WD_EN_PWR_OFF),
402 PM8058_PON_WD_EN_MASK);
403}
404EXPORT_SYMBOL(pm8058_watchdog_reset_control);
405
David Collins0a911602011-06-15 15:03:13 -0700406/*
407 * Set an SMPS regulator to be disabled in its CTRL register, but enabled
408 * in the master enable register. Also set it's pull down enable bit.
409 * Take care to make sure that the output voltage doesn't change if switching
410 * from advanced mode to legacy mode.
411 */
412static int disable_smps_locally_set_pull_down(u16 ctrl_addr, u16 test2_addr,
413 u16 master_enable_addr, u8 master_enable_bit)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700414{
David Collins0a911602011-06-15 15:03:13 -0700415 int rc = 0;
416 u8 vref_sel, vlow_sel, band, vprog, bank, reg;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700417
418 if (pmic_chip == NULL)
419 return -ENODEV;
420
David Collins0a911602011-06-15 15:03:13 -0700421 bank = REGULATOR_BANK_SEL(7);
422 rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1);
423 if (rc) {
424 pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n", __func__,
425 test2_addr, rc);
426 goto done;
427 }
428
429 rc = ssbi_read(pmic_chip->dev, test2_addr, &reg, 1);
430 if (rc) {
431 pr_err("%s: FAIL pm8058_read(0x%03X): rc=%d\n",
432 __func__, test2_addr, rc);
433 goto done;
434 }
435
436 /* Check if in advanced mode. */
437 if ((reg & SMPS_ADVANCED_MODE_MASK) == SMPS_ADVANCED_MODE) {
438 /* Determine current output voltage. */
439 rc = ssbi_read(pmic_chip->dev, ctrl_addr, &reg, 1);
440 if (rc) {
441 pr_err("%s: FAIL pm8058_read(0x%03X): rc=%d\n",
442 __func__, ctrl_addr, rc);
443 goto done;
444 }
445
446 band = (reg & SMPS_ADVANCED_BAND_MASK)
447 >> SMPS_ADVANCED_BAND_SHIFT;
448 switch (band) {
449 case 3:
450 vref_sel = 0;
451 vlow_sel = 0;
452 break;
453 case 2:
454 vref_sel = SMPS_LEGACY_VREF_SEL;
455 vlow_sel = 0;
456 break;
457 case 1:
458 vref_sel = SMPS_LEGACY_VREF_SEL;
459 vlow_sel = SMPS_LEGACY_VLOW_SEL;
460 break;
461 default:
462 pr_err("%s: regulator already disabled\n", __func__);
463 return -EPERM;
464 }
465 vprog = (reg & SMPS_ADVANCED_VPROG_MASK);
466 /* Round up if fine step is in use. */
467 vprog = (vprog + 1) >> 1;
468 if (vprog > SMPS_LEGACY_VPROG_MASK)
469 vprog = SMPS_LEGACY_VPROG_MASK;
470
471 /* Set VLOW_SEL bit. */
472 bank = REGULATOR_BANK_SEL(1);
473 rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1);
474 if (rc) {
475 pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n",
476 __func__, test2_addr, rc);
477 goto done;
478 }
479 rc = pm8058_masked_write(test2_addr,
480 REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(1)
481 | vlow_sel,
482 REGULATOR_BANK_WRITE | REGULATOR_BANK_MASK
483 | SMPS_LEGACY_VLOW_SEL);
484 if (rc)
485 goto done;
486
487 /* Switch to legacy mode */
488 bank = REGULATOR_BANK_SEL(7);
489 rc = ssbi_write(pmic_chip->dev, test2_addr, &bank, 1);
490 if (rc) {
491 pr_err("%s: FAIL ssbi_write(0x%03X): rc=%d\n", __func__,
492 test2_addr, rc);
493 goto done;
494 }
495 rc = pm8058_masked_write(test2_addr,
496 REGULATOR_BANK_WRITE | REGULATOR_BANK_SEL(7)
497 | SMPS_LEGACY_MODE,
498 REGULATOR_BANK_WRITE | REGULATOR_BANK_MASK
499 | SMPS_ADVANCED_MODE_MASK);
500 if (rc)
501 goto done;
502
503 /* Enable locally, enable pull down, keep voltage the same. */
504 rc = pm8058_masked_write(ctrl_addr,
505 REGULATOR_ENABLE | REGULATOR_PULL_DOWN_EN
506 | vref_sel | vprog,
507 REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK
508 | SMPS_LEGACY_VREF_SEL | SMPS_LEGACY_VPROG_MASK);
509 if (rc)
510 goto done;
511 }
512
513 /* Enable in master control register. */
514 rc = pm8058_masked_write(master_enable_addr, master_enable_bit,
515 master_enable_bit);
516 if (rc)
517 goto done;
518
519 /* Disable locally and enable pull down. */
520 rc = pm8058_masked_write(ctrl_addr,
521 REGULATOR_DISABLE | REGULATOR_PULL_DOWN_EN,
522 REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK);
523
524done:
525 return rc;
526}
527
528static int disable_ldo_locally_set_pull_down(u16 ctrl_addr,
529 u16 master_enable_addr, u8 master_enable_bit)
530{
531 int rc;
532
533 /* Enable LDO in master control register. */
534 rc = pm8058_masked_write(master_enable_addr, master_enable_bit,
535 master_enable_bit);
536 if (rc)
537 goto done;
538
539 /* Disable LDO in CTRL register and set pull down */
540 rc = pm8058_masked_write(ctrl_addr,
541 REGULATOR_DISABLE | REGULATOR_PULL_DOWN_EN,
542 REGULATOR_ENABLE_MASK | REGULATOR_PULL_DOWN_MASK);
543
544done:
545 return rc;
546}
547
548int pm8058_reset_pwr_off(int reset)
549{
550 int rc;
551 u8 pon, ctrl, smpl;
552
553 if (pmic_chip == NULL)
554 return -ENODEV;
555
556 /* When shutting down, enable active pulldowns on important rails. */
557 if (!reset) {
558 /* Disable SMPS's 0,1,3 locally and set pulldown enable bits. */
559 disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S0_CTRL,
560 SSBI_REG_ADDR_S0_TEST2, SSBI_REG_ADDR_VREG_EN_MSM, BIT(7));
561 disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S1_CTRL,
562 SSBI_REG_ADDR_S1_TEST2, SSBI_REG_ADDR_VREG_EN_MSM, BIT(6));
563 disable_smps_locally_set_pull_down(SSBI_REG_ADDR_S3_CTRL,
564 SSBI_REG_ADDR_S3_TEST2, SSBI_REG_ADDR_VREG_EN_GRP_5_4,
565 BIT(7) | BIT(4));
566 /* Disable LDO 21 locally and set pulldown enable bit. */
567 disable_ldo_locally_set_pull_down(SSBI_REG_ADDR_L21_CTRL,
568 SSBI_REG_ADDR_VREG_EN_GRP_5_4, BIT(1));
569 }
570
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700571 /* Set regulator L22 to 1.225V in high power mode. */
572 rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_L22_CTRL, &ctrl, 1);
573 if (rc) {
574 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n", __func__,
575 SSBI_REG_ADDR_L22_CTRL, rc);
576 goto get_out3;
577 }
578 /* Leave pull-down state intact. */
579 ctrl &= 0x40;
580 ctrl |= 0x93;
581 rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_L22_CTRL, &ctrl, 1);
582 if (rc)
583 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n", __func__,
584 SSBI_REG_ADDR_L22_CTRL, ctrl, rc);
585
586get_out3:
587 if (!reset) {
588 /* Only modify the SLEEP_CNTL reg if shutdown is desired. */
589 rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_SLEEP_CNTL,
590 &smpl, 1);
591 if (rc) {
592 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n",
593 __func__, SSBI_REG_ADDR_SLEEP_CNTL, rc);
594 goto get_out2;
595 }
596
597 smpl &= ~PM8058_SLEEP_SMPL_EN_MASK;
598 smpl |= PM8058_SLEEP_SMPL_EN_PWR_OFF;
599
600 rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_SLEEP_CNTL,
601 &smpl, 1);
602 if (rc)
603 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
604 __func__, SSBI_REG_ADDR_SLEEP_CNTL, smpl, rc);
605 }
606
607get_out2:
608 rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_1, &pon, 1);
609 if (rc) {
610 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n",
611 __func__, SSBI_REG_ADDR_PON_CNTL_1, rc);
612 goto get_out;
613 }
614
615 pon &= ~PM8058_PON_WD_EN_MASK;
616 pon |= reset ? PM8058_PON_WD_EN_RESET : PM8058_PON_WD_EN_PWR_OFF;
617
618 /* Enable all pullups */
619 pon |= PM8058_PON_PUP_MASK;
620
621 rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_1, &pon, 1);
622 if (rc) {
623 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
624 __func__, SSBI_REG_ADDR_PON_CNTL_1, pon, rc);
625 goto get_out;
626 }
627
628get_out:
629 return rc;
630}
631EXPORT_SYMBOL(pm8058_reset_pwr_off);
632
633/*
634 power on hard reset configuration
635 config = DISABLE_HARD_RESET to disable hard reset
636 = SHUTDOWN_ON_HARD_RESET to turn off the system on hard reset
637 = RESTART_ON_HARD_RESET to restart the system on hard reset
638 */
639int pm8058_hard_reset_config(enum pon_config config)
640{
641 int rc, ret;
642 u8 pon, pon_5;
643
644 if (config >= MAX_PON_CONFIG)
645 return -EINVAL;
646
647 if (pmic_chip == NULL)
648 return -ENODEV;
649
650 mutex_lock(&pmic_chip->pm_lock);
651
652 rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_5, &pon, 1);
653 if (rc) {
654 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n",
655 __func__, SSBI_REG_ADDR_PON_CNTL_5, rc);
656 mutex_unlock(&pmic_chip->pm_lock);
657 return rc;
658 }
659
660 pon_5 = pon;
661 (config != DISABLE_HARD_RESET) ? (pon |= PM8058_HARD_RESET_EN_MASK) :
662 (pon &= ~PM8058_HARD_RESET_EN_MASK);
663
664 rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_5, &pon, 1);
665 if (rc) {
666 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
667 __func__, SSBI_REG_ADDR_PON_CNTL_5, pon, rc);
668 mutex_unlock(&pmic_chip->pm_lock);
669 return rc;
670 }
671
672 if (config == DISABLE_HARD_RESET) {
673 mutex_unlock(&pmic_chip->pm_lock);
674 return 0;
675 }
676
677 rc = ssbi_read(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_4, &pon, 1);
678 if (rc) {
679 pr_err("%s: FAIL ssbi_read(0x%x): rc=%d\n",
680 __func__, SSBI_REG_ADDR_PON_CNTL_4, rc);
681 goto err_restore_pon_5;
682 }
683
684 (config == RESTART_ON_HARD_RESET) ? (pon |= PM8058_PON_RESET_EN_MASK) :
685 (pon &= ~PM8058_PON_RESET_EN_MASK);
686
687 rc = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_4, &pon, 1);
688 if (rc) {
689 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
690 __func__, SSBI_REG_ADDR_PON_CNTL_4, pon, rc);
691 goto err_restore_pon_5;
692 }
693 mutex_unlock(&pmic_chip->pm_lock);
694 return 0;
695
696err_restore_pon_5:
697 ret = ssbi_write(pmic_chip->dev, SSBI_REG_ADDR_PON_CNTL_5, &pon_5, 1);
698 if (ret)
699 pr_err("%s: FAIL ssbi_write(0x%x)=0x%x: rc=%d\n",
700 __func__, SSBI_REG_ADDR_PON_CNTL_5, pon, ret);
701 mutex_unlock(&pmic_chip->pm_lock);
702 return rc;
703}
704EXPORT_SYMBOL(pm8058_hard_reset_config);
705
706/* Internal functions */
707static inline int
708pm8058_config_irq(struct pm8058_chip *chip, u8 *bp, u8 *cp)
709{
710 int rc;
711
712 rc = ssbi_write(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, bp, 1);
713 if (rc) {
714 pr_err("%s: ssbi_write: rc=%d (Select block)\n",
715 __func__, rc);
716 goto bail_out;
717 }
718
719 rc = ssbi_write(chip->dev, SSBI_REG_ADDR_IRQ_CONFIG, cp, 1);
720 if (rc)
721 pr_err("%s: ssbi_write: rc=%d (Configure IRQ)\n",
722 __func__, rc);
723
724bail_out:
725 return rc;
726}
727
728static void pm8058_irq_mask(struct irq_data *data)
729{
730 int master, irq_bit;
731 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
732 u8 block, config;
733 unsigned int irq = data->irq;
734
735 irq -= chip->pdata.irq_base;
736 block = irq / 8;
737 master = block / 8;
738 irq_bit = irq % 8;
739
740 chip->irqs_allowed[block] &= ~(1 << irq_bit);
741 if (!chip->irqs_allowed[block]) {
742 chip->blocks_allowed[master] &= ~(1 << (block % 8));
743
744 if (!chip->blocks_allowed[master])
745 chip->masters_allowed &= ~(1 << master);
746 }
747
748 config = PM8058_IRQF_WRITE | chip->config[irq] |
749 PM8058_IRQF_MASK_FE | PM8058_IRQF_MASK_RE;
750 chip->bus_unlock_config[irq] = config;
751}
752
753static void pm8058_irq_unmask(struct irq_data *data)
754{
755 int master, irq_bit;
756 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
757 u8 block, config, old_irqs_allowed, old_blocks_allowed;
758 unsigned int irq = data->irq;
759
760 irq -= chip->pdata.irq_base;
761 block = irq / 8;
762 master = block / 8;
763 irq_bit = irq % 8;
764
765 old_irqs_allowed = chip->irqs_allowed[block];
766 chip->irqs_allowed[block] |= 1 << irq_bit;
767 if (!old_irqs_allowed) {
768 master = block / 8;
769
770 old_blocks_allowed = chip->blocks_allowed[master];
771 chip->blocks_allowed[master] |= 1 << (block % 8);
772
773 if (!old_blocks_allowed)
774 chip->masters_allowed |= 1 << master;
775 }
776
777 config = PM8058_IRQF_WRITE | chip->config[irq];
778 chip->bus_unlock_config[irq] = config;
779}
780
781static void pm8058_irq_ack(struct irq_data *data)
782{
783 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
784 u8 block, config;
785 unsigned int irq = data->irq;
786
787 irq -= chip->pdata.irq_base;
788 block = irq / 8;
789
790 config = PM8058_IRQF_WRITE | chip->config[irq] | PM8058_IRQF_CLR;
791 /* Keep the mask */
792 if (!(chip->irqs_allowed[block] & (1 << (irq % 8))))
793 config |= PM8058_IRQF_MASK_FE | PM8058_IRQF_MASK_RE;
794 chip->bus_unlock_config[irq] = config;
795}
796
797static int pm8058_irq_set_type(struct irq_data *data, unsigned int flow_type)
798{
799 int master, irq_bit;
800 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
801 u8 block, config;
802 unsigned int irq = data->irq;
803
804 irq -= chip->pdata.irq_base;
805 if (irq > chip->pm_max_irq) {
806 chip->pm_max_irq = irq;
807 chip->pm_max_blocks =
808 chip->pm_max_irq / 8 + 1;
809 chip->pm_max_masters =
810 chip->pm_max_blocks / 8 + 1;
811 }
812 block = irq / 8;
813 master = block / 8;
814 irq_bit = irq % 8;
815
816 chip->config[irq] = (irq_bit << PM8058_IRQF_BITS_SHIFT) |
817 PM8058_IRQF_MASK_RE | PM8058_IRQF_MASK_FE;
818 if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
819 if (flow_type & IRQF_TRIGGER_RISING)
820 chip->config[irq] &= ~PM8058_IRQF_MASK_RE;
821 if (flow_type & IRQF_TRIGGER_FALLING)
822 chip->config[irq] &= ~PM8058_IRQF_MASK_FE;
823 } else {
824 chip->config[irq] |= PM8058_IRQF_LVL_SEL;
825
826 if (flow_type & IRQF_TRIGGER_HIGH)
827 chip->config[irq] &= ~PM8058_IRQF_MASK_RE;
828 else
829 chip->config[irq] &= ~PM8058_IRQF_MASK_FE;
830 }
831
832 config = PM8058_IRQF_WRITE | chip->config[irq] | PM8058_IRQF_CLR;
833 chip->bus_unlock_config[irq] = config;
834 return 0;
835}
836
837static int pm8058_irq_set_wake(struct irq_data *data, unsigned int on)
838{
839 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
840 unsigned int irq = data->irq;
841
842 irq -= chip->pdata.irq_base;
843 if (on) {
844 if (!chip->wake_enable[irq]) {
845 chip->wake_enable[irq] = 1;
846 chip->count_wakeable++;
847 }
848 } else {
849 if (chip->wake_enable[irq]) {
850 chip->wake_enable[irq] = 0;
851 chip->count_wakeable--;
852 }
853 }
854
855 return 0;
856}
857
858static void pm8058_irq_bus_lock(struct irq_data *data)
859{
860 u8 block;
861 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
862 unsigned int irq = data->irq;
863
864 irq -= chip->pdata.irq_base;
865 block = irq / 8;
866 chip->bus_unlock_config[irq] = 0;
867
868 mutex_lock(&chip->pm_lock);
869}
870
871static void pm8058_irq_bus_sync_unlock(struct irq_data *data)
872{
873 u8 block, config;
874 struct pm8058_chip *chip = irq_data_get_irq_chip_data(data);
875 unsigned int irq = data->irq;
876
877 irq -= chip->pdata.irq_base;
878 block = irq / 8;
879 config = chip->bus_unlock_config[irq];
880 /* dont waste cpu cycles if we dont have data to write */
881 if (config)
882 pm8058_config_irq(chip, &block, &config);
883 mutex_unlock(&chip->pm_lock);
884}
885
886static inline int
887pm8058_read_root(struct pm8058_chip *chip, u8 *rp)
888{
889 int rc;
890
891 rc = ssbi_read(chip->dev, SSBI_REG_ADDR_IRQ_ROOT, rp, 1);
892 if (rc) {
893 pr_err("%s: FAIL ssbi_read(): rc=%d (Read Root)\n",
894 __func__, rc);
895 *rp = 0;
896 }
897
898 return rc;
899}
900
901static inline int
902pm8058_read_master(struct pm8058_chip *chip, u8 m, u8 *bp)
903{
904 int rc;
905
906 rc = ssbi_read(chip->dev, SSBI_REG_ADDR_IRQ_M_STATUS1 + m, bp, 1);
907 if (rc) {
908 pr_err("%s: FAIL ssbi_read(): rc=%d (Read Master)\n",
909 __func__, rc);
910 *bp = 0;
911 }
912
913 return rc;
914}
915
916static inline int
917pm8058_read_block(struct pm8058_chip *chip, u8 *bp, u8 *ip)
918{
919 int rc;
920
921 rc = ssbi_write(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, bp, 1);
922 if (rc) {
923 pr_err("%s: FAIL ssbi_write(): rc=%d (Select Block)\n",
924 __func__, rc);
925 *bp = 0;
926 goto bail_out;
927 }
928
929 rc = ssbi_read(chip->dev, SSBI_REG_ADDR_IRQ_IT_STATUS, ip, 1);
930 if (rc)
931 pr_err("%s: FAIL ssbi_read(): rc=%d (Read Status)\n",
932 __func__, rc);
933
934bail_out:
935 return rc;
936}
937
938static irqreturn_t pm8058_isr_thread(int irq_requested, void *data)
939{
940 struct pm8058_chip *chip = data;
941 int i, j, k;
942 u8 root, block, config, bits;
943 u8 blocks[MAX_PM_MASTERS];
944 int masters = 0, irq, handled = 0, spurious = 0;
945 u16 irqs_to_handle[MAX_PM_IRQ];
946
947 mutex_lock(&chip->pm_lock);
948
949 /* Read root for masters */
950 if (pm8058_read_root(chip, &root))
951 goto bail_out;
952
953 masters = root >> 1;
954
955 if (!(masters & chip->masters_allowed) ||
956 (masters & ~chip->masters_allowed)) {
957 spurious = 1000000;
958 }
959
960 /* Read allowed masters for blocks. */
961 for (i = 0; i < chip->pm_max_masters; i++) {
962 if (masters & (1 << i)) {
963 if (pm8058_read_master(chip, i, &blocks[i]))
964 goto bail_out;
965
966 if (!blocks[i]) {
967 if (pm8058_can_print())
968 pr_err("%s: Spurious master: %d "
969 "(blocks=0)", __func__, i);
970 spurious += 10000;
971 }
972 } else
973 blocks[i] = 0;
974 }
975
976 /* Select block, read status and call isr */
977 for (i = 0; i < chip->pm_max_masters; i++) {
978 if (!blocks[i])
979 continue;
980
981 for (j = 0; j < 8; j++) {
982 if (!(blocks[i] & (1 << j)))
983 continue;
984
985 block = i * 8 + j; /* block # */
986 if (pm8058_read_block(chip, &block, &bits))
987 goto bail_out;
988
989 if (!bits) {
990 if (pm8058_can_print())
991 pr_err("%s: Spurious block: "
992 "[master, block]=[%d, %d] "
993 "(bits=0)\n", __func__, i, j);
994 spurious += 100;
995 continue;
996 }
997
998 /* Check IRQ bits */
999 for (k = 0; k < 8; k++) {
1000 if (!(bits & (1 << k)))
1001 continue;
1002
1003 /* Check spurious interrupts */
1004 if (((1 << i) & chip->masters_allowed) &&
1005 (blocks[i] & chip->blocks_allowed[i]) &&
1006 (bits & chip->irqs_allowed[block])) {
1007
1008 /* Found one */
1009 irq = block * 8 + k;
1010 irqs_to_handle[handled] = irq +
1011 chip->pdata.irq_base;
1012 handled++;
1013 } else {
1014 /* Clear and mask wrong one */
1015 config = PM8058_IRQF_W_C_M |
1016 (k << PM8058_IRQF_BITS_SHIFT);
1017
1018 pm8058_config_irq(chip,
1019 &block, &config);
1020
1021 if (pm8058_can_print())
1022 pr_err("%s: Spurious IRQ: "
1023 "[master, block, bit]="
1024 "[%d, %d (%d), %d]\n",
1025 __func__,
1026 i, j, block, k);
1027 spurious++;
1028 }
1029 }
1030 }
1031
1032 }
1033
1034bail_out:
1035
1036 mutex_unlock(&chip->pm_lock);
1037
1038 for (i = 0; i < handled; i++)
1039 handle_nested_irq(irqs_to_handle[i]);
1040
1041 for (i = 0; i < handled; i++) {
1042 irqs_to_handle[i] -= chip->pdata.irq_base;
1043 block = irqs_to_handle[i] / 8 ;
1044 config = PM8058_IRQF_WRITE | chip->config[irqs_to_handle[i]]
1045 | PM8058_IRQF_CLR;
1046 pm8058_config_irq(chip, &block, &config);
1047 }
1048
1049 if (spurious) {
1050 if (!pm8058_can_print())
1051 return IRQ_HANDLED;
1052
1053 pr_err("%s: spurious = %d (handled = %d)\n",
1054 __func__, spurious, handled);
1055 pr_err(" root = 0x%x (masters_allowed<<1 = 0x%x)\n",
1056 root, chip->masters_allowed << 1);
1057 for (i = 0; i < chip->pm_max_masters; i++) {
1058 if (masters & (1 << i))
1059 pr_err(" blocks[%d]=0x%x, "
1060 "allowed[%d]=0x%x\n",
1061 i, blocks[i],
1062 i, chip->blocks_allowed[i]);
1063 }
1064 }
1065
1066 return IRQ_HANDLED;
1067}
1068
1069#if defined(CONFIG_DEBUG_FS)
1070
1071static int check_addr(int addr, const char *func_name)
1072{
1073 if (addr < 0 || addr > 0x3FF) {
1074 pr_err("%s: PMIC 8058 register address is invalid: %d\n",
1075 func_name, addr);
1076 return -EINVAL;
1077 }
1078 return 0;
1079}
1080
1081static int data_set(void *data, u64 val)
1082{
1083 struct pm8058_dbg_device *dbgdev = data;
1084 u8 reg = val;
1085 int rc;
1086
1087 mutex_lock(&dbgdev->dbg_mutex);
1088
1089 rc = check_addr(dbgdev->addr, __func__);
1090 if (rc)
1091 goto done;
1092
1093 rc = pm8058_write(dbgdev->pm_chip, dbgdev->addr, &reg, 1);
1094
1095 if (rc)
1096 pr_err("%s: FAIL pm8058_write(0x%03X)=0x%02X: rc=%d\n",
1097 __func__, dbgdev->addr, reg, rc);
1098done:
1099 mutex_unlock(&dbgdev->dbg_mutex);
1100 return rc;
1101}
1102
1103static int data_get(void *data, u64 *val)
1104{
1105 struct pm8058_dbg_device *dbgdev = data;
1106 int rc;
1107 u8 reg;
1108
1109 mutex_lock(&dbgdev->dbg_mutex);
1110
1111 rc = check_addr(dbgdev->addr, __func__);
1112 if (rc)
1113 goto done;
1114
1115 rc = pm8058_read(dbgdev->pm_chip, dbgdev->addr, &reg, 1);
1116
1117 if (rc) {
1118 pr_err("%s: FAIL pm8058_read(0x%03X)=0x%02X: rc=%d\n",
1119 __func__, dbgdev->addr, reg, rc);
1120 goto done;
1121 }
1122
1123 *val = reg;
1124done:
1125 mutex_unlock(&dbgdev->dbg_mutex);
1126 return rc;
1127}
1128
1129DEFINE_SIMPLE_ATTRIBUTE(dbg_data_fops, data_get, data_set, "0x%02llX\n");
1130
1131static int addr_set(void *data, u64 val)
1132{
1133 struct pm8058_dbg_device *dbgdev = data;
1134 int rc;
1135
1136 rc = check_addr(val, __func__);
1137 if (rc)
1138 return rc;
1139
1140 mutex_lock(&dbgdev->dbg_mutex);
1141 dbgdev->addr = val;
1142 mutex_unlock(&dbgdev->dbg_mutex);
1143
1144 return 0;
1145}
1146
1147static int addr_get(void *data, u64 *val)
1148{
1149 struct pm8058_dbg_device *dbgdev = data;
1150 int rc;
1151
1152 mutex_lock(&dbgdev->dbg_mutex);
1153
1154 rc = check_addr(dbgdev->addr, __func__);
1155 if (rc) {
1156 mutex_unlock(&dbgdev->dbg_mutex);
1157 return rc;
1158 }
1159 *val = dbgdev->addr;
1160
1161 mutex_unlock(&dbgdev->dbg_mutex);
1162
1163 return 0;
1164}
1165
1166DEFINE_SIMPLE_ATTRIBUTE(dbg_addr_fops, addr_get, addr_set, "0x%03llX\n");
1167
1168static int __devinit pmic8058_dbg_probe(struct pm8058_chip *chip)
1169{
1170 struct pm8058_dbg_device *dbgdev;
1171 struct dentry *dent;
1172 struct dentry *temp;
1173
1174 if (chip == NULL) {
1175 pr_err("%s: no parent data passed in.\n", __func__);
1176 return -EINVAL;
1177 }
1178
1179 dbgdev = kzalloc(sizeof *dbgdev, GFP_KERNEL);
1180 if (dbgdev == NULL) {
1181 pr_err("%s: kzalloc() failed.\n", __func__);
1182 return -ENOMEM;
1183 }
1184
1185 mutex_init(&dbgdev->dbg_mutex);
1186
1187 dbgdev->pm_chip = chip;
1188 dbgdev->addr = -1;
1189
1190 dent = debugfs_create_dir("pm8058-dbg", NULL);
1191 if (dent == NULL || IS_ERR(dent)) {
1192 pr_err("%s: ERR debugfs_create_dir: dent=0x%X\n",
1193 __func__, (unsigned)dent);
1194 return -ENOMEM;
1195 }
1196
1197 temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, dent,
1198 dbgdev, &dbg_addr_fops);
1199 if (temp == NULL || IS_ERR(temp)) {
1200 pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
1201 __func__, (unsigned)temp);
1202 goto debug_error;
1203 }
1204
1205 temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, dent,
1206 dbgdev, &dbg_data_fops);
1207 if (temp == NULL || IS_ERR(temp)) {
1208 pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
1209 __func__, (unsigned)temp);
1210 goto debug_error;
1211 }
1212
1213 dbgdev->dent = dent;
1214
1215 pmic_dbg_device = dbgdev;
1216
1217 return 0;
1218
1219debug_error:
1220 debugfs_remove_recursive(dent);
1221 return -ENOMEM;
1222}
1223
1224static int __devexit pmic8058_dbg_remove(void)
1225{
1226 if (pmic_dbg_device) {
1227 debugfs_remove_recursive(pmic_dbg_device->dent);
1228 kfree(pmic_dbg_device);
1229 }
1230 return 0;
1231}
1232
1233#else
1234
1235static int __devinit pmic8058_dbg_probe(struct pm8058_chip *chip)
1236{
1237 return 0;
1238}
1239
1240static int __devexit pmic8058_dbg_remove(void)
1241{
1242 return 0;
1243}
1244
1245#endif
1246
1247static struct irq_chip pm8058_irq_chip = {
1248 .name = "pm8058",
1249 .irq_ack = pm8058_irq_ack,
1250 .irq_mask = pm8058_irq_mask,
1251 .irq_unmask = pm8058_irq_unmask,
1252 .irq_set_type = pm8058_irq_set_type,
1253 .irq_set_wake = pm8058_irq_set_wake,
1254 .irq_bus_lock = pm8058_irq_bus_lock,
1255 .irq_bus_sync_unlock = pm8058_irq_bus_sync_unlock,
1256};
1257
1258static int pm8058_probe(struct i2c_client *client,
1259 const struct i2c_device_id *id)
1260{
1261 int i, rc;
1262 struct pm8058_platform_data *pdata = client->dev.platform_data;
1263 struct pm8058_chip *chip;
1264
1265 if (pdata == NULL || !client->irq) {
1266 pr_err("%s: No platform_data or IRQ.\n", __func__);
1267 return -ENODEV;
1268 }
1269
1270 if (pdata->num_subdevs == 0) {
1271 pr_err("%s: No sub devices to support.\n", __func__);
1272 return -ENODEV;
1273 }
1274
1275 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
1276 pr_err("%s: i2c_check_functionality failed.\n", __func__);
1277 return -ENODEV;
1278 }
1279
1280 chip = kzalloc(sizeof *chip, GFP_KERNEL);
1281 if (chip == NULL) {
1282 pr_err("%s: kzalloc() failed.\n", __func__);
1283 return -ENOMEM;
1284 }
1285
1286 chip->dev = client;
1287
1288 /* Read PMIC chip revision */
1289 rc = ssbi_read(chip->dev, SSBI_REG_REV, &chip->revision, 1);
1290 if (rc)
1291 pr_err("%s: Failed on ssbi_read for revision: rc=%d.\n",
1292 __func__, rc);
1293 pr_info("%s: PMIC revision: %X\n", __func__, chip->revision);
1294
1295 (void) memcpy((void *)&chip->pdata, (const void *)pdata,
1296 sizeof(chip->pdata));
1297
1298 mutex_init(&chip->pm_lock);
1299 irq_set_handler_data(chip->dev->irq, (void *)chip);
1300 irq_set_irq_wake(chip->dev->irq, 1);
1301
1302 chip->pm_max_irq = 0;
1303 chip->pm_max_blocks = 0;
1304 chip->pm_max_masters = 0;
1305
1306 i2c_set_clientdata(client, chip);
1307
1308 pmic_chip = chip;
1309
1310 /* Register for all reserved IRQs */
1311 for (i = pdata->irq_base; i < (pdata->irq_base + MAX_PM_IRQ); i++) {
1312 irq_set_chip(i, &pm8058_irq_chip);
1313 irq_set_chip_data(i, (void *)chip);
1314 irq_set_handler(i, handle_edge_irq);
1315 set_irq_flags(i, IRQF_VALID);
1316 irq_set_nested_thread(i, 1);
1317 }
1318
1319 rc = mfd_add_devices(&chip->dev->dev, 0, pdata->sub_devices,
1320 pdata->num_subdevs, NULL, 0);
1321
1322 /* Add charger sub device with the chip parameter as driver data */
1323 if (pdata->charger_sub_device) {
1324 rc = mfd_add_devices(&chip->dev->dev, 0,
1325 pdata->charger_sub_device,
1326 1, NULL, 0);
1327 }
1328
1329 if (pdata->init) {
1330 rc = pdata->init(chip);
1331 if (rc != 0) {
1332 pr_err("%s: board init failed\n", __func__);
1333 chip->dev = NULL;
1334 kfree(chip);
1335 return -ENODEV;
1336 }
1337 }
1338
1339 rc = request_threaded_irq(chip->dev->irq, NULL, pm8058_isr_thread,
1340 IRQF_ONESHOT | IRQF_DISABLED | pdata->irq_trigger_flags,
1341 "pm8058-irq", chip);
1342 if (rc < 0)
1343 pr_err("%s: could not request irq %d: %d\n", __func__,
1344 chip->dev->irq, rc);
1345
1346 rc = pmic8058_dbg_probe(chip);
1347 if (rc < 0)
1348 pr_err("%s: could not set up debugfs: %d\n", __func__, rc);
1349
1350 return 0;
1351}
1352
1353static int __devexit pm8058_remove(struct i2c_client *client)
1354{
1355 struct pm8058_chip *chip;
1356
1357 chip = i2c_get_clientdata(client);
1358 if (chip) {
1359 if (chip->pm_max_irq) {
1360 irq_set_irq_wake(chip->dev->irq, 0);
1361 free_irq(chip->dev->irq, chip);
1362 }
1363 mutex_destroy(&chip->pm_lock);
1364 chip->dev = NULL;
1365
1366 kfree(chip);
1367 }
1368
1369 pmic8058_dbg_remove();
1370
1371 return 0;
1372}
1373
1374#ifdef CONFIG_PM
1375static int pm8058_suspend(struct device *dev)
1376{
1377 struct i2c_client *client;
1378 struct pm8058_chip *chip;
1379 struct irq_data *data;
1380 int i;
1381
1382 client = to_i2c_client(dev);
1383 chip = i2c_get_clientdata(client);
1384
1385 for (i = 0; i < MAX_PM_IRQ; i++) {
1386 if (chip->config[i] && !chip->wake_enable[i]) {
1387 if (!((chip->config[i] & PM8058_IRQF_MASK_ALL)
1388 == PM8058_IRQF_MASK_ALL)) {
1389 data = irq_get_irq_data(i +
1390 chip->pdata.irq_base);
1391 pm8058_irq_bus_lock(data);
1392 pm8058_irq_mask(data);
1393 pm8058_irq_bus_sync_unlock(data);
1394 }
1395 }
1396 }
1397
1398 if (!chip->count_wakeable)
1399 disable_irq(chip->dev->irq);
1400
1401 return 0;
1402}
1403
1404extern int msm_show_resume_irq_mask;
1405
1406static void pm8058_show_resume_irq(void)
1407{
1408 u8 block, bits;
1409 int i;
1410 struct pm8058_chip *chip = pmic_chip;
1411
1412 if (!msm_show_resume_irq_mask)
1413 return;
1414
1415 for (i = 0; i < MAX_PM_IRQ; i++) {
1416 if (chip->wake_enable[i]) {
1417 block = i / 8;
1418 if (!pm8058_read_block(chip, &block, &bits)) {
1419 if (bits & (1 << (i & 0x7)))
1420 pr_warning("%s:%d triggered\n",
1421 __func__, i + chip->pdata.irq_base);
1422 }
1423 }
1424 }
1425}
1426
1427static int pm8058_resume(struct device *dev)
1428{
1429 struct i2c_client *client;
1430 struct pm8058_chip *chip;
1431 struct irq_data *data;
1432 int i;
1433
1434 pm8058_show_resume_irq();
1435
1436 client = to_i2c_client(dev);
1437 chip = i2c_get_clientdata(client);
1438
1439 for (i = 0; i < MAX_PM_IRQ; i++) {
1440 if (chip->config[i] && !chip->wake_enable[i]) {
1441 if (!((chip->config[i] & PM8058_IRQF_MASK_ALL)
1442 == PM8058_IRQF_MASK_ALL)) {
1443 data = irq_get_irq_data(i +
1444 chip->pdata.irq_base);
1445 pm8058_irq_bus_lock(data);
1446 pm8058_irq_unmask(data);
1447 pm8058_irq_bus_sync_unlock(data);
1448 }
1449 }
1450 }
1451
1452 if (!chip->count_wakeable)
1453 enable_irq(chip->dev->irq);
1454
1455 return 0;
1456}
1457#else
1458#define pm8058_suspend NULL
1459#define pm8058_resume NULL
1460#endif
1461
1462static const struct i2c_device_id pm8058_ids[] = {
1463 { "pm8058-core", 0 },
1464 { },
1465};
1466MODULE_DEVICE_TABLE(i2c, pm8058_ids);
1467
1468static struct dev_pm_ops pm8058_pm = {
1469 .suspend = pm8058_suspend,
1470 .resume = pm8058_resume,
1471};
1472
1473static struct i2c_driver pm8058_driver = {
1474 .driver.name = "pm8058-core",
1475 .driver.pm = &pm8058_pm,
1476 .id_table = pm8058_ids,
1477 .probe = pm8058_probe,
1478 .remove = __devexit_p(pm8058_remove),
1479};
1480
1481static int __init pm8058_init(void)
1482{
1483 int rc = i2c_add_driver(&pm8058_driver);
1484 pr_notice("%s: i2c_add_driver: rc = %d\n", __func__, rc);
1485
1486 return rc;
1487}
1488
1489static void __exit pm8058_exit(void)
1490{
1491 i2c_del_driver(&pm8058_driver);
1492}
1493
1494arch_initcall(pm8058_init);
1495module_exit(pm8058_exit);
1496
1497MODULE_LICENSE("GPL v2");
1498MODULE_DESCRIPTION("PMIC8058 core driver");
1499MODULE_VERSION("1.0");
1500MODULE_ALIAS("platform:pmic8058-core");