From nobody Tue Jan 27 00:10:28 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29F8C3370FE for ; Mon, 26 Jan 2026 16:22:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769444536; cv=none; b=p76HUIiOVLoH13hpaz9T5FfoA6gvVd/MWJkz5Wx3lSEVz6VQhc77p3aDbc/AGBER5F/L2YKCW//mXMFwS25TcT5g3ZBf9IyDIWXuWhuCc3Xswm/suG60I3mdV2eSomlYg2dMv2kQoo8qT1MxZy8o18UDEv5iyyjy+5mHKnv6cTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769444536; c=relaxed/simple; bh=yhPuiR6XrfoigONn7YjeXv5GIwSDKgMVMn3NKSqWbcw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FCHll7V9meRpzX/u1wSqodZd7sOMDLSA56UpUo9uq0wIx63rEA8fdDWxCF87N00TOg0fOwe1khTTyzpKbRM20MXViw3JMZ8In7ntF3e29F5eoSX5dY4Yl6vVSfwuDeZEqtdVc22k9hq/Vyxmgjsp8M2dVOuZab8uaCl5k5ravqY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WfcTnnc7; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WfcTnnc7" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-47f3b7ef761so33773955e9.0 for ; Mon, 26 Jan 2026 08:22:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769444533; x=1770049333; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=R/PKuQqJhmcmf0FdDQDCr8/x7Yh0ZaImvK0r2Y0Qm/o=; b=WfcTnnc7fpNPJ6ICXZQ23dW4oGKFrKYmtLNtoprd0idlBtQpsTDIzkb+4ZRrsbiKbm eJv0qGBfiHrx2Jk00OTMG4PoqPH4KdJwy9y3JoKhdmZFR8tgZuKMOIlR8iI9a500eQWa 7Q6kgtimc6bBCFJGndmzMZam7RLMHo6hCC45uF+TuPo95PBU04MCjEF8n85KA+ZkNIQ4 NtjSRDyCYL+YrO4TEtP/o+REka5deBH3sqHcITvV0PYdpr77TCoPC+1b3lnsvIkZrpx9 zoPxEadGTMhTbZ3GmQcNPnYhCgn6jMXUoPS4xwP6tS/xQBblCxHtUi9gPLL8O+7KavWe Ikcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769444533; x=1770049333; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=R/PKuQqJhmcmf0FdDQDCr8/x7Yh0ZaImvK0r2Y0Qm/o=; b=fZUQoCxbzApG+7LTISmjz80r9IaTqsw5H/0sGeD0MfkZ38g7fDe0VWloVFiuuk0B5Y cfTrz6BcPiaqjv94AaMhZ1slrSGsSR8fSFW78weRMBzbrkdWqft92LU8RWD4YEQ8RM3u fOgKslPzrk78qQQkQGaiVRSmt4Sgz5wFF/9d1mPGbxpwfzLB8Li7qu/cAvRW79L3LKv7 8omoEaxJ8m5EBBb/Lhr8yy7KwPsNQ2L95ZxWNObz9MSDVu50+RXgRJE8WqUtZr4zPYAu H/7E7oiaxqrGScHPPjPhEzwN8gA1P+4biGNpPM4LgLB8Wq4Hl4bji6trajT2HUjgu4cs 5hPw== X-Forwarded-Encrypted: i=1; AJvYcCXixRoCryeEz0wwSyn9sO3Pc+8VwFXbFCofahZS5zrFMtclQvJTEauc6PW56yT/TeEnwt1CrSqX202FxjA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz77SNoYBgk3VB3W8n0iCFy6KTxlZojvU9GRnr3Ato42pSbtE+r XCGY+s+eddfaNjUy22QcVMZiWZHFIdjZUzPJCBrZSsECWJNd95vj2f6D X-Gm-Gg: AZuq6aJU6bdc1QhizN8OMGR+0ub0L+FVV6GQWBRL0o/Q0kKOS4OEKQiQLcd8kv8GsCq 9k77pXgMUFddNcPPr7XOgq+v8Iv2Nf+Ifc7XhcUGLB/CXQRwqImSSjcvvC3m1fRnqgvGZCsiTBh 4/dHR/LXf+YD8l6FUQycES+othEFn3huR4EkxF8nok56iJe8QR3FrE9iwO9X1DH+bcEMqXjUwro XB3ZtiiqRkPVvIz4+2sQ7dHQjtIr0zeEJGSfeEZ9YYM9Kcp7V3AbRj4d7nmEk+x+k6reOU+Hbf/ +W5lXEPtZo8c0VKW2sdF9DKsiD37/4S9GKzEH0bPtDfx6dXnJ45bLvnarwgxVTkned/7VEFhxYN cell3IzhPJu0q/jL0Ih9UBVf1LydhM7BqujgFyb7+MC1zjP+d2X7D4HTEojCWgOmbWcCxcrVhlP D3CD0Tm8AaxIMy+bg9mruXMVddKCJXsqFQZ19jJw== X-Received: by 2002:a05:600c:6748:b0:479:2651:3f9c with SMTP id 5b1f17b1804b1-4805ce4e654mr79695865e9.14.1769444533295; Mon, 26 Jan 2026 08:22:13 -0800 (PST) Received: from SMW024614.wbi.nxp.com ([128.77.115.158]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-480470cf1acsm370371035e9.14.2026.01.26.08.22.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jan 2026 08:22:12 -0800 (PST) From: Laurentiu Mihalcea To: Philipp Zabel , Shawn Guo , Fabio Estevam , Daniel Baluta , Frank Li Cc: imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Pengutronix Kernel Team Subject: [PATCH v7 2/4] reset: imx8mp-audiomix: Switch to using regmap API Date: Mon, 26 Jan 2026 08:22:01 -0800 Message-ID: <20260126162203.708-3-laurentiumihalcea111@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260126162203.708-1-laurentiumihalcea111@gmail.com> References: <20260126162203.708-1-laurentiumihalcea111@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Laurentiu Mihalcea Switch to using the regmap API to allow performing register operations under the same lock. This is needed for cases such as i.MX8ULP's SIM LPAV where clock gating, reset control and MUX-ing is performed via the same register (i.e. SYSCTRL0) and different subsystem APIs. Reviewed-by: Philipp Zabel Reviewed-by: Frank Li Signed-off-by: Laurentiu Mihalcea --- drivers/reset/reset-imx8mp-audiomix.c | 92 +++++++++++++++++---------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/drivers/reset/reset-imx8mp-audiomix.c b/drivers/reset/reset-im= x8mp-audiomix.c index acfa92b15329..f6152c0cc5ff 100644 --- a/drivers/reset/reset-imx8mp-audiomix.c +++ b/drivers/reset/reset-imx8mp-audiomix.c @@ -12,6 +12,7 @@ #include #include #include +#include #include =20 #define IMX8MP_AUDIOMIX_EARC_RESET_OFFSET 0x200 @@ -43,8 +44,7 @@ static const struct imx8mp_reset_map reset_map[] =3D { =20 struct imx8mp_audiomix_reset { struct reset_controller_dev rcdev; - spinlock_t lock; /* protect register read-modify-write cycle */ - void __iomem *base; + struct regmap *regmap; }; =20 static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset= _controller_dev *rcdev) @@ -56,26 +56,14 @@ static int imx8mp_audiomix_update(struct reset_controll= er_dev *rcdev, unsigned long id, bool assert) { struct imx8mp_audiomix_reset *priv =3D to_imx8mp_audiomix_reset(rcdev); - void __iomem *reg_addr =3D priv->base; - unsigned int mask, offset, active_low; - unsigned long reg, flags; + unsigned int mask, offset, active_low, val; =20 mask =3D reset_map[id].mask; offset =3D reset_map[id].offset; active_low =3D reset_map[id].active_low; + val =3D (active_low ^ assert) ? mask : ~mask; =20 - spin_lock_irqsave(&priv->lock, flags); - - reg =3D readl(reg_addr + offset); - if (active_low ^ assert) - reg |=3D mask; - else - reg &=3D ~mask; - writel(reg, reg_addr + offset); - - spin_unlock_irqrestore(&priv->lock, flags); - - return 0; + return regmap_update_bits(priv->regmap, offset, mask, val); } =20 static int imx8mp_audiomix_reset_assert(struct reset_controller_dev *rcdev, @@ -95,6 +83,52 @@ static const struct reset_control_ops imx8mp_audiomix_re= set_ops =3D { .deassert =3D imx8mp_audiomix_reset_deassert, }; =20 +static const struct regmap_config regmap_config =3D { + .reg_bits =3D 32, + .val_bits =3D 32, + .reg_stride =3D 4, +}; + +/* assumption: registered only if not using parent regmap */ +static void imx8mp_audiomix_reset_iounmap(void *data) +{ + void __iomem *base =3D (void __iomem *)data; + + iounmap(base); +} + +static int imx8mp_audiomix_reset_get_regmap(struct imx8mp_audiomix_reset *= priv) +{ + void __iomem *base; + struct device *dev; + int ret; + + dev =3D priv->rcdev.dev; + + /* try to use the parent's regmap */ + priv->regmap =3D dev_get_regmap(dev->parent, NULL); + if (priv->regmap) + return 0; + + /* ... if that's not possible then initialize the regmap right now */ + base =3D of_iomap(dev->parent->of_node, 0); + if (!base) + return dev_err_probe(dev, -ENOMEM, "failed to iomap address space\n"); + + ret =3D devm_add_action_or_reset(dev, + imx8mp_audiomix_reset_iounmap, + (void __force *)base); + if (ret) + return dev_err_probe(dev, ret, "failed to register action\n"); + + priv->regmap =3D devm_regmap_init_mmio(dev, base, ®map_config); + if (IS_ERR(priv->regmap)) + return dev_err_probe(dev, PTR_ERR(priv->regmap), + "failed to initialize regmap\n"); + + return 0; +} + static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id) { @@ -106,36 +140,25 @@ static int imx8mp_audiomix_reset_probe(struct auxilia= ry_device *adev, if (!priv) return -ENOMEM; =20 - spin_lock_init(&priv->lock); - priv->rcdev.owner =3D THIS_MODULE; priv->rcdev.nr_resets =3D ARRAY_SIZE(reset_map); priv->rcdev.ops =3D &imx8mp_audiomix_reset_ops; priv->rcdev.of_node =3D dev->parent->of_node; priv->rcdev.dev =3D dev; priv->rcdev.of_reset_n_cells =3D 1; - priv->base =3D of_iomap(dev->parent->of_node, 0); - if (!priv->base) - return -ENOMEM; =20 dev_set_drvdata(dev, priv); =20 + ret =3D imx8mp_audiomix_reset_get_regmap(priv); + if (ret) + return dev_err_probe(dev, ret, "failed to get regmap\n"); + ret =3D devm_reset_controller_register(dev, &priv->rcdev); if (ret) - goto out_unmap; + return dev_err_probe(dev, ret, + "failed to register reset controller\n"); =20 return 0; - -out_unmap: - iounmap(priv->base); - return ret; -} - -static void imx8mp_audiomix_reset_remove(struct auxiliary_device *adev) -{ - struct imx8mp_audiomix_reset *priv =3D dev_get_drvdata(&adev->dev); - - iounmap(priv->base); } =20 static const struct auxiliary_device_id imx8mp_audiomix_reset_ids[] =3D { @@ -148,7 +171,6 @@ MODULE_DEVICE_TABLE(auxiliary, imx8mp_audiomix_reset_id= s); =20 static struct auxiliary_driver imx8mp_audiomix_reset_driver =3D { .probe =3D imx8mp_audiomix_reset_probe, - .remove =3D imx8mp_audiomix_reset_remove, .id_table =3D imx8mp_audiomix_reset_ids, }; =20 --=20 2.43.0