2 * Base driver for Maxim MAX8925
4 * Copyright (C) 2009 Marvell International Ltd.
5 * Haojian Zhuang <haojian.zhuang@marvell.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/i2c.h>
15 #include <linux/interrupt.h>
16 #include <linux/platform_device.h>
17 #include <linux/mfd/core.h>
18 #include <linux/mfd/max8925.h>
20 #define IRQ_MODE_STATUS 0
21 #define IRQ_MODE_MASK 1
23 static struct resource backlight_resources[] = {
25 .name = "max8925-backlight",
26 .start = MAX8925_WLED_MODE_CNTL,
27 .end = MAX8925_WLED_CNTL,
28 .flags = IORESOURCE_IO,
32 static struct mfd_cell backlight_devs[] = {
34 .name = "max8925-backlight",
36 .resources = &backlight_resources[0],
41 static struct resource touch_resources[] = {
43 .name = "max8925-tsc",
44 .start = MAX8925_TSC_IRQ,
45 .end = MAX8925_ADC_RES_END,
46 .flags = IORESOURCE_IO,
50 static struct mfd_cell touch_devs[] = {
52 .name = "max8925-touch",
54 .resources = &touch_resources[0],
59 #define MAX8925_REG_RESOURCE(_start, _end) \
61 .start = MAX8925_##_start, \
62 .end = MAX8925_##_end, \
63 .flags = IORESOURCE_IO, \
66 static struct resource regulator_resources[] = {
67 MAX8925_REG_RESOURCE(SDCTL1, SDCTL1),
68 MAX8925_REG_RESOURCE(SDCTL2, SDCTL2),
69 MAX8925_REG_RESOURCE(SDCTL3, SDCTL3),
70 MAX8925_REG_RESOURCE(LDOCTL1, LDOCTL1),
71 MAX8925_REG_RESOURCE(LDOCTL2, LDOCTL2),
72 MAX8925_REG_RESOURCE(LDOCTL3, LDOCTL3),
73 MAX8925_REG_RESOURCE(LDOCTL4, LDOCTL4),
74 MAX8925_REG_RESOURCE(LDOCTL5, LDOCTL5),
75 MAX8925_REG_RESOURCE(LDOCTL6, LDOCTL6),
76 MAX8925_REG_RESOURCE(LDOCTL7, LDOCTL7),
77 MAX8925_REG_RESOURCE(LDOCTL8, LDOCTL8),
78 MAX8925_REG_RESOURCE(LDOCTL9, LDOCTL9),
79 MAX8925_REG_RESOURCE(LDOCTL10, LDOCTL10),
80 MAX8925_REG_RESOURCE(LDOCTL11, LDOCTL11),
81 MAX8925_REG_RESOURCE(LDOCTL12, LDOCTL12),
82 MAX8925_REG_RESOURCE(LDOCTL13, LDOCTL13),
83 MAX8925_REG_RESOURCE(LDOCTL14, LDOCTL14),
84 MAX8925_REG_RESOURCE(LDOCTL15, LDOCTL15),
85 MAX8925_REG_RESOURCE(LDOCTL16, LDOCTL16),
86 MAX8925_REG_RESOURCE(LDOCTL17, LDOCTL17),
87 MAX8925_REG_RESOURCE(LDOCTL18, LDOCTL18),
88 MAX8925_REG_RESOURCE(LDOCTL19, LDOCTL19),
89 MAX8925_REG_RESOURCE(LDOCTL20, LDOCTL20),
92 #define MAX8925_REG_DEVS(_id) \
94 .name = "max8925-regulator", \
96 .resources = ®ulator_resources[MAX8925_ID_##_id], \
97 .id = MAX8925_ID_##_id, \
100 static struct mfd_cell regulator_devs[] = {
101 MAX8925_REG_DEVS(SD1),
102 MAX8925_REG_DEVS(SD2),
103 MAX8925_REG_DEVS(SD3),
104 MAX8925_REG_DEVS(LDO1),
105 MAX8925_REG_DEVS(LDO2),
106 MAX8925_REG_DEVS(LDO3),
107 MAX8925_REG_DEVS(LDO4),
108 MAX8925_REG_DEVS(LDO5),
109 MAX8925_REG_DEVS(LDO6),
110 MAX8925_REG_DEVS(LDO7),
111 MAX8925_REG_DEVS(LDO8),
112 MAX8925_REG_DEVS(LDO9),
113 MAX8925_REG_DEVS(LDO10),
114 MAX8925_REG_DEVS(LDO11),
115 MAX8925_REG_DEVS(LDO12),
116 MAX8925_REG_DEVS(LDO13),
117 MAX8925_REG_DEVS(LDO14),
118 MAX8925_REG_DEVS(LDO15),
119 MAX8925_REG_DEVS(LDO16),
120 MAX8925_REG_DEVS(LDO17),
121 MAX8925_REG_DEVS(LDO18),
122 MAX8925_REG_DEVS(LDO19),
123 MAX8925_REG_DEVS(LDO20),
126 static int __get_irq_offset(struct max8925_chip *chip, int irq, int mode,
127 int *offset, int *bit)
132 switch (chip->chip_id) {
134 *bit = irq % BITS_PER_BYTE;
135 if (irq < (BITS_PER_BYTE << 1)) { /* irq = [0,15] */
136 *offset = (mode) ? MAX8925_CHG_IRQ1_MASK
138 if (irq >= BITS_PER_BYTE)
140 } else { /* irq = [16,31] */
141 *offset = (mode) ? MAX8925_ON_OFF_IRQ1_MASK
142 : MAX8925_ON_OFF_IRQ1;
143 if (irq >= (BITS_PER_BYTE * 3))
148 *bit = irq % BITS_PER_BYTE;
149 *offset = (mode) ? MAX8925_TSC_IRQ_MASK : MAX8925_TSC_IRQ;
156 dev_err(chip->dev, "Wrong irq #%d is assigned\n", irq);
160 static int __check_irq(int irq)
162 if ((irq < 0) || (irq >= MAX8925_NUM_IRQ))
167 int max8925_mask_irq(struct max8925_chip *chip, int irq)
169 int offset, bit, ret;
171 ret = __get_irq_offset(chip, irq, IRQ_MODE_MASK, &offset, &bit);
174 ret = max8925_set_bits(chip->i2c, offset, 1 << bit, 1 << bit);
178 int max8925_unmask_irq(struct max8925_chip *chip, int irq)
180 int offset, bit, ret;
182 ret = __get_irq_offset(chip, irq, IRQ_MODE_MASK, &offset, &bit);
185 ret = max8925_set_bits(chip->i2c, offset, 1 << bit, 0);
189 #define INT_STATUS_NUM (MAX8925_NUM_IRQ / BITS_PER_BYTE)
191 static irqreturn_t max8925_irq_thread(int irq, void *data)
193 struct max8925_chip *chip = data;
194 unsigned long irq_status[INT_STATUS_NUM];
195 unsigned char status_buf[INT_STATUS_NUM << 1];
198 memset(irq_status, 0, sizeof(unsigned long) * INT_STATUS_NUM);
200 /* all these interrupt status registers are read-only */
201 switch (chip->chip_id) {
203 ret = max8925_bulk_read(chip->i2c, MAX8925_CHG_IRQ1,
207 ret = max8925_bulk_read(chip->i2c, MAX8925_ON_OFF_IRQ1,
211 ret = max8925_bulk_read(chip->i2c, MAX8925_ON_OFF_IRQ2,
215 /* clear masked interrupt status */
216 status_buf[0] &= (~status_buf[2] & CHG_IRQ1_MASK);
217 irq_status[0] |= status_buf[0];
218 status_buf[1] &= (~status_buf[3] & CHG_IRQ2_MASK);
219 irq_status[0] |= (status_buf[1] << BITS_PER_BYTE);
220 status_buf[4] &= (~status_buf[5] & ON_OFF_IRQ1_MASK);
221 irq_status[0] |= (status_buf[4] << (BITS_PER_BYTE * 2));
222 status_buf[6] &= (~status_buf[7] & ON_OFF_IRQ2_MASK);
223 irq_status[0] |= (status_buf[6] << (BITS_PER_BYTE * 3));
226 ret = max8925_bulk_read(chip->i2c, MAX8925_TSC_IRQ,
230 /* clear masked interrupt status */
231 status_buf[0] &= (~status_buf[1] & TSC_IRQ_MASK);
232 irq_status[0] |= status_buf[0];
238 for_each_bit(i, &irq_status[0], MAX8925_NUM_IRQ) {
239 clear_bit(i, irq_status);
240 dev_dbg(chip->dev, "Servicing IRQ #%d in %s\n", i, chip->name);
242 mutex_lock(&chip->irq_lock);
243 if (chip->irq[i].handler)
244 chip->irq[i].handler(i, chip->irq[i].data);
246 max8925_mask_irq(chip, i);
247 dev_err(chip->dev, "Noboday cares IRQ #%d in %s. "
248 "Now mask it.\n", i, chip->name);
250 mutex_unlock(&chip->irq_lock);
256 int max8925_request_irq(struct max8925_chip *chip, int irq,
257 irq_handler_t handler, void *data)
259 if ((__check_irq(irq) < 0) || !handler)
262 mutex_lock(&chip->irq_lock);
263 chip->irq[irq].handler = handler;
264 chip->irq[irq].data = data;
265 mutex_unlock(&chip->irq_lock);
268 EXPORT_SYMBOL(max8925_request_irq);
270 int max8925_free_irq(struct max8925_chip *chip, int irq)
272 if (__check_irq(irq) < 0)
275 mutex_lock(&chip->irq_lock);
276 chip->irq[irq].handler = NULL;
277 chip->irq[irq].data = NULL;
278 mutex_unlock(&chip->irq_lock);
281 EXPORT_SYMBOL(max8925_free_irq);
283 static int __devinit device_gpm_init(struct max8925_chip *chip,
284 struct i2c_client *i2c,
285 struct max8925_platform_data *pdata)
290 ret = max8925_set_bits(i2c, MAX8925_CHG_IRQ1_MASK, 0x7, 0x7);
293 ret = max8925_set_bits(i2c, MAX8925_CHG_IRQ2_MASK, 0xff, 0xff);
296 ret = max8925_set_bits(i2c, MAX8925_ON_OFF_IRQ1_MASK, 0xff, 0xff);
299 ret = max8925_set_bits(i2c, MAX8925_ON_OFF_IRQ2_MASK, 0x3, 0x3);
304 memset(chip->irq, 0, sizeof(struct max8925_irq) * MAX8925_NUM_IRQ);
305 ret = request_threaded_irq(i2c->irq, NULL, max8925_irq_thread,
306 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
307 "max8925-gpm", chip);
309 dev_err(chip->dev, "Failed to request IRQ #%d.\n", i2c->irq);
312 chip->chip_irq = i2c->irq;
314 /* enable hard-reset for ONKEY power-off */
315 max8925_set_bits(i2c, MAX8925_SYSENSEL, 0x80, 0x80);
317 ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[0],
318 ARRAY_SIZE(regulator_devs),
319 ®ulator_resources[0], 0);
321 dev_err(chip->dev, "Failed to add regulator subdev\n");
325 if (pdata && pdata->backlight) {
326 ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
327 ARRAY_SIZE(backlight_devs),
328 &backlight_resources[0], 0);
330 dev_err(chip->dev, "Failed to add backlight subdev\n");
336 mfd_remove_devices(chip->dev);
339 free_irq(chip->chip_irq, chip);
344 static int __devinit device_adc_init(struct max8925_chip *chip,
345 struct i2c_client *i2c,
346 struct max8925_platform_data *pdata)
351 ret = max8925_set_bits(i2c, MAX8925_TSC_IRQ_MASK, 3, 3);
354 memset(chip->irq, 0, sizeof(struct max8925_irq) * MAX8925_NUM_IRQ);
355 ret = request_threaded_irq(i2c->irq, NULL, max8925_irq_thread,
356 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
357 "max8925-adc", chip);
359 dev_err(chip->dev, "Failed to request IRQ #%d.\n", i2c->irq);
362 chip->chip_irq = i2c->irq;
364 if (pdata && pdata->touch) {
365 ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
366 ARRAY_SIZE(touch_devs),
367 &touch_resources[0], 0);
369 dev_err(chip->dev, "Failed to add touch subdev\n");
376 free_irq(chip->chip_irq, chip);
381 int __devinit max8925_device_init(struct max8925_chip *chip,
382 struct max8925_platform_data *pdata)
384 switch (chip->chip_id) {
386 device_gpm_init(chip, chip->i2c, pdata);
389 device_adc_init(chip, chip->i2c, pdata);
395 void max8925_device_exit(struct max8925_chip *chip)
397 if (chip->chip_irq >= 0)
398 free_irq(chip->chip_irq, chip);
399 mfd_remove_devices(chip->dev);
402 MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925");
403 MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com");
404 MODULE_LICENSE("GPL");