From 02ad284eea8714df30ae5c9af61955cb25cd2f2c Mon Sep 17 00:00:00 2001 From: dmitry pervushin Date: Tue, 2 Aug 2016 16:34:20 +0200 Subject: tegra: gpio: remove unneeded locks Instead of disabling interrupts on startup, mask out interrupts for accessible gpios Bug 200222365 Change-Id: Ia61f69c2de8094f4f9fe93f1b028969900df7743 Signed-off-by: dmitry pervushin Reviewed-on: http://git-master/r/1195993 (cherry picked from commit 4d96b29c6fbc3ac5740c5a3789bc860aafd38651) Reviewed-on: http://git-master/r/1219825 GVS: Gerrit_Virtual_Submit Reviewed-by: Sumeet Gupta --- drivers/gpio/gpio-tegra186.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c index 1f4114f1f..3ed3e00ac 100644 --- a/drivers/gpio/gpio-tegra186.c +++ b/drivers/gpio/gpio-tegra186.c @@ -91,7 +91,6 @@ struct tegra_gpio_controller { int controller; int irq; - spinlock_t lvl_lock[4]; u32 cnf[MAX_PORTS * MAX_PINS_PER_PORT]; u32 dbc[MAX_PORTS * MAX_PINS_PER_PORT]; u32 out_ctrl[MAX_PORTS * MAX_PINS_PER_PORT]; @@ -197,10 +196,8 @@ static inline bool is_gpio_accessible(u32 offset) u32 i, j; bool found = false; - if (controller == -1) { - pr_err("Invalid gpio number %d\n", offset); + if (controller == -1) return false; - } for (i = 0; i < MAX_GPIO_CONTROLLERS; i++) { for (j = 0; j < MAX_GPIO_PORTS; j++) { @@ -535,10 +532,9 @@ static int tegra_gpio_probe(struct platform_device *pdev) struct resource *res; struct tegra_gpio_controller *tg_cont; void __iomem *base; - u32 i, j; + u32 i; int gpio; int ret; - unsigned long flags; read_gpio_mapping_data(pdev); @@ -624,6 +620,10 @@ static int tegra_gpio_probe(struct platform_device *pdev) for (gpio = 0; gpio < tegra_gpio_chip.ngpio; gpio++) { int irq = irq_create_mapping(irq_domain, gpio); + if (is_gpio_accessible(gpio)) + /* mask interrupts for this GPIO */ + tegra_gpio_update(gpio, GPIO_ENB_CONFIG_REG, GPIO_INT_FUNC_BIT, 0); + tg_cont = &tegra_gpio_controllers[controller_index(gpio)]; irq_set_chip_data(irq, tg_cont); @@ -642,17 +642,13 @@ static int tegra_gpio_probe(struct platform_device *pdev) irq_domain_remove(irq_domain); return ret; } - local_irq_save(flags); + for (i = 0; i < tegra_gpio_bank_count; i++) { tg_cont = &tegra_gpio_controllers[i]; - - for (j = 0; j < 4; j++) - spin_lock_init(&tg_cont->lvl_lock[j]); - irq_set_chained_handler_and_data(tg_cont->irq, tegra_gpio_irq_handler, tg_cont); } - local_irq_restore(flags); + return 0; } -- cgit v1.2.2