summaryrefslogtreecommitdiff
path: root/drivers/mfd/da9052-core.c
diff options
context:
space:
mode:
authorZhou Jingyu <b02241@freescale.com>2011-03-02 16:28:25 +0800
committerJason Liu <r64343@freescale.com>2012-07-20 13:10:24 +0800
commite7b0b8997d008d60c512fb6b383ec8f4b53d518a (patch)
treebe17d79427abc2097457d76b84e2215e38a23124 /drivers/mfd/da9052-core.c
parentabec7b2ff44f34fac00c61d069f0cb7644690bdc (diff)
ENGR00141391-2 PMIC: porting da9053 to i.mx platform
Fix da9053 backlight Kconfig error porting da9052 regulator driver Signed-off-by: Zhou Jingyu <Jingyu.Zhou@freescale.com> Acked-by: Lily Zhang <r58066@freescale.com>
Diffstat (limited to 'drivers/mfd/da9052-core.c')
-rwxr-xr-x[-rw-r--r--]drivers/mfd/da9052-core.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c
index b19eeafbc857..8b4a658ceb50 100644..100755
--- a/drivers/mfd/da9052-core.c
+++ b/drivers/mfd/da9052-core.c
@@ -22,6 +22,7 @@
#include <linux/mfd/core.h>
#include <linux/spi/spi.h>
#include <linux/i2c.h>
+#include <linux/semaphore.h>
#include <linux/mfd/da9052/da9052.h>
#include <linux/mfd/da9052/adc.h>
@@ -171,7 +172,7 @@ static irqreturn_t da9052_eh_isr(int irq, void *dev_id)
/* Schedule work to be done */
schedule_work(&da9052->eh_isr_work);
/* Disable IRQ */
- disable_irq_nosync(DA9052_IRQ);
+ disable_irq_nosync(da9052->irq);
return IRQ_HANDLED;
}
@@ -306,14 +307,14 @@ void eh_workqueue_isr(struct work_struct *work)
ret = da9052_ssc_read_many(da9052,eve_data, DA9052_EVE_REGISTERS);
if (ret) {
- enable_irq(DA9052_IRQ);
+ enable_irq(da9052->irq);
da9052_unlock(da9052);
return;
}
ret = da9052_ssc_read_many(da9052,eve_mask_data, DA9052_EVE_REGISTERS);
if (ret) {
- enable_irq(DA9052_IRQ);
+ enable_irq(da9052->irq);
da9052_unlock(da9052);
return;
}
@@ -330,7 +331,7 @@ void eh_workqueue_isr(struct work_struct *work)
/* Check if we really got any event */
if (events_sts == 0) {
- enable_irq(DA9052_IRQ);
+ enable_irq(da9052->irq);
da9052_unlock(da9052);
return;
}
@@ -344,7 +345,7 @@ void eh_workqueue_isr(struct work_struct *work)
if (eve_data[cnt].data) {
ret = da9052_ssc_write(da9052, &eve_data[cnt]);
if (ret) {
- enable_irq(DA9052_IRQ);
+ enable_irq(da9052->irq);
da9052_unlock(da9052);
return;
}
@@ -360,13 +361,13 @@ void eh_workqueue_isr(struct work_struct *work)
udelay(50);
#endif
/* Enable HOST interrupt */
- enable_irq(DA9052_IRQ);
+ enable_irq(da9052->irq);
}
-static void da9052_eh_restore_irq(void)
+static void da9052_eh_restore_irq(struct da9052 *da9052)
{
/* Put your platform and board specific code here */
- free_irq(DA9052_IRQ, NULL);
+ free_irq(da9052->irq, NULL);
}
static int da9052_add_subdevice_pdata(struct da9052 *da9052,
@@ -404,7 +405,7 @@ static int add_da9052_devices(struct da9052 *da9052)
if (ret != 0)
return ret;
} else
- printk(KERN_CRIT "No platform initialisation supplied \n");
+ pr_err("No platform initialisation supplied\n");
ret = da9052_add_subdevice(da9052, "da9052-rtc");
if (ret)
@@ -433,11 +434,6 @@ static int add_da9052_devices(struct da9052 *da9052)
if (ret)
return ret;
- ret = da9052_add_subdevice_pdata(da9052, "da9052-gpio",
- pdata, sizeof(*pdata));
- if (ret)
- return ret;
-
ret = da9052_add_subdevice_pdata(da9052, "da9052-leds",
&leds_data, sizeof(leds_data));
if (ret)
@@ -464,6 +460,7 @@ int da9052_ssc_init(struct da9052 *da9052)
{
int cnt;
struct da9052_platform_data *pdata;
+ struct da9052_ssc_msg ssc_msg;
/* Initialize eve_nb_array */
for (cnt = 0; cnt < EVE_CNT; cnt++)
@@ -473,7 +470,7 @@ int da9052_ssc_init(struct da9052 *da9052)
mutex_init(&manconv_lock);
/* Initialize NB array lock */
- init_MUTEX(&eve_nb_array_lock);
+ sema_init(&eve_nb_array_lock, 1);
/* Assign the read-write function pointers */
da9052->read = da9052_ssc_read;
@@ -507,10 +504,16 @@ int da9052_ssc_init(struct da9052 *da9052)
add_da9052_devices(da9052);
INIT_WORK(&da9052->eh_isr_work, eh_workqueue_isr);
-
- if (request_irq(DA9052_IRQ, da9052_eh_isr, IRQ_TYPE_LEVEL_LOW,
+ ssc_msg.addr = DA9052_IRQMASKA_REG;
+ ssc_msg.data = 0xff;
+ da9052->write(da9052, &ssc_msg);
+ ssc_msg.addr = DA9052_IRQMASKC_REG;
+ ssc_msg.data = 0xff;
+ da9052->write(da9052, &ssc_msg);
+ if (request_irq(da9052->irq, da9052_eh_isr, IRQ_TYPE_LEVEL_LOW,
DA9052_EH_DEVICE_NAME, da9052))
return -EIO;
+ enable_irq_wake(da9052->irq);
return 0;
}
@@ -520,8 +523,8 @@ void da9052_ssc_exit(struct da9052 *da9052)
printk(KERN_INFO "DA9052: Unregistering SSC device.\n");
mutex_destroy(&manconv_lock);
/* Restore IRQ line */
- da9052_eh_restore_irq();
- free_irq(DA9052_IRQ, NULL);
+ da9052_eh_restore_irq(da9052);
+ free_irq(da9052->irq, NULL);
mutex_destroy(&da9052->ssc_lock);
mutex_destroy(&da9052->eve_nb_lock);
return;