Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751386AbaLFDmG (ORCPT ); Fri, 5 Dec 2014 22:42:06 -0500 Received: from mail-gw3-out.broadcom.com ([216.31.210.64]:19756 "EHLO mail-gw3-out.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750903AbaLFDmD (ORCPT ); Fri, 5 Dec 2014 22:42:03 -0500 X-IronPort-AV: E=Sophos;i="5.07,527,1413270000"; d="scan'208";a="52267667" Message-ID: <54827B07.3000707@broadcom.com> Date: Fri, 5 Dec 2014 19:41:59 -0800 From: Ray Jui User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Joe Perches CC: Rob Herring , Pawel Moll , "Mark Rutland" , Ian Campbell , Kumar Gala , "Linus Walleij" , Alexandre Courbot , Grant Likely , Christian Daudt , Matt Porter , Florian Fainelli , Russell King , Scott Branden , , , , , Subject: Re: [PATCH 2/5] gpio: Cygnus: add GPIO driver References: <1417826408-1600-1-git-send-email-rjui@broadcom.com> <1417826408-1600-3-git-send-email-rjui@broadcom.com> <1417829282.31745.3.camel@perches.com> <5482668F.1040907@broadcom.com> <1417833291.31745.5.camel@perches.com> In-Reply-To: <1417833291.31745.5.camel@perches.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 12/5/2014 6:34 PM, Joe Perches wrote: > On Fri, 2014-12-05 at 18:14 -0800, Ray Jui wrote: >> On 12/5/2014 5:28 PM, Joe Perches wrote: >>> On Fri, 2014-12-05 at 16:40 -0800, Ray Jui wrote: >>>> +static void bcm_cygnus_gpio_irq_handler(unsigned int irq, >>>> + struct irq_desc *desc) >>>> +{ >>>> + struct bcm_cygnus_gpio *cygnus_gpio; >>>> + struct irq_chip *chip = irq_desc_get_chip(desc); >>>> + int i, bit; >>>> + >>>> + chained_irq_enter(chip, desc); >>>> + >>>> + cygnus_gpio = irq_get_handler_data(irq); >>>> + >>>> + /* go through the entire GPIO banks and handle all interrupts */ >>>> + for (i = 0; i < cygnus_gpio->num_banks; i++) { >>>> + unsigned long val = readl(cygnus_gpio->base + >>>> + (i * GPIO_BANK_SIZE) + >>>> + CYGNUS_GPIO_INT_MSTAT_OFFSET); >>>> + if (val) { >>> >>> This if (val) and indentation isn't really necessary >>> >> >> Note for_each_set_bit in this case iterates 32 times searching for bits >> that are set. > > No it doesn't. > > #define for_each_set_bit(bit, addr, size) \ > for ((bit) = find_first_bit((addr), (size)); \ > (bit) < (size); \ > (bit) = find_next_bit((addr), (size), (bit) + 1)) > > find_first_bit: > > * Returns the bit number of the first set bit. > * If no bits are set, returns @size. > You are right. I reviewed for_each_set_bit but didn't notice find_next_bit may simply return 32 in our case without doing any iterative processing. I will get rid of the redundant if (val) check below. >> By having the if (val) check here, it can potentially save >> some of such processing in the ISR. I agree with you that it introduces >> one extra indent here but I think it's required. >> >>>> + for_each_set_bit(bit, &val, 32) { >>> >>> for_each_set_bit will effectively do the if above. >>> >>> 32 bit only code? >>> otherwise isn't this endian unsafe? >>> >> >> Will change 'unsigned long val' to 'u32 val'. > > All the bit operations only work on long * > > Actually, by reviewing the code more deeply, I'm not sure why using for_each_set_bit here is 'endian unsafe'. Isn't that already taken care of by macros in bitops.h? Sorry if I'm still missing something here... -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/