diff options
| author | Zhou Jingyu <b02241@freescale.com> | 2011-03-02 16:28:25 +0800 |
|---|---|---|
| committer | Jason Liu <r64343@freescale.com> | 2012-07-20 13:10:24 +0800 |
| commit | e7b0b8997d008d60c512fb6b383ec8f4b53d518a (patch) | |
| tree | be17d79427abc2097457d76b84e2215e38a23124 /drivers/mfd/da9052-core.c | |
| parent | abec7b2ff44f34fac00c61d069f0cb7644690bdc (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.c | 41 |
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; |
