From patchwork Thu Apr 19 03:14:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 133691 Delivered-To: patch@linaro.org Received: by 10.46.66.142 with SMTP id h14csp155812ljf; Wed, 18 Apr 2018 20:19:39 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/6/keE8YKhN21tvWTRUP14fXKY/u3e3KeYag00zHLWaj9yZNUKi5h+TW+Cv7qSUk2SF6G3 X-Received: by 10.80.240.199 with SMTP id a7mr6310379edm.90.1524107978850; Wed, 18 Apr 2018 20:19:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524107978; cv=none; d=google.com; s=arc-20160816; b=t66KnaE4PseHiGi5XfFIbsVO4ZIVJ4/u/wXftpMO7Dqle3SgVWtq7p8SnemIlns8hK Sb/sQ8HcSUR/VOryKgVI283dZEycJXBgpdJ5DiBfnqFFEPvh7ne6I6Ri2YX5m58k6YeI zK5iirFtJ3pipLY2YW1YX9+KTs+iInHhxq01sT5gUflWPxBtQo6JOioehAT7Qk2C78Z0 hCkHw/BJNJJgA7HXxWwCbb4neGzazvkROQArVLEPpiDj0ZmrMlIEwYNp/tGJdtWfJb0R xDeVSGPmREZrYojGHeZYHycx9Pl98E7XN6uP8azkOulQToolneXYAvNqDnkQOmWBF2HR LSYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:references:in-reply-to:message-id :date:to:from:dkim-signature:dkim-filter:arc-authentication-results; bh=n3WC8NsKbQc05x3QVBI2o/Ml5MtPcrsDE+ncKGvIldE=; b=pwcSVwiZVt2pMw7lc1mb20OIIBaq/jyBcBnQIEnGqQx55oI2Z59aVyJpw3PnCQc3bg h2qJEYtrvZ/hGkUwbO/xAMkYbA8WIT7og2zaHqYmRsx0hHpc29I253fCaRMgwyN3XLu2 1+u1hhaUZaffHsUxp/qxUqvyEWhN5Lis07saJ45tQyv5XslsHQVQ3bkByOZvcczoqXKY KS9zMARjv0Cle2GtGKxQ6x2aBYbnseTVbaSpMjfhs8lixtTQR8eF7dxCvVLMA+1Y2+rS o5IGDCcCCwCon0w8xrn2MOjj4JbN5/plwZVLWtjlOdN9pBTr35PYGMJCM5N864lTAwwP bYyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@nifty.com header.s=dec2015msa header.b=QAgltNmN; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id t13si1232077eda.409.2018.04.18.20.19.38; Wed, 18 Apr 2018 20:19:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@nifty.com header.s=dec2015msa header.b=QAgltNmN; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by lists.denx.de (Postfix, from userid 105) id 6DFA9C21F92; Thu, 19 Apr 2018 03:17:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id DD5E4C21F16; Thu, 19 Apr 2018 03:16:23 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 9802EC21F89; Thu, 19 Apr 2018 03:15:42 +0000 (UTC) Received: from conuserg-12.nifty.com (conuserg-12.nifty.com [210.131.2.79]) by lists.denx.de (Postfix) with ESMTPS id 0741AC21F21 for ; Thu, 19 Apr 2018 03:15:41 +0000 (UTC) Received: from pug.e01.socionext.com (p14092-ipngnfx01kyoto.kyoto.ocn.ne.jp [153.142.97.92]) (authenticated) by conuserg-12.nifty.com with ESMTP id w3J3EwYq013098; Thu, 19 Apr 2018 12:15:00 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-12.nifty.com w3J3EwYq013098 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1524107701; bh=2A7yqNhHFx6RebqTlFnLZYVGuLu+2ElcVoKR6388D3w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QAgltNmNBpvD2u/6lwXyKlp2+8vwOhebLlkE9UrJWEk+b3swf39EkvOtH+AGoMXAT Ad0AOkpMOLOJlYSXPM7Lg2vDOAn+4Rc5id7J1hpUEaT6MibU7PnaY5ewp61ZWEKhhH +0uG/Yh04Dd1gi+p8UY+lLYeqcViYcD2tAntMDW42uuq4Tk68f54a3ee+YRv8ZojmR Blu4+C0sLTy6ntHiK7D2YShYnRwl2C0oPhUrxNN4G72NmVUpIa6pVilh7tpuWzmLD1 HvACfdbg8VwTbqO9A3ddr+VhDdGH8MtPLnsxQwWkvLQlezMhWcHFApVEWfTkarOaG0 a1n5NnGCjQ3lQ== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: u-boot@lists.denx.de Date: Thu, 19 Apr 2018 12:14:01 +0900 Message-Id: <1524107644-28849-2-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524107644-28849-1-git-send-email-yamada.masahiro@socionext.com> References: <1524107644-28849-1-git-send-email-yamada.masahiro@socionext.com> Cc: Marek Vasut , Tom Rini , Jassi Brar , Masami Hiramatsu , Jagan Teki Subject: [U-Boot] [PATCH v2 1/4] regmap: clean up regmap allocation X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Putting zero length array at the end of struct is a common technique to embed arbitrary length of members. There is no good reason to let regmap_alloc_count() branch by "if (count <= 1)". As far as I understood the code, regmap->base is an alias of regmap->ranges[0].start, but it is not helpful but make the code just ugly. Rename regmap_alloc_count() to regmap_alloc() because the _count suffix seems pointless. Signed-off-by: Masahiro Yamada Reviewed-by: Simon Glass --- Changes in v2: - Fix up test and sti drivers drivers/core/regmap.c | 31 +++++++++---------------------- drivers/phy/sti_usb_phy.c | 4 ++-- drivers/pinctrl/pinctrl-sti.c | 4 ++-- drivers/reset/sti-reset.c | 2 +- drivers/sysreset/sysreset_sti.c | 2 +- drivers/usb/host/dwc3-sti-glue.c | 2 +- include/regmap.h | 7 ++----- test/dm/regmap.c | 13 +++++-------- 8 files changed, 23 insertions(+), 42 deletions(-) diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c index 8a0e00f..6c3dbe9 100644 --- a/drivers/core/regmap.c +++ b/drivers/core/regmap.c @@ -18,22 +18,13 @@ DECLARE_GLOBAL_DATA_PTR; -static struct regmap *regmap_alloc_count(int count) +static struct regmap *regmap_alloc(int count) { struct regmap *map; - map = malloc(sizeof(struct regmap)); + map = malloc(sizeof(*map) + sizeof(map->ranges[0]) * count); if (!map) return NULL; - if (count <= 1) { - map->range = &map->base_range; - } else { - map->range = malloc(count * sizeof(struct regmap_range)); - if (!map->range) { - free(map); - return NULL; - } - } map->range_count = count; return map; @@ -46,12 +37,11 @@ int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count, struct regmap_range *range; struct regmap *map; - map = regmap_alloc_count(count); + map = regmap_alloc(count); if (!map) return -ENOMEM; - map->base = *reg; - for (range = map->range; count > 0; reg += 2, range++, count--) { + for (range = map->ranges; count > 0; reg += 2, range++, count--) { range->start = *reg; range->size = reg[1]; } @@ -84,11 +74,11 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp) if (!count) return -EINVAL; - map = regmap_alloc_count(count); + map = regmap_alloc(count); if (!map) return -ENOMEM; - for (range = map->range, index = 0; count > 0; + for (range = map->ranges, index = 0; count > 0; count--, range++, index++) { fdt_size_t sz; if (of_live_active()) { @@ -102,7 +92,6 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp) range->size = sz; } } - map->base = map->range[0].start; *mapp = map; @@ -116,15 +105,13 @@ void *regmap_get_range(struct regmap *map, unsigned int range_num) if (range_num >= map->range_count) return NULL; - range = &map->range[range_num]; + range = &map->ranges[range_num]; return map_sysmem(range->start, range->size); } int regmap_uninit(struct regmap *map) { - if (map->range_count > 1) - free(map->range); free(map); return 0; @@ -132,7 +119,7 @@ int regmap_uninit(struct regmap *map) int regmap_read(struct regmap *map, uint offset, uint *valp) { - uint32_t *ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE); + u32 *ptr = map_physmem(map->ranges[0].start + offset, 4, MAP_NOCACHE); *valp = le32_to_cpu(readl(ptr)); @@ -141,7 +128,7 @@ int regmap_read(struct regmap *map, uint offset, uint *valp) int regmap_write(struct regmap *map, uint offset, uint val) { - uint32_t *ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE); + u32 *ptr = map_physmem(map->ranges[0].start + offset, 4, MAP_NOCACHE); writel(cpu_to_le32(val), ptr); diff --git a/drivers/phy/sti_usb_phy.c b/drivers/phy/sti_usb_phy.c index 727fb8b..181a338 100644 --- a/drivers/phy/sti_usb_phy.c +++ b/drivers/phy/sti_usb_phy.c @@ -65,12 +65,12 @@ static int sti_usb_phy_init(struct phy *usb_phy) void __iomem *reg; /* set ctrl picophy value */ - reg = (void __iomem *)phy->regmap->base + phy->ctrl; + reg = (void __iomem *)phy->regmap->ranges[0].start + phy->ctrl; /* CTRL_PORT mask is 0x1f */ clrsetbits_le32(reg, 0x1f, STIH407_USB_PICOPHY_CTRL_PORT_CONF); /* set ports parameters overriding */ - reg = (void __iomem *)phy->regmap->base + phy->param; + reg = (void __iomem *)phy->regmap->ranges[0].start + phy->param; /* PARAM_DEF mask is 0xffffffff */ clrsetbits_le32(reg, 0xffffffff, STIH407_USB_PICOPHY_PARAM_DEF); diff --git a/drivers/pinctrl/pinctrl-sti.c b/drivers/pinctrl/pinctrl-sti.c index a9c1495..890a7c2 100644 --- a/drivers/pinctrl/pinctrl-sti.c +++ b/drivers/pinctrl/pinctrl-sti.c @@ -62,7 +62,7 @@ void sti_alternate_select(struct udevice *dev, struct sti_pin_desc *pin_desc) int bank = pin_desc->bank; int pin = pin_desc->pin; - sysconfreg = (unsigned long *)plat->regmap->base; + sysconfreg = (unsigned long *)plat->regmap->ranges[0].start; switch (bank) { case 0 ... 5: /* in "SBC Bank" */ @@ -96,7 +96,7 @@ void sti_pin_configure(struct udevice *dev, struct sti_pin_desc *pin_desc) unsigned long *sysconfreg; int bank = pin_desc->bank; - sysconfreg = (unsigned long *)plat->regmap->base + 40; + sysconfreg = (unsigned long *)plat->regmap->ranges[0].start + 40; /* * NOTE: The PIO configuration for the PIO pins in the diff --git a/drivers/reset/sti-reset.c b/drivers/reset/sti-reset.c index 0fc5a28..41d7db4 100644 --- a/drivers/reset/sti-reset.c +++ b/drivers/reset/sti-reset.c @@ -218,7 +218,7 @@ phys_addr_t sti_reset_get_regmap(const char *compatible) return -ENODEV; } - return regmap->base; + return regmap->ranges[0].start; } static int sti_reset_program_hw(struct reset_ctl *reset_ctl, int assert) diff --git a/drivers/sysreset/sysreset_sti.c b/drivers/sysreset/sysreset_sti.c index 910f486..4fa7fd5 100644 --- a/drivers/sysreset/sysreset_sti.c +++ b/drivers/sysreset/sysreset_sti.c @@ -59,7 +59,7 @@ static int sti_sysreset_probe(struct udevice *dev) return -ENODEV; } - priv->base = regmap->base; + priv->base = regmap->ranges[0].start; return 0; } diff --git a/drivers/usb/host/dwc3-sti-glue.c b/drivers/usb/host/dwc3-sti-glue.c index ce9335e..f505738 100644 --- a/drivers/usb/host/dwc3-sti-glue.c +++ b/drivers/usb/host/dwc3-sti-glue.c @@ -134,7 +134,7 @@ static int sti_dwc3_glue_ofdata_to_platdata(struct udevice *dev) pr_err("unable to find regmap\n"); return -ENODEV; } - plat->syscfg_base = regmap->base; + plat->syscfg_base = regmap->ranges[0].start; /* get powerdown reset */ ret = reset_get_by_name(dev, "powerdown", &plat->powerdown_ctl); diff --git a/include/regmap.h b/include/regmap.h index 493a5d8..0d1dc5a 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -22,15 +22,12 @@ struct regmap_range { /** * struct regmap - a way of accessing hardware/bus registers * - * @base: Base address of register map * @range_count: Number of ranges available within the map - * @range: Pointer to the list of ranges, allocated if @range_count > 1 - * @base_range: If @range_count is <= 1, @range points here + * @ranges: Array of ranges */ struct regmap { - phys_addr_t base; int range_count; - struct regmap_range *range, base_range; + struct regmap_range ranges[0]; }; /* diff --git a/test/dm/regmap.c b/test/dm/regmap.c index 7f66058..8125345 100644 --- a/test/dm/regmap.c +++ b/test/dm/regmap.c @@ -26,23 +26,20 @@ static int dm_test_regmap_base(struct unit_test_state *uts) map = syscon_get_regmap(dev); ut_assertok_ptr(map); ut_asserteq(1, map->range_count); - ut_asserteq(0x10, map->base); - ut_asserteq(0x10, map->range->start); - ut_asserteq(4, map->range->size); - ut_asserteq_ptr(&map->base_range, map->range); + ut_asserteq(0x10, map->ranges[0].start); + ut_asserteq(4, map->ranges[0].size); ut_asserteq(0x10, map_to_sysmem(regmap_get_range(map, 0))); ut_assertok(uclass_get_device(UCLASS_SYSCON, 1, &dev)); map = syscon_get_regmap(dev); ut_assertok_ptr(map); ut_asserteq(4, map->range_count); - ut_asserteq(0x20, map->base); - ut_assert(&map->base_range != map->range); + ut_asserteq(0x20, map->ranges[0].start); for (i = 0; i < 4; i++) { const unsigned long addr = 0x20 + 8 * i; - ut_asserteq(addr, map->range[i].start); - ut_asserteq(5 + i, map->range[i].size); + ut_asserteq(addr, map->ranges[i].start); + ut_asserteq(5 + i, map->ranges[i].size); ut_asserteq(addr, map_to_sysmem(regmap_get_range(map, i))); }