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))); } From patchwork Thu Apr 19 03:14:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 133687 Delivered-To: patch@linaro.org Received: by 10.46.66.142 with SMTP id h14csp153824ljf; Wed, 18 Apr 2018 20:16:25 -0700 (PDT) X-Google-Smtp-Source: AIpwx48sXaWsr1cZPA1IRpXV7iaDgZKhT99cKPYYulv46vqfmyCWgj1zbNhPDbDEVblzmOdaJPGu X-Received: by 10.80.179.202 with SMTP id t10mr6181003edd.14.1524107785140; Wed, 18 Apr 2018 20:16:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524107785; cv=none; d=google.com; s=arc-20160816; b=H8kNEiZhTY7Wiov1708HRYz0GTutrUeZasL5NeTL/+rQ9q6Wn4ElkXbNOGpYiVEcBH n50zK7crO6/mmTSA5HtnK29QzQfJ+WFW4qkLSpMQL45TM9qAGAVvRiPdjWsYUoilXupi 34qzB86EFYLXt7BvrFAAXjbsXOtnnEbR4Vp86OQRsmJ1VtTYho4lSuH/E067MS/DcpII dYfPn/n7lLMQuTnHD34N6ABBoU99hYgvaQC8Ni3teJvEhi13p9o1NWI0yptW8INvgRg9 BM2t7JpnmqUravo15EDQWTLPf/7uWy+v4E9Vrfy1XrKTyVcGsMX4gwqm4q5nZ0/pe9z7 doYw== 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=ZAbxdheFQ6rCcOqcLEd/7xbgJ1tRV61bUn4l0q5OqvA=; b=pjFRCAgBm4j7Fdk/Ysm1yCu1Jzo+NA7n2sHcGUA7ik0o92BXwr0qIy6sbt8JnojSPH Mdcl/QUPbUadlJNyqrO6/p8VFCW34O31MCUXw4/hfZvlYe8YVq01Ez7f8H1+1+OfyZro fmDHUZ8LFVNdTaIw2yywVe3LgARS9xDyHHvClMWl3ALpY/LrcfgjdcKh0jpWdjxyRp7y 70lyveOfW8ISdkcQQEuLT7xeXx9Y9RMulLZmWeUgg/V/emKj7HSwrnH7FWlh+NxM/Tyt rVn120/GtE87QSfgxSEsjdmFnJWLASd1hM3jzNJjAhKYiplvYHn+XNSnKV5lZI3tqFrO Xrzw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@nifty.com header.s=dec2015msa header.b=Ryoz38TG; 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 p5si2622703eda.317.2018.04.18.20.16.24; Wed, 18 Apr 2018 20:16:25 -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=Ryoz38TG; 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 BFDD3C21F21; Thu, 19 Apr 2018 03:16:19 +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 B0901C21EEF; Thu, 19 Apr 2018 03:16:17 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 9AC88C21F16; Thu, 19 Apr 2018 03:15:33 +0000 (UTC) Received: from conuserg-12.nifty.com (conuserg-12.nifty.com [210.131.2.79]) by lists.denx.de (Postfix) with ESMTPS id 71928C21F21 for ; Thu, 19 Apr 2018 03:15:31 +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 w3J3EwYr013098; Thu, 19 Apr 2018 12:15:01 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-12.nifty.com w3J3EwYr013098 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1524107701; bh=g2QoQSRTiOQ7vVa7DYsBTdwDPeep7CaFVmhF5KS6iXw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ryoz38TGIizmWCtWAuMqx2S9e3tLAv19pihBgiVoPkyH30StIRhKtly6AoXPNfNit m77p/Mn1aE3Ndu4X3sPPvPuMylKKfq/zx/tMp59zYK3IyormD2se9TyK0q/LbgLMKf Du+HgP6yLGoNtUJpvdmt4B6xhTTA1hMNP2sIk9KW2sIW0S00yH9Nl4Tip4vG8eW0YU Tz4Zvzajf9lO76FpkadUguIvgnIOsLGTTJjUrPI9rq8X6NCdJNumPDzr1vvxtN5FZX G/zs4hM76IIKKVELDgD+NwDUOdSTiHj3aMySHnp97ZoJg5PXjDdmfw/d1c1zrYNcPa zf8aenwLdHNaA== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: u-boot@lists.denx.de Date: Thu, 19 Apr 2018 12:14:02 +0900 Message-Id: <1524107644-28849-3-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: Tom Rini , Jassi Brar , Masami Hiramatsu Subject: [U-Boot] [PATCH v2 2/4] dm: ofnode: add ofnode_device_is_compatible() helper 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" device_is_compatible() takes udevice, but there is no such a helper that takes ofnode. Signed-off-by: Masahiro Yamada Reviewed-by: Simon Glass --- Changes in v2: None drivers/core/device.c | 8 +------- drivers/core/ofnode.c | 11 +++++++++++ include/dm/ofnode.h | 11 +++++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/drivers/core/device.c b/drivers/core/device.c index 940a153..8d95787 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -709,13 +709,7 @@ int device_set_name(struct udevice *dev, const char *name) bool device_is_compatible(struct udevice *dev, const char *compat) { - const void *fdt = gd->fdt_blob; - ofnode node = dev_ofnode(dev); - - if (ofnode_is_np(node)) - return of_device_is_compatible(ofnode_to_np(node), compat, NULL, NULL); - else - return !fdt_node_check_compatible(fdt, ofnode_to_offset(node), compat); + return ofnode_device_is_compatible(dev_ofnode(dev), compat); } bool of_machine_is_compatible(const char *compat) diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 5909a25..ee2109b 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -687,3 +687,14 @@ u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr) else return fdt_translate_address(gd->fdt_blob, ofnode_to_offset(node), in_addr); } + +int ofnode_device_is_compatible(ofnode node, const char *compat) +{ + if (ofnode_is_np(node)) + return of_device_is_compatible(ofnode_to_np(node), compat, + NULL, NULL); + else + return !fdt_node_check_compatible(gd->fdt_blob, + ofnode_to_offset(node), + compat); +} diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index 0d00840..a2c6a50 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -681,4 +681,15 @@ int ofnode_read_resource_byname(ofnode node, const char *name, * @return the translated address; OF_BAD_ADDR on error */ u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr); + +/** + * ofnode_device_is_compatible() - check if the node is compatible with compat + * + * This allows to check whether the node is comaptible with the compat. + * + * @node: Device tree node for which compatible needs to be verified. + * @compat: Compatible string which needs to verified in the given node. + * @return true if OK, false if the compatible is not found + */ +int ofnode_device_is_compatible(ofnode node, const char *compat); #endif From patchwork Thu Apr 19 03:14:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 133690 Delivered-To: patch@linaro.org Received: by 10.46.66.142 with SMTP id h14csp155402ljf; Wed, 18 Apr 2018 20:18:59 -0700 (PDT) X-Google-Smtp-Source: AIpwx48fl8cjC3fh2AKI5GaY4svFXjtBSqb/N0A21xKzHb/R52TqLz7pVsUkk5l0mPlTrDZiL8Wr X-Received: by 10.80.134.15 with SMTP id o15mr5020152edo.243.1524107939392; Wed, 18 Apr 2018 20:18:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524107939; cv=none; d=google.com; s=arc-20160816; b=MKbFYfaxmCfuOHmH3dkY8yhNp3TthxJQlejqWQW8il2G23KG94vJDAi3DC3D9AqC6/ DDasr8FBBZcju+I2VONLIIEVqaB+lwrTJR7/O5zxp9nZeSrx9BfweCrwZ0dVLaZ1HX3I SiHIxZPOV+yPqOPybpahp2ZD5BBQhOg5AEKFuO/y6rN8LDla9WN8m9iuS0cdkKtCXbFi xWn10B0EjgJkViyr3u42KY130oyMwc2Tt7qpjYnMGyUltRPzOm9GUJQhhHe3Eukf7GO1 gtOXoNQ2GnfNSbkIeBwPnhdGb+ZO9dSOGXEzdGhNyjJUwC3ff78QVvnUZhDRuhRmMyyR uEig== 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=jkgQKtXNqPCr5SZoMc1ZUJjhKNRk1aUEN3fyuBwSMgU=; b=xayJkt75pPdM15/uWO/FB3rTa29Bd9TgmAyORpLgudmxJqla2uepOEWm5cd2agorAB GHkB/yOL3TL4O/YNInSKjElEVSopuXTbn71AXeV/1ZLCs2T+kUUP095OMG48ePV/ronu qTXrhbH2qfdp0xQbqCMtgFTXxvrpnBeRwO2kKc8eouPMNZKWvD3ITFXyecFYDLW7+PfO 7k3LG5yzSLSZx5V0+FVS538/B144/vTuOr0duwupaO7/D1QFvBgqIhAeQHpywpic49L0 HX51Lxz4ur09v5WzXQQnu7VwSZVp/cw054MipjB5RZkPKUsXfUP4ZSaKSTyhDtu7721X SzEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@nifty.com header.s=dec2015msa header.b=VEqodADb; 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 t2si977566edf.433.2018.04.18.20.18.59; Wed, 18 Apr 2018 20:18:59 -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=VEqodADb; 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 043FCC21F53; Thu, 19 Apr 2018 03:16:41 +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 C9A1DC21F6D; Thu, 19 Apr 2018 03:16:18 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A6E86C21F3F; Thu, 19 Apr 2018 03:15:33 +0000 (UTC) Received: from conuserg-12.nifty.com (conuserg-12.nifty.com [210.131.2.79]) by lists.denx.de (Postfix) with ESMTPS id 600D5C21F02 for ; Thu, 19 Apr 2018 03:15:31 +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 w3J3EwYs013098; Thu, 19 Apr 2018 12:15:02 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-12.nifty.com w3J3EwYs013098 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1524107702; bh=5slu6n/I9WcbQ4pj7wLKZsjatB9oIuzTUkVQITzTUS8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VEqodADbSkgPPIQxEble5uRihO4W7c4FJo/E8SqzHiPI0r6MskDm2xpuKHfzQR3DE ecpUTStLMk99Ys0UKbQnBNql+iyopvPVWWOXeyi12Pw725i4dHBZxLWF8rrB58Kga4 2EaQ3Jbmk2IxyjGZPfJDqO4FtcGGWbym2lIIL054rZxTfzkd0AYF9QUJbEp7gs4ke8 ABTH9HkuDqe0FOyetuye/nxdMuf2BOJPtIRP86zEtZDRfPIRAJLJMwXSfCBWR87FBN /db1DqY5RG0c+r8pBjyvgvvyXNF17EDGZyjmXNXTXqYSlAtq1LmFd0i3eb64g8/pvt G9ly4pV0J1KOQ== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: u-boot@lists.denx.de Date: Thu, 19 Apr 2018 12:14:03 +0900 Message-Id: <1524107644-28849-4-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: Tom Rini , Jassi Brar , Masami Hiramatsu Subject: [U-Boot] [PATCH v2 3/4] regmap: change regmap_init_mem() to take ofnode instead udevice 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" Currently, regmap_init_mem() takes a udevice. This requires the node has already been associated with a device. It prevents syscon/regmap from behaving like those in Linux. Change the first argumenet to take a device node. Signed-off-by: Masahiro Yamada Acked-by: Neil Armstrong Reviewed-by: Simon Glass --- Changes in v2: None arch/arm/mach-aspeed/ast2500/sdram_ast2500.c | 2 +- drivers/core/regmap.c | 11 +++++------ drivers/core/syscon-uclass.c | 2 +- drivers/phy/meson-gxl-usb2.c | 2 +- drivers/phy/meson-gxl-usb3.c | 2 +- drivers/ram/rockchip/dmc-rk3368.c | 2 +- drivers/ram/rockchip/sdram_rk3188.c | 2 +- drivers/ram/rockchip/sdram_rk322x.c | 2 +- drivers/ram/rockchip/sdram_rk3288.c | 2 +- drivers/ram/rockchip/sdram_rk3399.c | 2 +- drivers/ram/stm32mp1/stm32mp1_ram.c | 2 +- drivers/reset/reset-meson.c | 2 +- include/regmap.h | 4 ++-- 13 files changed, 18 insertions(+), 19 deletions(-) diff --git a/arch/arm/mach-aspeed/ast2500/sdram_ast2500.c b/arch/arm/mach-aspeed/ast2500/sdram_ast2500.c index 6383f72..f267c58 100644 --- a/arch/arm/mach-aspeed/ast2500/sdram_ast2500.c +++ b/arch/arm/mach-aspeed/ast2500/sdram_ast2500.c @@ -392,7 +392,7 @@ static int ast2500_sdrammc_ofdata_to_platdata(struct udevice *dev) struct regmap *map; int ret; - ret = regmap_init_mem(dev, &map); + ret = regmap_init_mem(dev_ofnode(dev), &map); if (ret) return ret; diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c index 6c3dbe9..1185a44 100644 --- a/drivers/core/regmap.c +++ b/drivers/core/regmap.c @@ -51,7 +51,7 @@ int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count, return 0; } #else -int regmap_init_mem(struct udevice *dev, struct regmap **mapp) +int regmap_init_mem(ofnode node, struct regmap **mapp) { struct regmap_range *range; struct regmap *map; @@ -59,14 +59,13 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp) int addr_len, size_len, both_len; int len; int index; - ofnode node = dev_ofnode(dev); struct resource r; - addr_len = dev_read_simple_addr_cells(dev->parent); - size_len = dev_read_simple_size_cells(dev->parent); + addr_len = ofnode_read_simple_addr_cells(ofnode_get_parent(node)); + size_len = ofnode_read_simple_size_cells(ofnode_get_parent(node)); both_len = addr_len + size_len; - len = dev_read_size(dev, "reg"); + len = ofnode_read_size(node, "reg"); if (len < 0) return len; len /= sizeof(fdt32_t); @@ -87,7 +86,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp) range->size = r.end - r.start + 1; } else { range->start = fdtdec_get_addr_size_fixed(gd->fdt_blob, - dev_of_offset(dev), "reg", index, + ofnode_to_offset(node), "reg", index, addr_len, size_len, &sz, true); range->size = sz; } diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c index a69937e..c99409b 100644 --- a/drivers/core/syscon-uclass.c +++ b/drivers/core/syscon-uclass.c @@ -41,7 +41,7 @@ static int syscon_pre_probe(struct udevice *dev) return regmap_init_mem_platdata(dev, plat->reg, ARRAY_SIZE(plat->reg), &priv->regmap); #else - return regmap_init_mem(dev, &priv->regmap); + return regmap_init_mem(dev_ofnode(dev), &priv->regmap); #endif } diff --git a/drivers/phy/meson-gxl-usb2.c b/drivers/phy/meson-gxl-usb2.c index 15c9c89..7242bf6 100644 --- a/drivers/phy/meson-gxl-usb2.c +++ b/drivers/phy/meson-gxl-usb2.c @@ -195,7 +195,7 @@ int meson_gxl_usb2_phy_probe(struct udevice *dev) struct phy_meson_gxl_usb2_priv *priv = dev_get_priv(dev); int ret; - ret = regmap_init_mem(dev, &priv->regmap); + ret = regmap_init_mem(dev_ofnode(dev), &priv->regmap); if (ret) return ret; diff --git a/drivers/phy/meson-gxl-usb3.c b/drivers/phy/meson-gxl-usb3.c index a385fbd..47a41fd 100644 --- a/drivers/phy/meson-gxl-usb3.c +++ b/drivers/phy/meson-gxl-usb3.c @@ -166,7 +166,7 @@ int meson_gxl_usb3_phy_probe(struct udevice *dev) struct phy_meson_gxl_usb3_priv *priv = dev_get_priv(dev); int ret; - ret = regmap_init_mem(dev, &priv->regmap); + ret = regmap_init_mem(dev_ofnode(dev), &priv->regmap); if (ret) return ret; diff --git a/drivers/ram/rockchip/dmc-rk3368.c b/drivers/ram/rockchip/dmc-rk3368.c index bfcb1dd..9bf64bf 100644 --- a/drivers/ram/rockchip/dmc-rk3368.c +++ b/drivers/ram/rockchip/dmc-rk3368.c @@ -880,7 +880,7 @@ static int rk3368_dmc_ofdata_to_platdata(struct udevice *dev) #if !CONFIG_IS_ENABLED(OF_PLATDATA) struct rk3368_sdram_params *plat = dev_get_platdata(dev); - ret = regmap_init_mem(dev, &plat->map); + ret = regmap_init_mem(dev_ofnode(dev), &plat->map); if (ret) return ret; #endif diff --git a/drivers/ram/rockchip/sdram_rk3188.c b/drivers/ram/rockchip/sdram_rk3188.c index 365d00e..c0a2618 100644 --- a/drivers/ram/rockchip/sdram_rk3188.c +++ b/drivers/ram/rockchip/sdram_rk3188.c @@ -842,7 +842,7 @@ static int rk3188_dmc_ofdata_to_platdata(struct udevice *dev) printf("%s: Cannot read rockchip,sdram-params\n", __func__); return -EINVAL; } - ret = regmap_init_mem(dev, ¶ms->map); + ret = regmap_init_mem(dev_ofnode(dev), ¶ms->map); if (ret) return ret; #endif diff --git a/drivers/ram/rockchip/sdram_rk322x.c b/drivers/ram/rockchip/sdram_rk322x.c index cc3138b..dca07db 100644 --- a/drivers/ram/rockchip/sdram_rk322x.c +++ b/drivers/ram/rockchip/sdram_rk322x.c @@ -744,7 +744,7 @@ static int rk322x_dmc_ofdata_to_platdata(struct udevice *dev) printf("%s: Cannot read rockchip,sdram-params\n", __func__); return -EINVAL; } - ret = regmap_init_mem(dev, ¶ms->map); + ret = regmap_init_mem(dev_ofnode(dev), ¶ms->map); if (ret) return ret; #endif diff --git a/drivers/ram/rockchip/sdram_rk3288.c b/drivers/ram/rockchip/sdram_rk3288.c index 95efb11..ffb663c 100644 --- a/drivers/ram/rockchip/sdram_rk3288.c +++ b/drivers/ram/rockchip/sdram_rk3288.c @@ -1003,7 +1003,7 @@ static int rk3288_dmc_ofdata_to_platdata(struct udevice *dev) priv->is_veyron = !fdt_node_check_compatible(blob, 0, "google,veyron"); #endif - ret = regmap_init_mem(dev, ¶ms->map); + ret = regmap_init_mem(dev_ofnode(dev), ¶ms->map); if (ret) return ret; #endif diff --git a/drivers/ram/rockchip/sdram_rk3399.c b/drivers/ram/rockchip/sdram_rk3399.c index 5cb470c..6e2a39e 100644 --- a/drivers/ram/rockchip/sdram_rk3399.c +++ b/drivers/ram/rockchip/sdram_rk3399.c @@ -1100,7 +1100,7 @@ static int rk3399_dmc_ofdata_to_platdata(struct udevice *dev) __func__, ret); return ret; } - ret = regmap_init_mem(dev, &plat->map); + ret = regmap_init_mem(dev_ofnode(dev), &plat->map); if (ret) printf("%s: regmap failed %d\n", __func__, ret); diff --git a/drivers/ram/stm32mp1/stm32mp1_ram.c b/drivers/ram/stm32mp1/stm32mp1_ram.c index 9599444..a4d5906 100644 --- a/drivers/ram/stm32mp1/stm32mp1_ram.c +++ b/drivers/ram/stm32mp1/stm32mp1_ram.c @@ -149,7 +149,7 @@ static int stm32mp1_ddr_probe(struct udevice *dev) debug("STM32MP1 DDR probe\n"); priv->dev = dev; - ret = regmap_init_mem(dev, &map); + ret = regmap_init_mem(dev_ofnode(dev), &map); if (ret) return ret; diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c index 5324f86..c41d176 100644 --- a/drivers/reset/reset-meson.c +++ b/drivers/reset/reset-meson.c @@ -77,7 +77,7 @@ static int meson_reset_probe(struct udevice *dev) { struct meson_reset_priv *priv = dev_get_priv(dev); - return regmap_init_mem(dev, &priv->regmap); + return regmap_init_mem(dev_ofnode(dev), &priv->regmap); } U_BOOT_DRIVER(meson_reset) = { diff --git a/include/regmap.h b/include/regmap.h index 0d1dc5a..a5a4646 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -48,10 +48,10 @@ int regmap_read(struct regmap *map, uint offset, uint *valp); * * Use regmap_uninit() to free it. * - * @dev: Device that uses this map + * @node: Device node that uses this map * @mapp: Returns allocated map */ -int regmap_init_mem(struct udevice *dev, struct regmap **mapp); +int regmap_init_mem(ofnode node, struct regmap **mapp); /** * regmap_init_mem_platdata() - Set up a new memory register map for of-platdata From patchwork Thu Apr 19 03:14:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 133689 Delivered-To: patch@linaro.org Received: by 10.46.66.142 with SMTP id h14csp155206ljf; Wed, 18 Apr 2018 20:18:40 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/eKMOsxcE7L2fCbhoJfMMAC47nzL4bU9Orwi7PjQKt8p8vm9bJ0heWmo9o94X172tWsD2m X-Received: by 10.80.200.139 with SMTP id d11mr6243911edh.74.1524107920726; Wed, 18 Apr 2018 20:18:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524107920; cv=none; d=google.com; s=arc-20160816; b=pbcNHKdGLFrYLrjpXz79XUeajguqucwlYZFM1aorjQxwRE1nXnaLbqPBSA9AYRw6S/ H7Ro6NGs17i/oB3cdFHmVQ545nvxY1bKp26aIP+8HBMWlT8IQUh+DE7+Vhv6LL2ga2uV lELDNg2XrrRCvD/MDnQNNR2AWu4dzW5vfrRfRxzZe1MN8wDcfJ3/VPBV2DSP6mrByDk/ YGXs2cmDJAwTSRSPs7oYPWCzgrVxDH0O6dIMNHHmKTyJhlra2j7bULBPNfDhCBN3vG9U UNurqHJbAjzHNNV5ruq21AhX9XTZb+MxaHL+wVbMEeUUIjnI1iO+uUVSr3hgaAVZMvNa 3FIg== 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=1jrJ2egH1Hh7Rxrt92WcbQTUXryQVR84NXexpP+F7kA=; b=C75UnOLFK2lU2RdLL2fVF8WyuoXpcjUg1WBSuAHnLYQYcgKNLTS0EIL7X7gDzFqMit 3ty2zRh5KmSR4fjc4t0l1FLV6ulR6o7iJPM7RWzDkbJPBLCrDxECsgla/BVwTh9i8qld 3EyBXmfQaOLEUTf/w39r4nJww6UjeDRYSk69mz4xVJSG2JBh8exr05N8u2JgXdUtNL/G YXcMzkbse06RWNagyTusH3xTeZyA/vlb/pDMtTsmep4G7tuV4Q+ClmGezhSVHbTAxAyg knMHKGennz95O+TW3wWKS48SgB95uwm+ON5EMHZrhv0bed7WRFSVzLJx2EUatahxMEHj ijRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@nifty.com header.s=dec2015msa header.b=IUDbpYKZ; 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 j62si1489781edb.430.2018.04.18.20.18.40; Wed, 18 Apr 2018 20:18:40 -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=IUDbpYKZ; 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 55B76C21F8F; Thu, 19 Apr 2018 03:17:23 +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 2A7B5C21F91; Thu, 19 Apr 2018 03:16:21 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 1BFFBC21F3F; Thu, 19 Apr 2018 03:16:06 +0000 (UTC) Received: from conuserg-12.nifty.com (conuserg-12.nifty.com [210.131.2.79]) by lists.denx.de (Postfix) with ESMTPS id D651DC21EEF for ; Thu, 19 Apr 2018 03:16:05 +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 w3J3EwYt013098; Thu, 19 Apr 2018 12:15:03 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-12.nifty.com w3J3EwYt013098 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1524107703; bh=dmjEIBveWv78Q7bpILjOYutjmfS2saGXx0+VWH9bqMo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IUDbpYKZDiwyWS9mCv6orDO7ZBZFd8EYNcapSFGsGZn2kxmipa5fwPf3A4+xWf4Tr Eqy8VRbsj4iDHNabTxxeeuL7mYxHqmUhgs5N7ptbxKWsunLB4PjWfxzGiIvuQ1Ap8M Hw9ke10EvMF065CnmZiZzlGBW9U80TxipVXyE1KM17S8mRQVGWPaU2kBW2SKVQnB1W awd4oxv9AZne+hdRPBltyJpoSoca2wCcOO92D9QtKYL3UollLI1tpQ2nKHfpyRNDeU tcOKGSVQWIPaTCWLGbteL8FcqhOaDltJ1CxbYy3/+OpnYhRkazK+emnfdo3K31tGx+ gHRZzPlTPyn3w== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: u-boot@lists.denx.de Date: Thu, 19 Apr 2018 12:14:04 +0900 Message-Id: <1524107644-28849-5-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: Tom Rini , Jassi Brar , Masami Hiramatsu Subject: [U-Boot] [PATCH v2 4/4] syscon: add Linux-compatible syscon API 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" The syscon implementation in U-Boot is different from that in Linux. Thus, DT files imported from Linux do not work for U-Boot. In U-Boot driver model, each node is bound to a dedicated driver that is the most compatible to it. This design gets along with the concept of DT, and the syscon in Linux originally worked like that. However, Linux commit bdb0066df96e ("mfd: syscon: Decouple syscon interface from platform devices") changed the behavior because it is useful to let a device bind to another driver, but still work as a syscon provider. That change had happened before U-Boot initially supported the syscon driver by commit 6f98b7504f70 ("dm: Add support for generic system controllers (syscon)"). So, the U-Boot's syscon works differently from the beginning. I'd say this is mis-implementation given that DT is not oriented to a particular project, but Linux is the canon of DT in practice. The problem typically arises in the combination of "syscon" and "simple-mfd" compatibles. In Linux, they are orthogonal, i.e., the order between "syscon" and "simple-mfd" does not matter at all. Assume the following compatible. compatible = "foo,bar-syscon", "syscon", "simple-mfd"; In U-Boot, this device node is bound to the syscon driver (driver/core/syscon-uclass.c) since the "syscon" is found to be the most compatible. Then, syscon_get_regmap() succeeds. However, compatible = "foo,bar-syscon", "simple-mfd", "syscon"; does not work because this node is bound to the simple-bus driver (drivers/core/simple-bus.c) in favor of "simple-mfd" compatible. The compatible string "syscon" is just dismissed. Moreover, compatible = "foo,bar-syscon", "syscon"; works like the first case because the syscon driver populates the child devices. This is wrong because populating children is the job of "simple-mfd" (or "simple-bus"). This commit ports syscon_node_to_regmap() from Linux. This API does not require the given node to be bound to a driver in any way. Reported-by: Kunihiko Hayashi Signed-off-by: Masahiro Yamada --- Changes in v2: None drivers/core/syscon-uclass.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ include/syscon.h | 8 ++++++ 2 files changed, 72 insertions(+) diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c index c99409b..6f2c5e3 100644 --- a/drivers/core/syscon-uclass.c +++ b/drivers/core/syscon-uclass.c @@ -15,6 +15,15 @@ #include #include +/* + * Caution: + * This API requires the given device has alerady been bound to syscon driver. + * For example, + * compatible = "syscon", "simple-mfd"; + * works, but + * compatible = "simple-mfd", "syscon"; + * does not. The behavior is different from Linux. + */ struct regmap *syscon_get_regmap(struct udevice *dev) { struct syscon_uc_info *priv; @@ -109,3 +118,58 @@ U_BOOT_DRIVER(generic_syscon) = { #endif .of_match = generic_syscon_ids, }; + +/* + * Linux-compatible syscon-to-regmap + * The syscon node can be bound to another driver, but still works + * as a syscon provider. + */ +static LIST_HEAD(syscon_list); + +struct syscon { + ofnode node; + struct regmap *regmap; + struct list_head list; +}; + +static struct syscon *of_syscon_register(ofnode node) +{ + struct syscon *syscon; + int ret; + + if (!ofnode_device_is_compatible(node, "syscon")) + return ERR_PTR(-EINVAL); + + syscon = malloc(sizeof(*syscon)); + if (!syscon) + return ERR_PTR(-ENOMEM); + + ret = regmap_init_mem(node, &syscon->regmap); + if (ret) { + free(syscon); + return ERR_PTR(ret); + } + + list_add_tail(&syscon->list, &syscon_list); + + return syscon; +} + +struct regmap *syscon_node_to_regmap(ofnode node) +{ + struct syscon *entry, *syscon = NULL; + + list_for_each_entry(entry, &syscon_list, list) + if (ofnode_equal(entry->node, node)) { + syscon = entry; + break; + } + + if (!syscon) + syscon = of_syscon_register(node); + + if (IS_ERR(syscon)) + return ERR_CAST(syscon); + + return syscon->regmap; +} diff --git a/include/syscon.h b/include/syscon.h index 5d52b1c..f4b9cb0 100644 --- a/include/syscon.h +++ b/include/syscon.h @@ -8,6 +8,7 @@ #ifndef __SYSCON_H #define __SYSCON_H +#include #include /** @@ -82,4 +83,11 @@ struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data); */ void *syscon_get_first_range(ulong driver_data); +/** + * syscon_node_to_regmap - get regmap from syscon + * + * @node: Device node of syscon + */ +struct regmap *syscon_node_to_regmap(ofnode node); + #endif