Re: [PATCH v4 13/19] reset: starfive: Add StarFive JH7110 reset driver

Hal Feng
2023-02-23T06:48:26Z

On Tue, 21 Feb 2023 16:34:11 +0000, Conor Dooley wrote:
> On Tue, Feb 21, 2023 at 04:33:09PM +0100, Emil Renner Berthing wrote:
>> On Tue, 21 Feb 2023 at 03:47, Hal Feng <hal.feng@starfivetech.com> wrote:
>> >
>> > Add auxiliary driver to support StarFive JH7110 system
>> > and always-on resets.
>> >
>> > Reported-by: kernel test robot <lkp@intel.com>
>
> Drop the reported-by here too please Hal.

OK.

>
>> > Signed-off-by: Hal Feng <hal.feng@starfivetech.com>
>
>> > +static int jh7110_reset_probe(struct auxiliary_device *adev,
>> > + const struct auxiliary_device_id *id)
>> > +{
>> > + struct reset_info *info = (struct reset_info *)(id->driver_data);
>> > + void __iomem **base = (void __iomem **)dev_get_drvdata(adev->dev.parent);
>>
>> Hi Hal,
>>
>> I saw the kernel test robot complain about this, but I still wonder if
>> the extra level of indirection is really needed. Isn't it enough to
>> just add the explicit casts, so
>>
>> dev_set_drvdata(priv->dev, (void *)priv->base);
>>
>> in the clock drivers and here just
>>
>> void __iomem *base = (void __iomem *)dev_get_drvdata(adev->dev.parent);
>
> I *think* if you do that, sparse will complain that you cast away the
> __iomem. The complaint is something like "cast removes address space
> qualifier from expression".
>
> The other option is, rather than set the base as the drvdata, just pass
> the whole priv struct. That's what I did for mpfs at least & I thought I
> had suggested it on v3, but must not have.
> It looks prettier than the casting madness at least ;)

I modified this just because we need to use container_of() to get some
struct in [1].

+struct isp_top_crg {
+ struct clk_bulk_data *top_clks;
+ struct reset_control *top_rsts;
+ int top_clks_num;
+ void __iomem *base;
+};

+static struct isp_top_crg *top_crg_from(void __iomem **base)
+{
+ return container_of(base, struct isp_top_crg, base);
+}

[1] https://lore.kernel.org/all/20230221083323.302471-7-xingyu.wu@starfivetech.com/

If we pass the whole priv struct, we need to make the priv struct
public. I think setting the address of "base" as the drvdata is
enough and easier.

Best regards,
Hal

>
>> > +
>> > + if (!info || !base)
>> > + return -ENODEV;
>> > +
>> > + return reset_starfive_jh71x0_register(&adev->dev, adev->dev.parent->of_node,
>> > + *base + info->assert_offset,
>> > + *base + info->status_offset,
>> > + NULL,
>> > + info->nr_resets,
>> > + NULL);
>> > +}