From patchwork Mon Mar 12 20:48:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884868 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="g0P6FKq8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VSx6jCRz9sSg for ; Tue, 13 Mar 2018 07:48:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932352AbeCLUss (ORCPT ); Mon, 12 Mar 2018 16:48:48 -0400 Received: from mail-yw0-f194.google.com ([209.85.161.194]:41309 "EHLO mail-yw0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932274AbeCLUsr (ORCPT ); Mon, 12 Mar 2018 16:48:47 -0400 Received: by mail-yw0-f194.google.com with SMTP id w12so6390494ywa.8; Mon, 12 Mar 2018 13:48:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oW7qoF0vCVNAEeVV6/d5z0FY+Hgb2Bn7ueLmM0QXAqA=; b=g0P6FKq8Zw2mYvSaVLGyc6P2JH+B+rKftjlYOnnBbe+lX8g/n+ke6OtujrjAwPtmsj VobYcwzTLctDSYWQB5Or4xAdi212MYn9cYYVjDwwcTBWgYPUBJpKD9kW2WnofpKorcgV E5qGHmYtdpsKN0k24Ws42seGmuyF4HOMg2fpqEnaFXNoQ0W7J/ALEXWru0Sszy/2whoz thln/umKOpqptim1K2YczimOTkYvdNawE3nASSAVRr9iMuB+8GngxdUEYMFEGmzp11h3 SIbeDSDVtNb+xyGihJzNXg+JvqyRDuznLhPSrKtPJth21/d2ScYHOkC8J0EVia+bAZmf RfIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oW7qoF0vCVNAEeVV6/d5z0FY+Hgb2Bn7ueLmM0QXAqA=; b=K5Xj4k/mUtNyXHrexQuzUUvA6ozceicIx1TQOClhUe1ygHnopVEgd0+nfH8tGgi0fq uswS0vdwLrY/Mq4tXfIbp4MvNz/VHtDRT0aHuSi9Nj55ZS8eWjdWPWMtG3rce5SRQN2I YRQWWVb0m4xZhxLrsOzMTY/LkvEK37D/uLoDXTlalzi73nziaE4eDOglxcq/kg9tDKiS i6l986Atli9EtezXK9cTcJrDkCUNAY4Q7Q7txKHrXg4pJz+6HUt70ohqqsD0zrARR/z9 GIwDfDY9kFS9gSBiJ1grt0BxxCC+GprTGmsP+Pzk3xfPivZvYDtXTRGvckg7dlj2XUgt NkvQ== X-Gm-Message-State: AElRT7GrN23eKM3k0hh0xxypu7BjEWRZR3yGyrw7AHUnNgvoTo/i7Z/G IjImlsTNR4eEjqheEcMqBZ0= X-Google-Smtp-Source: AG47ELsmSdChZr1Nx8DaQtkREh/Mre9e33mMBpVGjU/vGcgjYhW2+O7TCouOUTDIH09Jnagid0aOqQ== X-Received: by 10.13.252.198 with SMTP id m189mr5358088ywf.84.1520887727006; Mon, 12 Mar 2018 13:48:47 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id r127sm3279553ywr.45.2018.03.12.13.48.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:48:46 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler Subject: [PATCH 1/8] iio: stx104: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:48:40 -0400 Message-Id: <14a09900bf4642495ebe4072b9eb02769dbc4c5e.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The Apex Embedded Systems STX104 series of devices provides 4 TTL compatible lines of inputs accessed via a single 4-bit port. Since four input lines are acquired on a single port input read, the STX104 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the stx104_gpio_get_multiple function which serves as the respective get_multiple callback. Cc: Jonathan Cameron Cc: Hartmut Knaack Cc: Lars-Peter Clausen Cc: Peter Meerwald-Stadler Signed-off-by: William Breathitt Gray --- drivers/iio/adc/stx104.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/iio/adc/stx104.c b/drivers/iio/adc/stx104.c index 17b021f33180..0662ca199eb0 100644 --- a/drivers/iio/adc/stx104.c +++ b/drivers/iio/adc/stx104.c @@ -233,6 +233,16 @@ static int stx104_gpio_get(struct gpio_chip *chip, unsigned int offset) return !!(inb(stx104gpio->base) & BIT(offset)); } +static int stx104_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, + unsigned long *bits) +{ + struct stx104_gpio *const stx104gpio = gpiochip_get_data(chip); + + *bits = inb(stx104gpio->base); + + return 0; +} + static void stx104_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) { @@ -342,6 +352,7 @@ static int stx104_probe(struct device *dev, unsigned int id) stx104gpio->chip.direction_input = stx104_gpio_direction_input; stx104gpio->chip.direction_output = stx104_gpio_direction_output; stx104gpio->chip.get = stx104_gpio_get; + stx104gpio->chip.get_multiple = stx104_gpio_get_multiple; stx104gpio->chip.set = stx104_gpio_set; stx104gpio->chip.set_multiple = stx104_gpio_set_multiple; stx104gpio->base = base[id] + 3; From patchwork Mon Mar 12 20:48:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884869 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AWMZdDJW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VTF3Xnlz9sSg for ; Tue, 13 Mar 2018 07:49:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932343AbeCLUtE (ORCPT ); Mon, 12 Mar 2018 16:49:04 -0400 Received: from mail-yw0-f193.google.com ([209.85.161.193]:37029 "EHLO mail-yw0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932274AbeCLUtD (ORCPT ); Mon, 12 Mar 2018 16:49:03 -0400 Received: by mail-yw0-f193.google.com with SMTP id j143so6391792ywb.4; Mon, 12 Mar 2018 13:49:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5S57FZrDn18lTmUv3cK/UjtCHjKej2R0jpXyStLW50c=; b=AWMZdDJW2zxiUpccHlrG6FUHoju3CZK4i2ZptjXAbEzMVFr5v2T+lHr4efGq3HaNEP p6aq5YJx2UREJ8B7VY+vBfRq/paSlPn7CxG5sVA3x5M/Awmoz3jLqcyh8/13IaQpneo3 oKr4HM4AwCdeFefLWI3TsEpsdDKIiuaHfQLs/BRj3wL3ZuMyfvcY8g4v7XsfTPTr6KRh cg5WwKiOCRAlno5JJngOUcWdexFZwhICds1dS++ey6n3wUiNIhConCcLCccslfBf68Ch alMjWDdQNIAYuPNv+MF98aoICnRlaFX1qZulKalu6ZBWN6vfGsjd35G7u6ExgJevQiti OBqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5S57FZrDn18lTmUv3cK/UjtCHjKej2R0jpXyStLW50c=; b=O5BrsE93+uBPH5Rg34E2GXt6pi21MlpiJuzq4UtbQEFjCxe1Fk/Cv285fCCJe8zjKD myDRAYfz39ogQduEFRE1bnjq1Dx/4pbbuS8yVQWcSbYOOJUpey4MbaEnpJO9cYCHa+HO 0pM+HhxAQ/muZwnXr8RuXm1z6gZZxYmp1n3D3fhWGpt0bPjpkbzDheKD4UjinLFZ5+rp wAXjfE7LvlliJcYD9Hfa2+qb5TlHLz1OxV0DwVv2pOMkqB3txiRH0dsM0pZIFQb0ArTf 4MdySk3j+MrLWoe5nUbloxy0UGbEUFgkZm2xP7wD2q8fpdtM5Co5yLgXAKhtkpbsCbKn fnYQ== X-Gm-Message-State: AElRT7FxY2UwEQJD7aXG0reaAGTIaRvYmFbosy7EsZc/XvFkRyIgDgRb VnCSgHSPwICt29SsalbNMmY= X-Google-Smtp-Source: AG47ELsc7vNXuPDLhvlsvr7ZKbtt5DJFUtFFtFx3YLaXAxkK9B/e/frxcOQT9oyWeytWYH8y6ZkTyg== X-Received: by 10.129.69.10 with SMTP id s10mr5639124ywa.145.1520887742479; Mon, 12 Mar 2018 13:49:02 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id h7sm3112890ywf.2.2018.03.12.13.49.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:49:01 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 2/8] gpio: 104-idio-16: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:48:51 -0400 Message-Id: <486eb9bad0440ed305a78d9fc990728cbeb7d43e.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The ACCES I/O 104-IDIO-16 series of devices provides 16 optically-isolated digital inputs accessed via two 8-bit ports. Since eight input lines are acquired on a single port input read, the 104-IDIO-16 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the idio_16_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-104-idio-16.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c index 2f16638a0589..5de5819e5156 100644 --- a/drivers/gpio/gpio-104-idio-16.c +++ b/drivers/gpio/gpio-104-idio-16.c @@ -90,6 +90,20 @@ static int idio_16_gpio_get(struct gpio_chip *chip, unsigned offset) return !!(inb(idio16gpio->base + 5) & (mask>>8)); } +static int idio_16_gpio_get_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip); + + *bits = 0; + if (*mask & 0xFF0000) + *bits |= (unsigned long)inb(idio16gpio->base + 1) << 16; + if (*mask & 0xFF000000) + *bits |= (unsigned long)inb(idio16gpio->base + 5) << 24; + + return 0; +} + static void idio_16_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip); @@ -244,6 +258,7 @@ static int idio_16_probe(struct device *dev, unsigned int id) idio16gpio->chip.direction_input = idio_16_gpio_direction_input; idio16gpio->chip.direction_output = idio_16_gpio_direction_output; idio16gpio->chip.get = idio_16_gpio_get; + idio16gpio->chip.get_multiple = idio_16_gpio_get_multiple; idio16gpio->chip.set = idio_16_gpio_set; idio16gpio->chip.set_multiple = idio_16_gpio_set_multiple; idio16gpio->base = base[id]; From patchwork Mon Mar 12 20:49:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884870 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="jDqpjZzo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VTT3Zs3z9sSj for ; Tue, 13 Mar 2018 07:49:17 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932474AbeCLUtQ (ORCPT ); Mon, 12 Mar 2018 16:49:16 -0400 Received: from mail-yw0-f196.google.com ([209.85.161.196]:33679 "EHLO mail-yw0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932274AbeCLUtO (ORCPT ); Mon, 12 Mar 2018 16:49:14 -0400 Received: by mail-yw0-f196.google.com with SMTP id l200so6399457ywb.0; Mon, 12 Mar 2018 13:49:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VY12YUu6hlk5Bq7RxTzYRv59jkAS3swOR0Yq8By0ql4=; b=jDqpjZzoeDOCRFYPyAnQV06l3UEoxFRIVt6PklIWnDUfKdp4LSK3VLE/ExrdTWTnII IkYmB9LBCZHaD/sbMukUMITbT3x+ZGLchRw3foZrOJri14xcn75bn+Fk6HEFtYnybD0r tuVKvcB6vMzK8sL7XMcU13el7ufrtoXeyKBWjRciqs8O91jnwPzyCNyKf8vq+L2N8Eql AS+nF7C5XResGhnpa30XPbUG8GND1hqihqYzVmeegAmh8PXHp6AkSbVuS4lU0fs2gvX2 oMhDpW1DIsPgWeJ/0TSM27utroEKqZbje/l0R/DwmzS/C1l3f007NX+cfszht8wu8ldN q4qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VY12YUu6hlk5Bq7RxTzYRv59jkAS3swOR0Yq8By0ql4=; b=JkQMopFs5c7CZC0C/w3G9JXGGzB0QpKppkX5vtkAq+853zLSztn4GIczBwuk0lP3qn BpZDN59qTtkCXCauqNSUMhARTKTp1VNe4BIfqTaled2KHoXDHfzlEOvi/LWi7Aun0ZWP xJ6tvBjXWKpaXchZfbrcRLIVTjv7RulwtLQBRZ+SOL7cDfMFWmJ9S4s3Mm3VCC3JJ/p2 frEwJDhABHiTQ/MXMfvcRdaPTkc7y68bfSejWHcLbqqL2uIc8jLQUhRNcWiCbX3NAUNI NUIJc8yzPUkN/JeH6lG7LcrSahV2/30PMsZraImpPrF0K9F38PTPPD7Glx6pjr89pgIh ey1A== X-Gm-Message-State: AElRT7Elpn30zZCoZrqfdXPrQYQiS9C4g/IY9lrq6LeYU4v3DUn0iRs9 jeqcABE8/MZhdSS8FJgYcKQ= X-Google-Smtp-Source: AG47ELu/N6NpQIyoXb8Vyf2fa4QOJVcP1SvFYUGEzszzoySL0bQRCzC3MTA758QoH/OOBeDYbru8OA== X-Received: by 10.129.107.11 with SMTP id g11mr2029436ywc.459.1520887753717; Mon, 12 Mar 2018 13:49:13 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id q11sm3215215ywc.106.2018.03.12.13.49.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:49:12 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 3/8] gpio: pci-idio-16: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:49:07 -0400 Message-Id: X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The ACCES I/O PCI-IDIO-16 series of devices provides 16 optically-isolated digital inputs accessed via two 8-bit ports. Since eight input lines are acquired on a single port input read, the PCI-IDIO-16 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the idio_16_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-pci-idio-16.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/gpio/gpio-pci-idio-16.c b/drivers/gpio/gpio-pci-idio-16.c index 57d1b7fbf07b..8c5ec301c7ff 100644 --- a/drivers/gpio/gpio-pci-idio-16.c +++ b/drivers/gpio/gpio-pci-idio-16.c @@ -103,6 +103,53 @@ static int idio_16_gpio_get(struct gpio_chip *chip, unsigned int offset) return !!(ioread8(&idio16gpio->reg->in8_15) & (mask >> 24)); } +static int idio_16_gpio_get_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip); + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned long port_state; + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* read bits from current gpio register */ + switch (i / gpio_reg_size) { + case 0: + port_state = ioread8(&idio16gpio->reg->out0_7); + break; + case 1: + port_state = ioread8(&idio16gpio->reg->out8_15); + break; + case 2: + port_state = ioread8(&idio16gpio->reg->in0_7); + break; + case 3: + port_state = ioread8(&idio16gpio->reg->in8_15); + break; + } + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void idio_16_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) { @@ -299,6 +346,7 @@ static int idio_16_probe(struct pci_dev *pdev, const struct pci_device_id *id) idio16gpio->chip.direction_input = idio_16_gpio_direction_input; idio16gpio->chip.direction_output = idio_16_gpio_direction_output; idio16gpio->chip.get = idio_16_gpio_get; + idio16gpio->chip.get_multiple = idio_16_gpio_get_multiple; idio16gpio->chip.set = idio_16_gpio_set; idio16gpio->chip.set_multiple = idio_16_gpio_set_multiple; From patchwork Mon Mar 12 20:49:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884871 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uEhpMB+D"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VTs5crwz9sSg for ; Tue, 13 Mar 2018 07:49:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932282AbeCLUtg (ORCPT ); Mon, 12 Mar 2018 16:49:36 -0400 Received: from mail-yw0-f195.google.com ([209.85.161.195]:43494 "EHLO mail-yw0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932274AbeCLUtf (ORCPT ); Mon, 12 Mar 2018 16:49:35 -0400 Received: by mail-yw0-f195.google.com with SMTP id r66so1926419ywh.10; Mon, 12 Mar 2018 13:49:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BuC7Dbfae7lBC/DvrwfsTN1TjrzAuZ5G3YhmPUvEVAU=; b=uEhpMB+D1F7XIxXJ8MBFllRtoFcB7OINndN0ORvV/SrwDIRtFpCHKeM6KEYtj50obU pPG2gf+9zAK4OXPpae9zf9O37OfvzZKpU0Mk8mHdOd58Dx090jFQYvomjFC+YmqD/kYH Cs05nzJ3D8N+vQguz0SaJTvz3WmVXQ4xJb3Mwrhf+2wFzx8LHjeQswiBwFFzXcrlOAsV 8DIWXGnwKT6reOv7onlR7aSfAvmfYybemS/bIGFLl6NwlOcwouEWUnCXdZFsSTLelnpy /dFYfZV0j7w/sNApr3i2H8bK2uC8m/ss7+nQMhOi3qQoZML2h3WE/BrU0W/uXDXe2Usd 9Vbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BuC7Dbfae7lBC/DvrwfsTN1TjrzAuZ5G3YhmPUvEVAU=; b=BWin18SdVvSsbDxHaCeiqfSKgiE88D7cBBBXJVRNkYuwl/iRquarmNzva1py2hhyVq EmdGqBUXxfFQ53p3Jp+8RoKSMSfV+8hvGlkWLWP9mUrnHdiGstOhJ8v3XUcPYiT8vSJS HyC6ANV1XfuGTKmXU3tEp62GNlo73vTadWEE01THP6cRnIBtnLVsR8Jv2DpIBtXlq0qO TGc7Z45+DJzS9GcsOnelAe6/NjvErLOP9xYl7Oqdn95rTUhdOE3NnS9JCydFvjaRcyR4 veHpphhCGMiKb6YRvnnmLxYqpR3cxgCrlR7MWdSH8tv0nZJs9WalcCl+Kh8K8aAJter8 NqrQ== X-Gm-Message-State: AElRT7FsCXAhtfoOZAVtwF2WIT3f16fATWfQgnkEjfv4yjf5vb84ddOB 0RZwbjR9EFwxmMOk8sS0G7I= X-Google-Smtp-Source: AG47ELsfSxv34e3PZDx3bwYqqED1ZyT5YmH1f/oqviXHlsw1rYV7HtV3/xYK+0qF1cmdrfeApsm2qw== X-Received: by 2002:a25:4643:: with SMTP id t64-v6mr5643245yba.100.1520887774566; Mon, 12 Mar 2018 13:49:34 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id k125sm3110063ywe.85.2018.03.12.13.49.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:49:34 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 4/8] gpio: pcie-idio-24: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:49:28 -0400 Message-Id: <5d46c780a6e3be82e672dbd17ba70d275e35b51b.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The ACCES I/O PCIe-IDIO-24 series of devices provides 24 optically-isolated digital inputs accessed via three 8-bit ports. Since eight input lines are acquired on a single port input read, the PCIe-IDIO-24 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the idio_24_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-pcie-idio-24.c | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/drivers/gpio/gpio-pcie-idio-24.c b/drivers/gpio/gpio-pcie-idio-24.c index f666e2e69074..6efc85292c49 100644 --- a/drivers/gpio/gpio-pcie-idio-24.c +++ b/drivers/gpio/gpio-pcie-idio-24.c @@ -193,6 +193,68 @@ static int idio_24_gpio_get(struct gpio_chip *chip, unsigned int offset) return !!(ioread8(&idio24gpio->reg->ttl_in0_7) & offset_mask); } +static int idio_24_gpio_get_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct idio_24_gpio *const idio24gpio = gpiochip_get_data(chip); + struct idio_24_gpio_reg __iomem *const reg = idio24gpio->reg; + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned long port_state; + const unsigned long out_mode_mask = BIT(1); + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* read bits from current gpio register */ + switch (i / gpio_reg_size) { + case 0: + port_state = ioread8(®->out0_7); + break; + case 1: + port_state = ioread8(®->out8_15); + break; + case 2: + port_state = ioread8(®->out16_23); + break; + case 3: + port_state = ioread8(®->in0_7); + break; + case 4: + port_state = ioread8(®->in8_15); + break; + case 5: + port_state = ioread8(®->in16_23); + break; + case 6: + /* TTL/CMOS Outputs/Inputs */ + if (ioread8(®->ctl) & out_mode_mask) + port_state = ioread8(®->ttl_out0_7); + else + port_state = ioread8(®->ttl_in0_7); + break; + } + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void idio_24_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) { @@ -397,6 +459,7 @@ static int idio_24_probe(struct pci_dev *pdev, const struct pci_device_id *id) idio24gpio->chip.direction_input = idio_24_gpio_direction_input; idio24gpio->chip.direction_output = idio_24_gpio_direction_output; idio24gpio->chip.get = idio_24_gpio_get; + idio24gpio->chip.get_multiple = idio_24_gpio_get_multiple; idio24gpio->chip.set = idio_24_gpio_set; raw_spin_lock_init(&idio24gpio->lock); From patchwork Mon Mar 12 20:49:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884872 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="D0lW6mHQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VVC3HK8z9sSg for ; Tue, 13 Mar 2018 07:49:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932274AbeCLUty (ORCPT ); Mon, 12 Mar 2018 16:49:54 -0400 Received: from mail-yw0-f194.google.com ([209.85.161.194]:40901 "EHLO mail-yw0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932247AbeCLUtx (ORCPT ); Mon, 12 Mar 2018 16:49:53 -0400 Received: by mail-yw0-f194.google.com with SMTP id y186so6393093ywf.7; Mon, 12 Mar 2018 13:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NfS+jMjSTe60ZXly15zdbshzvtQKQWIKopVzIFheHzg=; b=D0lW6mHQjqbpWwr6n91I5W5l1rMY7fGVgVOrR8z/ylJcmFrVBcp/2TfxH2bpmJ430Q u5RZPEq2qneWCRZ+dpvL73FwqXJ1/jTm+wNgonibIvgqdHe3lxVThIlL+7uMSAFLHYTY s1CKrwd2uQ89gqoVv6F1CGt7qP+YMcVHBSK8SunhuVH3mt+uS/oPAN7Pke0fKQ3Y6Ps9 6Ms0wchLS3wRRITaKFDKY4U1Hg4A1Os3QiG2TQgDVl84CktJUpRYdo3YH4aIw94qARXy TdR3BqwnRzNmQQLBv/2PgQombi8OhrgYnMrRrceZQEPH6JrdvsN+geoA9m+n7YrrxVVO 6hEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NfS+jMjSTe60ZXly15zdbshzvtQKQWIKopVzIFheHzg=; b=CY6LDbiCU4xhGWnffyL1iDPkKu3K6oVN1kHtLWzy138+WXPIpkk9euq3CzBzm824Gn p0aRAaVJDu1OrwJWhwhQUY96w1uORAR+g6dVR6vIpjX4E/q/ftCvpfzlbwWebEUX1b4Q TZBg0Hiyymx4nNZ+vKOyPE6DKjLZcT7tR4QSpoxW3QZW5uvebTXABE3DsAOf5tsQ33Uv gY4+CA5o9WNDnMKijpiCmIoUUBhguR5KuJmxE3mL21yy8uTQgRcuRplbWK3x3e7dNQD9 q2r4Q4XdpbmZNbUpvYdGwKp79WomnqLIgww9iCDwB0cJlWnSG5Tt9v48h1gg0hoc7iCn EjSw== X-Gm-Message-State: AElRT7HDNhgEp4fzWlI6QbrpQK/HjXxtzMPJMSVcJ3WL4UIBss/LaJRl gTKnTqv4TGVHvW/gejC6BhkjNQ== X-Google-Smtp-Source: AG47ELuYKkH72MRV7JkGWUa3t7w87w5H7bCgaCIfjJVfraq6BxH87lG6uZyX3+DsVrtvvoT8o8Vs4Q== X-Received: by 10.129.159.195 with SMTP id w186mr1939238ywg.414.1520887792503; Mon, 12 Mar 2018 13:49:52 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id g9sm3192544ywb.69.2018.03.12.13.49.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:49:52 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 5/8] gpio: 104-dio-48e: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:49:46 -0400 Message-Id: <5b8ac88568320f8a1b00f3ade7da51b1f3e1cdb3.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The ACCES I/O 104-DIO-48E series of devices contain two Programmable Peripheral Interface (PPI) chips of type 82C55, which each feature three 8-bit ports of I/O. Since eight input lines are acquired on a single port input read, the 104-DIO-48E GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the dio48e_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-104-dio-48e.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpio/gpio-104-dio-48e.c b/drivers/gpio/gpio-104-dio-48e.c index bab3b94c5cbc..35ae2357d2ba 100644 --- a/drivers/gpio/gpio-104-dio-48e.c +++ b/drivers/gpio/gpio-104-dio-48e.c @@ -182,6 +182,46 @@ static int dio48e_gpio_get(struct gpio_chip *chip, unsigned offset) return !!(port_state & mask); } +static int dio48e_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, + unsigned long *bits) +{ + struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip); + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned int port; + unsigned int in_port; + unsigned long port_state; + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* compute input port offset */ + port = i / gpio_reg_size; + in_port = (port > 2) ? port + 1 : port; + + /* get input bits */ + port_state = inb(dio48egpio->base + in_port); + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void dio48e_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct dio48e_gpio *const dio48egpio = gpiochip_get_data(chip); @@ -384,6 +424,7 @@ static int dio48e_probe(struct device *dev, unsigned int id) dio48egpio->chip.direction_input = dio48e_gpio_direction_input; dio48egpio->chip.direction_output = dio48e_gpio_direction_output; dio48egpio->chip.get = dio48e_gpio_get; + dio48egpio->chip.get_multiple = dio48e_gpio_get_multiple; dio48egpio->chip.set = dio48e_gpio_set; dio48egpio->chip.set_multiple = dio48e_gpio_set_multiple; dio48egpio->base = base[id]; From patchwork Mon Mar 12 20:49:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884875 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="RD2996o4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VWT71N6z9sSg for ; Tue, 13 Mar 2018 07:51:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932311AbeCLUuU (ORCPT ); Mon, 12 Mar 2018 16:50:20 -0400 Received: from mail-yw0-f194.google.com ([209.85.161.194]:33751 "EHLO mail-yw0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932525AbeCLUuD (ORCPT ); Mon, 12 Mar 2018 16:50:03 -0400 Received: by mail-yw0-f194.google.com with SMTP id l200so6401097ywb.0; Mon, 12 Mar 2018 13:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9f18JN+BWd/gT8Hh1qfUHDGD7k3kMF/bONsOVu5XxaA=; b=RD2996o4D/JrVS0wJM+6zwvXVYEkbt8z/wbrAObUBWZU0EYplTcBB6iuf/x8gzBhPt Z2xZ4x+Eh10AYE0dahzqYe95TdGngUybNNhc6iUySB/MBsajgrYdt/pdOez9qsOhxYBL bCOHp/14K84wxRwP/IiNlKI+gXUXyqTYCmEedCLyH+zGwkpYtPiuDkQhXebJ4xiZeHEw XCcFqfUq9N4MsDTHPaj7wQy4OruVUuX3xH30Y3V0KaxWcuQ3Y8JCZqNx6rRQdHlSXSQs VlBZatwuXHkMOAZiP+x9wgwJoHITo3vVtUjcP9LeyeBJyQIhTX9s6CJLBTxKVvBIr3vk 1MNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9f18JN+BWd/gT8Hh1qfUHDGD7k3kMF/bONsOVu5XxaA=; b=Hvj9w2BsTWjOpq5f/rINlcP1nd6/fHZC6KLoz9mMdQDEIj92Jm/jp7YKNVAHDk83Sq Z9aCAlnNuj4F17+QQA/iFM5rQ5qr4cucwUeqUYPqeV3LU696JJPr3YkInjcTCTj5hMLy VtQg6gutrPK4JcuWZOZA9RwvJoSjk1fGZeSIwBAnVNPX0KwHqtQo8sNt9a68ppGA7uel uEcNDCWlCpCg2H8eQ+VVXTsFtkZOMZH6jzb4AapSVKxwKiLtKRRDEgGuXyv3IQj7e/Cg QXUOBINwZEc31fhggTjqa+TvS4UnCv26w4BkNLnSZFoqRvKvNsXQdxi7j9+xuC2SQAm4 +jAw== X-Gm-Message-State: AElRT7HjCNPmOmqmrbwtczs/Hf3WOC3F606NQ9ZsfCJKw2/RlPMiWcM3 +y+KXCBn8HhH6QbxPJG9iG0= X-Google-Smtp-Source: AG47ELtnJPQ6lhzCwMOioBNx3IPmPuApnCVGXxvR4iyx0UezJoypKUCgfGNoW3keprl0o3e1OOqyRA== X-Received: by 10.129.114.213 with SMTP id n204mr5761216ywc.513.1520887803261; Mon, 12 Mar 2018 13:50:03 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id e188sm2629363ywd.37.2018.03.12.13.50.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:50:02 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 6/8] gpio: 104-idi-48: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:49:57 -0400 Message-Id: X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The ACCES I/O 104-IDI-48 series of devices provides 48 optically-isolated inputs accessed via six 8-bit ports. Since eight input lines are acquired on a single port input read, the 104-IDI-48 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the idi_48_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-104-idi-48.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c index add859d59766..d82139c3117a 100644 --- a/drivers/gpio/gpio-104-idi-48.c +++ b/drivers/gpio/gpio-104-idi-48.c @@ -88,6 +88,46 @@ static int idi_48_gpio_get(struct gpio_chip *chip, unsigned offset) return 0; } +static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, + unsigned long *bits) +{ + struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip); + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned int port; + unsigned int in_port; + unsigned long port_state; + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* compute input port offset */ + port = i / gpio_reg_size; + in_port = (port > 2) ? port + 1 : port; + + /* get input bits */ + port_state = inb(idi48gpio->base + in_port); + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void idi_48_irq_ack(struct irq_data *data) { } @@ -256,6 +296,7 @@ static int idi_48_probe(struct device *dev, unsigned int id) idi48gpio->chip.get_direction = idi_48_gpio_get_direction; idi48gpio->chip.direction_input = idi_48_gpio_direction_input; idi48gpio->chip.get = idi_48_gpio_get; + idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple; idi48gpio->base = base[id]; raw_spin_lock_init(&idi48gpio->lock); From patchwork Mon Mar 12 20:50:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884874 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="f2TjsVWA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VWS23L5z9sSg for ; Tue, 13 Mar 2018 07:51:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932322AbeCLUua (ORCPT ); Mon, 12 Mar 2018 16:50:30 -0400 Received: from mail-yw0-f196.google.com ([209.85.161.196]:41450 "EHLO mail-yw0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932525AbeCLUu2 (ORCPT ); Mon, 12 Mar 2018 16:50:28 -0400 Received: by mail-yw0-f196.google.com with SMTP id w12so6393696ywa.8; Mon, 12 Mar 2018 13:50:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kLDV0HGYgPPJceXoBrDErFSjfMCg52cjK/Oh29azbnY=; b=f2TjsVWAWLp4/v5DsuinWt7UwURkbKV2aklYcdTP7T6zY7oYMZyHr6hyhFsYCk6eGQ PnRk1zTG/+NiJIm1UIj/aVoOIxidcfTO9xE096pQ6MgZTlDTofJ9PeChdK5ocmMFBZLW hXxhnALMtxyvAp7M6vPjHGWfCC2+C/BIOhhMiP+IyOzsr1tnHphBmjV+OXiUmHE3LeAA lfNidc413iqw/u0fQCY05N130puhkV5f7iCE2FQiUtx8PPC+syTEBSKmYSPfrPTrkAWc tmc2S0RAdoB6L99ASPSClyktEhHMhFuaxj2cBE70PMhYjDy+y3C3R9WLRnB+YlEhOCr6 mowg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kLDV0HGYgPPJceXoBrDErFSjfMCg52cjK/Oh29azbnY=; b=TTHkxY1ck+rOFN4kIC11o+yQGAy9TPyz5M/tHQIyvtvPMlUgF/7kGagHTDM5bYLwm5 PZdecAl+46ews4h47Byc88dVNrxzHxJ46AaW/tCfWFZ1Psee2hInTI7QnzJuXXq4h+1X YT0WvlZ7Lo4dtkRiYyTGqU1ZiV+HFyWnLewYfMRF5C9/vz25Tbi8QWjuyR4L+X9eQlAJ CFJQA7X6BLrvKAXvDB9xfuMfg9nKrL38bTEJfpmVNJQHpwzzF5y0ptePK6Tx+ZAJ6vWt vDZTsJJLGr/1SOi9ivcZduFBQIryaVDHbWC/V+Y6todLnXiYLzXnbtaGXOL6tj9Qf9U7 gsdQ== X-Gm-Message-State: AElRT7HfXH+TaVAUHzdSlVq/ahDUb5qwvd44s4z8eGAPFipfpP2jSV2n zeg3eC8fUXdzP1yjaoroSBY= X-Google-Smtp-Source: AG47ELtpTFTklStmBgf3l3e0V5g0af3jZbnc1iH4Pxf77ORAgS8oQ/IQRm4qZeETuW21jGWTviKqoQ== X-Received: by 2002:a25:84c5:: with SMTP id x5-v6mr3413111ybm.430.1520887828067; Mon, 12 Mar 2018 13:50:28 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id l15sm3364437ywk.44.2018.03.12.13.50.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:50:27 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 7/8] gpio: gpio-mm: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:50:22 -0400 Message-Id: <909f0d3dac7a9f24cfd92f05f4d1e84f569162b1.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The Diamond Systems GPIO-MM series of devices contain two 82C55A devices, which each feature three 8-bit ports of I/O. Since eight input lines are acquired on a single port input read, the GPIO-MM GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the gpiomm_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-gpio-mm.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c index 11ade5b288f8..5bacfa1f2c02 100644 --- a/drivers/gpio/gpio-gpio-mm.c +++ b/drivers/gpio/gpio-gpio-mm.c @@ -171,6 +171,46 @@ static int gpiomm_gpio_get(struct gpio_chip *chip, unsigned int offset) return !!(port_state & mask); } +static int gpiomm_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, + unsigned long *bits) +{ + struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned int port; + unsigned int in_port; + unsigned long port_state; + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* compute input port offset */ + port = i / gpio_reg_size; + in_port = (port > 2) ? port + 1 : port; + + /* get input bits */ + port_state = inb(gpiommgpio->base + in_port); + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void gpiomm_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) { @@ -268,6 +308,7 @@ static int gpiomm_probe(struct device *dev, unsigned int id) gpiommgpio->chip.direction_input = gpiomm_gpio_direction_input; gpiommgpio->chip.direction_output = gpiomm_gpio_direction_output; gpiommgpio->chip.get = gpiomm_gpio_get; + gpiommgpio->chip.get_multiple = gpiomm_gpio_get_multiple; gpiommgpio->chip.set = gpiomm_gpio_set; gpiommgpio->chip.set_multiple = gpiomm_gpio_set_multiple; gpiommgpio->base = base[id]; From patchwork Mon Mar 12 20:50:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 884873 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="J8p9zAa2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 400VWN4Mrhz9sSg for ; Tue, 13 Mar 2018 07:50:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932441AbeCLUul (ORCPT ); Mon, 12 Mar 2018 16:50:41 -0400 Received: from mail-yw0-f193.google.com ([209.85.161.193]:44822 "EHLO mail-yw0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932302AbeCLUuj (ORCPT ); Mon, 12 Mar 2018 16:50:39 -0400 Received: by mail-yw0-f193.google.com with SMTP id x197so6385468ywg.11; Mon, 12 Mar 2018 13:50:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Fr1k3SPIO42JmzfgAj7cd80A+uSl2kSn825coQuKL0I=; b=J8p9zAa24A/IhOZCIOG/Y59djC+0lrA0b4m0njs4Eoz7rIR2qBbNN04/NKK0pFpCrZ DOerDwe5UJ47s4UR0Jbg8M53aNaFRZHte0NEML0RtvV9a4D3C4J7P2aOMCeJrGzzfzE4 OHWU9EQstpa9/KSeiUFcycXuUwyNhJm91AsB/VX5sgun5uLBdEWySN6uuX2VICctb4Ut DW5w3PyqAZUJyj7zOXEqoTOvCQu+Pd5FWxeHQ2xt7MkEGehe4Ewpp4L4nbQDWSdPYGgk RF0ddYm5ft+lUINY40WqjTQcgZwjFqG8eVkCIpo8XBjsC7iEv6nJF2pwEz5ndVfGyAuj Ktig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Fr1k3SPIO42JmzfgAj7cd80A+uSl2kSn825coQuKL0I=; b=jSdpwluikKoYMsql0vm43TAb6ATcPBtX/tb5AUD0c9xvmEo7ed5VW0YKu4g6/WHIYj nfYSpj+ciRxp3VPU9RW1mTeX1H0cHcAJdZVRNlBPUDsZnQIdDmoeplgBRV1SepgG8Ooc GF5bZ050XZwI/aK4vYBkJwf6+rMCMkFBJDzzYTKi2mi//P6M88pIVHtNIIBe6NejXhSO TqB9YxjZsVB9mz5RKwR2Pv6hjaeLvoKsDsHyfQeh3ngjEcJI5d4Q3RAbXBAuP9NWHAev 5UQcTMVp7pNrkPfATklLVfQS0ByzqlsBoeVlfvzAUcYcYImKM5bM9qGpJnmpLehKkJUg hJZQ== X-Gm-Message-State: AElRT7GQiVcA/8DKYvKM6wqhdVY6x7HfYGz3qV+fJLAvkDnGKhyu8PA/ bGmb/gdTnGmgIOEAOzFgIhQ= X-Google-Smtp-Source: AG47ELthYQSyemYEzqpO/VfzcCJeAKez45uxiVOf8s1SxyzQhHVEqpJ3+JFjWGu8WgoMT7hMMnoinw== X-Received: by 10.129.162.87 with SMTP id z84mr243067ywg.436.1520887838628; Mon, 12 Mar 2018 13:50:38 -0700 (PDT) Received: from localhost ([72.188.97.40]) by smtp.gmail.com with ESMTPSA id z80sm3433152ywz.49.2018.03.12.13.50.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 13:50:38 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, William Breathitt Gray Subject: [PATCH 8/8] gpio: ws16c48: Implement get_multiple callback Date: Mon, 12 Mar 2018 16:50:32 -0400 Message-Id: <1776078694b1f68535fd9d0051dcaa992413ea60.1520886945.git.vilhelm.gray@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The WinSystems WS16C48 device provides 48 lines of digital I/O accessed via six 8-bit ports. Since eight input lines are acquired on a single port input read, the WS16C48 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the ws16c48_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-ws16c48.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/gpio/gpio-ws16c48.c b/drivers/gpio/gpio-ws16c48.c index 746648244bf3..6d911f8e92c1 100644 --- a/drivers/gpio/gpio-ws16c48.c +++ b/drivers/gpio/gpio-ws16c48.c @@ -129,6 +129,44 @@ static int ws16c48_gpio_get(struct gpio_chip *chip, unsigned offset) return !!(port_state & mask); } +static int ws16c48_gpio_get_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); + unsigned int i; + const unsigned int gpio_reg_size = 8; + unsigned int bit_word_offset; + unsigned int bits_mask; + const unsigned long reg_mask = GENMASK(gpio_reg_size, 0); + unsigned int in_port; + unsigned long port_state; + + /* clear bits array to a clean slate */ + for (i = 0; i < chip->ngpio; i += BITS_PER_LONG) + bits[i / BITS_PER_LONG] = 0; + + /* get bits are evaluated a gpio register size at a time */ + for (i = 0; i < chip->ngpio; i += gpio_reg_size) { + bit_word_offset = i % BITS_PER_LONG; + bits_mask = mask[BIT_WORD(i)] & (reg_mask << bit_word_offset); + if (!bits_mask) { + /* no get bits in this register so skip to next one */ + continue; + } + + /* compute input port offset */ + in_port = i / gpio_reg_size; + + /* get input bits */ + port_state = inb(ws16c48gpio->base + in_port); + + /* store acquired bits */ + bits[BIT_WORD(i)] |= port_state << bit_word_offset; + } + + return 0; +} + static void ws16c48_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); @@ -383,6 +421,7 @@ static int ws16c48_probe(struct device *dev, unsigned int id) ws16c48gpio->chip.direction_input = ws16c48_gpio_direction_input; ws16c48gpio->chip.direction_output = ws16c48_gpio_direction_output; ws16c48gpio->chip.get = ws16c48_gpio_get; + ws16c48gpio->chip.get_multiple = ws16c48_gpio_get_multiple; ws16c48gpio->chip.set = ws16c48_gpio_set; ws16c48gpio->chip.set_multiple = ws16c48_gpio_set_multiple; ws16c48gpio->base = base[id];