linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, kuba@kernel.org, linux-can@vger.kernel.org,
	kernel@pengutronix.de, Biju Das <biju.das.jz@bp.renesas.com>,
	Geert Uytterhoeven <geert+renesas@glider.be>,
	Marc Kleine-Budde <mkl@pengutronix.de>
Subject: [PATCH net-next 03/39] can: rcar_canfd: rcar_canfd_probe: Add struct rcar_canfd_hw_info to driver data
Date: Mon, 12 Dec 2022 12:30:09 +0100	[thread overview]
Message-ID: <20221212113045.222493-4-mkl@pengutronix.de> (raw)
In-Reply-To: <20221212113045.222493-1-mkl@pengutronix.de>

From: Biju Das <biju.das.jz@bp.renesas.com>

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.

Whilst started using driver data instead of chip_id for detecting
R-Car V3U SoCs.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/all/20221027082158.95895-2-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/rcar/rcar_canfd.c | 43 +++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 13 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 0a59eab35da7..1a5a013ac5bc 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -522,6 +522,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 */
@@ -547,7 +551,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;
 };
 
@@ -590,10 +594,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,
@@ -1696,6 +1712,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;
@@ -1718,7 +1735,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;
@@ -1818,6 +1835,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;
@@ -1826,13 +1844,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 */
@@ -1845,7 +1862,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 */
@@ -1879,7 +1896,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,
@@ -1917,7 +1934,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;
 
@@ -1929,7 +1946,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);
@@ -2082,9 +2099,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 },
 	{ }
 };
 
-- 
2.35.1



  parent reply	other threads:[~2022-12-12 11:30 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-12 11:30 [PATCH net-next 0/39] pull-request: can-next 2022-12-12 Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 01/39] can: kvaser_usb: kvaser_usb_set_bittiming(): fix redundant initialization warning for err Marc Kleine-Budde
2022-12-12 12:20   ` patchwork-bot+netdevbpf
2022-12-12 11:30 ` [PATCH net-next 02/39] can: kvaser_usb: kvaser_usb_set_{,data}bittiming(): remove empty lines in variable declaration Marc Kleine-Budde
2022-12-12 11:30 ` Marc Kleine-Budde [this message]
2022-12-12 11:30 ` [PATCH net-next 04/39] can: m_can: sort header inclusion alphabetically Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 05/39] can: rcar_canfd: Add max_channels to struct rcar_canfd_hw_info Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 06/39] can: rcar_canfd: Add shared_global_irqs " Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 07/39] can: rcar_canfd: Add postdiv " Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 08/39] can: rcar_canfd: Add multi_channel_irqs " Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 09/39] can: ctucanfd: Drop obsolete dependency on COMPILE_TEST Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 10/39] can: etas_es58x: sort the includes by alphabetic order Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 11/39] can: flexcan: add auto stop mode for IMX93 to support wakeup Marc Kleine-Budde
2022-12-13  2:22   ` Bough Chen
2022-12-13  8:11     ` Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 12/39] can: etas_es58x: add devlink support Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 13/39] dt-bindings: can: fsl,flexcan: add imx93 compatible Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 14/39] can: etas_es58x: add devlink port support Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 15/39] dt-bindings: can: renesas,rcar-canfd: Document RZ/Five SoC Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 16/39] USB: core: export usb_cache_string() Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 17/39] can: c_can: use devm_platform_get_and_ioremap_resource() Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 18/39] net: devlink: add DEVLINK_INFO_VERSION_GENERIC_FW_BOOTLOADER Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 19/39] can: etas_es58x: export product information through devlink_ops::info_get() Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 20/39] can: etas_es58x: remove es58x_get_product_info() Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 21/39] Documentation: devlink: add devlink documentation for the etas_es58x driver Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 22/39] can: ucan: use strscpy() to instead of strncpy() Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 23/39] net: af_can: remove useless parameter 'err' in 'can_rx_register()' Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 24/39] can: ucan: remove unused ucan_priv::intf Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 25/39] can: gs_usb: remove gs_can::iface Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 26/39] can: m_can: Call the RAM init directly from m_can_chip_config Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 27/39] can: raw: add support for SO_MARK Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 28/39] dt-bindings: can: renesas,rcar-canfd: Fix number of channels for R-Car V3U Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 29/39] can: m_can: Eliminate double read of TXFQS in tx_handler Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 30/39] can: m_can: Avoid reading irqstatus twice Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 31/39] can: m_can: Read register PSR only on error Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 32/39] can: m_can: Count TXE FIFO getidx in the driver Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 33/39] can: m_can: Count read getindex " Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 34/39] can: m_can: Batch acknowledge transmit events Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 35/39] can: m_can: Batch acknowledge rx fifo Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 36/39] can: tcan4x5x: Remove invalid write in clear_interrupts Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 37/39] can: tcan4x5x: Fix use of register error status mask Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 38/39] can: tcan4x5x: Fix register range of first two blocks Marc Kleine-Budde
2022-12-12 11:30 ` [PATCH net-next 39/39] can: tcan4x5x: Specify separate read/write ranges Marc Kleine-Budde

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=20221212113045.222493-4-mkl@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=biju.das.jz@bp.renesas.com \
    --cc=davem@davemloft.net \
    --cc=geert+renesas@glider.be \
    --cc=kernel@pengutronix.de \
    --cc=kuba@kernel.org \
    --cc=linux-can@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /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).