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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 59DB2C2BD05 for ; Mon, 24 Jun 2024 09:06:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Kew+Lkgg2/C1wK/ceEvlEA0LvihR0nCkMCFEGGDYFH0=; b=1exOwlFXDQVBvcoR2Y2i3ejW/O NctnH27jGRFNnPeLqt4K2A5OkvKTlV/YroyUlJmgnEvuOk7nJMX4g48uFZ8snkc6zimeR/NQ8slxT vSPkR0wwFb9LLZvfYk/rQvLr8Yu2fs3AS3jEcqyUGFjjyGhrQ/W5hrEYEKCY2mq/zC5/ZJJsWqZ0k snDyePxRlUiQmEdrPb4D2Ur9HCNdAjTmW/seYAqx6yfRJMRNj6c8XKoH3fOy4qeHPtcKGQoSmob11 FhLXpNVdZX74UUcx2st+E0eUiJ/5UEuOcIq01tiiGLZ8S+E6wK3+mYbZvyNYx1tGPZtdT9GYpI19c 178YZNKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sLfeO-0000000GByp-2t9Z; Mon, 24 Jun 2024 09:06:12 +0000 Received: from mail-lf1-x136.google.com ([2a00:1450:4864:20::136]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sLfeI-0000000GBvh-29Pu for linux-arm-kernel@lists.infradead.org; Mon, 24 Jun 2024 09:06:09 +0000 Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-52cdebf9f53so1460218e87.2 for ; Mon, 24 Jun 2024 02:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1719219964; x=1719824764; darn=lists.infradead.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=Kew+Lkgg2/C1wK/ceEvlEA0LvihR0nCkMCFEGGDYFH0=; b=GFFcavxdqAehH0HG/YXg3Ts3kkv6QPKmeLU6UOFGCoHCCvPeXqehtFA+H7XzV+53P/ GF5tdXcImZqNUXmIgsccebidB6QwrIyTRVL2L/5eXSx9UF5ht2LE6hQpiLD4w8bAo8yA UI53QCZu9SI6s/T9HVUpeW6dTVZhMR+LQrrw0qD6HV4gmiMS9igS5OEgQ6VkUZ9Wv3yx Ac4fAPD80UdFwIVTq/q19mBQ0dr23KundpFiH+XdfR30uJ0LWkrXrYS1+vqFFz5Y0oPV ELumhie0KPcuwR+fHVEKcis04JfGsm/SV+ZF1XK396Rs2tUy7TeL9isi/qUp7rp3hPZj 903w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719219964; x=1719824764; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Kew+Lkgg2/C1wK/ceEvlEA0LvihR0nCkMCFEGGDYFH0=; b=VILaVt5+Zmhhg1ffJebTFmCqYbkKHipPwbWlE1m5zCSLvtlAnQGEwZ/xvRr5k6tGjd ZLNjw9P0u6yh4SOOXB+RvcKjGdV+MTXnSx9C3l1LtZ1GUcK859Y+NwlpQ0TsxiE6fLG3 JV01/Y+2FZBaPW6PnHTLNnEsV10s0a6aqbdtq7O0wCluDo0e7/D0Vsuk8dRPj04lyKIs lR0x5CdOyYIXurNfVbVzLHKD0ukf7LhQ+3sUPJDPA5JTJBPTL6YjcnoalmEaf2GhY/H/ JSuQiqtYvrDdDJVBJg6HBAVJeZPfKTbBzi9IDQqEy58Fo3Q8sgmi6FY24wrM6wja31Ln sZOw== X-Forwarded-Encrypted: i=1; AJvYcCWYjPGYUZ3kMpovwcFVFGL0y2ikUurDS6RElF1oXAcF/D5u9vU33T32UEl/Z5Vcfv44av8143zr56BL/xa/TEfOHuiZ7gWp5faxovCLu+/2xMJXwhM= X-Gm-Message-State: AOJu0YxX4DyYn9WgCeCLkH8Y9pRK7gnSf21SeFu71oIZogYTOQANpLCG ufmF69BlRExT8uFvVMehF1xwYKOwylJ4vPZTheQhdYGI1PQw7hHc5TtL+ZIjl/I= X-Google-Smtp-Source: AGHT+IFLK18mj5o7O9bzNwh+9imco/emBa0iy/WB+YbshssFsZ8QxRrWGYZrnIism3ewt/VuyDJvAA== X-Received: by 2002:a05:6512:b8b:b0:52c:e312:2082 with SMTP id 2adb3069b0e04-52ce3122186mr2621375e87.54.1719219964284; Mon, 24 Jun 2024 02:06:04 -0700 (PDT) Received: from linaro.org ([82.79.124.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3663a2f6af9sm9494370f8f.73.2024.06.24.02.06.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Jun 2024 02:06:03 -0700 (PDT) Date: Mon, 24 Jun 2024 12:06:02 +0300 From: Abel Vesa To: Shengjiu Wang Cc: p.zabel@pengutronix.de, abelvesa@kernel.org, peng.fan@nxp.com, mturquette@baylibre.com, sboyd@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, marex@denx.de, linux-clk@vger.kernel.org, imx@lists.linux.dev, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, shengjiu.wang@gmail.com Subject: Re: [PATCH v9] reset: imx8mp-audiomix: Add AudioMix Block Control reset driver Message-ID: References: <1719200345-32006-1-git-send-email-shengjiu.wang@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1719200345-32006-1-git-send-email-shengjiu.wang@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240624_020606_670172_3190A6AA X-CRM114-Status: GOOD ( 28.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 24-06-24 11:39:05, Shengjiu Wang wrote: > Add support for the resets on i.MX8MP Audio Block Control module, > which includes the EARC PHY software reset and EARC controller > software reset. The reset controller is created using the auxiliary > device framework and set up in the clock driver. > > Signed-off-by: Shengjiu Wang > Reviewed-by: Marco Felsch Reviewed-by: Abel Vesa > --- > changes in v9: > - only send this commits because others have been applied > - remove depends on in config > - add spin lock > - call iounmmap() > > changes in v8: > https://lore.kernel.org/linux-arm-kernel/27ea1bf7de6f349426fcd7ddb056a1adfae47c73.camel@pengutronix.de/T/ > > drivers/reset/Kconfig | 7 ++ > drivers/reset/Makefile | 1 + > drivers/reset/reset-imx8mp-audiomix.c | 128 ++++++++++++++++++++++++++ > 3 files changed, 136 insertions(+) > create mode 100644 drivers/reset/reset-imx8mp-audiomix.c > > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig > index 7112f5932609..509f70e5c4c0 100644 > --- a/drivers/reset/Kconfig > +++ b/drivers/reset/Kconfig > @@ -91,6 +91,13 @@ config RESET_IMX7 > help > This enables the reset controller driver for i.MX7 SoCs. > > +config RESET_IMX8MP_AUDIOMIX > + tristate "i.MX8MP AudioMix Reset Driver" > + select AUXILIARY_BUS > + default CLK_IMX8MP > + help > + This enables the reset controller driver for i.MX8MP AudioMix > + > config RESET_INTEL_GW > bool "Intel Reset Controller Driver" > depends on X86 || COMPILE_TEST > diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile > index fd8b49fa46fc..a6796e83900b 100644 > --- a/drivers/reset/Makefile > +++ b/drivers/reset/Makefile > @@ -14,6 +14,7 @@ obj-$(CONFIG_RESET_BRCMSTB_RESCAL) += reset-brcmstb-rescal.o > obj-$(CONFIG_RESET_GPIO) += reset-gpio.o > obj-$(CONFIG_RESET_HSDK) += reset-hsdk.o > obj-$(CONFIG_RESET_IMX7) += reset-imx7.o > +obj-$(CONFIG_RESET_IMX8MP_AUDIOMIX) += reset-imx8mp-audiomix.o > obj-$(CONFIG_RESET_INTEL_GW) += reset-intel-gw.o > obj-$(CONFIG_RESET_K210) += reset-k210.o > obj-$(CONFIG_RESET_LANTIQ) += reset-lantiq.o > diff --git a/drivers/reset/reset-imx8mp-audiomix.c b/drivers/reset/reset-imx8mp-audiomix.c > new file mode 100644 > index 000000000000..6e3f3069f727 > --- /dev/null > +++ b/drivers/reset/reset-imx8mp-audiomix.c > @@ -0,0 +1,128 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright 2024 NXP > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define EARC 0x200 > +#define EARC_RESET_MASK 0x3 > + > +struct imx8mp_audiomix_reset { > + struct reset_controller_dev rcdev; > + spinlock_t lock; /* protect register read-modify-write cycle */ > + void __iomem *base; > +}; > + > +static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset_controller_dev *rcdev) > +{ > + return container_of(rcdev, struct imx8mp_audiomix_reset, rcdev); > +} > + > +static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev); > + void __iomem *reg_addr = priv->base; > + unsigned int mask, reg; > + unsigned long flags; > + > + mask = BIT(id); > + spin_lock_irqsave(&priv->lock, flags); > + reg = readl(reg_addr + EARC); > + writel(reg & ~mask, reg_addr + EARC); > + spin_unlock_irqrestore(&priv->lock, flags); > + > + return 0; > +} > + > +static int imx8mp_audiomix_reset_deassert(struct reset_controller_dev *rcdev, > + unsigned long id) > +{ > + struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev); > + void __iomem *reg_addr = priv->base; > + unsigned int mask, reg; > + unsigned long flags; > + > + mask = BIT(id); > + spin_lock_irqsave(&priv->lock, flags); > + reg = readl(reg_addr + EARC); > + writel(reg | mask, reg_addr + EARC); > + spin_unlock_irqrestore(&priv->lock, flags); > + > + return 0; > +} > + > +static const struct reset_control_ops imx8mp_audiomix_reset_ops = { > + .assert = imx8mp_audiomix_reset_assert, > + .deassert = imx8mp_audiomix_reset_deassert, > +}; > + > +static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev, > + const struct auxiliary_device_id *id) > +{ > + struct imx8mp_audiomix_reset *priv; > + struct device *dev = &adev->dev; > + int ret; > + > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + spin_lock_init(&priv->lock); > + > + priv->rcdev.owner = THIS_MODULE; > + priv->rcdev.nr_resets = fls(EARC_RESET_MASK); > + priv->rcdev.ops = &imx8mp_audiomix_reset_ops; > + priv->rcdev.of_node = dev->parent->of_node; > + priv->rcdev.dev = dev; > + priv->rcdev.of_reset_n_cells = 1; > + priv->base = of_iomap(dev->parent->of_node, 0); > + if (!priv->base) > + return -ENOMEM; > + > + dev_set_drvdata(dev, priv); > + > + ret = devm_reset_controller_register(dev, &priv->rcdev); > + if (ret) > + goto out_unmap; > + > + return 0; > + > +out_unmap: > + iounmap(priv->base); > + return ret; > +} > + > +static void imx8mp_audiomix_reset_remove(struct auxiliary_device *adev) > +{ > + struct imx8mp_audiomix_reset *priv = dev_get_drvdata(&adev->dev); > + > + iounmap(priv->base); > +} > + > +static const struct auxiliary_device_id imx8mp_audiomix_reset_ids[] = { > + { > + .name = "clk_imx8mp_audiomix.reset", > + }, > + { } > +}; > +MODULE_DEVICE_TABLE(auxiliary, imx8mp_audiomix_reset_ids); > + > +static struct auxiliary_driver imx8mp_audiomix_reset_driver = { > + .probe = imx8mp_audiomix_reset_probe, > + .remove = imx8mp_audiomix_reset_remove, > + .id_table = imx8mp_audiomix_reset_ids, > +}; > + > +module_auxiliary_driver(imx8mp_audiomix_reset_driver); > + > +MODULE_AUTHOR("Shengjiu Wang "); > +MODULE_DESCRIPTION("Freescale i.MX8MP Audio Block Controller reset driver"); > +MODULE_LICENSE("GPL"); > -- > 2.34.1 >