[PATCH 6/8] gpio: omap: get rid of GPIO_BIT() macro

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for GPIO_BIT() macro removing.
Do it ;)

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index b39faa8..dd7934a 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -82,7 +82,6 @@ struct gpio_bank {
 };
 
 #define GPIO_INDEX(bank, gpio) (gpio % bank->width)
-#define GPIO_BIT(bank, gpio) (BIT(GPIO_INDEX(bank, gpio)))
 #define GPIO_MOD_CTRL_BIT  BIT(0)
 
 #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
@@ -863,7 +862,6 @@ static void omap_gpio_unmask_irq(struct irq_data *d)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
unsigned offset = d->hwirq;
-   unsigned int irq_mask = GPIO_BIT(bank, gpio);
u32 trigger = irqd_get_trigger_type(d);
unsigned long flags;
 
@@ -873,7 +871,7 @@ static void omap_gpio_unmask_irq(struct irq_data *d)
 
/* For level-triggered GPIOs, the clearing must be done after
 * the HW source is cleared, thus after the handler has run */
-   if (bank->level_mask & irq_mask) {
+   if (bank->level_mask & BIT(offset)) {
omap_set_gpio_irqenable(bank, offset, 0);
omap_clear_gpio_irqstatus(bank, offset);
}
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 5/8] gpio: omap: convert gpio irq functions to use GPIO offset

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Convert GPIO IRQ functions to use GPIO offset instead of system
GPIO numbers. This allows to drop unneeded conversations between
system GPIO <-> GPIO offset which are done in many places and
many times.
It is safe to do now because:
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain, so
  struct irq_data->hwirq contains GPIO offset

This is preparation step before removing:
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 64 +---
 1 file changed, 33 insertions(+), 31 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index ff5d54d..b39faa8 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -549,9 +549,10 @@ static void omap_clear_gpio_irqbank(struct gpio_bank 
*bank, int gpio_mask)
readl_relaxed(reg);
 }
 
-static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
+static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
+unsigned offset)
 {
-   omap_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_clear_gpio_irqbank(bank, BIT(offset));
 }
 
 static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
@@ -612,13 +613,13 @@ static void omap_disable_gpio_irqbank(struct gpio_bank 
*bank, int gpio_mask)
writel_relaxed(l, reg);
 }
 
-static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio,
-  int enable)
+static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
+  unsigned offset, int enable)
 {
if (enable)
-   omap_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_enable_gpio_irqbank(bank, BIT(offset));
else
-   omap_disable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_disable_gpio_irqbank(bank, BIT(offset));
 }
 
 /*
@@ -629,14 +630,16 @@ static inline void omap_set_gpio_irqenable(struct 
gpio_bank *bank, int gpio,
  * enabled. When system is suspended, only selected GPIO interrupts need
  * to have wake-up enabled.
  */
-static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
+static int omap_set_gpio_wakeup(struct gpio_bank *bank, unsigned offset,
+   int enable)
 {
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
unsigned long flags;
 
if (bank->non_wakeup_gpios & gpio_bit) {
dev_err(bank->dev,
-   "Unable to modify wakeup on non-wakeup GPIO%d\n", gpio);
+   "Unable to modify wakeup on non-wakeup GPIO%d\n",
+   offset);
return -EINVAL;
}
 
@@ -652,22 +655,22 @@ static int omap_set_gpio_wakeup(struct gpio_bank *bank, 
int gpio, int enable)
return 0;
 }
 
-static void omap_reset_gpio(struct gpio_bank *bank, int gpio)
+static void omap_reset_gpio(struct gpio_bank *bank, unsigned offset)
 {
-   omap_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1);
-   omap_set_gpio_irqenable(bank, gpio, 0);
-   omap_clear_gpio_irqstatus(bank, gpio);
-   omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
-   omap_clear_gpio_debounce(bank, GPIO_INDEX(bank, gpio));
+   omap_set_gpio_direction(bank, offset, 1);
+   omap_set_gpio_irqenable(bank, offset, 0);
+   omap_clear_gpio_irqstatus(bank, offset);
+   omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
+   omap_clear_gpio_debounce(bank, offset);
 }
 
 /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
 static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
+   unsigned offset = d->hwirq;
 
-   return omap_set_gpio_wakeup(bank, gpio, enable);
+   return omap_set_gpio_wakeup(bank, offset, enable);
 }
 
 static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -705,7 +708,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned 
offset)
spin_lock_irqsave(&bank->lock, flags);
bank->mod_usage &= ~(BIT(offset));
omap_disable_gpio_module(bank, offset);
-   omap_reset_gpio(bank, bank->chip.base + offset);
+   omap_reset_gpio(bank, offset);
spin_unlock_irqrestore(&bank->lock, flags);
 
/*
@@ -819,14 +822,13 @@ static unsigned int omap_gpio_irq_startup(struct irq_data 
*d)
 static void omap_gpio_irq_shutdown(struct irq_data *d)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
unsigned long flags;
-   unsigned offset = GPIO_IN

[RFT OMAP1 PATCH 7/8] gpio: omap: get rid of omap_irq_to_gpio()

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for omap_irq_to_gpio() removing.
Do it ;)

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 17 +
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index dd7934a..615e950 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -89,11 +89,6 @@ struct gpio_bank {
 
 static void omap_gpio_unmask_irq(struct irq_data *d);
 
-static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq)
-{
-   return bank->chip.base + gpio_irq;
-}
-
 static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d)
 {
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
@@ -490,22 +485,21 @@ static void omap_gpio_init_irq(struct gpio_bank *bank, 
unsigned offset)
 static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned gpio = 0;
int retval;
unsigned long flags;
-   unsigned offset;
+   unsigned offset = d->hwirq;
 
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
 #ifdef CONFIG_ARCH_OMAP1
-   if (d->irq > IH_MPUIO_BASE)
+   if (d->irq > IH_MPUIO_BASE) {
+   unsigned gpio = 0;
gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
+   offset = GPIO_INDEX(bank, gpio);
+   }
 #endif
 
-   if (!gpio)
-   gpio = omap_irq_to_gpio(bank, d->hwirq);
-
if (type & ~IRQ_TYPE_SENSE_MASK)
return -EINVAL;
 
@@ -514,7 +508,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
return -EINVAL;
 
spin_lock_irqsave(&bank->lock, flags);
-   offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
omap_gpio_init_irq(bank, offset);
if (!omap_gpio_is_input(bank, offset)) {
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/8] gpio: omap: simplify omap_set_gpio_dataout_x()

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Both functions omap_set_gpio_dataout_reg() and
omap_set_gpio_dataout_mask() accept GPIO offset
as 'gpio' input parameter, so rename it to 'offset' and
drop usage of GPIO_BIT() macro.

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index ce71239..7aeee7b 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -75,7 +75,7 @@ struct gpio_bank {
int power_mode;
bool workaround_enabled;
 
-   void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);
+   void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
int (*get_context_loss_count)(struct device *dev);
 
struct omap_gpio_reg_offs *regs;
@@ -119,11 +119,11 @@ static void omap_set_gpio_direction(struct gpio_bank 
*bank, int gpio,
 
 
 /* set data out value using dedicate set/clear register */
-static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, int gpio,
+static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, unsigned offset,
  int enable)
 {
void __iomem *reg = bank->base;
-   u32 l = GPIO_BIT(bank, gpio);
+   u32 l = BIT(offset);
 
if (enable) {
reg += bank->regs->set_dataout;
@@ -137,11 +137,11 @@ static void omap_set_gpio_dataout_reg(struct gpio_bank 
*bank, int gpio,
 }
 
 /* set data out value using mask register */
-static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, int gpio,
+static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
   int enable)
 {
void __iomem *reg = bank->base + bank->regs->dataout;
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
u32 l;
 
l = readl_relaxed(reg);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFT OMAP1 PATCH 8/8] gpio: omap: get rid of GPIO_INDEX() macro

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for GPIO_INDEX() macro removing.
Do It ;)

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 9 -
 1 file changed, 9 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 615e950..cd1d5bf 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -81,7 +81,6 @@ struct gpio_bank {
struct omap_gpio_reg_offs *regs;
 };
 
-#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
 #define GPIO_MOD_CTRL_BIT  BIT(0)
 
 #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
@@ -492,14 +491,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
-#ifdef CONFIG_ARCH_OMAP1
-   if (d->irq > IH_MPUIO_BASE) {
-   unsigned gpio = 0;
-   gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
-   offset = GPIO_INDEX(bank, gpio);
-   }
-#endif
-
if (type & ~IRQ_TYPE_SENSE_MASK)
return -EINVAL;
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 4/8] gpio: omap: drop 'gpio' param from omap_gpio_init_irq()

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

The 'gpio' parameter isn't needed any more as it
duplicates 'offset' parameter, so drop it.

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 2df693b..ff5d54d 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -479,14 +479,13 @@ static int omap_gpio_is_input(struct gpio_bank *bank, 
unsigned offset)
return readl_relaxed(reg) & BIT(offset);
 }
 
-static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio,
-  unsigned offset)
+static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset)
 {
if (!LINE_USED(bank->mod_usage, offset)) {
omap_enable_gpio_module(bank, offset);
omap_set_gpio_direction(bank, offset, 1);
}
-   bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio));
+   bank->irq_usage |= BIT(offset);
 }
 
 static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
@@ -518,7 +517,7 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
spin_lock_irqsave(&bank->lock, flags);
offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
-   omap_gpio_init_irq(bank, gpio, offset);
+   omap_gpio_init_irq(bank, offset);
if (!omap_gpio_is_input(bank, offset)) {
spin_unlock_irqrestore(&bank->lock, flags);
return -EINVAL;
@@ -803,15 +802,14 @@ exit:
 static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
unsigned long flags;
-   unsigned offset = GPIO_INDEX(bank, gpio);
+   unsigned offset = d->hwirq;
 
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
spin_lock_irqsave(&bank->lock, flags);
-   omap_gpio_init_irq(bank, gpio, offset);
+   omap_gpio_init_irq(bank, offset);
spin_unlock_irqrestore(&bank->lock, flags);
omap_gpio_unmask_irq(d);
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 0/8] gpio: omap: cleanup: get rid of system GPIO <-> GPIO offset converseations

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Now in TI OMAP GPIO driver there are a lot of places where
System GPIO number calculated and then converted to GPIO offset.
What is worse is that in many place such conversation performed twice
or even three times. But actually, we don't need to do that at all, because
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain, so
  struct irq_data->hwirq contains GPIO offset

Hence, it is safe to convert all GPIO OMAP functions to use GPIO
offset instead of system GPIO numbers. Also, this allows to remove
unneeded conversations routines
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Tested on dra7-evm.

Last two patches have to be tested on OMAP1:
-  gpio: omap: get rid of omap_irq_to_gpio()
-  gpio: omap: get rid of GPIO_INDEX() macro

Based on top of Linux 4.0-rc4 plus patch
'[PATCH 1/2] gpio: omap: irq_shutdown: remove unnecessary call of 
gpiochip_unlock_as_irq'
http://www.spinics.net/lists/linux-omap/msg116482.html

Grygorii Strashko (8):
  gpio: omap: convert omap_gpio_is_input() to use gpio offset
  gpio: omap: simplify omap_set_gpio_dataout_x()
  gpio: omap: convert debounce functions switch to use gpio offset
  gpio: omap: drop 'gpio' param from omap_gpio_init_irq()
  gpio: omap: convert gpio irq functions to use GPIO offset
  gpio: omap: get rid of GPIO_BIT() macro
  gpio: omap: get rid of omap_irq_to_gpio()
  gpio: omap: get rid of GPIO_INDEX() macro

 drivers/gpio/gpio-omap.c | 130 ---
 1 file changed, 55 insertions(+), 75 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3/8] gpio: omap: convert debounce functions switch to use gpio offset

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Convert debounce functions to use GPIO offset instead of system
GPIO numbers. This allows to drop unneeded conversations between
system GPIO <-> GPIO offset which are done in many places and
many times.
It is safe to do now because:
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain

This is preparation step before removing:
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 7aeee7b..2df693b 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -208,13 +208,13 @@ static inline void omap_gpio_dbck_disable(struct 
gpio_bank *bank)
 /**
  * omap2_set_gpio_debounce - low level gpio debounce time
  * @bank: the gpio bank we're acting upon
- * @gpio: the gpio number on this @gpio
+ * @offset: the gpio number on this @bank
  * @debounce: debounce time to use
  *
  * OMAP's debounce time is in 31us steps so we need
  * to convert and round up to the closest unit.
  */
-static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
+static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
unsigned debounce)
 {
void __iomem*reg;
@@ -231,7 +231,7 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, 
unsigned gpio,
else
debounce = (debounce / 0x1f) - 1;
 
-   l = GPIO_BIT(bank, gpio);
+   l = BIT(offset);
 
clk_prepare_enable(bank->dbck);
reg = bank->base + bank->regs->debounce;
@@ -266,16 +266,16 @@ static void omap2_set_gpio_debounce(struct gpio_bank 
*bank, unsigned gpio,
 /**
  * omap_clear_gpio_debounce - clear debounce settings for a gpio
  * @bank: the gpio bank we're acting upon
- * @gpio: the gpio number on this @gpio
+ * @offset: the gpio number on this @bank
  *
  * If a gpio is using debounce, then clear the debounce enable bit and if
  * this is the only gpio in this bank using debounce, then clear the debounce
  * time too. The debounce clock will also be disabled when calling this 
function
  * if this is the only gpio in the bank using debounce.
  */
-static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned gpio)
+static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
 {
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
 
if (!bank->dbck_flag)
return;
@@ -659,7 +659,7 @@ static void omap_reset_gpio(struct gpio_bank *bank, int 
gpio)
omap_set_gpio_irqenable(bank, gpio, 0);
omap_clear_gpio_irqstatus(bank, gpio);
omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
-   omap_clear_gpio_debounce(bank, gpio);
+   omap_clear_gpio_debounce(bank, GPIO_INDEX(bank, gpio));
 }
 
 /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/8] gpio: omap: convert omap_gpio_is_input() to use gpio offset

2015-03-19 Thread grygorii.strashko
From: Grygorii Strashko 

Convert omap_gpio_is_input() to use GPIO offset instead of mask and,
in such way, make code simpler and remove few lines of code.

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 10 --
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 2b2fc4b..ce71239 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -472,11 +472,11 @@ static void omap_disable_gpio_module(struct gpio_bank 
*bank, unsigned offset)
}
 }
 
-static int omap_gpio_is_input(struct gpio_bank *bank, int mask)
+static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset)
 {
void __iomem *reg = bank->base + bank->regs->direction;
 
-   return readl_relaxed(reg) & mask;
+   return readl_relaxed(reg) & BIT(offset);
 }
 
 static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio,
@@ -519,7 +519,7 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
omap_gpio_init_irq(bank, gpio, offset);
-   if (!omap_gpio_is_input(bank, BIT(offset))) {
+   if (!omap_gpio_is_input(bank, offset)) {
spin_unlock_irqrestore(&bank->lock, flags);
return -EINVAL;
}
@@ -976,12 +976,10 @@ static int omap_gpio_input(struct gpio_chip *chip, 
unsigned offset)
 static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
struct gpio_bank *bank;
-   u32 mask;
 
bank = container_of(chip, struct gpio_bank, chip);
-   mask = (BIT(offset));
 
-   if (omap_gpio_is_input(bank, mask))
+   if (omap_gpio_is_input(bank, offset))
return omap_get_gpio_datain(bank, offset);
else
return omap_get_gpio_dataout(bank, offset);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 8/8] gpio: omap: get rid of GPIO_INDEX() macro

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for GPIO_INDEX() macro removing.
Do It ;)

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 9 -
 1 file changed, 9 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 615e950..cd1d5bf 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -81,7 +81,6 @@ struct gpio_bank {
struct omap_gpio_reg_offs *regs;
 };
 
-#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
 #define GPIO_MOD_CTRL_BIT  BIT(0)
 
 #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
@@ -492,14 +491,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
-#ifdef CONFIG_ARCH_OMAP1
-   if (d->irq > IH_MPUIO_BASE) {
-   unsigned gpio = 0;
-   gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
-   offset = GPIO_INDEX(bank, gpio);
-   }
-#endif
-
if (type & ~IRQ_TYPE_SENSE_MASK)
return -EINVAL;
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 4/8] gpio: omap: drop 'gpio' param from omap_gpio_init_irq()

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

The 'gpio' parameter isn't needed any more as it
duplicates 'offset' parameter, so drop it.

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 2df693b..ff5d54d 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -479,14 +479,13 @@ static int omap_gpio_is_input(struct gpio_bank *bank, 
unsigned offset)
return readl_relaxed(reg) & BIT(offset);
 }
 
-static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio,
-  unsigned offset)
+static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned offset)
 {
if (!LINE_USED(bank->mod_usage, offset)) {
omap_enable_gpio_module(bank, offset);
omap_set_gpio_direction(bank, offset, 1);
}
-   bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio));
+   bank->irq_usage |= BIT(offset);
 }
 
 static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
@@ -518,7 +517,7 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
spin_lock_irqsave(&bank->lock, flags);
offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
-   omap_gpio_init_irq(bank, gpio, offset);
+   omap_gpio_init_irq(bank, offset);
if (!omap_gpio_is_input(bank, offset)) {
spin_unlock_irqrestore(&bank->lock, flags);
return -EINVAL;
@@ -803,15 +802,14 @@ exit:
 static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
unsigned long flags;
-   unsigned offset = GPIO_INDEX(bank, gpio);
+   unsigned offset = d->hwirq;
 
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
spin_lock_irqsave(&bank->lock, flags);
-   omap_gpio_init_irq(bank, gpio, offset);
+   omap_gpio_init_irq(bank, offset);
spin_unlock_irqrestore(&bank->lock, flags);
omap_gpio_unmask_irq(d);
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 7/8] gpio: omap: get rid of omap_irq_to_gpio()

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for omap_irq_to_gpio() removing.
Do it ;)

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 17 +
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index dd7934a..615e950 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -89,11 +89,6 @@ struct gpio_bank {
 
 static void omap_gpio_unmask_irq(struct irq_data *d);
 
-static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq)
-{
-   return bank->chip.base + gpio_irq;
-}
-
 static inline struct gpio_bank *omap_irq_data_get_bank(struct irq_data *d)
 {
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
@@ -490,22 +485,21 @@ static void omap_gpio_init_irq(struct gpio_bank *bank, 
unsigned offset)
 static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned gpio = 0;
int retval;
unsigned long flags;
-   unsigned offset;
+   unsigned offset = d->hwirq;
 
if (!BANK_USED(bank))
pm_runtime_get_sync(bank->dev);
 
 #ifdef CONFIG_ARCH_OMAP1
-   if (d->irq > IH_MPUIO_BASE)
+   if (d->irq > IH_MPUIO_BASE) {
+   unsigned gpio = 0;
gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
+   offset = GPIO_INDEX(bank, gpio);
+   }
 #endif
 
-   if (!gpio)
-   gpio = omap_irq_to_gpio(bank, d->hwirq);
-
if (type & ~IRQ_TYPE_SENSE_MASK)
return -EINVAL;
 
@@ -514,7 +508,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
return -EINVAL;
 
spin_lock_irqsave(&bank->lock, flags);
-   offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
omap_gpio_init_irq(bank, offset);
if (!omap_gpio_is_input(bank, offset)) {
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 5/8] gpio: omap: convert gpio irq functions to use GPIO offset

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Convert GPIO IRQ functions to use GPIO offset instead of system
GPIO numbers. This allows to drop unneeded conversations between
system GPIO <-> GPIO offset which are done in many places and
many times.
It is safe to do now because:
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain, so
  struct irq_data->hwirq contains GPIO offset

This is preparation step before removing:
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 67 
 1 file changed, 34 insertions(+), 33 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index ff5d54d..628a132 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -549,9 +549,10 @@ static void omap_clear_gpio_irqbank(struct gpio_bank 
*bank, int gpio_mask)
readl_relaxed(reg);
 }
 
-static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
+static inline void omap_clear_gpio_irqstatus(struct gpio_bank *bank,
+unsigned offset)
 {
-   omap_clear_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_clear_gpio_irqbank(bank, BIT(offset));
 }
 
 static u32 omap_get_gpio_irqbank_mask(struct gpio_bank *bank)
@@ -612,13 +613,13 @@ static void omap_disable_gpio_irqbank(struct gpio_bank 
*bank, int gpio_mask)
writel_relaxed(l, reg);
 }
 
-static inline void omap_set_gpio_irqenable(struct gpio_bank *bank, int gpio,
-  int enable)
+static inline void omap_set_gpio_irqenable(struct gpio_bank *bank,
+  unsigned offset, int enable)
 {
if (enable)
-   omap_enable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_enable_gpio_irqbank(bank, BIT(offset));
else
-   omap_disable_gpio_irqbank(bank, GPIO_BIT(bank, gpio));
+   omap_disable_gpio_irqbank(bank, BIT(offset));
 }
 
 /*
@@ -629,14 +630,16 @@ static inline void omap_set_gpio_irqenable(struct 
gpio_bank *bank, int gpio,
  * enabled. When system is suspended, only selected GPIO interrupts need
  * to have wake-up enabled.
  */
-static int omap_set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
+static int omap_set_gpio_wakeup(struct gpio_bank *bank, unsigned offset,
+   int enable)
 {
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
unsigned long flags;
 
if (bank->non_wakeup_gpios & gpio_bit) {
dev_err(bank->dev,
-   "Unable to modify wakeup on non-wakeup GPIO%d\n", gpio);
+   "Unable to modify wakeup on non-wakeup GPIO%d\n",
+   offset);
return -EINVAL;
}
 
@@ -652,22 +655,22 @@ static int omap_set_gpio_wakeup(struct gpio_bank *bank, 
int gpio, int enable)
return 0;
 }
 
-static void omap_reset_gpio(struct gpio_bank *bank, int gpio)
+static void omap_reset_gpio(struct gpio_bank *bank, unsigned offset)
 {
-   omap_set_gpio_direction(bank, GPIO_INDEX(bank, gpio), 1);
-   omap_set_gpio_irqenable(bank, gpio, 0);
-   omap_clear_gpio_irqstatus(bank, gpio);
-   omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
-   omap_clear_gpio_debounce(bank, GPIO_INDEX(bank, gpio));
+   omap_set_gpio_direction(bank, offset, 1);
+   omap_set_gpio_irqenable(bank, offset, 0);
+   omap_clear_gpio_irqstatus(bank, offset);
+   omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
+   omap_clear_gpio_debounce(bank, offset);
 }
 
 /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
 static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-   unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq);
+   unsigned offset = d->hwirq;
 
-   return omap_set_gpio_wakeup(bank, gpio, enable);
+   return omap_set_gpio_wakeup(bank, offset, enable);
 }
 
 static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -705,7 +708,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned 
offset)
spin_lock_irqsave(&bank->lock, flags);
bank->mod_usage &= ~(BIT(offset));
omap_disable_gpio_module(bank, offset);
-   omap_reset_gpio(bank, bank->chip.base + offset);
+   omap_reset_gpio(bank, offset);
spin_unlock_irqrestore(&bank->lock, flags);
 
/*
@@ -819,14 +822,13 @@ static unsigned int omap_gpio_irq_startup(struct irq_data 
*d)
 static void omap_gpio_irq_shutdown(struct irq_data *d)
 {
struct gpio_bank *bank = omap_irq_data_get_bank(d);
-  

[PATCH v2 2/8] gpio: omap: simplify omap_set_gpio_dataout_x()

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Both functions omap_set_gpio_dataout_reg() and
omap_set_gpio_dataout_mask() accept GPIO offset
as 'gpio' input parameter, so rename it to 'offset' and
drop usage of GPIO_BIT() macro.

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index ce71239..7aeee7b 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -75,7 +75,7 @@ struct gpio_bank {
int power_mode;
bool workaround_enabled;
 
-   void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);
+   void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
int (*get_context_loss_count)(struct device *dev);
 
struct omap_gpio_reg_offs *regs;
@@ -119,11 +119,11 @@ static void omap_set_gpio_direction(struct gpio_bank 
*bank, int gpio,
 
 
 /* set data out value using dedicate set/clear register */
-static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, int gpio,
+static void omap_set_gpio_dataout_reg(struct gpio_bank *bank, unsigned offset,
  int enable)
 {
void __iomem *reg = bank->base;
-   u32 l = GPIO_BIT(bank, gpio);
+   u32 l = BIT(offset);
 
if (enable) {
reg += bank->regs->set_dataout;
@@ -137,11 +137,11 @@ static void omap_set_gpio_dataout_reg(struct gpio_bank 
*bank, int gpio,
 }
 
 /* set data out value using mask register */
-static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, int gpio,
+static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
   int enable)
 {
void __iomem *reg = bank->base + bank->regs->dataout;
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
u32 l;
 
l = readl_relaxed(reg);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 6/8] gpio: omap: get rid of GPIO_BIT() macro

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Now OMAP GPIO driver prepared for GPIO_BIT() macro removing.
Do it ;)

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 628a132..dd7934a 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -82,7 +82,6 @@ struct gpio_bank {
 };
 
 #define GPIO_INDEX(bank, gpio) (gpio % bank->width)
-#define GPIO_BIT(bank, gpio) (BIT(GPIO_INDEX(bank, gpio)))
 #define GPIO_MOD_CTRL_BIT  BIT(0)
 
 #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 1/8] gpio: omap: convert omap_gpio_is_input() to use gpio offset

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Convert omap_gpio_is_input() to use GPIO offset instead of mask and,
in such way, make code simpler and remove few lines of code.

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 10 --
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 2b2fc4b..ce71239 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -472,11 +472,11 @@ static void omap_disable_gpio_module(struct gpio_bank 
*bank, unsigned offset)
}
 }
 
-static int omap_gpio_is_input(struct gpio_bank *bank, int mask)
+static int omap_gpio_is_input(struct gpio_bank *bank, unsigned offset)
 {
void __iomem *reg = bank->base + bank->regs->direction;
 
-   return readl_relaxed(reg) & mask;
+   return readl_relaxed(reg) & BIT(offset);
 }
 
 static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio,
@@ -519,7 +519,7 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned 
type)
offset = GPIO_INDEX(bank, gpio);
retval = omap_set_gpio_triggering(bank, offset, type);
omap_gpio_init_irq(bank, gpio, offset);
-   if (!omap_gpio_is_input(bank, BIT(offset))) {
+   if (!omap_gpio_is_input(bank, offset)) {
spin_unlock_irqrestore(&bank->lock, flags);
return -EINVAL;
}
@@ -976,12 +976,10 @@ static int omap_gpio_input(struct gpio_chip *chip, 
unsigned offset)
 static int omap_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
struct gpio_bank *bank;
-   u32 mask;
 
bank = container_of(chip, struct gpio_bank, chip);
-   mask = (BIT(offset));
 
-   if (omap_gpio_is_input(bank, mask))
+   if (omap_gpio_is_input(bank, offset))
return omap_get_gpio_datain(bank, offset);
else
return omap_get_gpio_dataout(bank, offset);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 0/8] gpio: omap: cleanup: get rid of system GPIO <-> GPIO offset converseations

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Now in TI OMAP GPIO driver there are a lot of places where
System GPIO number calculated and then converted to GPIO offset.
What is worse is that in many place such conversation performed twice
or even three times. But actually, we don't need to do that at all, because
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain, so
  struct irq_data->hwirq contains GPIO offset

Hence, it is safe to convert all GPIO OMAP functions to use GPIO
offset instead of system GPIO numbers. Also, this allows to remove
unneeded conversations routines
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Tested on:
- dra7-evm.
- omap1 (osk5912), 770 and E3.

Last two patches have to be tested on OMAP1:
-  gpio: omap: get rid of omap_irq_to_gpio()
-  gpio: omap: get rid of GPIO_INDEX() macro

Based on top of Linux 4.0-rc4 plus patch
'[PATCH 1/2] gpio: omap: irq_shutdown: remove unnecessary call of 
gpiochip_unlock_as_irq'
http://www.spinics.net/lists/linux-omap/msg116482.html

Changes in v2:
- fixed build failure with Patch 5, no functional code
  changes.

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar  
Acked-by: Javier Martinez Canillas 

Grygorii Strashko (8):
  gpio: omap: convert omap_gpio_is_input() to use gpio offset
  gpio: omap: simplify omap_set_gpio_dataout_x()
  gpio: omap: convert debounce functions switch to use gpio offset
  gpio: omap: drop 'gpio' param from omap_gpio_init_irq()
  gpio: omap: convert gpio irq functions to use GPIO offset
  gpio: omap: get rid of GPIO_BIT() macro
  gpio: omap: get rid of omap_irq_to_gpio()
  gpio: omap: get rid of GPIO_INDEX() macro

 drivers/gpio/gpio-omap.c | 130 ---
 1 file changed, 55 insertions(+), 75 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 3/8] gpio: omap: convert debounce functions switch to use gpio offset

2015-03-23 Thread grygorii.strashko
From: Grygorii Strashko 

Convert debounce functions to use GPIO offset instead of system
GPIO numbers. This allows to drop unneeded conversations between
system GPIO <-> GPIO offset which are done in many places and
many times.
It is safe to do now because:
- gpiolib always passes GPIO offset to GPIO controller
- OMAP GPIO driver converted to use IRQ domain

This is preparation step before removing:
 #define GPIO_INDEX(bank, gpio)
 #define GPIO_BIT(bank, gpio)
 int omap_irq_to_gpio()

Tested-by: Tony Lindgren 
Tested-by: Aaro Koskinen 
Acked-by: Santosh Shilimkar 
Acked-by: Javier Martinez Canillas 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-omap.c | 14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 7aeee7b..2df693b 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -208,13 +208,13 @@ static inline void omap_gpio_dbck_disable(struct 
gpio_bank *bank)
 /**
  * omap2_set_gpio_debounce - low level gpio debounce time
  * @bank: the gpio bank we're acting upon
- * @gpio: the gpio number on this @gpio
+ * @offset: the gpio number on this @bank
  * @debounce: debounce time to use
  *
  * OMAP's debounce time is in 31us steps so we need
  * to convert and round up to the closest unit.
  */
-static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
+static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
unsigned debounce)
 {
void __iomem*reg;
@@ -231,7 +231,7 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, 
unsigned gpio,
else
debounce = (debounce / 0x1f) - 1;
 
-   l = GPIO_BIT(bank, gpio);
+   l = BIT(offset);
 
clk_prepare_enable(bank->dbck);
reg = bank->base + bank->regs->debounce;
@@ -266,16 +266,16 @@ static void omap2_set_gpio_debounce(struct gpio_bank 
*bank, unsigned gpio,
 /**
  * omap_clear_gpio_debounce - clear debounce settings for a gpio
  * @bank: the gpio bank we're acting upon
- * @gpio: the gpio number on this @gpio
+ * @offset: the gpio number on this @bank
  *
  * If a gpio is using debounce, then clear the debounce enable bit and if
  * this is the only gpio in this bank using debounce, then clear the debounce
  * time too. The debounce clock will also be disabled when calling this 
function
  * if this is the only gpio in the bank using debounce.
  */
-static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned gpio)
+static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
 {
-   u32 gpio_bit = GPIO_BIT(bank, gpio);
+   u32 gpio_bit = BIT(offset);
 
if (!bank->dbck_flag)
return;
@@ -659,7 +659,7 @@ static void omap_reset_gpio(struct gpio_bank *bank, int 
gpio)
omap_set_gpio_irqenable(bank, gpio, 0);
omap_clear_gpio_irqstatus(bank, gpio);
omap_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
-   omap_clear_gpio_debounce(bank, gpio);
+   omap_clear_gpio_debounce(bank, GPIO_INDEX(bank, gpio));
 }
 
 /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 0/3] i2c: davinci improvements and fixes

2015-04-06 Thread grygorii.strashko
From: Grygorii Strashko 

This series converts driver to use I2C bus recovery infrastructure and
adds Davinci I2C bus recovery mechanizm based on using ICPFUNC registers.
These patches are combination of two patches from Ben Gardiner [1] and
Mike Looijmans [2] which i've reworked to use I2C bus recovery infrastructure

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2011-April/047305.html
"[PATCH 0/6] i2c-davinci gpio pulsed SCL recovery with ICPFUNC"
[2] https://lkml.org/lkml/2014/2/28/133
"[PATCH] i2c-davinci: Implement a bus recovery that actually works"

Changes in v4:
- no changes, re-besed on top of i2c/for-next, K4.1

Changes in v3:
- minor comments applied

Changes in v2:
- patch 1: error handling improved
- patch 2: commit message updated
- patch 4: minor comments applied
- patch 5: added new optional DT property "ti,has-pfunc"

Links
v3: http://www.spinics.net/lists/linux-i2c/msg17835.html
v2: https://lkml.org/lkml/2014/11/26/252
v1: http://www.spinics.net/lists/linux-i2c/msg17601.html

CC: Sekhar Nori 
CC: Kevin Hilman 
CC: Santosh Shilimkar 
CC: Murali Karicheri 
CC: Alexander Sverdlin 

Grygorii Strashko (3):
  i2c: recovery: change input parameter to i2c_adapter for 
prepare/unprepare_recovery
  i2c: davinci: use bus recovery infrastructure
  i2c: davinci: use ICPFUNC to toggle I2C as gpio for bus recovery

 .../devicetree/bindings/i2c/i2c-davinci.txt|   3 +
 drivers/i2c/busses/i2c-davinci.c   | 177 -
 drivers/i2c/i2c-core.c |   4 +-
 include/linux/i2c.h|   4 +-
 include/linux/platform_data/i2c-davinci.h  |   1 +
 5 files changed, 144 insertions(+), 45 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 2/3] i2c: davinci: use bus recovery infrastructure

2015-04-06 Thread grygorii.strashko
From: Grygorii Strashko 

This patch converts Davinci I2C driver to use I2C bus recovery
infrastructure, introduced by commit 5f9296ba21b3 ("i2c: Add
bus recovery infrastructure").

The i2c_bus_recovery_info is configured for Davinci I2C adapter
only in case scl_pin is provided in platform data.

As the controller must be held in reset while doing so, the
recovery routine must re-init the controller. Since this was already
being done after each call to i2c_recover_bus, move those calls into
the recovery_prepare/unprepare routines and as well.

CC: Sekhar Nori 
CC: Kevin Hilman 
CC: Santosh Shilimkar 
CC: Murali Karicheri 
CC: Alexander Sverdlin 
Acked-by: Uwe Kleine-König 
Signed-off-by: Grygorii Strashko 
---
 drivers/i2c/busses/i2c-davinci.c | 77 +++-
 1 file changed, 36 insertions(+), 41 deletions(-)

diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 120a4ef..54819fb 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -129,43 +129,6 @@ static inline u16 davinci_i2c_read_reg(struct 
davinci_i2c_dev *i2c_dev, int reg)
return readw_relaxed(i2c_dev->base + reg);
 }
 
-/* Generate a pulse on the i2c clock pin. */
-static void davinci_i2c_clock_pulse(unsigned int scl_pin)
-{
-   u16 i;
-
-   if (scl_pin) {
-   /* Send high and low on the SCL line */
-   for (i = 0; i < 9; i++) {
-   gpio_set_value(scl_pin, 0);
-   udelay(20);
-   gpio_set_value(scl_pin, 1);
-   udelay(20);
-   }
-   }
-}
-
-/* This routine does i2c bus recovery as specified in the
- * i2c protocol Rev. 03 section 3.16 titled "Bus clear"
- */
-static void davinci_i2c_recover_bus(struct davinci_i2c_dev *dev)
-{
-   u32 flag = 0;
-   struct davinci_i2c_platform_data *pdata = dev->pdata;
-
-   dev_err(dev->dev, "initiating i2c bus recovery\n");
-   /* Send NACK to the slave */
-   flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
-   flag |=  DAVINCI_I2C_MDR_NACK;
-   /* write the data into mode register */
-   davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
-   davinci_i2c_clock_pulse(pdata->scl_pin);
-   /* Send STOP */
-   flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
-   flag |= DAVINCI_I2C_MDR_STP;
-   davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
-}
-
 static inline void davinci_i2c_reset_ctrl(struct davinci_i2c_dev *i2c_dev,
int val)
 {
@@ -263,6 +226,34 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev)
 }
 
 /*
+ * This routine does i2c bus recovery by using i2c_generic_gpio_recovery
+ * which is provided by I2C Bus recovery infrastructure.
+ */
+static void davinci_i2c_prepare_recovery(struct i2c_adapter *adap)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+
+   /* Disable interrupts */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, 0);
+
+   /* put I2C into reset */
+   davinci_i2c_reset_ctrl(dev, 0);
+}
+
+static void davinci_i2c_unprepare_recovery(struct i2c_adapter *adap)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+
+   i2c_davinci_init(dev);
+}
+
+static struct i2c_bus_recovery_info davinci_i2c_gpio_recovery_info = {
+   .recover_bus = i2c_generic_gpio_recovery,
+   .prepare_recovery = davinci_i2c_prepare_recovery,
+   .unprepare_recovery = davinci_i2c_unprepare_recovery,
+};
+
+/*
  * Waiting for bus not busy
  */
 static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev,
@@ -282,8 +273,7 @@ static int i2c_davinci_wait_bus_not_busy(struct 
davinci_i2c_dev *dev,
return -ETIMEDOUT;
} else {
to_cnt = 0;
-   davinci_i2c_recover_bus(dev);
-   i2c_davinci_init(dev);
+   i2c_recover_bus(&dev->adapter);
}
}
if (allow_sleep)
@@ -372,8 +362,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct 
i2c_msg *msg, int stop)
dev->adapter.timeout);
if (!time_left) {
dev_err(dev->dev, "controller timed out\n");
-   davinci_i2c_recover_bus(dev);
-   i2c_davinci_init(dev);
+   i2c_recover_bus(adap);
dev->buf_len = 0;
return -ETIMEDOUT;
}
@@ -712,6 +701,12 @@ static int davinci_i2c_probe(struct platform_device *pdev)
adap->timeout = DAVINCI_I2C_TIMEOUT;
adap->dev.of_node = pdev->dev.of_node;
 
+   if (dev->pdata->scl_pin) {
+   adap->bus_recovery_info = &davinci_i2c_gpio_recovery_info;
+   adap->bus_recovery_info->scl_gpio = dev->pdata->scl_pin;
+

[PATCH v4 3/3] i2c: davinci: use ICPFUNC to toggle I2C as gpio for bus recovery

2015-04-06 Thread grygorii.strashko
From: Grygorii Strashko 

Having a board where the I2C bus locks up occasionally made it clear
that the bus recovery in the i2c-davinci driver will only work on
some boards, because on regular boards, this will only toggle GPIO
lines that aren't muxed to the actual pins.

The I2C controller on SoCs like da850 (and da830), Keystone 2 has the
built-in capability to bit-bang its lines by using the ICPFUNC registers
of the i2c controller.
Implement the suggested procedure by toggling SCL and checking SDA using
the ICPFUNC registers of the I2C controller when present. Allow platforms
to indicate the presence of the ICPFUNC registers with a has_pfunc platform
data flag and add optional DT property "ti,has-pfunc" to indicate
the same in DT.

CC: Sekhar Nori 
CC: Kevin Hilman 
CC: Santosh Shilimkar 
CC: Murali Karicheri 
CC: Mike Looijmans 
CC: 
Reviewed-by: Uwe Kleine-König 
Acked-by: Alexander Sverdlin 
Tested-by: Michael Lawnick 
Signed-off-by: Ben Gardiner 
Signed-off-by: Mike Looijmans 
[grygorii.stras...@ti.com: combined patches from Ben Gardiner and
Mike Looijmans and reimplemented ICPFUNC bus recovery using I2C
bus recovery infrastructure]
Signed-off-by: Grygorii Strashko 
---
 .../devicetree/bindings/i2c/i2c-davinci.txt|   3 +
 drivers/i2c/busses/i2c-davinci.c   | 102 -
 include/linux/platform_data/i2c-davinci.h  |   1 +
 3 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/i2c/i2c-davinci.txt 
b/Documentation/devicetree/bindings/i2c/i2c-davinci.txt
index 2dc935b..a4e1cbc 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-davinci.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-davinci.txt
@@ -10,6 +10,9 @@ Required properties:
 Recommended properties :
 - interrupts : standard interrupt property.
 - clock-frequency : desired I2C bus clock frequency in Hz.
+- ti,has-pfunc: boolean; if defined, it indicates that SoC supports PFUNC
+   registers. PFUNC registers allow to switch I2C pins to function as
+   GPIOs, so they can by toggled manually.
 
 Example (enbw_cmc board):
i2c@1c22000 {
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 54819fb..4788a32 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -60,6 +60,12 @@
 #define DAVINCI_I2C_IVR_REG0x28
 #define DAVINCI_I2C_EMDR_REG   0x2c
 #define DAVINCI_I2C_PSC_REG0x30
+#define DAVINCI_I2C_FUNC_REG   0x48
+#define DAVINCI_I2C_DIR_REG0x4c
+#define DAVINCI_I2C_DIN_REG0x50
+#define DAVINCI_I2C_DOUT_REG   0x54
+#define DAVINCI_I2C_DSET_REG   0x58
+#define DAVINCI_I2C_DCLR_REG   0x5c
 
 #define DAVINCI_I2C_IVR_AAS0x07
 #define DAVINCI_I2C_IVR_SCD0x06
@@ -93,6 +99,29 @@
 #define DAVINCI_I2C_IMR_NACK   BIT(1)
 #define DAVINCI_I2C_IMR_AL BIT(0)
 
+/* set SDA and SCL as GPIO */
+#define DAVINCI_I2C_FUNC_PFUNC0BIT(0)
+
+/* set SCL as output when used as GPIO*/
+#define DAVINCI_I2C_DIR_PDIR0  BIT(0)
+/* set SDA as output when used as GPIO*/
+#define DAVINCI_I2C_DIR_PDIR1  BIT(1)
+
+/* read SCL GPIO level */
+#define DAVINCI_I2C_DIN_PDIN0 BIT(0)
+/* read SDA GPIO level */
+#define DAVINCI_I2C_DIN_PDIN1 BIT(1)
+
+/*set the SCL GPIO high */
+#define DAVINCI_I2C_DSET_PDSET0BIT(0)
+/*set the SDA GPIO high */
+#define DAVINCI_I2C_DSET_PDSET1BIT(1)
+
+/* set the SCL GPIO low */
+#define DAVINCI_I2C_DCLR_PDCLR0BIT(0)
+/* set the SDA GPIO low */
+#define DAVINCI_I2C_DCLR_PDCLR1BIT(1)
+
 struct davinci_i2c_dev {
struct device   *dev;
void __iomem*base;
@@ -253,6 +282,71 @@ static struct i2c_bus_recovery_info 
davinci_i2c_gpio_recovery_info = {
.unprepare_recovery = davinci_i2c_unprepare_recovery,
 };
 
+static void davinci_i2c_set_scl(struct i2c_adapter *adap, int val)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+
+   if (val)
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_DSET_REG,
+ DAVINCI_I2C_DSET_PDSET0);
+   else
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_DCLR_REG,
+ DAVINCI_I2C_DCLR_PDCLR0);
+}
+
+static int davinci_i2c_get_scl(struct i2c_adapter *adap)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+   int val;
+
+   /* read the state of SCL */
+   val = davinci_i2c_read_reg(dev, DAVINCI_I2C_DIN_REG);
+   return val & DAVINCI_I2C_DIN_PDIN0;
+}
+
+static int davinci_i2c_get_sda(struct i2c_adapter *adap)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+   int val;
+
+   /* read the state of SDA */
+   val = davinci_i2c_read_reg(dev, DAVINCI_I2C_DIN_REG);
+   return val & DAVINCI_I2C_DIN_PDIN1;
+}
+
+static void davinci_i2c_scl_prepare_recovery(struct i2c_adapter *adap)
+{
+   struct davinci_i2c_dev *dev = i2c_get_adapdata(adap);
+
+   davinci_i2c_prepare_recovery(adap);
+
+  

[PATCH v4 1/3] i2c: recovery: change input parameter to i2c_adapter for prepare/unprepare_recovery

2015-04-06 Thread grygorii.strashko
From: Grygorii Strashko 

This patch changes type of input parameter for .prepare/unprepare_recovery()
callbacks from struct i2c_bus_recovery_info * to struct i2c_adapter *.
This allows to simplify implementation of these callbacks and avoid
type conversations from i2c_bus_recovery_info to i2c_adapter.
The i2c_bus_recovery_info can be simply retrieved from struct i2c_adapter
which contains pointer on it.

CC: Sekhar Nori 
CC: Kevin Hilman 
CC: Santosh Shilimkar 
CC: Murali Karicheri 
Acked-by: Uwe Kleine-König 
Acked-by: Alexander Sverdlin 
Signed-off-by: Grygorii Strashko 
---
 drivers/i2c/i2c-core.c | 4 ++--
 include/linux/i2c.h| 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index fe80f85..617a19a 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -561,7 +561,7 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
int i = 0, val = 1, ret = 0;
 
if (bri->prepare_recovery)
-   bri->prepare_recovery(bri);
+   bri->prepare_recovery(adap);
 
/*
 * By this time SCL is high, as we need to give 9 falling-rising edges
@@ -586,7 +586,7 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
}
 
if (bri->unprepare_recovery)
-   bri->unprepare_recovery(bri);
+   bri->unprepare_recovery(adap);
 
return ret;
 }
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index c5e4bb2..898033f 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -435,8 +435,8 @@ struct i2c_bus_recovery_info {
void (*set_scl)(struct i2c_adapter *, int val);
int (*get_sda)(struct i2c_adapter *);
 
-   void (*prepare_recovery)(struct i2c_bus_recovery_info *bri);
-   void (*unprepare_recovery)(struct i2c_bus_recovery_info *bri);
+   void (*prepare_recovery)(struct i2c_adapter *);
+   void (*unprepare_recovery)(struct i2c_adapter *);
 
/* gpio recovery */
int scl_gpio;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/3] bus: omap_l3_noc: add missed callbacks for suspend-to-disk

2015-04-27 Thread grygorii.strashko
From: Grygorii Strashko 

Add missed callbacks needed for proper supporting of suspend-to-disk
by using recently introduced macro SET_NOIRQ_SYSTEM_SLEEP_PM_OPS.

Cc: Tony Lindgren 
Cc: Nishanth Menon 
Cc: Kevin Hilman 
Cc: Santosh Shilimkar 
Signed-off-by: Grygorii Strashko 
---
 drivers/bus/omap_l3_noc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
index 11f7982..6ae3884 100644
--- a/drivers/bus/omap_l3_noc.c
+++ b/drivers/bus/omap_l3_noc.c
@@ -300,7 +300,7 @@ static int omap_l3_probe(struct platform_device *pdev)
return ret;
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 
 /**
  * l3_resume_noirq() - resume function for l3_noc
@@ -346,7 +346,7 @@ static int l3_resume_noirq(struct device *dev)
 }
 
 static const struct dev_pm_ops l3_dev_pm_ops = {
-   .resume_noirq   = l3_resume_noirq,
+   SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, l3_resume_noirq)
 };
 
 #define L3_DEV_PM_OPS (&l3_dev_pm_ops)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 0/3] Introduce SET_NOIRQ_SYSTEM_SLEEP_PM_OPS and use it

2015-04-27 Thread grygorii.strashko
From: Grygorii Strashko 

While working on suspend-to-disk functionality on TI dra7-evm (DRA7xx SoC)
i've found that the most common problem I have to dial with is absence
of corresponding PM callbacks in drivers and, in particular, noirq callbacks.
So, I've fixed one driver first
commit 6248015d6867 "ARM: omap-device: add missed callback for suspend-to-disk"
but then found another one which need to be fixed too (omap_l3_noc.c).
At this moment I decided to make my life easier and added new macro
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS using the same approach as for the existing
SET_SYSTEM_SLEEP_PM_OPS macro.

SET_NOIRQ_SYSTEM_SLEEP_PM_OPS: defined for CONFIG_PM_SLEEP and
assigns ->suspend_noirq, ->freeze_noirq and ->poweroff_noirq to the same
function. Vice versa happens for ->resume_noirq, ->thaw_noirq and
->restore_noirq.

Further two patches reuse this newly introduced macro.

SET_NOIRQ_SYSTEM_SLEEP_PM_OPS, defined for CONFIG_PM_SLEEP, will
point ->suspend_noirq, ->freeze_noirq and ->poweroff_noirq to the same
function. Vice versa happens for ->resume_noirq, ->thaw_noirq and
->restore_noirq.

Cc: Tony Lindgren 
Cc: Nishanth Menon 
Cc: Kevin Hilman 
Cc: Santosh Shilimkar 

Grygorii Strashko (3):
  PM / Sleep: Add macro to define common noirq system PM callbacks
  bus: omap_l3_noc: add missed callbacks for suspend-to-disk
  ARM: omap-device: use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS

 arch/arm/mach-omap2/omap_device.c |  7 ++-
 drivers/bus/omap_l3_noc.c |  4 ++--
 include/linux/pm.h| 12 
 3 files changed, 16 insertions(+), 7 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3/3] ARM: omap-device: use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS

2015-04-27 Thread grygorii.strashko
From: Grygorii Strashko 

Use recently introduced macro SET_NOIRQ_SYSTEM_SLEEP_PM_OPS to
set up PM callbacks. This also fixes missed assignment of
.poweroff_noirq() callback.

Cc: Tony Lindgren 
Cc: Nishanth Menon 
Cc: Kevin Hilman 
Cc: Santosh Shilimkar 
Signed-off-by: Grygorii Strashko 
---
 arch/arm/mach-omap2/omap_device.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_device.c 
b/arch/arm/mach-omap2/omap_device.c
index 166b18f..83a0f5a 100644
--- a/arch/arm/mach-omap2/omap_device.c
+++ b/arch/arm/mach-omap2/omap_device.c
@@ -688,11 +688,8 @@ struct dev_pm_domain omap_device_pm_domain = {
SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
   NULL)
USE_PLATFORM_PM_SLEEP_OPS
-   .suspend_noirq = _od_suspend_noirq,
-   .resume_noirq = _od_resume_noirq,
-   .freeze_noirq = _od_suspend_noirq,
-   .thaw_noirq = _od_resume_noirq,
-   .restore_noirq = _od_resume_noirq,
+   SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(_od_suspend_noirq,
+ _od_resume_noirq)
}
 };
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/3] PM / Sleep: Add macro to define common noirq system PM callbacks

2015-04-27 Thread grygorii.strashko
From: Grygorii Strashko 

The same approach is used as for the existing SET_SYSTEM_SLEEP_PM_OPS,
but for noirq callbacks.

New SET_NOIRQ_SYSTEM_SLEEP_PM_OPS, defined for CONFIG_PM_SLEEP, will
point ->suspend_noirq, ->freeze_noirq and ->poweroff_noirq to the same
function. Vice versa happens for ->resume_noirq, ->thaw_noirq and
->restore_noirq.

Cc: Tony Lindgren 
Cc: Nishanth Menon 
Cc: Kevin Hilman 
Cc: Santosh Shilimkar 
Signed-off-by: Grygorii Strashko 
---
 include/linux/pm.h | 12 
 1 file changed, 12 insertions(+)

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 2d29c64..4890743 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -342,6 +342,18 @@ struct dev_pm_ops {
 #define SET_LATE_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)
 #endif
 
+#ifdef CONFIG_PM_SLEEP
+#define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
+   .suspend_noirq = suspend_fn, \
+   .resume_noirq = resume_fn, \
+   .freeze_noirq = suspend_fn, \
+   .thaw_noirq = resume_fn, \
+   .poweroff_noirq = suspend_fn, \
+   .restore_noirq = resume_fn,
+#else
+#define SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn)
+#endif
+
 #ifdef CONFIG_PM
 #define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \
.runtime_suspend = suspend_fn, \
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] gpiolib: debugfs: display gpios requested as irq only

2015-05-15 Thread grygorii.strashko
From: Grygorii Strashko 

Now GPIOs, wich are requested as IRQ only, will not be displayed
through GPIO debugfs. For example:
 # cat /proc/interrupts
CPU0   CPU1
...
209:  0  0  4805d000.gpio  11 Edge  0-0021

 # cat /debug/gpio
...
GPIOs 160-191, platform/4805d000.gpio, gpio:
<--- no info about gpio used as IRQ only here

GPIOs 192-223, platform/48051000.gpio, gpio:
 gpio-203 (vtt_fixed   ) out hi
...

Hence, improve GPIO debugfs code to show such kind of gpio and print
IRQ number also. In addition, add marker "requested" for GPIOs wich
were requested by using gpioX_request().

After this patch sys/kernel/debug/gpio will produce following output:

 # cat /debug/gpio
...
GPIOs 160-191, platform/4805d000.gpio, gpio:
 gpio-171 ((null)  ) in  hi IRQ209

GPIOs 192-223, platform/48051000.gpio, gpio:
 gpio-203 (vtt_fixed   ) out hi requested

Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpiolib.c | 12 
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 59eaa23..ea11706 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2259,19 +2259,23 @@ static void gpiolib_dbg_show(struct seq_file *s, struct 
gpio_chip *chip)
int is_irq;
 
for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) {
-   if (!test_bit(FLAG_REQUESTED, &gdesc->flags))
+   if (!test_bit(FLAG_REQUESTED, &gdesc->flags) &&
+   !test_bit(FLAG_USED_AS_IRQ, &gdesc->flags))
continue;
 
gpiod_get_direction(gdesc);
is_out = test_bit(FLAG_IS_OUT, &gdesc->flags);
is_irq = test_bit(FLAG_USED_AS_IRQ, &gdesc->flags);
-   seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s",
+   seq_printf(s, " gpio-%-3d (%-20.20s) %s %s",
gpio, gdesc->label,
is_out ? "out" : "in ",
chip->get
? (chip->get(chip, i) ? "hi" : "lo")
-   : "?  ",
-   is_irq ? "IRQ" : "   ");
+   : "?  ");
+   if (is_irq)
+   seq_printf(s, " IRQ%d", gpiod_to_irq(gdesc));
+   if (test_bit(FLAG_REQUESTED, &gdesc->flags))
+   seq_puts(s, " requested");
seq_printf(s, "\n");
}
 }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] gpio: syscon: reduce message level when direction reg offset not in dt

2015-03-24 Thread grygorii.strashko
From: Grygorii Strashko 

Now GPIO syscon driver produces bunch of warnings during the
boot of Kesytone 2 SoCs:
 gpio-syscon soc:keystone_dsp_gpio@02620240: can't read the dir register offset!
 gpio-syscon soc:keystone_dsp_gpio@2620244: can't read the dir register offset!

This message unintentionally was added using dev_err(), but its
actual log level is debug, because third cell of "ti,syscon-dev" is
optional.

Hence change it to dev_dbg() as it should be.

This patch fixes commit:
 5a3e3f8 ("gpio: syscon: retriave syscon node and regs offsets from dt")

Reported-by: Russell King 
Signed-off-by: Grygorii Strashko 
---
 drivers/gpio/gpio-syscon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpio/gpio-syscon.c b/drivers/gpio/gpio-syscon.c
index 257e298..045a952 100644
--- a/drivers/gpio/gpio-syscon.c
+++ b/drivers/gpio/gpio-syscon.c
@@ -219,7 +219,7 @@ static int syscon_gpio_probe(struct platform_device *pdev)
ret = of_property_read_u32_index(np, "gpio,syscon-dev", 2,
 &priv->dir_reg_offset);
if (ret)
-   dev_err(dev, "can't read the dir register offset!\n");
+   dev_dbg(dev, "can't read the dir register offset!\n");
 
priv->dir_reg_offset <<= 3;
}
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2] leds: fix hibernation on arm when gpio-led used with CPU led trigger

2015-02-05 Thread grygorii.strashko
From: Grygorii Strashko 

Setting a dev_pm_ops suspend/resume pair of callbacks but not a set of
hibernation callbacks means those pm functions will not be
called upon hibernation - that leads to system crash on ARM during
freezing if gpio-led is used in combination with CPU led trigger.
It may happen after freeze_noirq stage (GPIO is suspended)
and before syscore_suspend stage (CPU led trigger is suspended)
- usually when disable_nonboot_cpus() is called.

Log:
  PM: noirq freeze of devices complete after 1.425 msecs
  Disabling non-boot CPUs ...
^ system may crash or stuck here with message (TI AM572x)

  WARNING: CPU: 0 PID: 3100 at drivers/bus/omap_l3_noc.c:148 
l3_interrupt_handler+0x22c/0x370()
  4400.ocp:L3 Custom Error: MASTER MPU TARGET L4_PER1_P3 (Idle): Data 
Access in Supervisor mode during Functional access

  CPU1: shutdown
^ or here

Fix this by using SIMPLE_DEV_PM_OPS, which appropriately
assigns the suspend and hibernation callbacks and move
led_suspend/led_resume under CONFIG_PM_SLEEP to avoid
build warnings.

Signed-off-by: Grygorii Strashko 
---
This patch actually fixes commit:
 73e1ab4 "leds: Convert led class driver from legacy pm ops to dev_pm_ops"

Changes in v2:
- fixed compile time warnings when !CONFIG_PM_SLEEP
- updated commit message

v1:
- https://lkml.org/lkml/2015/2/2/476

 drivers/leds/led-class.c | 7 +++
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index dbeebac..5033e0d 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -183,6 +183,7 @@ void led_classdev_resume(struct led_classdev *led_cdev)
 }
 EXPORT_SYMBOL_GPL(led_classdev_resume);
 
+#ifdef CONFIG_PM_SLEEP
 static int led_suspend(struct device *dev)
 {
struct led_classdev *led_cdev = dev_get_drvdata(dev);
@@ -202,11 +203,9 @@ static int led_resume(struct device *dev)
 
return 0;
 }
+#endif
 
-static const struct dev_pm_ops leds_class_dev_pm_ops = {
-   .suspend= led_suspend,
-   .resume = led_resume,
-};
+static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume);
 
 /**
  * led_classdev_register - register a new object of led_classdev class.
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] leds: add hibernation callbacks

2015-02-02 Thread grygorii.strashko
From: Grygorii Strashko 

Setting a dev_pm_ops suspend/resume pair of callbacks but not a set of
hibernation callbacks means those pm functions will not be
called upon hibernation - that leads to system crash on ARM during
freezing if gpio-led is used in combination with CPU led trigger.
It may happen after freeze_noirq stage (GPIO is suspended)
and before syscore_suspend stage (CPU led trigger is suspended)
- usually when disable_nonboot_cpus() is called.

Fix this by using SIMPLE_DEV_PM_OPS, which appropriately
assigns the suspend and hibernation callbacks.

Signed-off-by: Grygorii Strashko 
---
 drivers/leds/led-class.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index f37d63c..4c03808 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -198,10 +198,7 @@ static int led_resume(struct device *dev)
return 0;
 }
 
-static const struct dev_pm_ops leds_class_dev_pm_ops = {
-   .suspend= led_suspend,
-   .resume = led_resume,
-};
+static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume);
 
 /**
  * led_classdev_register - register a new object of led_classdev class.
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] hwmon: tmp102: add hibernation callbacks

2015-02-02 Thread grygorii.strashko
From: Grygorii Strashko 

Setting a dev_pm_ops suspend/resume pair but not a set of
hibernation functions means those pm functions will not be
called upon hibernation.
Fix this by using SIMPLE_DEV_PM_OPS, which appropriately
assigns the suspend and hibernation handlers.

Signed-off-by: Grygorii Strashko 
---
 drivers/hwmon/tmp102.c | 13 +++--
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/drivers/hwmon/tmp102.c b/drivers/hwmon/tmp102.c
index 6748b45..4f790f5 100644
--- a/drivers/hwmon/tmp102.c
+++ b/drivers/hwmon/tmp102.c
@@ -281,17 +281,10 @@ static int tmp102_resume(struct device *dev)
config &= ~TMP102_CONF_SD;
return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config);
 }
-
-static const struct dev_pm_ops tmp102_dev_pm_ops = {
-   .suspend= tmp102_suspend,
-   .resume = tmp102_resume,
-};
-
-#define TMP102_DEV_PM_OPS (&tmp102_dev_pm_ops)
-#else
-#defineTMP102_DEV_PM_OPS NULL
 #endif /* CONFIG_PM */
 
+SIMPLE_DEV_PM_OPS(tmp102_dev_pm_ops, tmp102_suspend, tmp102_resume);
+
 static const struct i2c_device_id tmp102_id[] = {
{ "tmp102", 0 },
{ }
@@ -300,7 +293,7 @@ MODULE_DEVICE_TABLE(i2c, tmp102_id);
 
 static struct i2c_driver tmp102_driver = {
.driver.name= DRIVER_NAME,
-   .driver.pm  = TMP102_DEV_PM_OPS,
+   .driver.pm  = &tmp102_dev_pm_ops,
.probe  = tmp102_probe,
.remove = tmp102_remove,
.id_table   = tmp102_id,
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2] hwmon: tmp102: add hibernation callbacks

2015-02-03 Thread grygorii.strashko
From: Grygorii Strashko 

Setting a dev_pm_ops suspend/resume pair but not a set of
hibernation functions means those pm functions will not be
called upon hibernation.
Fix this by using SIMPLE_DEV_PM_OPS, which appropriately
assigns the suspend and hibernation handlers and move
mp102_suspend/tmp102_resume under CONFIG_PM_SLEEP to avoid
build warnings.

Signed-off-by: Grygorii Strashko 
---
V1:
- https://lkml.org/lkml/2015/2/2/509

 drivers/hwmon/tmp102.c | 15 ---
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/hwmon/tmp102.c b/drivers/hwmon/tmp102.c
index ba9f478..565df47 100644
--- a/drivers/hwmon/tmp102.c
+++ b/drivers/hwmon/tmp102.c
@@ -253,7 +253,7 @@ static int tmp102_remove(struct i2c_client *client)
return 0;
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int tmp102_suspend(struct device *dev)
 {
struct i2c_client *client = to_i2c_client(dev);
@@ -279,17 +279,10 @@ static int tmp102_resume(struct device *dev)
config &= ~TMP102_CONF_SD;
return i2c_smbus_write_word_swapped(client, TMP102_CONF_REG, config);
 }
-
-static const struct dev_pm_ops tmp102_dev_pm_ops = {
-   .suspend= tmp102_suspend,
-   .resume = tmp102_resume,
-};
-
-#define TMP102_DEV_PM_OPS (&tmp102_dev_pm_ops)
-#else
-#defineTMP102_DEV_PM_OPS NULL
 #endif /* CONFIG_PM */
 
+SIMPLE_DEV_PM_OPS(tmp102_dev_pm_ops, tmp102_suspend, tmp102_resume);
+
 static const struct i2c_device_id tmp102_id[] = {
{ "tmp102", 0 },
{ }
@@ -298,7 +291,7 @@ MODULE_DEVICE_TABLE(i2c, tmp102_id);
 
 static struct i2c_driver tmp102_driver = {
.driver.name= DRIVER_NAME,
-   .driver.pm  = TMP102_DEV_PM_OPS,
+   .driver.pm  = &tmp102_dev_pm_ops,
.probe  = tmp102_probe,
.remove = tmp102_remove,
.id_table   = tmp102_id,
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/