aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/intel_pmic_gpio.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-04-12 15:24:23 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-04-12 15:24:23 -0700
commitd77d9597ad8f2bd381a5168005a21e82df6f18eb (patch)
tree43b4ceb5662b41ad340ae781f136afbeb30deeec /drivers/platform/x86/intel_pmic_gpio.c
parent0bba01695b74fdd2f9286243bb39f88544d81401 (diff)
parentb569ab3911aca64841bd819720d2b241aa09d713 (diff)
downloadkernel_replicant_linux-d77d9597ad8f2bd381a5168005a21e82df6f18eb.tar.gz
kernel_replicant_linux-d77d9597ad8f2bd381a5168005a21e82df6f18eb.tar.bz2
kernel_replicant_linux-d77d9597ad8f2bd381a5168005a21e82df6f18eb.zip
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86: thinkpad-acpi fails to load with newer Thinkpad X201s BIOS acer-wmi: Fix capitalisation of GUID in module alias sony-laptop: keyboard backlight fixes sony-laptop: only show the handles sysfs file in debug mode samsung-laptop: set backlight type staging: samsung-laptop has moved to platform/x86 samsung-laptop: Samsung R410P backlight driver samsung-laptop: add support for N230 model platform-drivers: x86: pmic: Restore the dropped buslock/unlock sony-laptop: fix early NULL pointer dereference msi-laptop: fix config-dependent build error eeepc-wmi: add keys found on EeePC 1215T asus-wmi: swap input name and phys asus-laptop: remove removed features from feature-removal-schedule.txt
Diffstat (limited to 'drivers/platform/x86/intel_pmic_gpio.c')
-rw-r--r--drivers/platform/x86/intel_pmic_gpio.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/platform/x86/intel_pmic_gpio.c b/drivers/platform/x86/intel_pmic_gpio.c
index d653104b59cb..7bbb5388e564 100644
--- a/drivers/platform/x86/intel_pmic_gpio.c
+++ b/drivers/platform/x86/intel_pmic_gpio.c
@@ -74,6 +74,19 @@ struct pmic_gpio {
u32 trigger_type;
};
+static void pmic_program_irqtype(int gpio, int type)
+{
+ if (type & IRQ_TYPE_EDGE_RISING)
+ intel_scu_ipc_update_register(GPIO0 + gpio, 0x20, 0x20);
+ else
+ intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x20);
+
+ if (type & IRQ_TYPE_EDGE_FALLING)
+ intel_scu_ipc_update_register(GPIO0 + gpio, 0x10, 0x10);
+ else
+ intel_scu_ipc_update_register(GPIO0 + gpio, 0x00, 0x10);
+};
+
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{
if (offset > 8) {
@@ -166,16 +179,38 @@ static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
return pg->irq_base + offset;
}
+static void pmic_bus_lock(struct irq_data *data)
+{
+ struct pmic_gpio *pg = irq_data_get_irq_chip_data(data);
+
+ mutex_lock(&pg->buslock);
+}
+
+static void pmic_bus_sync_unlock(struct irq_data *data)
+{
+ struct pmic_gpio *pg = irq_data_get_irq_chip_data(data);
+
+ if (pg->update_type) {
+ unsigned int gpio = pg->update_type & ~GPIO_UPDATE_TYPE;
+
+ pmic_program_irqtype(gpio, pg->trigger_type);
+ pg->update_type = 0;
+ }
+ mutex_unlock(&pg->buslock);
+}
+
/* the gpiointr register is read-clear, so just do nothing. */
static void pmic_irq_unmask(struct irq_data *data) { }
static void pmic_irq_mask(struct irq_data *data) { }
static struct irq_chip pmic_irqchip = {
- .name = "PMIC-GPIO",
- .irq_mask = pmic_irq_mask,
- .irq_unmask = pmic_irq_unmask,
- .irq_set_type = pmic_irq_type,
+ .name = "PMIC-GPIO",
+ .irq_mask = pmic_irq_mask,
+ .irq_unmask = pmic_irq_unmask,
+ .irq_set_type = pmic_irq_type,
+ .irq_bus_lock = pmic_irq_buslock,
+ .irq_bus_sync_unlock = pmic_bus_sync_unlock,
};
static irqreturn_t pmic_irq_handler(int irq, void *data)