Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp4446309pxb; Thu, 14 Oct 2021 05:28:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxa2v+e5/4Jvr9f1jkt762JFA4dCmdss3naTUu/BjLaIz0KlmQ5ydNgLd9ibDmX5XK+EKmz X-Received: by 2002:a17:902:7246:b0:138:a6ed:66cc with SMTP id c6-20020a170902724600b00138a6ed66ccmr4926830pll.22.1634214495026; Thu, 14 Oct 2021 05:28:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634214495; cv=none; d=google.com; s=arc-20160816; b=iF00rT78/1y3mZO2b/iSAD/OE9Q9Va7UbfjYwv4kHH/wWtCuo1BdqglwH3ibWgVKXN feQAjs2UfISoxXMxTYYqjO8ydvxfbKeB0YOZOIZKC+kRbuDmwxUTnDZw27JNG4s+/US6 fkqiBkzAvNO3nR+XAeXBkNteXJYJ6fKu7XRqcmzR7boJeSpzM54PbTqAXj6y8YtWQBT4 a653aWTczf2iBh0Ni7Sy4AKoTTWOoqWPgLymiQsqSQAnflGgJ+WQpginMM1P8jX+kLU+ viVnM5gmXjTP090hblMNf2kVYkzrvOEIbHBtJzmhN4ISgRLQGW5NW77vXeITH18QMcAo DD0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=Xj8F02qjcFD/OxSetCAdaTkDEAtmLez+FikCwyhAwDU=; b=MeZzMf2gzrhHaL3w7pq77TVHLT6uJAdrdn4dgW4siuZWdYlsn3ykCO9/Jrat15rQ5b SkQgj8oJrtWNH08k5d5twoyGAd2WAN9GZrMD9+vaFLbzdVUn6KRpVLnMrKPyL8iaJ89S qS/qUmQsn+a3rYB+BzSzNTWcVpH44e0kdhV6A8vt26onS6GD8/j6haE4/Xpnfa9p4NeP JMg2SGFLFebkQzq/ZPeXvlcuPz/rAAa1mkDVlvImelag5KCjGfez82jX0kocVscybcMG PnX1EG2J1S/tmGSSrM7uakBzwZMr+DGDd6CfGHO9ZVx0GJoph5ah/Pp87QifHNJsZNr0 qDVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wDuxotBJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q18si4368424plh.236.2021.10.14.05.27.55; Thu, 14 Oct 2021 05:28:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wDuxotBJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231346AbhJNMFa (ORCPT + 99 others); Thu, 14 Oct 2021 08:05:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231378AbhJNMF3 (ORCPT ); Thu, 14 Oct 2021 08:05:29 -0400 Received: from mail-ua1-x932.google.com (mail-ua1-x932.google.com [IPv6:2607:f8b0:4864:20::932]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACF2BC061760 for ; Thu, 14 Oct 2021 05:03:24 -0700 (PDT) Received: by mail-ua1-x932.google.com with SMTP id e2so10718425uax.7 for ; Thu, 14 Oct 2021 05:03:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Xj8F02qjcFD/OxSetCAdaTkDEAtmLez+FikCwyhAwDU=; b=wDuxotBJb/+zjFdczEvupCmne7rv44CGr+5h2R+lYo61eRnWC1EAFn4i83sh7rX3yZ V7movBmXIEybpOfvKxfcSoZM8s14aImiaK7T3CM4LFAYoTOvpo9Fq+Dbxg0LaVidfIEc syPvFsSscgM8cio8XTjfXekbVyjDl48TLNGTfIjxsAz31lohV6wmra9eHwb2EWPXW6Od Geemk7JVSfF/jcS/y1qenTMLStW4vUfQieVQRye+fj955TP8JnxYCYaWTWyRe0IKqKao L/1z7qJIutgRw049kdC3st4vuqfMF6eKVR8K7iQHy+xIu1rW5Nn/ulpWSThbRjyd8s5+ 21yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Xj8F02qjcFD/OxSetCAdaTkDEAtmLez+FikCwyhAwDU=; b=JVKzFG7RCQ7w2JSjIvrTO5nUd3eRyar6Wwb6sqakRJepZSiciG+Ltc36QtqcYVuStk WnxtOvebttkFVYAP6E+SVQrsFt81Et7cOdP19U0mK6UWZvrTyssjVZjxOwdblu16QpIh A9y7ne7tRz5flsep1pBAjBkmPeznDpHWTYpQrcovdA5sjJx6by7xbJi608dLoJj9fqJQ +LHrspW9qlYxiu97DBSkIzHZs6AXcKPr7DMy9+BXgEs5eIWQUQtzGO0APMaxnNv6tagh WPl4ADxi0OWfI5vZu9x4vL7QsBW8W4RoRDz6shWS2RMvNz+4SUBhlgou0Ca/wesDf928 +zIA== X-Gm-Message-State: AOAM530CCBpzu7rZBVWBHJlp2cw/8RnMFqJn6dcwRLGFRv9ehLd7QLxg JJ2UiZwN15NcuPG0SXUMMAOlqMtQRYNb/7OcBeP68w== X-Received: by 2002:a67:ab48:: with SMTP id k8mr6179623vsh.30.1634213003678; Thu, 14 Oct 2021 05:03:23 -0700 (PDT) MIME-Version: 1.0 References: <20211013202110.31701-1-semen.protsenko@linaro.org> <1cd31098-ba9d-f2e3-e34c-5bada00a2696@canonical.com> In-Reply-To: From: Sam Protsenko Date: Thu, 14 Oct 2021 15:03:12 +0300 Message-ID: Subject: Re: [PATCH v2 1/3] soc: samsung: exynos-chipid: Pass revision reg offsets To: Krzysztof Kozlowski Cc: Rob Herring , Sumit Semwal , Linux Samsung SOC , linux-arm Mailing List , devicetree , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 14 Oct 2021 at 14:48, Krzysztof Kozlowski wrote: > > On 14/10/2021 13:34, Sam Protsenko wrote: > > On Thu, 14 Oct 2021 at 10:11, Krzysztof Kozlowski > > wrote: > >> > >> On 13/10/2021 22:21, Sam Protsenko wrote: > >>> Old Exynos SoCs have both Product ID and Revision ID in one single > >>> register, while new SoCs tend to have two separate registers for those > >>> IDs. Implement handling of both cases by passing Revision ID register > >>> offsets in driver data. > >>> > >>> Signed-off-by: Sam Protsenko > >>> --- > >>> drivers/soc/samsung/exynos-chipid.c | 67 +++++++++++++++++++---- > >>> include/linux/soc/samsung/exynos-chipid.h | 6 +- > >>> 2 files changed, 58 insertions(+), 15 deletions(-) > >>> > >>> diff --git a/drivers/soc/samsung/exynos-chipid.c b/drivers/soc/samsung/exynos-chipid.c > >>> index 5c1d0f97f766..7837331fb753 100644 > >>> --- a/drivers/soc/samsung/exynos-chipid.c > >>> +++ b/drivers/soc/samsung/exynos-chipid.c > >>> @@ -16,6 +16,7 @@ > >>> #include > >>> #include > >>> #include > >>> +#include > >>> #include > >>> #include > >>> #include > >>> @@ -24,6 +25,17 @@ > >>> > >>> #include "exynos-asv.h" > >>> > >>> +struct exynos_chipid_variant { > >>> + unsigned int rev_reg; /* revision register offset */ > >>> + unsigned int main_rev_shift; /* main revision offset in rev_reg */ > >>> + unsigned int sub_rev_shift; /* sub revision offset in rev_reg */ > >>> +}; > >>> + > >>> +struct exynos_chipid_info { > >>> + u32 product_id; > >>> + u32 revision; > >>> +}; > >>> + > >>> static const struct exynos_soc_id { > >>> const char *name; > >>> unsigned int id; > >>> @@ -49,31 +61,55 @@ static const char *product_id_to_soc_id(unsigned int product_id) > >>> int i; > >>> > >>> for (i = 0; i < ARRAY_SIZE(soc_ids); i++) > >>> - if ((product_id & EXYNOS_MASK) == soc_ids[i].id) > >>> + if (product_id == soc_ids[i].id) > >>> return soc_ids[i].name; > >>> return NULL; > >>> } > >>> > >>> +static int exynos_chipid_get_chipid_info(struct regmap *regmap, > >>> + const struct exynos_chipid_variant *data, > >>> + struct exynos_chipid_info *soc_info) > >>> +{ > >>> + int ret; > >>> + unsigned int val, main_rev, sub_rev; > >>> + > >>> + ret = regmap_read(regmap, EXYNOS_CHIPID_REG_PRO_ID, &val); > >>> + if (ret < 0) > >>> + return ret; > >>> + soc_info->product_id = val & EXYNOS_MASK; > >>> + > >>> + ret = regmap_read(regmap, data->rev_reg, &val); > >> > >> Isn't this the same register as EXYNOS_CHIPID_REG_PRO_ID? > >> > > > > It is for Exynos4210, but it's not for Exynos850 (see PATCH 3/3), as > > it's described in the commit message. I tried to keep this code > > unified for all SoCs. > > Yeah, but for Exynos4210 you read the same register twice. It's > confusing. Read only once. You could compare the offsets and skip second > read. > Thanks, will do in v3. > > > >>> + if (ret < 0) > >>> + return ret; > >>> + main_rev = (val >> data->main_rev_shift) & EXYNOS_REV_PART_MASK; > >>> + sub_rev = (val >> data->sub_rev_shift) & EXYNOS_REV_PART_MASK; > >>> + soc_info->revision = (main_rev << EXYNOS_REV_PART_SHIFT) | sub_rev; > >>> + > >>> + return 0; > >>> +} > >>> + > >>> static int exynos_chipid_probe(struct platform_device *pdev) > >>> { > >>> + const struct exynos_chipid_variant *drv_data; > >>> + struct exynos_chipid_info soc_info; > >>> struct soc_device_attribute *soc_dev_attr; > >>> struct soc_device *soc_dev; > >>> struct device_node *root; > >>> struct regmap *regmap; > >>> - u32 product_id; > >>> - u32 revision; > >>> int ret; > >>> > >>> + drv_data = of_device_get_match_data(&pdev->dev); > >>> + if (!drv_data) > >>> + return -EINVAL; > >>> + > >>> regmap = device_node_to_regmap(pdev->dev.of_node); > >>> if (IS_ERR(regmap)) > >>> return PTR_ERR(regmap); > >>> > >>> - ret = regmap_read(regmap, EXYNOS_CHIPID_REG_PRO_ID, &product_id); > >>> + ret = exynos_chipid_get_chipid_info(regmap, drv_data, &soc_info); > >>> if (ret < 0) > >>> return ret; > >>> > >>> - revision = product_id & EXYNOS_REV_MASK; > >>> - > >>> soc_dev_attr = devm_kzalloc(&pdev->dev, sizeof(*soc_dev_attr), > >>> GFP_KERNEL); > >>> if (!soc_dev_attr) > >>> @@ -86,8 +122,8 @@ static int exynos_chipid_probe(struct platform_device *pdev) > >>> of_node_put(root); > >>> > >>> soc_dev_attr->revision = devm_kasprintf(&pdev->dev, GFP_KERNEL, > >>> - "%x", revision); > >>> - soc_dev_attr->soc_id = product_id_to_soc_id(product_id); > >>> + "%x", soc_info.revision); > >>> + soc_dev_attr->soc_id = product_id_to_soc_id(soc_info.product_id); > >>> if (!soc_dev_attr->soc_id) { > >>> pr_err("Unknown SoC\n"); > >>> return -ENODEV; > >>> @@ -106,7 +142,7 @@ static int exynos_chipid_probe(struct platform_device *pdev) > >>> > >>> dev_info(soc_device_to_device(soc_dev), > >>> "Exynos: CPU[%s] PRO_ID[0x%x] REV[0x%x] Detected\n", > >>> - soc_dev_attr->soc_id, product_id, revision); > >>> + soc_dev_attr->soc_id, soc_info.product_id, soc_info.revision); > >>> > >>> return 0; > >>> > >>> @@ -125,9 +161,18 @@ static int exynos_chipid_remove(struct platform_device *pdev) > >>> return 0; > >>> } > >>> > >>> +static const struct exynos_chipid_variant exynos4210_chipid_drv_data = { > >>> + .rev_reg = 0x0, > >>> + .main_rev_shift = 0, > >>> + .sub_rev_shift = 4, > >> > >> The code does not look correct here. Subrev is at 0:3 bits, mainrev is > >> at 4:7. > >> > > > > Right. I was confused by those existing macros: > > > > #define EXYNOS_SUBREV_MASK (0xf << 4) > > #define EXYNOS_MAINREV_MASK (0xf << 0) > > > > Those were probably wrong the whole time? Anyway, now I've found > > Exynos4412 User Manual and checked it there -- you are right about > > offsets. Will fix in v3. > > They were not used, I think. > > > > >> Did you test it that it produces same result? Looks not - I gave it a > >> try and got wrong revision. > >> > > > > I only have Exynos850 based board, and that has 0x0 in Revision ID > > register. But for v3 I'll try to emulate register value in the code > > and make sure that the read value does not change with patch applied. > > You should get one of Odroid boards to test it. The MC1 is fairly cheap. > Will do, I see how it can be useful for further work. For this series, I'm pretty sure I can test all cases by emulating the read register values. Would it be enough? Also, if you have some time, I'd ask you to check v3 on your board. > Best regards, > Krzysztof