Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp104893imm; Wed, 3 Oct 2018 12:41:20 -0700 (PDT) X-Google-Smtp-Source: ACcGV61yjyRivWQfcuHRU/98lsP4k+WOCwD6CR2PGj3Cz7kDOITOvS8JK8E+qziqvJtRnF3AX2d6 X-Received: by 2002:a63:bd41:: with SMTP id d1-v6mr2667661pgp.309.1538595680117; Wed, 03 Oct 2018 12:41:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538595680; cv=none; d=google.com; s=arc-20160816; b=tDA0iFkANT0+2AIgDNPAot/bVy9yyMAwjr5+k18MffWfW+aL150SRTNd9m+BSAi0Ef qO/ElVODDAUwb625e27WjNmd49PyTR1Tcz1LAk0P6krEhrxSWHkfhgkfPXFHxF3jX/Ok sYuSTMj95N8wNcIdFcJwK0QTkRX4tfzyfJRtzveYD8G1H09Wl43hcRhOzKk6c6bxfHGd REJkhrgM4c5dbE8GBO0OP0F1dxkTm/FggAhWfU3zJ6ZtiCp/C2lf7itAqXVNy1pI35sB PUamqGYt2/TC2zPOYDEE3Jbd7edOyeM/zwp282U0NwAFIFe6WzEyVMosCXNA+pzigXLH atjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ls+XcqdmHnBV0GS3bS8NGlkMVyhd9AxDVYAww4RmSug=; b=GQQDJGEd5RCbA4LeNZxfSCWfap2eNczDlo3lMF9Ymgcp/BceS0Wplf8xDcjvOjcryX 8FFczUK7GpmlAvZkeUIJkYGrCcwOW8VHUq4zLvRGfLyiq4SEusR1R6dqsJfXiR5N7/tJ IDBxCUKoOeS6uXngPxxojLUQPPclrfVj52P71nky1vmzc1xfl9OEHMRaElJWlk1LiExy LTHxdv9XIhRKkacM3NEoiWdO4y5vi7xzqjqep4WvjPKcY+6aGTG+Dm9dkenDU3UqpCEF IeXcXVsV4H1F4vAttM5xzdRUTPM47MW+QhbNBZweXTYgO1jIB9WzG4Pjbjyeyi1iOx3o gyYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=WHcKmzmD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l4-v6si2591184plb.181.2018.10.03.12.41.04; Wed, 03 Oct 2018 12:41:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=WHcKmzmD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727415AbeJDC24 (ORCPT + 99 others); Wed, 3 Oct 2018 22:28:56 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:33447 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726964AbeJDC2z (ORCPT ); Wed, 3 Oct 2018 22:28:55 -0400 Received: by mail-ed1-f66.google.com with SMTP id g26-v6so6463854edp.0 for ; Wed, 03 Oct 2018 12:39:08 -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 :mime-version:content-transfer-encoding; bh=ls+XcqdmHnBV0GS3bS8NGlkMVyhd9AxDVYAww4RmSug=; b=WHcKmzmDc1eR3RjHo6WRbNx1WahwoWFYxfdR/EAPsjAvZdgQK30Jn2K6iYwm8/ZwUu Ysjc6p/M9vtJZPEMu6m7fae1L2ZjSr+63ZqyylwfKxJuEmvWjlvrRbtIoIQsLxlvUYr6 mrrmsMv7w5FYbBYA8o9SaMkZiTK+urlxxJasdJIZUrPrk9TdM2BsqDKJ8w8EMIfPzuGp UENODJIf9Tq3Onw1ZPGGsKvs8g8RpfI3Me266/xolz8LWut1a+z89Yna8Lvn25VKmnkw dqhfjDJNxB8QSdZpFOAnEGCkqsgnmWIvTl357e8bd9kCuEmflEfxMhjULXopfOj66W2/ clmQ== 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:mime-version:content-transfer-encoding; bh=ls+XcqdmHnBV0GS3bS8NGlkMVyhd9AxDVYAww4RmSug=; b=gMKagpFr1QiZfoObAlftn/kgYsnT+17tcKE9XJZgamh/EteSAxvCYkpCtp8WI4qmny 9agYA0EcxqT7SiR5TdwtF7K1dOFidIVV7qhzqnOlPAqvSMkYyMPT8j5JOGsGkEaU1+mU w9s+hK0FygkwneZ48kV2UCn/2NMjS69QIYKkZ+js0SwkE40rqDyenjouRW4p4q0mKPnD fZ1iTkhyvQMj2w8h/PvEz8G2sr+nUtWMDgJp4P3mUA/bYoOxZatMcAla2jVJjFlkk0/7 sKtHpOAyogxw1uwgIzIHN9nNvrDQamwhXHIW7AJEsCIKKNiBL9NBz65u6gwZI9NbnoAV iRmw== X-Gm-Message-State: ABuFfoiprDtR2RFzq0W48BpUznTrxdNeBtVHrMMSS1s6bUrTL4dWC8c8 4EWZDO3lYVMKg9yVmYpEDWU= X-Received: by 2002:a17:906:95da:: with SMTP id n26-v6mr3239995ejy.205.1538595547282; Wed, 03 Oct 2018 12:39:07 -0700 (PDT) Received: from piling.lan (80-71-134-83.u.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id b49-v6sm765263eda.70.2018.10.03.12.39.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Oct 2018 12:39:05 -0700 (PDT) From: Ricardo Ribalda Delgado To: David Woodhouse , Brian Norris , Boris Brezillon , Marek Vasut , Richard Weinberger , Zhouyang Jia , linux-mtd@lists.infradead.org, open list Cc: Ricardo Ribalda Delgado Subject: [PATCH v5 4/8] mtd: maps: gpio-addr-flash: Use order insted of size Date: Wed, 3 Oct 2018 21:38:55 +0200 Message-Id: <20181003193859.23928-4-ricardo.ribalda@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181003193859.23928-1-ricardo.ribalda@gmail.com> References: <20181003193859.23928-1-ricardo.ribalda@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org By using the order of the window instead of the size, we can replace a lot of expensive division and modulus on the code with simple bit operations. Signed-off-by: Ricardo Ribalda Delgado --- drivers/mtd/maps/gpio-addr-flash.c | 39 ++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/drivers/mtd/maps/gpio-addr-flash.c b/drivers/mtd/maps/gpio-addr-flash.c index 84404dcc7824..89cc8cce161b 100644 --- a/drivers/mtd/maps/gpio-addr-flash.c +++ b/drivers/mtd/maps/gpio-addr-flash.c @@ -25,6 +25,8 @@ #include #include +#define win_mask(x) ((BIT(x)) - 1) + #define DRIVER_NAME "gpio-addr-flash" /** @@ -34,7 +36,7 @@ * @gpio_count: number of GPIOs used to address * @gpio_addrs: array of GPIOs to twiddle * @gpio_values: cached GPIO values - * @win_size: dedicated memory size (if no GPIOs) + * @win_order: dedicated memory size (if no GPIOs) */ struct async_state { struct mtd_info *mtd; @@ -42,7 +44,7 @@ struct async_state { size_t gpio_count; unsigned *gpio_addrs; int *gpio_values; - unsigned long win_size; + unsigned int win_order; }; #define gf_map_info_to_state(mi) ((struct async_state *)(mi)->map_priv_1) @@ -60,7 +62,8 @@ static void gf_set_gpios(struct async_state *state, unsigned long ofs) { size_t i = 0; int value; - ofs /= state->win_size; + + ofs >>= state->win_order; do { value = ofs & (1 << i); if (state->gpio_values[i] != value) { @@ -83,7 +86,7 @@ static map_word gf_read(struct map_info *map, unsigned long ofs) gf_set_gpios(state, ofs); - word = readw(map->virt + (ofs % state->win_size)); + word = readw(map->virt + (ofs & win_mask(state->win_order))); test.x[0] = word; return test; } @@ -105,14 +108,14 @@ static void gf_copy_from(struct map_info *map, void *to, unsigned long from, ssi int this_len; while (len) { - if ((from % state->win_size) + len > state->win_size) - this_len = state->win_size - (from % state->win_size); - else - this_len = len; + this_len = from & win_mask(state->win_order); + this_len = BIT(state->win_order) - this_len; + this_len = min_t(int, len, this_len); gf_set_gpios(state, from); - memcpy_fromio(to, map->virt + (from % state->win_size), - this_len); + memcpy_fromio(to, + map->virt + (from & win_mask(state->win_order)), + this_len); len -= this_len; from += this_len; to += this_len; @@ -132,7 +135,7 @@ static void gf_write(struct map_info *map, map_word d1, unsigned long ofs) gf_set_gpios(state, ofs); d = d1.x[0]; - writew(d, map->virt + (ofs % state->win_size)); + writew(d, map->virt + (ofs & win_mask(state->win_order))); } /** @@ -152,13 +155,13 @@ static void gf_copy_to(struct map_info *map, unsigned long to, int this_len; while (len) { - if ((to % state->win_size) + len > state->win_size) - this_len = state->win_size - (to % state->win_size); - else - this_len = len; + this_len = to & win_mask(state->win_order); + this_len = BIT(state->win_order) - this_len; + this_len = min_t(int, len, this_len); gf_set_gpios(state, to); - memcpy_toio(map->virt + (to % state->win_size), from, len); + memcpy_toio(map->virt + (to & win_mask(state->win_order)), + from, len); len -= this_len; to += this_len; @@ -224,7 +227,7 @@ static int gpio_flash_probe(struct platform_device *pdev) state->gpio_count = gpios->end; state->gpio_addrs = (void *)(unsigned long)gpios->start; state->gpio_values = (void *)(state + 1); - state->win_size = resource_size(memory); + state->win_order = get_bitmask_order(resource_size(memory)) - 1; memset(state->gpio_values, 0xff, arr_size); state->map.name = DRIVER_NAME; @@ -233,7 +236,7 @@ static int gpio_flash_probe(struct platform_device *pdev) state->map.write = gf_write; state->map.copy_to = gf_copy_to; state->map.bankwidth = pdata->width; - state->map.size = state->win_size * (1 << state->gpio_count); + state->map.size = BIT(state->win_order + state->gpio_count); state->map.virt = devm_ioremap_resource(&pdev->dev, memory); if (IS_ERR(state->map.virt)) return PTR_ERR(state->map.virt); -- 2.19.0