[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200924073248.GA17562@sol>
Date: Thu, 24 Sep 2020 15:32:48 +0800
From: Kent Gibson <warthog618@...il.com>
To: Andy Shevchenko <andy.shevchenko@...il.com>
Cc: Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
"open list:GPIO SUBSYSTEM" <linux-gpio@...r.kernel.org>,
Bartosz Golaszewski <bgolaszewski@...libre.com>,
Linus Walleij <linus.walleij@...aro.org>,
Arnd Bergmann <arnd@...db.de>
Subject: Re: [PATCH v9 11/20] gpiolib: cdev: support
GPIO_V2_LINE_SET_VALUES_IOCTL
On Wed, Sep 23, 2020 at 07:18:08PM +0300, Andy Shevchenko wrote:
> On Tue, Sep 22, 2020 at 5:36 AM Kent Gibson <warthog618@...il.com> wrote:
> >
> > Add support for the GPIO_V2_LINE_SET_VALUES_IOCTL.
>
> > +static long linereq_set_values_unlocked(struct linereq *lr,
> > + struct gpio_v2_line_values *lv)
> > +{
> > + DECLARE_BITMAP(vals, GPIO_V2_LINES_MAX);
> > + struct gpio_desc **descs;
> > + unsigned int i, didx, num_set;
> > + int ret;
> > +
> > + bitmap_zero(vals, GPIO_V2_LINES_MAX);
> > + for (num_set = 0, i = 0; i < lr->num_lines; i++) {
> > + if (lv->mask & BIT_ULL(i)) {
>
> Similar idea
>
> DECLARE_BITMAP(mask, 64) = BITMAP_FROM_U64(lv->mask);
>
> num_set = bitmap_weight();
>
I had played with this option, but bitmap_weight() counts all
the bits set in the mask - which considers bits >= lr->num_lines.
So you would need to mask lv->mask before converting it to a bitmap.
(I'm ok with ignoring those bits in case userspace wants to be lazy and
use an all 1s mask.)
But since we're looping over the bitmap anyway we may as well just
count as we go.
> for_each_set_bit(i, mask, lr->num_lines)
>
Yeah, that should work. I vaguely recall trying this and finding it
generated larger object code, but I'll give it another try and if it
works out then include it in v10.
Cheers,
Kent.
Powered by blists - more mailing lists