Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp515015iof; Mon, 6 Jun 2022 07:45:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUmAeCd0qR9P+ZL4lVjdyGiyqp7p+YnqWhaJJYoSaBED64kvPt50B6XfzG/jAdPUMFv9ho X-Received: by 2002:a63:2:0:b0:3f6:5b37:e94c with SMTP id 2-20020a630002000000b003f65b37e94cmr21502997pga.356.1654526738105; Mon, 06 Jun 2022 07:45:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654526738; cv=none; d=google.com; s=arc-20160816; b=Myn6cJ5jIi8FvQngvwu64Hjo5MWiAeAOKB+sIN9qarRJqelFqvyGGJnT9waplLaAF5 6MnvPB/K40UOASirTTVkvsS4dJoDEHyAgX0F8StI4N/StUSFdLRYxxtSjVSc1sswDynx dlnZFaVNN7eKX+9g7LvS54gGHPJczyMBDVzT0HbbeYwKXNk9BzgyA880ISJ8Or0U3Q9E CCEtQOXGKKNA+P64N9dqXs/fRZFSCzhinB3t9g18DdHRGrQxnNwK5yv4r5m06u0fecoC xDz8We2anlTsq76Pl23ZC4q8DdynmW29lXmDmbBcvjHmlxV9s9sOIE9GfofD/3Cued4k JiIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=7G/D0jrlvNgMc+Tde0XVhDy5Wvyd9twlgo7j0TICrRc=; b=R47SP0uGuTYNcGYtskxMShWq0/yjlVlDtFV68IK48MvHLJ1HMErbbOqsVAyj9wQZn+ RfhuTGKe91IuSD1JVZALX6D2+xNyDexU6VK3C/pPvOESD5/rnjDrWxZPnw2kwed+zNS4 34Tc0Sn/PaigQZhxRb/yHKgSwPM7MAvuPSLkBYaQ2saH7Lqt6QMQww9vDpH36ufitRVo w0IGtyIcJQLLe/S9hCQAZpnTKAKnQ9uV3toO+EPpgh6OAhNkH46Ap9Dsg/dZXoVDPbed kwaM1pCiVFn6OgNl0g7q6TejIJlvPMbst1G5VUUNgVazhIXJTGMKEYkn2IkkskR8v8EX shCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=niXsWsKt; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id e15-20020a170902ed8f00b0015ea8b56188si20365634plj.56.2022.06.06.07.45.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 07:45:38 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=niXsWsKt; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CA22714D780; Mon, 6 Jun 2022 07:36:43 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239857AbiFFOgY (ORCPT + 99 others); Mon, 6 Jun 2022 10:36:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239829AbiFFOgV (ORCPT ); Mon, 6 Jun 2022 10:36:21 -0400 Received: from mail-ot1-x330.google.com (mail-ot1-x330.google.com [IPv6:2607:f8b0:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E7E31339D1 for ; Mon, 6 Jun 2022 07:36:13 -0700 (PDT) Received: by mail-ot1-x330.google.com with SMTP id r3-20020a9d5cc3000000b0060ae1789875so10856542oti.13 for ; Mon, 06 Jun 2022 07:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7G/D0jrlvNgMc+Tde0XVhDy5Wvyd9twlgo7j0TICrRc=; b=niXsWsKtWaVclpeC3TuRqVL1gv/xiSdzbpfZBGPvo0JeRr1OVIO82F5WbhdFjcB//4 8By7sa2TDe1Bo0i1L7FUiFEurXjSReM/UKd30yUHG0AQNZd4wI8t/A9W78T04H4R1gbi VTgAvArN4LOqQO2k87PUZAiIyo9w98XM7MWQlvWNVno9wmPq6VaBtcMpBq7AOIuiw9nh Oyzh35dF666yIYgUnbeovalOS396uhlPO05sF+HMm55Zd+g+tMiungG0sGyVo5Itd/gL nidcFegF3kbBDl106IchsNJuUp+rfBXcHRQNxNn4KPGkO4yLipEd6Ottt09Jy2WclR4H o/KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7G/D0jrlvNgMc+Tde0XVhDy5Wvyd9twlgo7j0TICrRc=; b=3lzLFHBUbKwun8DkOPqbas9HKZ/Se8YIgVgKQn6vkFOJnN0bgXTo87drKUfcakUB17 E9gkSVz0JpskXX5JeHPuGr25tInFs5siK2fXwf17/UDzv6vNN8q/UdmEZ+xMndn0JZ/M HftOqkelB+acm6woxxRSQPesaTJBDhCd6uNlStTLGsoiTS+u+YqEgpyRJqyTEMqzvX22 /g3R4i4DSOet/GRW/Wzv/wMK2mK5MSwUmi6aFST3S3pCLLH/C3I7M3EalcuNKpAN3pxl kofpdzyPJRGzcMH2D8co8yGg4PgkON0g0Yedg69kn3BJ9gIHNOxH13TBgGKJjP3sWo82 DBJw== X-Gm-Message-State: AOAM533H7O2PP7OCkPBwupVe9M6g/I2/i7+OAj5pia5YOmA/j5LvG/Vf gSod4SFqeCgHZZ3MvdTRb7v0+A== X-Received: by 2002:a9d:4c6:0:b0:60b:537c:f4c1 with SMTP id 64-20020a9d04c6000000b0060b537cf4c1mr10492707otm.16.1654526172844; Mon, 06 Jun 2022 07:36:12 -0700 (PDT) Received: from fedora.attlocal.net (69-109-179-158.lightspeed.dybhfl.sbcglobal.net. [69.109.179.158]) by smtp.gmail.com with ESMTPSA id u13-20020a056871008d00b000f5d4e5b9a0sm6942791oaa.2.2022.06.06.07.36.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 07:36:12 -0700 (PDT) From: William Breathitt Gray To: linus.walleij@linaro.org, brgl@bgdev.pl Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, William Breathitt Gray Subject: [PATCH 4/5] gpio: gpio-mm: Implement and utilize register structures Date: Mon, 6 Jun 2022 10:33:19 -0400 Message-Id: X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reduce magic numbers and improve code readability by implementing and utilizing named register data structures. Signed-off-by: William Breathitt Gray --- drivers/gpio/gpio-gpio-mm.c | 116 ++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 44 deletions(-) diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c index 097a06463d01..8f67442b8715 100644 --- a/drivers/gpio/gpio-gpio-mm.c +++ b/drivers/gpio/gpio-gpio-mm.c @@ -27,6 +27,16 @@ static unsigned int num_gpiomm; module_param_hw_array(base, uint, ioport, &num_gpiomm, 0); MODULE_PARM_DESC(base, "Diamond Systems GPIO-MM base addresses"); +/** + * struct i8255_reg - Intel 8255 register structure + * @port: Port A, B, and C + * @control: Control register + */ +struct i8255_reg { + u8 port[3]; + u8 control; +}; + /** * struct gpiomm_gpio - GPIO device private data structure * @chip: instance of the gpio_chip @@ -34,7 +44,7 @@ MODULE_PARM_DESC(base, "Diamond Systems GPIO-MM base addresses"); * @out_state: output bits state * @control: Control registers state * @lock: synchronization lock to prevent I/O race conditions - * @base: base port address of the GPIO device + * @dio: Digital I/O register groups */ struct gpiomm_gpio { struct gpio_chip chip; @@ -42,7 +52,7 @@ struct gpiomm_gpio { unsigned char out_state[6]; unsigned char control[2]; spinlock_t lock; - void __iomem *base; + struct i8255_reg __iomem *dio; }; static int gpiomm_gpio_get_direction(struct gpio_chip *chip, @@ -63,32 +73,33 @@ static int gpiomm_gpio_direction_input(struct gpio_chip *chip, { struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); const unsigned int io_port = offset / 8; - const unsigned int control_port = io_port / 3; + const unsigned long group = io_port / 3; + const unsigned long port = io_port - (group * 3); unsigned long flags; unsigned int control; spin_lock_irqsave(&gpiommgpio->lock, flags); /* Check if configuring Port C */ - if (io_port == 2 || io_port == 5) { + if (port == 2) { /* Port C can be configured by nibble */ if (offset % 8 > 3) { gpiommgpio->io_state[io_port] |= 0xF0; - gpiommgpio->control[control_port] |= BIT(3); + gpiommgpio->control[group] |= BIT(3); } else { gpiommgpio->io_state[io_port] |= 0x0F; - gpiommgpio->control[control_port] |= BIT(0); + gpiommgpio->control[group] |= BIT(0); } } else { gpiommgpio->io_state[io_port] |= 0xFF; - if (io_port == 0 || io_port == 3) - gpiommgpio->control[control_port] |= BIT(4); + if (port == 0) + gpiommgpio->control[group] |= BIT(4); else - gpiommgpio->control[control_port] |= BIT(1); + gpiommgpio->control[group] |= BIT(1); } - control = BIT(7) | gpiommgpio->control[control_port]; - iowrite8(control, gpiommgpio->base + 3 + control_port*4); + control = BIT(7) | gpiommgpio->control[group]; + iowrite8(control, &gpiommgpio->dio[group].control); spin_unlock_irqrestore(&gpiommgpio->lock, flags); @@ -100,30 +111,31 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip, { struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); const unsigned int io_port = offset / 8; - const unsigned int control_port = io_port / 3; + const unsigned long group = io_port / 3; + const unsigned long port = io_port - (group * 3); const unsigned int mask = BIT(offset % 8); - const unsigned int out_port = (io_port > 2) ? io_port + 1 : io_port; + struct i8255_reg __iomem *const dio = gpiommgpio->dio + group; unsigned long flags; unsigned int control; spin_lock_irqsave(&gpiommgpio->lock, flags); /* Check if configuring Port C */ - if (io_port == 2 || io_port == 5) { + if (port == 2) { /* Port C can be configured by nibble */ if (offset % 8 > 3) { gpiommgpio->io_state[io_port] &= 0x0F; - gpiommgpio->control[control_port] &= ~BIT(3); + gpiommgpio->control[group] &= ~BIT(3); } else { gpiommgpio->io_state[io_port] &= 0xF0; - gpiommgpio->control[control_port] &= ~BIT(0); + gpiommgpio->control[group] &= ~BIT(0); } } else { gpiommgpio->io_state[io_port] &= 0x00; - if (io_port == 0 || io_port == 3) - gpiommgpio->control[control_port] &= ~BIT(4); + if (port == 0) + gpiommgpio->control[group] &= ~BIT(4); else - gpiommgpio->control[control_port] &= ~BIT(1); + gpiommgpio->control[group] &= ~BIT(1); } if (value) @@ -131,10 +143,10 @@ static int gpiomm_gpio_direction_output(struct gpio_chip *chip, else gpiommgpio->out_state[io_port] &= ~mask; - control = BIT(7) | gpiommgpio->control[control_port]; - iowrite8(control, gpiommgpio->base + 3 + control_port*4); + control = BIT(7) | gpiommgpio->control[group]; + iowrite8(control, &dio->control); - iowrite8(gpiommgpio->out_state[io_port], gpiommgpio->base + out_port); + iowrite8(gpiommgpio->out_state[io_port], dio->port + port); spin_unlock_irqrestore(&gpiommgpio->lock, flags); @@ -146,7 +158,8 @@ static int gpiomm_gpio_get(struct gpio_chip *chip, unsigned int offset) struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); const unsigned int port = offset / 8; const unsigned int mask = BIT(offset % 8); - const unsigned int in_port = (port > 2) ? port + 1 : port; + const unsigned long group = port / 3; + const unsigned long in_port = port - (group * 3); unsigned long flags; unsigned int port_state; @@ -158,29 +171,33 @@ static int gpiomm_gpio_get(struct gpio_chip *chip, unsigned int offset) return -EINVAL; } - port_state = ioread8(gpiommgpio->base + in_port); + port_state = ioread8(gpiommgpio->dio[group].port + in_port); spin_unlock_irqrestore(&gpiommgpio->lock, flags); return !!(port_state & mask); } -static const size_t ports[] = { 0, 1, 2, 4, 5, 6 }; - 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 long offset; unsigned long gpio_mask; - void __iomem *port_addr; + unsigned long port; + unsigned long group; + unsigned long in_port; + u8 __iomem *port_addr; unsigned long port_state; /* clear bits array to a clean slate */ bitmap_zero(bits, chip->ngpio); - for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) { - port_addr = gpiommgpio->base + ports[offset / 8]; + for_each_set_clump8(offset, gpio_mask, mask, chip->ngpio) { + port = offset / 8; + group = port / 3; + in_port = port - (group * 3); + port_addr = gpiommgpio->dio[group].port + in_port; port_state = ioread8(port_addr) & gpio_mask; bitmap_set_value8(bits, port_state, offset); @@ -195,7 +212,8 @@ static void gpiomm_gpio_set(struct gpio_chip *chip, unsigned int offset, struct gpiomm_gpio *const gpiommgpio = gpiochip_get_data(chip); const unsigned int port = offset / 8; const unsigned int mask = BIT(offset % 8); - const unsigned int out_port = (port > 2) ? port + 1 : port; + const unsigned long group = port / 3; + const unsigned long out_port = port - (group * 3); unsigned long flags; spin_lock_irqsave(&gpiommgpio->lock, flags); @@ -205,7 +223,8 @@ static void gpiomm_gpio_set(struct gpio_chip *chip, unsigned int offset, else gpiommgpio->out_state[port] &= ~mask; - iowrite8(gpiommgpio->out_state[port], gpiommgpio->base + out_port); + iowrite8(gpiommgpio->out_state[port], + gpiommgpio->dio[group].port + out_port); spin_unlock_irqrestore(&gpiommgpio->lock, flags); } @@ -217,13 +236,17 @@ static void gpiomm_gpio_set_multiple(struct gpio_chip *chip, unsigned long offset; unsigned long gpio_mask; size_t index; - void __iomem *port_addr; + size_t group; + size_t out_port; + u8 __iomem *port_addr; unsigned long bitmask; unsigned long flags; - for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) { + for_each_set_clump8(offset, gpio_mask, mask, chip->ngpio) { index = offset / 8; - port_addr = gpiommgpio->base + ports[index]; + group = index / 3; + out_port = index - (group * 3); + port_addr = gpiommgpio->dio[group].port + out_port; bitmask = bitmap_get_value8(bits, offset) & gpio_mask; @@ -250,6 +273,17 @@ static const char *gpiomm_names[GPIOMM_NGPIO] = { "Port 2C2", "Port 2C3", "Port 2C4", "Port 2C5", "Port 2C6", "Port 2C7", }; +static void gpiomm_init_dio(struct i8255_reg __iomem *const dio) +{ + /* Activate Mode Set; set Mode 0 output mode for Port A, B, and C */ + iowrite8(0x80, &dio->control); + + /* Initialize all GPIO to 0 */ + iowrite8(0x00, &dio->port[0]); + iowrite8(0x00, &dio->port[1]); + iowrite8(0x00, &dio->port[2]); +} + static int gpiomm_probe(struct device *dev, unsigned int id) { struct gpiomm_gpio *gpiommgpio; @@ -266,8 +300,8 @@ static int gpiomm_probe(struct device *dev, unsigned int id) return -EBUSY; } - gpiommgpio->base = devm_ioport_map(dev, base[id], GPIOMM_EXTENT); - if (!gpiommgpio->base) + gpiommgpio->dio = devm_ioport_map(dev, base[id], GPIOMM_EXTENT); + if (!gpiommgpio->dio) return -ENOMEM; gpiommgpio->chip.label = name; @@ -293,14 +327,8 @@ static int gpiomm_probe(struct device *dev, unsigned int id) } /* initialize all GPIO as output */ - iowrite8(0x80, gpiommgpio->base + 3); - iowrite8(0x00, gpiommgpio->base); - iowrite8(0x00, gpiommgpio->base + 1); - iowrite8(0x00, gpiommgpio->base + 2); - iowrite8(0x80, gpiommgpio->base + 7); - iowrite8(0x00, gpiommgpio->base + 4); - iowrite8(0x00, gpiommgpio->base + 5); - iowrite8(0x00, gpiommgpio->base + 6); + gpiomm_init_dio(&gpiommgpio->dio[0]); + gpiomm_init_dio(&gpiommgpio->dio[1]); return 0; } -- 2.36.1