RE: [PATCH] [OMAP] GPIO Module disable if all pins inactive
#endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } why do this every time a gpio is enabled? why not do this iff gpio was never used before.. how about the following: The module is enabled only when gpio_status indicates that no GPIO in that module is currently active and the GPIO being requested is the 1st one to be active in that module. Each module would be disabled in free() API when all GPIOs in a particular module becomes inactive. The module is re-enabled in request() API when a GPIO is requested from the module that was previously disabled. Thanks. Welcome if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is enabled, clocks are not gated */ ctrl = 0xFFFE; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } bank-gpio_status |= 1 offset; Why to touch gpio_status if not used (for other than 34xx/24xx/44xx cases)? either the gpio_status should be under a #ifdef for 34xx when defining or it should be usable by all. what it does now is do both. gpio_status is not used under #ifdef for 34xx. It is used only with cpu_is_omap (34xx/24xx/44xx). Should we use both #ifdef and cpu_is_omap together? Why? But I don't see that approach in LO. For eg., usage of dbck_enable_mask is used only with cpu_is_omap and is not declared under #ifdef. my proposal is to allow gpio_status to be usable by ALL OMAPs - maybe OMAP1 also could also use it.. I cannot comment - but it does look to have scope of usage beyond omap2/3/4 series? Even though OMAP1 supports the same feature, I am not including it as I cannot test it and I am not sure about it in OMAP1. For 24xx, 34xx 44xx, the registers used and offsets are all the same. So the same code is reused. -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH] [OMAP] GPIO Module disable if all pins inactive
From: Varadarajan, Charu Latha Sent: Monday, October 26, 2009 4:07 AM #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } why do this every time a gpio is enabled? why not do this iff gpio was never used before.. how about the following: The module is enabled only when gpio_status indicates that no GPIO in that module is currently active and the GPIO being requested is the 1st one to be active in that module. Each module would be disabled in free() API when all GPIOs in a particular module becomes inactive. The module is re-enabled in request() API when a GPIO is requested from the module that was previously disabled. Thanks. Welcome if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is enabled, clocks are not gated */ ctrl = 0xFFFE; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } bank-gpio_status |= 1 offset; Why to touch gpio_status if not used (for other than 34xx/24xx/44xx cases)? either the gpio_status should be under a #ifdef for 34xx when defining or it should be usable by all. what it does now is do both. gpio_status is not used under #ifdef for 34xx. It is used only with cpu_is_omap (34xx/24xx/44xx). Should we use both #ifdef and cpu_is_omap together? Why? But I don't see that approach in LO. For eg., usage of dbck_enable_mask is used only with cpu_is_omap and is not declared under #ifdef. Please see [1] saved_datain is an example of why I think gpio.c could go thru a cleanup ;) already in #ifdef in line 1908, in line 1925, we add a new #ifdef under a #ifdef :D.. err... Ok this piece of code is not perfect.. Regards, Nishanth Menon [1] http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=blob;f=arch/arm/plat-omap/gpio.c;h=487bea7b5605fe366064d792d0c9cc8aed1eac63;hb=0bbf5337f2f2957775051a3caf60b66d3306c815#l174 -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH] [OMAP] GPIO Module disable if all pins inactive
sinipped bank-gpio_status |= 1 offset; Why to touch gpio_status if not used (for other than 34xx/24xx/44xx cases)? either the gpio_status should be under a #ifdef for 34xx when defining or it should be usable by all. what it does now is do both. gpio_status is not used under #ifdef for 34xx. It is used only with cpu_is_omap (34xx/24xx/44xx). Should we use both #ifdef and cpu_is_omap together? Why? But I don't see that approach in LO. For eg., usage of dbck_enable_mask is used only with cpu_is_omap and is not declared under #ifdef. Please see [1] saved_datain is an example of why I think gpio.c could go thru a cleanup ;) already in #ifdef in line 1908, in line 1925, we add a new #ifdef under a #ifdef :D.. err... Ok this piece of code is not perfect.. Looking onto lines 1908 1925, I accept that the gpio.c code is not perfect. But they are nothing to do with my patch. I guess this is the same at many places in most of the drivers and someone has to take up the job of cleaning up. Regards, Nishanth Menon .[1] http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=blob;f=arch/arm/plat-omap/gpio.c;h=487bea7b5605fe366064d792d0c9cc8aed1eac63;hb=0bbf5337f2f2957775051a3caf60b66d3306c815#l174 -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] [OMAP] GPIO Module disable if all pins inactive
From: Charulatha V ch...@ti.com This patch disables a GPIO module when all the pins of GPIO module are inactive (clock gating forced at module level) and enables the module when any gpio in the module is requested. Signed-off-by: Charulatha V ch...@ti.com --- arch/arm/plat-omap/gpio.c | 22 ++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index cdc2a58..2304a5d 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -194,6 +194,7 @@ struct gpio_bank { spinlock_t lock; struct gpio_chip chip; struct clk *dbck; + u32 gpio_status; }; #define METHOD_MPUIO 0 @@ -1080,6 +1081,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; spin_lock_irqsave(bank-lock, flags); @@ -1097,6 +1099,15 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) __raw_writel(__raw_readl(reg) | (1 offset), reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } spin_unlock_irqrestore(bank-lock, flags); return 0; @@ -1106,6 +1117,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; spin_lock_irqsave(bank-lock, flags); #ifdef CONFIG_ARCH_OMAP16XX @@ -1123,6 +1135,15 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) __raw_writel(1 offset, reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + bank-gpio_status = ~(1 offset); + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is disabled, clocks are gated */ + ctrl |= 1; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + } _reset_gpio(bank, bank-chip.base + offset); spin_unlock_irqrestore(bank-lock, flags); } @@ -1700,6 +1721,7 @@ static int __init _omap_gpio_init(void) gpio_count = 32; } #endif + bank-gpio_status = 0; /* REVISIT eventually switch from OMAP-specific gpio structs * over to the generic ones */ -- 1.6.0.4 -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] [OMAP] GPIO Module disable if all pins inactive
Varadarajan, Charu Latha had written, on 10/23/2009 10:55 AM, the following: From: Charulatha V ch...@ti.com This patch disables a GPIO module when all the pins of GPIO module are inactive (clock gating forced at module level) and enables the module when any gpio in the module is requested. Signed-off-by: Charulatha V ch...@ti.com --- arch/arm/plat-omap/gpio.c | 22 ++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index cdc2a58..2304a5d 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -194,6 +194,7 @@ struct gpio_bank { spinlock_t lock; struct gpio_chip chip; struct clk *dbck; + u32 gpio_status; please rename this as gpio_usage? maybe OMAP1 could also benefit out of this.. }; #define METHOD_MPUIO 0 @@ -1080,6 +1081,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; Remove this to the {} no point in wasting stack space when you dont need to + you will generate warning for OMAP1 platforms. spin_lock_irqsave(bank-lock, flags); @@ -1097,6 +1099,15 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) __raw_writel(__raw_readl(reg) | (1 offset), reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } why do this every time a gpio is enabled? why not do this iff gpio was never used before.. how about the following: if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is enabled, clocks are not gated */ ctrl = 0xFFFE; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } bank-gpio_status |= 1 offset; spin_unlock_irqrestore(bank-lock, flags); return 0; @@ -1106,6 +1117,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; used just once - move it to the {} + warning to OMAP1 spin_lock_irqsave(bank-lock, flags); #ifdef CONFIG_ARCH_OMAP16XX @@ -1123,6 +1135,15 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) __raw_writel(1 offset, reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + bank-gpio_status = ~(1 offset); + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is disabled, clocks are gated */ + ctrl |= 1; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + } how about this: bank-gpio_status = ~(1 offset); if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is disabled, clocks are gated */ ctrl |= 1; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } _reset_gpio(bank, bank-chip.base + offset); spin_unlock_irqrestore(bank-lock, flags); } @@ -1700,6 +1721,7 @@ static int __init _omap_gpio_init(void) gpio_count = 32; } #endif + bank-gpio_status = 0; /* REVISIT eventually switch from OMAP-specific gpio structs * over to the generic ones */ Regards, Nishanth Menon -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH] [OMAP] GPIO Module disable if all pins inactive
Varadarajan, Charu Latha had written, on 10/23/2009 10:55 AM, the following: From: Charulatha V ch...@ti.com This patch disables a GPIO module when all the pins of GPIO module are inactive (clock gating forced at module level) and enables the module when any gpio in the module is requested. Signed-off-by: Charulatha V ch...@ti.com --- arch/arm/plat-omap/gpio.c | 22 ++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index cdc2a58..2304a5d 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -194,6 +194,7 @@ struct gpio_bank { spinlock_t lock; struct gpio_chip chip; struct clk *dbck; + u32 gpio_status; please rename this as gpio_usage? okay maybe OMAP1 could also benefit out of this.. }; #define METHOD_MPUIO 0 @@ -1080,6 +1081,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; Remove this to the {} no point in wasting stack space when you dont need to + you will generate warning for OMAP1 platforms. spin_lock_irqsave(bank-lock, flags); @@ -1097,6 +1099,15 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) __raw_writel(__raw_readl(reg) | (1 offset), reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } why do this every time a gpio is enabled? why not do this iff gpio was never used before.. how about the following: The module is enabled only when gpio_status indicates that no GPIO in that module is currently active and the GPIO being requested is the 1st one to be active in that module. Each module would be disabled in free() API when all GPIOs in a particular module becomes inactive. The module is re-enabled in request() API when a GPIO is requested from the module that was previously disabled. if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is enabled, clocks are not gated */ ctrl = 0xFFFE; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } bank-gpio_status |= 1 offset; Why to touch gpio_status if not used (for other than 34xx/24xx/44xx cases)? spin_unlock_irqrestore(bank-lock, flags); return 0; @@ -1106,6 +1117,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) { struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip); unsigned long flags; + u32 ctrl = 0; used just once - move it to the {} + warning to OMAP1 spin_lock_irqsave(bank-lock, flags); #ifdef CONFIG_ARCH_OMAP16XX @@ -1123,6 +1135,15 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) __raw_writel(1 offset, reg); } #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + bank-gpio_status = ~(1 offset); + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is disabled, clocks are gated */ + ctrl |= 1; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + } how about this: bank-gpio_status = ~(1 offset); if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is disabled, clocks are gated */ ctrl |= 1; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } Why to touch gpio_status if not used (for other than 24xx/34xx/44xx cases)? _reset_gpio(bank, bank-chip.base + offset); spin_unlock_irqrestore(bank-lock, flags); } @@ -1700,6 +1721,7 @@ static int __init _omap_gpio_init(void) gpio_count = 32; } #endif + bank-gpio_status = 0; /* REVISIT eventually switch from OMAP-specific gpio structs * over to the generic ones */ -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] [OMAP] GPIO Module disable if all pins inactive
Varadarajan, Charu Latha had written, on 10/23/2009 11:05 PM, the following: #endif + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (!bank-gpio_status) { + ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); + /* Module is enabled, clocks are not gated */ + ctrl = 0xFFFE; + __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); + } + bank-gpio_status |= 1 offset; + } why do this every time a gpio is enabled? why not do this iff gpio was never used before.. how about the following: The module is enabled only when gpio_status indicates that no GPIO in that module is currently active and the GPIO being requested is the 1st one to be active in that module. Each module would be disabled in free() API when all GPIOs in a particular module becomes inactive. The module is re-enabled in request() API when a GPIO is requested from the module that was previously disabled. Thanks. if (!bank-gpio_status (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())) { u32 ctrl = __raw_readl(bank-base + OMAP24XX_GPIO_CTRL); /* Module is enabled, clocks are not gated */ ctrl = 0xFFFE; __raw_writel(ctrl, bank-base + OMAP24XX_GPIO_CTRL); } bank-gpio_status |= 1 offset; Why to touch gpio_status if not used (for other than 34xx/24xx/44xx cases)? either the gpio_status should be under a #ifdef for 34xx when defining or it should be usable by all. what it does now is do both. my proposal is to allow gpio_status to be usable by ALL OMAPs - maybe OMAP1 also could also use it.. I cannot comment - but it does look to have scope of usage beyond omap2/3/4 series? -- Regards, Nishanth Menon -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html