From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E545C07E96 for ; Tue, 6 Jul 2021 21:25:22 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 83C7A61C3C for ; Tue, 6 Jul 2021 21:25:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 83C7A61C3C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 46A4382D92; Tue, 6 Jul 2021 23:25:19 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="Tswv58qZ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9B84482D94; Tue, 6 Jul 2021 23:25:16 +0200 (CEST) Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1005F82D92 for ; Tue, 6 Jul 2021 23:24:55 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=jh80.chung@samsung.com Received: from epcas1p3.samsung.com (unknown [182.195.41.47]) by mailout2.samsung.com (KnoxPortal) with ESMTP id 20210706212446epoutp02b49b07595e1df66931819ddbab37dd53~PUKsU-RaG2327023270epoutp02U for ; Tue, 6 Jul 2021 21:24:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20210706212446epoutp02b49b07595e1df66931819ddbab37dd53~PUKsU-RaG2327023270epoutp02U DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1625606686; bh=K6olXrwmLf7KWrURCUUezPaPWqk7mdKMWW4j0JLAZgY=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=Tswv58qZawkVeIKNhJwfZBSl+SSifJcnylGfQugJuYCrvQPo1qJuMQE7vMIthwQzt x/t7X7jSaMG3wfvZ+OJuno3P1irfUPOh0CeF4IoG6+XFm7xLJ2fr06ImKjm8D8Ntl7 DWJVnG4awRfXT4/1MLA1z1FierxmNO8kRC+6mZ1Q= Received: from epsnrtp3.localdomain (unknown [182.195.42.164]) by epcas1p1.samsung.com (KnoxPortal) with ESMTP id 20210706212445epcas1p131cd931d282671d46f937d17a831f9e8~PUKrnLyKt3145731457epcas1p12; Tue, 6 Jul 2021 21:24:45 +0000 (GMT) Received: from epsmges1p4.samsung.com (unknown [182.195.40.157]) by epsnrtp3.localdomain (Postfix) with ESMTP id 4GKFty05SQz4x9Pw; Tue, 6 Jul 2021 21:24:42 +0000 (GMT) Received: from epcas1p4.samsung.com ( [182.195.41.48]) by epsmges1p4.samsung.com (Symantec Messaging Gateway) with SMTP id 49.ED.10119.91AC4E06; Wed, 7 Jul 2021 06:24:42 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas1p2.samsung.com (KnoxPortal) with ESMTPA id 20210706212441epcas1p209d919b283c9281e180f1fec5f450a96~PUKoC5HNb2992729927epcas1p2w; Tue, 6 Jul 2021 21:24:41 +0000 (GMT) Received: from epsmgms1p2.samsung.com (unknown [182.195.42.42]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20210706212441epsmtrp1aaf6d979f7d225e8312900dbabd1e874~PUKoCJZzk2142821428epsmtrp15; Tue, 6 Jul 2021 21:24:41 +0000 (GMT) X-AuditID: b6c32a38-97bff70000002787-67-60e4ca19be6b Received: from epsmtip1.samsung.com ( [182.195.34.30]) by epsmgms1p2.samsung.com (Symantec Messaging Gateway) with SMTP id 4B.A0.08289.91AC4E06; Wed, 7 Jul 2021 06:24:41 +0900 (KST) Received: from [10.113.113.235] (unknown [10.113.113.235]) by epsmtip1.samsung.com (KnoxPortal) with ESMTPA id 20210706212441epsmtip1cd13d948b7c0b6f74178522787fedfa8~PUKn2G7aW1528615286epsmtip1J; Tue, 6 Jul 2021 21:24:41 +0000 (GMT) Subject: Re: [PATCH 1/3] power: pmic: Add driver for ST-Ericsson AB8500 via PRCMU To: Stephan Gerhold Cc: u-boot@lists.denx.de, Marek Vasut , Linus Walleij , Joe Hershberger From: Jaehoon Chung Message-ID: <16621bab-fa06-4f3f-4585-7c2c1b14eff2@samsung.com> Date: Wed, 7 Jul 2021 06:25:37 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupjk+LIzCtJLcpLzFFi42LZdljTQFfq1JMEg08LGS0+7XzMajHlz3Im izdtjYwWN+aaWLzd28nuwOoxb9YJFo+2BfYed67tYfM4e2cHo8f1M9uZAlijsm0yUhNTUosU UvOS81My89JtlbyD453jTc0MDHUNLS3MlRTyEnNTbZVcfAJ03TJzgHYrKZQl5pQChQISi4uV 9O1sivJLS1IVMvKLS2yVUgtScgosC/SKE3OLS/PS9ZLzc60MDQyMTIEKE7Iz1m9Yzl6wtrTi w9IJrA2Mj+K7GDk4JARMJP5vD+1i5OIQEtjBKHHzWjcLhPOJUaLv5SEmCOczo8SbvvmsXYyc YB3XF25nhkjsYpTYfriPEcJ5zygx480TdpAqYYFgiYu394PZIgKaEr+2HQQbxSzQzSixaOl7 RpAEm4COxPZvx5lAbF4BO4kNV16CNbAIqEhc7lzFDGKLCkRKnN+9gAWiRlDi5MwnYDangLZE w+PTYHOYBcQlbj2ZzwRhy0tsfzsH7DwJgVYOifV/1rND3O0i0d/zlBHCFpZ4dXwLVFxK4mV/ G5RdLbGr+QxUcwejxK1tTUwQCWOJ/UsnM4GCjBnonfW79CHCihI7f8+FOoJP4t3XHlZIqPJK dLQJQZSoSFx6/ZIJZtXdJ/+hweghMX3LCaYJjIqzkLw2C8k7s5C8Mwth8QJGllWMYqkFxbnp qcWGBSbI0b2JEZwwtSx2MM59+0HvECMTB+MhRgkOZiUR3jqfJwlCvCmJlVWpRfnxRaU5qcWH GE2BgT2RWUo0OR+YsvNK4g1NjYyNjS1MDM1MDQ2VxHl3sh1KEBJITyxJzU5NLUgtgulj4uCU amBSlbYru/S78bndRBHTUHmDTdWqtjP6AiWz9yVP2ONkdDx0SoWJ3lXraR0zOsOrHe7c6Hgh fnoVL59z1aOWbRvusp3O3fEixdH0uMmKGq/AC8pXEmOnT85YIJ60piFy1dX9fMvn3V5tfrEl 0Wh51F8NtXeabusXvjPR4GJii1/66O+sg20/7qTpzLO9PuODAc9b1bf7GM8ppWo6K+9fk/L6 4sHuMx++NUvddF6wsKhdo0Z+2SIFFunV23sniZxe6rbkhem1PReKWEuevluT1Xiz/YKY604T lZTJVwXC9zzzF5dJt3448f0K89ZFopatKouEL825EdIisVpUSPD1u4KMvRN4f0/9yPniF7uX 6cQkJZbijERDLeai4kQArOYWDSEEAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLLMWRmVeSWpSXmKPExsWy7bCSnK7kqScJBkcuqVh82vmY1WLKn+VM Fm/aGhktbsw1sXi7t5PdgdVj3qwTLB5tC+w97lzbw+Zx9s4ORo/rZ7YzBbBGcdmkpOZklqUW 6dslcGWs37CcvWBtacWHpRNYGxgfxXcxcnJICJhIXF+4nbmLkYtDSGAHo8S/fafZIRJSEp+f TmXrYuQAsoUlDh8uhqh5yyixrPcZC0iNsECwxMXb+8HqRQQ0JX5tO8gEUsQs0MsoMeN/AxNE x2QmicbVNxlBqtgEdCS2fzvOBGLzCthJbLjyEqybRUBF4nLnKmYQW1QgUuLzglesEDWCEidn PgHbximgLdHw+DTYHGYBdYk/8y4xQ9jiEreezGeCsOUltr+dwzyBUWgWkvZZSFpmIWmZhaRl ASPLKkbJ1ILi3PTcYsMCo7zUcr3ixNzi0rx0veT83E2M4BjR0trBuGfVB71DjEwcjIcYJTiY lUR463yeJAjxpiRWVqUW5ccXleakFh9ilOZgURLnvdB1Ml5IID2xJDU7NbUgtQgmy8TBKdXA ZHfZ4emE206TPa1upT+Y9SEprTuvZM6a/zNn3bi1kslgtv1ToT2vHj1/PemBagOX5N0d88Ue njBIi1sitmLh05xD/31MLT0ehE68f1loyenHGjOvBHun17BdZFxn7PC2Vae8hO+ilMQMjqab +dLaV3/1sf/byntneXXqx8XJ4hm9T//vyF7TLJC9NvqqRv+enPg5X7xsnzzh3DKtkPGLXdu8 6arLz7562iQWorbyf9yJU29DZx1c414zr8374QPWF54erCf7WQVDrgls1/w/ufyLwvu2Yw4t mg2bw6a9uf3WgWvpjjNZM70WpDm3TuQ0y/xUU3bqyNVU7zmrpj57Mzn/8LV9v1oVY+c8eKV7 89x1JZbijERDLeai4kQA4qfLOgADAAA= X-CMS-MailID: 20210706212441epcas1p209d919b283c9281e180f1fec5f450a96 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: SVC_REQ_APPROVE CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20210705162828epcas1p13c29a0f99fb9701dca61c1b68e7f539e References: <20210705162809.144862-1-stephan@gerhold.net> <20210705162809.144862-2-stephan@gerhold.net> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean On 7/6/21 5:52 PM, Stephan Gerhold wrote: > On Tue, Jul 06, 2021 at 10:08:03AM +0900, Jaehoon Chung wrote: >> On 7/6/21 1:28 AM, Stephan Gerhold wrote: >>> All devices based on ST-Ericsson Ux500 use a PMIC similar to AB8500 >>> (Analog Baseband). There is AB8500, AB8505, AB9540 and AB8540 >>> although in practice only AB8500 and AB8505 are relevant since the >>> platforms with AB9540 and AB8540 were cancelled and never used in >>> production. >>> >>> In general, the AB8500 PMIC uses I2C as control interface, where the >>> different register banks are represented as separate I2C devices. >>> However, in practice AB8500 is always connected to a special I2C bus >>> on the DB8500 SoC that is controlled by the power/reset/clock >>> management unit (PRCMU) firmware. >>> >>> Add a simple driver that allows reading/writing registers of the >>> AB8500 PMIC. The driver directly accesses registers from the PRCMU >>> parent device (represented by syscon in U-Boot). Abstracting it >>> further (e.g. with the i2c uclass) would not provide any advantage >>> because the PRCMU I2C bus is always just connected to AB8500 and >>> vice-versa. >>> >>> The ab8500.h header is mostly taken as-is from Linux (with some >>> minor adjustments) to allow using similar code in both Linux and >>> U-Boot. >>> >>> Cc: Linus Walleij >>> Signed-off-by: Stephan Gerhold >>> --- >>> >>> drivers/power/pmic/Kconfig | 10 ++ >>> drivers/power/pmic/Makefile | 1 + >>> drivers/power/pmic/ab8500.c | 258 ++++++++++++++++++++++++++++++++++++ >>> include/power/ab8500.h | 125 +++++++++++++++++ >>> 4 files changed, 394 insertions(+) >>> create mode 100644 drivers/power/pmic/ab8500.c >>> create mode 100644 include/power/ab8500.h >>> >>> diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig >>> index 583fd3ddcd..fd6648b313 100644 >>> --- a/drivers/power/pmic/Kconfig >>> +++ b/drivers/power/pmic/Kconfig >>> @@ -31,6 +31,16 @@ config SPL_PMIC_CHILDREN >>> to call your regulator code (e.g. see rk8xx.c for direct functions >>> for use in SPL). >>> >>> +config PMIC_AB8500 >>> + bool "Enable driver for ST-Ericsson AB8500 PMIC via PRCMU" >>> + depends on DM_PMIC >>> + select REGMAP >>> + select SYSCON >>> + help >>> + Enable support for the ST-Ericsson AB8500 (Analog Baseband) PMIC. >>> + It connects with the ST-Ericsson DB8500 SoC via an I2C bus managed by >>> + the power/reset/clock management unit (PRCMU) firmware. >>> + >>> config PMIC_ACT8846 >>> bool "Enable support for the active-semi 8846 PMIC" >>> depends on DM_PMIC && DM_I2C >>> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile >>> index 89099fde57..5d1a97e5f6 100644 >>> --- a/drivers/power/pmic/Makefile >>> +++ b/drivers/power/pmic/Makefile >>> @@ -15,6 +15,7 @@ obj-$(CONFIG_$(SPL_)DM_PMIC_PFUZE100) += pfuze100.o >>> obj-$(CONFIG_$(SPL_)DM_PMIC_PCA9450) += pca9450.o >>> obj-$(CONFIG_PMIC_S2MPS11) += s2mps11.o >>> obj-$(CONFIG_DM_PMIC_SANDBOX) += sandbox.o i2c_pmic_emul.o >>> +obj-$(CONFIG_PMIC_AB8500) += ab8500.o >>> obj-$(CONFIG_PMIC_ACT8846) += act8846.o >>> obj-$(CONFIG_PMIC_AS3722) += as3722.o as3722_gpio.o >>> obj-$(CONFIG_PMIC_MAX8997) += max8997.o >>> diff --git a/drivers/power/pmic/ab8500.c b/drivers/power/pmic/ab8500.c >>> new file mode 100644 >>> index 0000000000..a87a3b497c >>> --- /dev/null >>> +++ b/drivers/power/pmic/ab8500.c >>> @@ -0,0 +1,258 @@ >>> +// SPDX-License-Identifier: GPL-2.0+ >>> +/* >>> + * Copyright (C) 2019 Stephan Gerhold >>> + * >>> + * Adapted from old U-Boot and Linux kernel implementation: >>> + * Copyright (C) STMicroelectronics 2009 >>> + * Copyright (C) ST-Ericsson SA 2010 >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +/* CPU mailbox registers */ >>> +#define PRCM_MBOX_CPU_VAL 0x0fc >>> +#define PRCM_MBOX_CPU_SET 0x100 >>> +#define PRCM_MBOX_CPU_CLR 0x104 >>> + >>> +#define PRCM_ARM_IT1_CLR 0x48C >>> +#define PRCM_ARM_IT1_VAL 0x494 >>> + >>> +#define PRCM_TCDM_RANGE 2 >>> +#define PRCM_REQ_MB5 0xE44 >>> +#define PRCM_ACK_MB5 0xDF4 >>> +#define _PRCM_MBOX_HEADER 0xFE8 >>> +#define PRCM_MBOX_HEADER_REQ_MB5 (_PRCM_MBOX_HEADER + 0x5) >>> +#define PRCMU_I2C_MBOX_BIT BIT(5) >>> + >>> +/* Mailbox 5 Requests */ >>> +#define PRCM_REQ_MB5_I2C_SLAVE_OP (PRCM_REQ_MB5 + 0x0) >>> +#define PRCM_REQ_MB5_I2C_HW_BITS (PRCM_REQ_MB5 + 0x1) >>> +#define PRCM_REQ_MB5_I2C_REG (PRCM_REQ_MB5 + 0x2) >>> +#define PRCM_REQ_MB5_I2C_VAL (PRCM_REQ_MB5 + 0x3) >>> +#define PRCMU_I2C(bank) (((bank) << 1) | BIT(6)) >>> +#define PRCMU_I2C_WRITE 0 >>> +#define PRCMU_I2C_READ 1 >>> +#define PRCMU_I2C_STOP_EN BIT(3) >>> + >>> +/* Mailbox 5 ACKs */ >>> +#define PRCM_ACK_MB5_I2C_STATUS (PRCM_ACK_MB5 + 0x1) >>> +#define PRCM_ACK_MB5_I2C_VAL (PRCM_ACK_MB5 + 0x3) >>> +#define PRCMU_I2C_WR_OK 0x1 >>> +#define PRCMU_I2C_RD_OK 0x2 >>> + >>> +/* AB8500 version registers */ >>> +#define AB8500_MISC_REV_REG AB8500_MISC(0x80) >>> +#define AB8500_MISC_IC_NAME_REG AB8500_MISC(0x82) >>> + >>> +struct ab8500_priv { >>> + struct ab8500 ab8500; >>> + struct regmap *regmap; >>> +}; >>> + >>> +static inline int prcmu_tcdm_readb(struct regmap *map, uint offset, u8 *valp) >>> +{ >>> + return regmap_raw_read_range(map, PRCM_TCDM_RANGE, offset, >>> + valp, sizeof(*valp)); >>> +} >>> + >>> +static inline int prcmu_tcdm_writeb(struct regmap *map, uint offset, u8 val) >>> +{ >>> + return regmap_raw_write_range(map, PRCM_TCDM_RANGE, offset, >>> + &val, sizeof(val)); >>> +} >>> + >>> +static int prcmu_wait_i2c_mbx_ready(struct ab8500_priv *priv) >>> +{ >>> + uint val; >>> + int ret; >>> + >>> + ret = regmap_read(priv->regmap, PRCM_ARM_IT1_VAL, &val); >> >> Doesn't need to check about returned to error? >> >>> + if (ret == 0 && val & PRCMU_I2C_MBOX_BIT) { >>> + printf("ab8500: warning: PRCMU i2c mailbox was not acked\n"); >>> + /* clear mailbox 5 ack irq */ >>> + regmap_write(priv->regmap, PRCM_ARM_IT1_CLR, PRCMU_I2C_MBOX_BIT); >> >> Not need to check the return value about regmap_write()? >> > > Good point, it's probably better to return in case of errors here. > >>> [...] >>> + >>> + /* clear mailbox 5 ack irq */ >>> + regmap_write(priv->regmap, PRCM_ARM_IT1_CLR, PRCMU_I2C_MBOX_BIT); >> >> Ditto. >> > > But here it doesn't really make sense: The read/write is already done. > Even if we don't manage to clear the IRQ the read/write will still have > succeeded. I will add a comment to clarify this. > >>> + >>> + if (status != expected_status) { >>> + /* >>> + * AB8500 does not have the AB8500_MISC_IC_NAME_REG register, >>> + * but we need to try reading it to detect AB8505. >>> + * In case of an error, assume that we have AB8500. >>> + */ >>> + if (op == PRCMU_I2C_READ && bank_reg == AB8500_MISC_IC_NAME_REG) { >>> + *val = AB8500_VERSION_AB8500; >>> + return 0; >>> + } >>> + >>> + printf("%s: return status %d\n", __func__, status); >>> + return -EIO; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static int ab8500_reg_count(struct udevice *dev) >>> +{ >>> + return AB8500_NUM_REGISTERS; >>> +} >>> + >>> +static int ab8500_read(struct udevice *dev, uint reg, uint8_t *buf, int len) >>> +{ >>> + int ret; >>> + >>> + if (len != 1) >>> + return -EINVAL; >>> + >>> + *buf = 0; >>> + ret = ab8500_transfer(dev, reg, buf, PRCMU_I2C_READ, PRCMU_I2C_RD_OK); >>> + if (ret) { >>> + printf("%s failed: %d\n", __func__, ret); >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static int ab8500_write(struct udevice *dev, uint reg, const uint8_t *buf, int len) >>> +{ >>> + int ret; >>> + u8 val; >>> + >>> + if (len != 1) >>> + return -EINVAL; >>> + >>> + val = *buf; >>> + ret = ab8500_transfer(dev, reg, &val, PRCMU_I2C_WRITE, PRCMU_I2C_WR_OK); >>> + if (ret) { >>> + printf("%s failed: %d\n", __func__, ret); >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static struct dm_pmic_ops ab8500_ops = { >>> + .reg_count = ab8500_reg_count, >>> + .read = ab8500_read, >>> + .write = ab8500_write, >>> +}; >>> + >>> +static int ab8500_probe(struct udevice *dev) >>> +{ >>> + struct ab8500_priv *priv = dev_get_priv(dev); >>> + int ret; >>> + >>> + /* get regmap from the PRCMU parent device (syscon in U-Boot) */ >>> + priv->regmap = syscon_get_regmap(dev->parent); >>> + if (IS_ERR(priv->regmap)) >>> + return PTR_ERR(priv->regmap); >>> + >>> + ret = pmic_reg_read(dev, AB8500_MISC_IC_NAME_REG); >>> + if (ret < 0) { >>> + printf("ab8500: failed to read chip version: %d\n", ret); >>> + return ret; >>> + } >>> + priv->ab8500.version = ret; >>> + >>> + ret = pmic_reg_read(dev, AB8500_MISC_REV_REG); >>> + if (ret < 0) { >>> + printf("ab8500: failed to read chip id: %d\n", ret); >>> + return ret; >>> + } >>> + priv->ab8500.chip_id = ret; >>> + >>> + debug("ab8500: version: %#x, chip id: %#x\n", >>> + priv->ab8500.version, priv->ab8500.chip_id); >>> + >>> + return 0; >>> +} >>> + >>> +static const struct udevice_id ab8500_ids[] = { >>> + { .compatible = "stericsson,ab8500" }, >>> + { } >>> +}; >>> + >>> +U_BOOT_DRIVER(pmic_ab8500) = { >>> + .name = "pmic_ab8500", >>> + .id = UCLASS_PMIC, >>> + .of_match = ab8500_ids, >>> + .bind = dm_scan_fdt_dev, >>> + .probe = ab8500_probe, >>> + .ops = &ab8500_ops, >>> + .priv_auto = sizeof(struct ab8500_priv), >>> +}; >>> diff --git a/include/power/ab8500.h b/include/power/ab8500.h >>> new file mode 100644 >>> index 0000000000..157eb4a5b1 >>> --- /dev/null >>> +++ b/include/power/ab8500.h >>> @@ -0,0 +1,125 @@ >>> +/* SPDX-License-Identifier: GPL-2.0-only */ >>> +/* >>> + * Based on include/linux/mfd/abx500/ab8500.h from Linux >>> + * Copyright (C) ST-Ericsson SA 2010 >>> + * Author: Srinidhi Kasagar >>> + */ >>> + >>> +#ifndef _PMIC_AB8500_H_ >>> +#define _PMIC_AB8500_H_ >>> + >>> +/* >>> + * AB IC versions >>> + * >>> + * AB8500_VERSION_AB8500 should be 0xFF but will never be read as need a >>> + * non-supported multi-byte I2C access via PRCMU. Set to 0x00 to ease the >>> + * print of version string. >>> + */ >>> +enum ab8500_version { >>> + AB8500_VERSION_AB8500 = 0x0, >>> + AB8500_VERSION_AB8505 = 0x1, >>> + AB8500_VERSION_AB9540 = 0x2, >>> + AB8500_VERSION_AB8540 = 0x4, >>> + AB8500_VERSION_UNDEFINED, >>> +}; >>> + >>> +/* AB8500 CIDs*/ >>> +#define AB8500_CUTEARLY 0x00 >>> +#define AB8500_CUT1P0 0x10 >>> +#define AB8500_CUT1P1 0x11 >>> +#define AB8500_CUT1P2 0x12 /* Only valid for AB8540 */ >>> +#define AB8500_CUT2P0 0x20 >>> +#define AB8500_CUT3P0 0x30 >>> +#define AB8500_CUT3P3 0x33 >>> + >>> +/* >>> + * AB8500 bank addresses >>> + */ >>> +#define AB8500_BANK(bank, reg) (((bank) << 8) | (reg)) >>> +#define AB8500_M_FSM_RANK(reg) AB8500_BANK(0x0, reg) >>> +#define AB8500_SYS_CTRL1_BLOCK(reg) AB8500_BANK(0x1, reg) >>> +#define AB8500_SYS_CTRL2_BLOCK(reg) AB8500_BANK(0x2, reg) >>> +#define AB8500_REGU_CTRL1(reg) AB8500_BANK(0x3, reg) >>> +#define AB8500_REGU_CTRL2(reg) AB8500_BANK(0x4, reg) >>> +#define AB8500_USB(reg) AB8500_BANK(0x5, reg) >>> +#define AB8500_TVOUT(reg) AB8500_BANK(0x6, reg) >>> +#define AB8500_DBI(reg) AB8500_BANK(0x7, reg) >>> +#define AB8500_ECI_AV_ACC(reg) AB8500_BANK(0x8, reg) >>> +#define AB8500_RESERVED(reg) AB8500_BANK(0x9, reg) >>> +#define AB8500_GPADC(reg) AB8500_BANK(0xA, reg) >>> +#define AB8500_CHARGER(reg) AB8500_BANK(0xB, reg) >>> +#define AB8500_GAS_GAUGE(reg) AB8500_BANK(0xC, reg) >>> +#define AB8500_AUDIO(reg) AB8500_BANK(0xD, reg) >>> +#define AB8500_INTERRUPT(reg) AB8500_BANK(0xE, reg) >>> +#define AB8500_RTC(reg) AB8500_BANK(0xF, reg) >>> +#define AB8500_GPIO(reg) AB8500_BANK(0x10, reg) >>> +#define AB8500_MISC(reg) AB8500_BANK(0x10, reg) >>> +#define AB8500_DEVELOPMENT(reg) AB8500_BANK(0x11, reg) >>> +#define AB8500_DEBUG(reg) AB8500_BANK(0x12, reg) >>> +#define AB8500_PROD_TEST(reg) AB8500_BANK(0x13, reg) >>> +#define AB8500_STE_TEST(reg) AB8500_BANK(0x14, reg) >>> +#define AB8500_OTP_EMUL(reg) AB8500_BANK(0x15, reg) >>> + >>> +#define AB8500_NUM_BANKS 0x16 >>> +#define AB8500_NUM_REGISTERS AB8500_BANK(AB8500_NUM_BANKS, 0) >>> + >>> +struct ab8500 { >>> + enum ab8500_version version; >>> + u8 chip_id; >>> +};> + >> >> I have checked that below codes are existed in linux kernel. >> But I didn't find where the below codes is used in U-boot. >> Will it be used in future? >> > > At the moment I don't have any drivers myself that make use of this. > However, it would certainly be needed if more advanced drivers for > AB8500 are written. I don't know if this will happen anytime soon. > > I can remove these if you would prefer to have them added once they are > actually needed. What do you think? If you want to maintain them, not need to remove them. :) Best Regards, Jaehoon Chung > > Thanks! > Stephan > >>> +static inline int is_ab8500(struct ab8500 *ab) >>> +{ >>> + return ab->version == AB8500_VERSION_AB8500; >>> +} >>> + >>> +static inline int is_ab8505(struct ab8500 *ab) >>> +{ >>> + return ab->version == AB8500_VERSION_AB8505; >>> +} >>> + >>> +/* exclude also ab8505, ab9540... */ >>> +static inline int is_ab8500_1p0_or_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P0)); >>> +} >>> + >>> +/* exclude also ab8505, ab9540... */ >>> +static inline int is_ab8500_1p1_or_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P1)); >>> +} >>> + >>> +/* exclude also ab8505, ab9540... */ >>> +static inline int is_ab8500_2p0_or_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT2P0)); >>> +} >>> + >>> +static inline int is_ab8500_3p3_or_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT3P3)); >>> +} >>> + >>> +/* exclude also ab8505, ab9540... */ >>> +static inline int is_ab8500_2p0(struct ab8500 *ab) >>> +{ >>> + return (is_ab8500(ab) && (ab->chip_id == AB8500_CUT2P0)); >>> +} >>> + >>> +static inline int is_ab8505_1p0_or_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8505(ab) && (ab->chip_id <= AB8500_CUT1P0)); >>> +} >>> + >>> +static inline int is_ab8505_2p0(struct ab8500 *ab) >>> +{ >>> + return (is_ab8505(ab) && (ab->chip_id == AB8500_CUT2P0)); >>> +} >>> + >>> +static inline int is_ab8505_2p0_earlier(struct ab8500 *ab) >>> +{ >>> + return (is_ab8505(ab) && (ab->chip_id < AB8500_CUT2P0)); >>> +} >>> + >>> +#endif >>> >> >