diff mbox series

[1/6] can: rcar_canfd: rcar_canfd_probe: Add struct rcar_canfd_hw_info to driver data

Message ID 20221022104357.1276740-2-biju.das.jz@bp.renesas.com (mailing list archive)
State Awaiting Upstream
Delegated to: Netdev Maintainers
Headers show
Series R-Can CAN FD driver enhancements | expand

Checks

Context Check Description
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Biju Das Oct. 22, 2022, 10:43 a.m. UTC
The CAN FD IP found on RZ/G2L SoC has some HW features different to that
of R-Car. For example, it has multiple resets and multiple IRQs for global
and channel interrupts. Also, it does not have ECC error flag registers
and clk post divider present on R-Car. Similarly, R-Car V3U has 8 channels
whereas other SoCs has only 2 channels.

This patch adds the struct rcar_canfd_hw_info to take care of the
HW feature differences and driver data present on both IPs. It also
replaces the driver data chip type with struct rcar_canfd_hw_info by
moving chip type to it.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 43 +++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 13 deletions(-)

Comments

Geert Uytterhoeven Oct. 24, 2022, 2:40 p.m. UTC | #1
Hi Biju,

On Sat, Oct 22, 2022 at 1:02 PM Biju Das <biju.das.jz@bp.renesas.com> wrote:
> The CAN FD IP found on RZ/G2L SoC has some HW features different to that
> of R-Car. For example, it has multiple resets and multiple IRQs for global
> and channel interrupts. Also, it does not have ECC error flag registers
> and clk post divider present on R-Car. Similarly, R-Car V3U has 8 channels
> whereas other SoCs has only 2 channels.
>
> This patch adds the struct rcar_canfd_hw_info to take care of the
> HW feature differences and driver data present on both IPs. It also
> replaces the driver data chip type with struct rcar_canfd_hw_info by
> moving chip type to it.
>
> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>

Thanks for your patch!

> --- a/drivers/net/can/rcar/rcar_canfd.c
> +++ b/drivers/net/can/rcar/rcar_canfd.c

> @@ -591,10 +595,22 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
>         .brp_inc = 1,
>  };
>
> +static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
> +       .chip_id = RENESAS_RCAR_GEN3,
> +};
> +
> +static const struct rcar_canfd_hw_info rzg2l_hw_info = {
> +       .chip_id = RENESAS_RZG2L,
> +};
> +
> +static const struct rcar_canfd_hw_info r8a779a0_hw_info = {
> +       .chip_id = RENESAS_R8A779A0,
> +};
> +
>  /* Helper functions */
>  static inline bool is_v3u(struct rcar_canfd_global *gpriv)
>  {
> -       return gpriv->chip_id == RENESAS_R8A779A0;
> +       return gpriv->info == &r8a779a0_hw_info;

"return gpriv->info->chip_id == RENESAS_R8A779A0;" would match all
the other changes you make. But I see why you did it this way...
((most) users of is_v3u() are not converted to feature flags (yet) ;-)

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Biju Das Oct. 24, 2022, 5:23 p.m. UTC | #2
Hi Geert,

Thanks for the feedback.

> Subject: Re: [PATCH 1/6] can: rcar_canfd: rcar_canfd_probe: Add struct
> rcar_canfd_hw_info to driver data
> 
> Hi Biju,
> 
> On Sat, Oct 22, 2022 at 1:02 PM Biju Das <biju.das.jz@bp.renesas.com>
> wrote:
> > The CAN FD IP found on RZ/G2L SoC has some HW features different to
> > that of R-Car. For example, it has multiple resets and multiple IRQs
> > for global and channel interrupts. Also, it does not have ECC error
> > flag registers and clk post divider present on R-Car. Similarly, R-
> Car
> > V3U has 8 channels whereas other SoCs has only 2 channels.
> >
> > This patch adds the struct rcar_canfd_hw_info to take care of the HW
> > feature differences and driver data present on both IPs. It also
> > replaces the driver data chip type with struct rcar_canfd_hw_info by
> > moving chip type to it.
> >
> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> 
> Thanks for your patch!
> 
> > --- a/drivers/net/can/rcar/rcar_canfd.c
> > +++ b/drivers/net/can/rcar/rcar_canfd.c
> 
> > @@ -591,10 +595,22 @@ static const struct can_bittiming_const
> rcar_canfd_bittiming_const = {
> >         .brp_inc = 1,
> >  };
> >
> > +static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
> > +       .chip_id = RENESAS_RCAR_GEN3,
> > +};
> > +
> > +static const struct rcar_canfd_hw_info rzg2l_hw_info = {
> > +       .chip_id = RENESAS_RZG2L,
> > +};
> > +
> > +static const struct rcar_canfd_hw_info r8a779a0_hw_info = {
> > +       .chip_id = RENESAS_R8A779A0,
> > +};
> > +
> >  /* Helper functions */
> >  static inline bool is_v3u(struct rcar_canfd_global *gpriv)  {
> > -       return gpriv->chip_id == RENESAS_R8A779A0;
> > +       return gpriv->info == &r8a779a0_hw_info;
> 
> "return gpriv->info->chip_id == RENESAS_R8A779A0;" would match all the
> other changes you make. But I see why you did it this way...
> ((most) users of is_v3u() are not converted to feature flags (yet) ;-)

Yep, that is correct. Chip_id() is being removed in subsequent patches
Otherwise I need to create separate patch for this change alone.

Cheers,
Biju

> 
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 --
> geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a
> hacker. But when I'm talking to journalists I just say "programmer" or
> something like that.
>                                 -- Linus Torvalds
diff mbox series

Patch

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 4b12ed85deca..7bdbda1f1f12 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -523,6 +523,10 @@  enum rcar_canfd_fcanclk {
 
 struct rcar_canfd_global;
 
+struct rcar_canfd_hw_info {
+	enum rcanfd_chip_id chip_id;
+};
+
 /* Channel priv data */
 struct rcar_canfd_channel {
 	struct can_priv can;			/* Must be the first member */
@@ -548,7 +552,7 @@  struct rcar_canfd_global {
 	bool fdmode;			/* CAN FD or Classical CAN only mode */
 	struct reset_control *rstc1;
 	struct reset_control *rstc2;
-	enum rcanfd_chip_id chip_id;
+	const struct rcar_canfd_hw_info *info;
 	u32 max_channels;
 };
 
@@ -591,10 +595,22 @@  static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 	.brp_inc = 1,
 };
 
+static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
+	.chip_id = RENESAS_RCAR_GEN3,
+};
+
+static const struct rcar_canfd_hw_info rzg2l_hw_info = {
+	.chip_id = RENESAS_RZG2L,
+};
+
+static const struct rcar_canfd_hw_info r8a779a0_hw_info = {
+	.chip_id = RENESAS_R8A779A0,
+};
+
 /* Helper functions */
 static inline bool is_v3u(struct rcar_canfd_global *gpriv)
 {
-	return gpriv->chip_id == RENESAS_R8A779A0;
+	return gpriv->info == &r8a779a0_hw_info;
 }
 
 static inline u32 reg_v3u(struct rcar_canfd_global *gpriv,
@@ -1707,6 +1723,7 @@  static const struct ethtool_ops rcar_canfd_ethtool_ops = {
 static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
 				    u32 fcan_freq)
 {
+	const struct rcar_canfd_hw_info *info = gpriv->info;
 	struct platform_device *pdev = gpriv->pdev;
 	struct rcar_canfd_channel *priv;
 	struct net_device *ndev;
@@ -1729,7 +1746,7 @@  static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
 	priv->can.clock.freq = fcan_freq;
 	dev_info(&pdev->dev, "can_clk rate is %u\n", priv->can.clock.freq);
 
-	if (gpriv->chip_id == RENESAS_RZG2L) {
+	if (info->chip_id == RENESAS_RZG2L) {
 		char *irq_name;
 		int err_irq;
 		int tx_irq;
@@ -1829,6 +1846,7 @@  static void rcar_canfd_channel_remove(struct rcar_canfd_global *gpriv, u32 ch)
 
 static int rcar_canfd_probe(struct platform_device *pdev)
 {
+	const struct rcar_canfd_hw_info *info;
 	void __iomem *addr;
 	u32 sts, ch, fcan_freq;
 	struct rcar_canfd_global *gpriv;
@@ -1837,13 +1855,12 @@  static int rcar_canfd_probe(struct platform_device *pdev)
 	int err, ch_irq, g_irq;
 	int g_err_irq, g_recc_irq;
 	bool fdmode = true;			/* CAN FD only mode - default */
-	enum rcanfd_chip_id chip_id;
 	int max_channels;
 	char name[9] = "channelX";
 	int i;
 
-	chip_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
-	max_channels = chip_id == RENESAS_R8A779A0 ? 8 : 2;
+	info = of_device_get_match_data(&pdev->dev);
+	max_channels = info->chip_id == RENESAS_R8A779A0 ? 8 : 2;
 
 	if (of_property_read_bool(pdev->dev.of_node, "renesas,no-can-fd"))
 		fdmode = false;			/* Classical CAN only mode */
@@ -1856,7 +1873,7 @@  static int rcar_canfd_probe(struct platform_device *pdev)
 		of_node_put(of_child);
 	}
 
-	if (chip_id != RENESAS_RZG2L) {
+	if (info->chip_id != RENESAS_RZG2L) {
 		ch_irq = platform_get_irq_byname_optional(pdev, "ch_int");
 		if (ch_irq < 0) {
 			/* For backward compatibility get irq by index */
@@ -1890,7 +1907,7 @@  static int rcar_canfd_probe(struct platform_device *pdev)
 	gpriv->pdev = pdev;
 	gpriv->channels_mask = channels_mask;
 	gpriv->fdmode = fdmode;
-	gpriv->chip_id = chip_id;
+	gpriv->info = info;
 	gpriv->max_channels = max_channels;
 
 	gpriv->rstc1 = devm_reset_control_get_optional_exclusive(&pdev->dev,
@@ -1928,7 +1945,7 @@  static int rcar_canfd_probe(struct platform_device *pdev)
 	}
 	fcan_freq = clk_get_rate(gpriv->can_clk);
 
-	if (gpriv->fcan == RCANFD_CANFDCLK && gpriv->chip_id != RENESAS_RZG2L)
+	if (gpriv->fcan == RCANFD_CANFDCLK && info->chip_id != RENESAS_RZG2L)
 		/* CANFD clock is further divided by (1/2) within the IP */
 		fcan_freq /= 2;
 
@@ -1940,7 +1957,7 @@  static int rcar_canfd_probe(struct platform_device *pdev)
 	gpriv->base = addr;
 
 	/* Request IRQ that's common for both channels */
-	if (gpriv->chip_id != RENESAS_RZG2L) {
+	if (info->chip_id != RENESAS_RZG2L) {
 		err = devm_request_irq(&pdev->dev, ch_irq,
 				       rcar_canfd_channel_interrupt, 0,
 				       "canfd.ch_int", gpriv);
@@ -2093,9 +2110,9 @@  static SIMPLE_DEV_PM_OPS(rcar_canfd_pm_ops, rcar_canfd_suspend,
 			 rcar_canfd_resume);
 
 static const __maybe_unused struct of_device_id rcar_canfd_of_table[] = {
-	{ .compatible = "renesas,rcar-gen3-canfd", .data = (void *)RENESAS_RCAR_GEN3 },
-	{ .compatible = "renesas,rzg2l-canfd", .data = (void *)RENESAS_RZG2L },
-	{ .compatible = "renesas,r8a779a0-canfd", .data = (void *)RENESAS_R8A779A0 },
+	{ .compatible = "renesas,rcar-gen3-canfd", .data = &rcar_gen3_hw_info },
+	{ .compatible = "renesas,rzg2l-canfd", .data = &rzg2l_hw_info },
+	{ .compatible = "renesas,r8a779a0-canfd", .data = &r8a779a0_hw_info },
 	{ }
 };