162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * CTU CAN FD IP Core
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2015-2018 Ondrej Ille <ondrej.ille@gmail.com> FEE CTU
762306a36Sopenharmony_ci * Copyright (C) 2018-2021 Ondrej Ille <ondrej.ille@gmail.com> self-funded
862306a36Sopenharmony_ci * Copyright (C) 2018-2019 Martin Jerabek <martin.jerabek01@gmail.com> FEE CTU
962306a36Sopenharmony_ci * Copyright (C) 2018-2021 Pavel Pisa <pisa@cmp.felk.cvut.cz> FEE CTU/self-funded
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * Project advisors:
1262306a36Sopenharmony_ci *     Jiri Novak <jnovak@fel.cvut.cz>
1362306a36Sopenharmony_ci *     Pavel Pisa <pisa@cmp.felk.cvut.cz>
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * Department of Measurement         (http://meas.fel.cvut.cz/)
1662306a36Sopenharmony_ci * Faculty of Electrical Engineering (http://www.fel.cvut.cz)
1762306a36Sopenharmony_ci * Czech Technical University        (http://www.cvut.cz/)
1862306a36Sopenharmony_ci ******************************************************************************/
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#ifndef __CTUCANFD__
2162306a36Sopenharmony_ci#define __CTUCANFD__
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include <linux/netdevice.h>
2462306a36Sopenharmony_ci#include <linux/can/dev.h>
2562306a36Sopenharmony_ci#include <linux/list.h>
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum ctu_can_fd_can_registers;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct ctucan_priv {
3062306a36Sopenharmony_ci	struct can_priv can; /* must be first member! */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	void __iomem *mem_base;
3362306a36Sopenharmony_ci	u32 (*read_reg)(struct ctucan_priv *priv,
3462306a36Sopenharmony_ci			enum ctu_can_fd_can_registers reg);
3562306a36Sopenharmony_ci	void (*write_reg)(struct ctucan_priv *priv,
3662306a36Sopenharmony_ci			  enum ctu_can_fd_can_registers reg, u32 val);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	unsigned int txb_head;
3962306a36Sopenharmony_ci	unsigned int txb_tail;
4062306a36Sopenharmony_ci	u32 txb_prio;
4162306a36Sopenharmony_ci	unsigned int ntxbufs;
4262306a36Sopenharmony_ci	spinlock_t tx_lock; /* spinlock to serialize allocation and processing of TX buffers */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	struct napi_struct napi;
4562306a36Sopenharmony_ci	struct device *dev;
4662306a36Sopenharmony_ci	struct clk *can_clk;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	int irq_flags;
4962306a36Sopenharmony_ci	unsigned long drv_flags;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	u32 rxfrm_first_word;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	struct list_head peers_on_pdev;
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/**
5762306a36Sopenharmony_ci * ctucan_probe_common - Device type independent registration call
5862306a36Sopenharmony_ci *
5962306a36Sopenharmony_ci * This function does all the memory allocation and registration for the CAN
6062306a36Sopenharmony_ci * device.
6162306a36Sopenharmony_ci *
6262306a36Sopenharmony_ci * @dev:	Handle to the generic device structure
6362306a36Sopenharmony_ci * @addr:	Base address of CTU CAN FD core address
6462306a36Sopenharmony_ci * @irq:	Interrupt number
6562306a36Sopenharmony_ci * @ntxbufs:	Number of implemented Tx buffers
6662306a36Sopenharmony_ci * @can_clk_rate: Clock rate, if 0 then clock are taken from device node
6762306a36Sopenharmony_ci * @pm_enable_call: Whether pm_runtime_enable should be called
6862306a36Sopenharmony_ci * @set_drvdata_fnc: Function to set network driver data for physical device
6962306a36Sopenharmony_ci *
7062306a36Sopenharmony_ci * Return: 0 on success and failure value on error
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ciint ctucan_probe_common(struct device *dev, void __iomem *addr,
7362306a36Sopenharmony_ci			int irq, unsigned int ntxbufs,
7462306a36Sopenharmony_ci			unsigned long can_clk_rate,
7562306a36Sopenharmony_ci			int pm_enable_call,
7662306a36Sopenharmony_ci			void (*set_drvdata_fnc)(struct device *dev,
7762306a36Sopenharmony_ci						struct net_device *ndev));
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciint ctucan_suspend(struct device *dev) __maybe_unused;
8062306a36Sopenharmony_ciint ctucan_resume(struct device *dev) __maybe_unused;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#endif /*__CTUCANFD__*/
83