| From 1b89970d81bbd52720fc64a3fe9572ee33588363 Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Thu, 26 Jan 2017 19:24:08 +0200 |
| Subject: [PATCH] pinctrl: baytrail: Debounce register is one per community |
| |
| commit 1b89970d81bbd52720fc64a3fe9572ee33588363 upstream. |
| |
| Debounce value is set globally per community. Otherwise user will easily |
| get a kernel crash when they start using the feature: |
| |
| BUG: unable to handle kernel paging request at ffffc900003be000 |
| IP: byt_gpio_dbg_show+0xa9/0x430 |
| |
| Make it clear in byt_gpio_reg(). |
| |
| Note that this fix just prevents kernel to crash, but doesn't make any |
| difference to the existing logic. It means the last caller will win the |
| trade and debounce value will be configured accordingly. The actual |
| logic fix needs to be thought about and it's not as important as crash |
| fix. That's why the latter goes separately and right now. |
| |
| Fixes: 658b476c742f ("pinctrl: baytrail: Add debounce configuration") |
| Cc: Cristina Ciocan <cristina.ciocan@intel.com> |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Reviewed-by: Jean Delvare <jdelvare@suse.de> |
| Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| |
| diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c |
| index 3eb7c2bde87e..05ba052ff6b9 100644 |
| --- a/drivers/pinctrl/intel/pinctrl-baytrail.c |
| +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c |
| @@ -731,16 +731,23 @@ static void __iomem *byt_gpio_reg(struct byt_gpio *vg, unsigned int offset, |
| int reg) |
| { |
| struct byt_community *comm = byt_get_community(vg, offset); |
| - u32 reg_offset = 0; |
| + u32 reg_offset; |
| |
| if (!comm) |
| return NULL; |
| |
| offset -= comm->pin_base; |
| - if (reg == BYT_INT_STAT_REG) |
| + switch (reg) { |
| + case BYT_INT_STAT_REG: |
| reg_offset = (offset / 32) * 4; |
| - else |
| + break; |
| + case BYT_DEBOUNCE_REG: |
| + reg_offset = 0; |
| + break; |
| + default: |
| reg_offset = comm->pad_map[offset] * 16; |
| + break; |
| + } |
| |
| return comm->reg_base + reg_offset + reg; |
| } |
| -- |
| 2.12.0 |
| |