linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>
To: Anusha Srivatsa <asrivats@redhat.com>
Cc: "Joel Stanley" <joel@jms.id.au>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Andrew Jeffery" <andrew@codeconstruct.com.au>,
	"Stefan Agner" <stefan@agner.ch>,
	"Alison Wang" <alison.wang@nxp.com>,
	"Xinliang Liu" <xinliang.liu@linaro.org>,
	"Tian Tao" <tiantao6@hisilicon.com>,
	"Xinwei Kong" <kong.kongxinwei@hisilicon.com>,
	"Sumit Semwal" <sumit.semwal@linaro.org>,
	"Yongqin Liu" <yongqin.liu@linaro.org>,
	"John Stultz" <jstultz@google.com>,
	"Chun-Kuang Hu" <chunkuang.hu@kernel.org>,
	"Philipp Zabel" <p.zabel@pengutronix.de>,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	"AngeloGioacchino Del Regno"
	<angelogioacchino.delregno@collabora.com>,
	"Marek Vasut" <marex@denx.de>, "Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	"Orson Zhai" <orsonzhai@gmail.com>,
	"Baolin Wang" <baolin.wang@linux.alibaba.com>,
	"Chunyan Zhang" <zhang.lyra@gmail.com>,
	"Alain Volmat" <alain.volmat@foss.st.com>,
	"Raphael Gallais-Pou" <rgallaispou@gmail.com>,
	"Yannick Fertre" <yannick.fertre@foss.st.com>,
	"Philippe Cornu" <philippe.cornu@foss.st.com>,
	"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
	"Alexandre Torgue" <alexandre.torgue@foss.st.com>,
	"Thierry Reding" <thierry.reding@gmail.com>,
	"Mikko Perttunen" <mperttunen@nvidia.com>,
	"Jonathan Hunter" <jonathanh@nvidia.com>,
	"Alexey Brodkin" <abrodkin@synopsys.com>,
	"Dave Stevenson" <dave.stevenson@raspberrypi.com>,
	"Maíra Canal" <mcanal@igalia.com>,
	"Raspberry Pi Kernel Maintenance" <kernel-list@raspberrypi.com>,
	"Jonathan Corbet" <corbet@lwn.net>,
	linux-aspeed@lists.ozlabs.org, dri-devel@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
	imx@lists.linux.dev, linux-stm32@st-md-mailman.stormreply.com,
	linux-tegra@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: [PATCH RESEND 07/12] drm/sti: move to devm_platform_ioremap_resource() usage
Date: Wed, 5 Mar 2025 09:47:05 +0100	[thread overview]
Message-ID: <3b173c1c-4e74-4907-961c-9c90d48a9412@foss.st.com> (raw)
In-Reply-To: <CAN9Xe3Q8=_Tz51i6gxNM6445p-rhNiK7B5Ljcga8g_Nn676dCQ@mail.gmail.com>


On 3/3/25 18:29, Anusha Srivatsa wrote:
> On Wed, Feb 26, 2025 at 5:19 AM Raphael Gallais-Pou <
> raphael.gallais-pou@foss.st.com> wrote:
>
>> On 2/25/25 23:20, Anusha Srivatsa wrote:
>>> Replace platform_get_resource/_byname + devm_ioremap
>>> with just devm_platform_ioremap_resource()
>>>
>>> Used Coccinelle to do this change. SmPl patch:
>>>
>>> @rule@
>>> identifier res;
>>> expression ioremap;
>>> identifier pdev;
>>> constant mem;
>>> expression name;
>>> @@
>>> -struct resource *res;
>>> ...
>>> -res = platform_get_resource_byname(pdev,mem,name);
>>> <...
>>> -if (!res) {
>>> -...
>>> -}
>>> ...>
>>> -ioremap = devm_ioremap(...);
>>> +ioremap = devm_platform_ioremap_resource_byname(pdev,name);
>>>
>>> and
>>> @rule_2@
>>> identifier res;
>>> expression ioremap;
>>> identifier pdev;
>>> @@
>>> -struct resource *res;
>>> ...
>>> -res = platform_get_resource(pdev,...);
>>> <...
>>> -if (!res) {
>>> -...
>>> -}
>>> ...>
>>> -ioremap = devm_ioremap(...);
>>> +ioremap = devm_platform_ioremap_resource(pdev,0);
>>>
>>> v2: Fix compilation error.
>>
>> Hi Anusha,
>>
>>
>> You did not take into account my comment regarding the changelog. :-)
>>
>> https://www.kernel.org/doc/html/latest/process/submitting-patches.html#commentary
>>
>> While the commit summary do not specify the version, this changelog
>> suggests
>> that the version of your series as been incremented.
>> If this is a v2, then a version descriptor should be applied to the
>> patchset.
>>
>> https://www.kernel.org/doc/html/latest/process/submitting-patches.html#subject-line
>>
>> Hi  Raphael,
> That is correct. While this patch is a v2, there is another patch or two in
> the same series that is on v4 when it got acked and reviewed. Having
> patches belonging to the same series with different version prefixes seemed
> odd when I sent the series. Hence added what exactly changed in the commit
> log.


Indeed, the serie version should remain consistent across all patches.

Maxime told you in an earlier answer, any modification of any patch what so ever
increases the serie version. Thus all patches are at v5 (looking at your latest
revision).

Verbatim from the documentation :

Other comments relevant only to the moment or the maintainer, not suitable for
the permanent changelog, should also go here [under the --- marker]. A good
example of such comments might be patch changelogs which describe what has
changed between the v1 and v2 version of the patch.

Please put this information after the --- line which separates the changelog
from the rest of the patch. The version information is not part of the changelog
which gets committed to the git tree. It is additional information for the
reviewers. If it’s placed above the commit tags, it needs manual interaction to
remove it. If it is below the separator line, it gets automatically stripped off
when applying the patch:

https://www.kernel.org/doc/html/latest/process/submitting-patches.html#commentary

Raphaël

>
> Anusha
>
>
>> Regards,
>> Raphaël
>>
>>> Cc: Raphael Gallais-Pou <raphael.gallais-pou@foss.st.com>
>>> Cc: Alain Volmat <alain.volmat@foss.st.com>
>>> Reviewed-by: Maxime Ripard <mripard@kernel.org>
>>> Acked-by: Raphael Gallais-Pou <rgallaispou@gmail.com>
>>> Signed-off-by: Anusha Srivatsa <asrivats@redhat.com>
>>> ---
>>>  drivers/gpu/drm/sti/sti_compositor.c | 10 +---------
>>>  drivers/gpu/drm/sti/sti_dvo.c        | 10 +---------
>>>  drivers/gpu/drm/sti/sti_hda.c        |  9 +--------
>>>  drivers/gpu/drm/sti/sti_hdmi.c       | 11 +----------
>>>  drivers/gpu/drm/sti/sti_hqvdp.c      | 10 +---------
>>>  drivers/gpu/drm/sti/sti_tvout.c      | 10 +---------
>>>  drivers/gpu/drm/sti/sti_vtg.c        | 10 +---------
>>>  7 files changed, 7 insertions(+), 63 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/sti/sti_compositor.c
>> b/drivers/gpu/drm/sti/sti_compositor.c
>>> index
>> 063f82d23d80c4ba83624a0066a18416a2b37351..7aefce6706ba2cd7d97a33228c9b9812edecf06f
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_compositor.c
>>> +++ b/drivers/gpu/drm/sti/sti_compositor.c
>>> @@ -177,7 +177,6 @@ static int sti_compositor_probe(struct
>> platform_device *pdev)
>>>       struct device_node *np = dev->of_node;
>>>       struct device_node *vtg_np;
>>>       struct sti_compositor *compo;
>>> -     struct resource *res;
>>>       unsigned int i;
>>>
>>>       compo = devm_kzalloc(dev, sizeof(*compo), GFP_KERNEL);
>>> @@ -194,14 +193,7 @@ static int sti_compositor_probe(struct
>> platform_device *pdev)
>>>       memcpy(&compo->data, of_match_node(compositor_of_match, np)->data,
>>>              sizeof(struct sti_compositor_data));
>>> -
>>> -     /* Get Memory ressources */
>>> -     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> -     if (res == NULL) {
>>> -             DRM_ERROR("Get memory resource failed\n");
>>> -             return -ENXIO;
>>> -     }
>>> -     compo->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     compo->regs = devm_platform_ioremap_resource(pdev, 0);
>>>       if (compo->regs == NULL) {
>>>               DRM_ERROR("Register mapping failed\n");
>>>               return -ENXIO;
>>> diff --git a/drivers/gpu/drm/sti/sti_dvo.c
>> b/drivers/gpu/drm/sti/sti_dvo.c
>>> index
>> 4dcddd02629b6a1052be8fb8333bd3aa17c083c5..c877298a7f2bad171724eca4d43ea622db4c81cd
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_dvo.c
>>> +++ b/drivers/gpu/drm/sti/sti_dvo.c
>>> @@ -511,7 +511,6 @@ static int sti_dvo_probe(struct platform_device
>> *pdev)
>>>  {
>>>       struct device *dev = &pdev->dev;
>>>       struct sti_dvo *dvo;
>>> -     struct resource *res;
>>>       struct device_node *np = dev->of_node;
>>>
>>>       DRM_INFO("%s\n", __func__);
>>> @@ -523,14 +522,7 @@ static int sti_dvo_probe(struct platform_device
>> *pdev)
>>>       }
>>>
>>>       dvo->dev = pdev->dev;
>>> -
>>> -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> "dvo-reg");
>>> -     if (!res) {
>>> -             DRM_ERROR("Invalid dvo resource\n");
>>> -             return -ENOMEM;
>>> -     }
>>> -     dvo->regs = devm_ioremap(dev, res->start,
>>> -                     resource_size(res));
>>> +     dvo->regs = devm_platform_ioremap_resource_byname(pdev, "dvo-reg");
>>>       if (!dvo->regs)
>>>               return -ENOMEM;
>>>
>>> diff --git a/drivers/gpu/drm/sti/sti_hda.c
>> b/drivers/gpu/drm/sti/sti_hda.c
>>> index
>> 14fdc00d2ba03d4f96ba407ac8e576decb6f32c0..3ca3abb80d425901f4c031edfd327a770d624e1c
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_hda.c
>>> +++ b/drivers/gpu/drm/sti/sti_hda.c
>>> @@ -750,14 +750,7 @@ static int sti_hda_probe(struct platform_device
>> *pdev)
>>>               return -ENOMEM;
>>>
>>>       hda->dev = pdev->dev;
>>> -
>>> -     /* Get resources */
>>> -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> "hda-reg");
>>> -     if (!res) {
>>> -             DRM_ERROR("Invalid hda resource\n");
>>> -             return -ENOMEM;
>>> -     }
>>> -     hda->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     hda->regs = devm_platform_ioremap_resource_byname(pdev, "hda-reg");
>>>       if (!hda->regs)
>>>               return -ENOMEM;
>>>
>>> diff --git a/drivers/gpu/drm/sti/sti_hdmi.c
>> b/drivers/gpu/drm/sti/sti_hdmi.c
>>> index
>> 164a34d793d86f114394048667ae3189e1c39242..c64ce7a1ef58b9ce4429edd368269bea87d86984
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_hdmi.c
>>> +++ b/drivers/gpu/drm/sti/sti_hdmi.c
>>> @@ -1380,7 +1380,6 @@ static int sti_hdmi_probe(struct platform_device
>> *pdev)
>>>       struct device *dev = &pdev->dev;
>>>       struct sti_hdmi *hdmi;
>>>       struct device_node *np = dev->of_node;
>>> -     struct resource *res;
>>>       struct device_node *ddc;
>>>       int ret;
>>>
>>> @@ -1399,15 +1398,7 @@ static int sti_hdmi_probe(struct platform_device
>> *pdev)
>>>       }
>>>
>>>       hdmi->dev = pdev->dev;
>>> -
>>> -     /* Get resources */
>>> -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> "hdmi-reg");
>>> -     if (!res) {
>>> -             DRM_ERROR("Invalid hdmi resource\n");
>>> -             ret = -ENOMEM;
>>> -             goto release_adapter;
>>> -     }
>>> -     hdmi->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     hdmi->regs = devm_platform_ioremap_resource_byname(pdev,
>> "hdmi-reg");
>>>       if (!hdmi->regs) {
>>>               ret = -ENOMEM;
>>>               goto release_adapter;
>>> diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c
>> b/drivers/gpu/drm/sti/sti_hqvdp.c
>>> index
>> 0f658709c9d0d398c4eed65202443db9d0b41f8c..420395598d119a403d531211022e6005d6a2bd59
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_hqvdp.c
>>> +++ b/drivers/gpu/drm/sti/sti_hqvdp.c
>>> @@ -1356,7 +1356,6 @@ static int sti_hqvdp_probe(struct platform_device
>> *pdev)
>>>       struct device *dev = &pdev->dev;
>>>       struct device_node *vtg_np;
>>>       struct sti_hqvdp *hqvdp;
>>> -     struct resource *res;
>>>
>>>       DRM_DEBUG_DRIVER("\n");
>>>
>>> @@ -1367,14 +1366,7 @@ static int sti_hqvdp_probe(struct platform_device
>> *pdev)
>>>       }
>>>
>>>       hqvdp->dev = dev;
>>> -
>>> -     /* Get Memory resources */
>>> -     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> -     if (!res) {
>>> -             DRM_ERROR("Get memory resource failed\n");
>>> -             return -ENXIO;
>>> -     }
>>> -     hqvdp->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     hqvdp->regs = devm_platform_ioremap_resource(pdev, 0);
>>>       if (!hqvdp->regs) {
>>>               DRM_ERROR("Register mapping failed\n");
>>>               return -ENXIO;
>>> diff --git a/drivers/gpu/drm/sti/sti_tvout.c
>> b/drivers/gpu/drm/sti/sti_tvout.c
>>> index
>> af6c06f448c4819def8cc0d0836e30f991529690..0bebe815f5e7567f84388af93723a6fa7d2cc7a2
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_tvout.c
>>> +++ b/drivers/gpu/drm/sti/sti_tvout.c
>>> @@ -838,7 +838,6 @@ static int sti_tvout_probe(struct platform_device
>> *pdev)
>>>       struct device *dev = &pdev->dev;
>>>       struct device_node *node = dev->of_node;
>>>       struct sti_tvout *tvout;
>>> -     struct resource *res;
>>>
>>>       DRM_INFO("%s\n", __func__);
>>>
>>> @@ -850,14 +849,7 @@ static int sti_tvout_probe(struct platform_device
>> *pdev)
>>>               return -ENOMEM;
>>>
>>>       tvout->dev = dev;
>>> -
>>> -     /* get memory resources */
>>> -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> "tvout-reg");
>>> -     if (!res) {
>>> -             DRM_ERROR("Invalid glue resource\n");
>>> -             return -ENOMEM;
>>> -     }
>>> -     tvout->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     tvout->regs = devm_platform_ioremap_resource_byname(pdev,
>> "tvout-reg");
>>>       if (!tvout->regs)
>>>               return -ENOMEM;
>>>
>>> diff --git a/drivers/gpu/drm/sti/sti_vtg.c
>> b/drivers/gpu/drm/sti/sti_vtg.c
>>> index
>> 5ba469b711b5318e9e9e6d8df127fb8933d1fac1..b5353fe774d72fd629ecd3ef75a5d2817ca8617f
>> 100644
>>> --- a/drivers/gpu/drm/sti/sti_vtg.c
>>> +++ b/drivers/gpu/drm/sti/sti_vtg.c
>>> @@ -380,20 +380,12 @@ static int vtg_probe(struct platform_device *pdev)
>>>  {
>>>       struct device *dev = &pdev->dev;
>>>       struct sti_vtg *vtg;
>>> -     struct resource *res;
>>>       int ret;
>>>
>>>       vtg = devm_kzalloc(dev, sizeof(*vtg), GFP_KERNEL);
>>>       if (!vtg)
>>>               return -ENOMEM;
>>> -
>>> -     /* Get Memory ressources */
>>> -     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> -     if (!res) {
>>> -             DRM_ERROR("Get memory resource failed\n");
>>> -             return -ENOMEM;
>>> -     }
>>> -     vtg->regs = devm_ioremap(dev, res->start, resource_size(res));
>>> +     vtg->regs = devm_platform_ioremap_resource(pdev, 0);
>>>       if (!vtg->regs) {
>>>               DRM_ERROR("failed to remap I/O memory\n");
>>>               return -ENOMEM;
>>>
>>

  parent reply	other threads:[~2025-03-05  9:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-25 22:20 [PATCH RESEND 00/12] drm: Move to using devm_platform_ioremap_resource Anusha Srivatsa
2025-02-25 22:20 ` [PATCH RESEND 01/12] drm/aspeed: move to devm_platform_ioremap_resource() usage Anusha Srivatsa
2025-02-26 14:47   ` (subset) " Maxime Ripard
2025-02-25 22:20 ` [PATCH RESEND 02/12] drm/fsl-dcu: " Anusha Srivatsa
2025-02-25 22:20 ` [PATCH RESEND 03/12] drm/hisilicon: " Anusha Srivatsa
2025-02-25 22:20 ` [PATCH RESEND 04/12] drm/mediatek: " Anusha Srivatsa
2025-02-26 12:39   ` AngeloGioacchino Del Regno
2025-02-26 14:47   ` (subset) " Maxime Ripard
2025-02-25 22:20 ` [PATCH RESEND 05/12] drm/mxsfb: " Anusha Srivatsa
2025-02-25 22:20 ` [PATCH RESEND 06/12] drm/sprd: " Anusha Srivatsa
2025-02-27  1:52   ` Chunyan Zhang
2025-02-25 22:20 ` [PATCH RESEND 07/12] drm/sti: " Anusha Srivatsa
2025-02-26  9:06   ` Raphael Gallais-Pou
     [not found]     ` <CAN9Xe3Q8=_Tz51i6gxNM6445p-rhNiK7B5Ljcga8g_Nn676dCQ@mail.gmail.com>
2025-03-04  8:04       ` Maxime Ripard
2025-03-05  8:47       ` Raphael Gallais-Pou [this message]
2025-02-25 22:20 ` [PATCH RESEND 08/12] drm/stm: " Anusha Srivatsa
2025-02-26 14:47   ` (subset) " Maxime Ripard
2025-02-25 22:20 ` [PATCH RESEND 09/12] drm/tegra: " Anusha Srivatsa
2025-02-25 22:20 ` [PATCH RESEND 10/12] drm/tiny: " Anusha Srivatsa
2025-02-26 14:47   ` (subset) " Maxime Ripard
2025-02-25 22:20 ` [PATCH RESEND 11/12] drm/vc4: " Anusha Srivatsa
2025-02-26 14:47   ` (subset) " Maxime Ripard
2025-02-25 22:20 ` [PATCH RESEND 12/12] Documentation: Update the todo Anusha Srivatsa
2025-02-26 10:21   ` Thomas Zimmermann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3b173c1c-4e74-4907-961c-9c90d48a9412@foss.st.com \
    --to=raphael.gallais-pou@foss.st.com \
    --cc=abrodkin@synopsys.com \
    --cc=airlied@gmail.com \
    --cc=alain.volmat@foss.st.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=alison.wang@nxp.com \
    --cc=andrew@codeconstruct.com.au \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=asrivats@redhat.com \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=chunkuang.hu@kernel.org \
    --cc=corbet@lwn.net \
    --cc=dave.stevenson@raspberrypi.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=festevam@gmail.com \
    --cc=imx@lists.linux.dev \
    --cc=joel@jms.id.au \
    --cc=jonathanh@nvidia.com \
    --cc=jstultz@google.com \
    --cc=kernel-list@raspberrypi.com \
    --cc=kernel@pengutronix.de \
    --cc=kong.kongxinwei@hisilicon.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=linux-tegra@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=marex@denx.de \
    --cc=matthias.bgg@gmail.com \
    --cc=mcanal@igalia.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=mperttunen@nvidia.com \
    --cc=mripard@kernel.org \
    --cc=orsonzhai@gmail.com \
    --cc=p.zabel@pengutronix.de \
    --cc=philippe.cornu@foss.st.com \
    --cc=rgallaispou@gmail.com \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=stefan@agner.ch \
    --cc=sumit.semwal@linaro.org \
    --cc=thierry.reding@gmail.com \
    --cc=tiantao6@hisilicon.com \
    --cc=tzimmermann@suse.de \
    --cc=xinliang.liu@linaro.org \
    --cc=yannick.fertre@foss.st.com \
    --cc=yongqin.liu@linaro.org \
    --cc=zhang.lyra@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).