1*2dcb8e87SMartin Jerabek /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*2dcb8e87SMartin Jerabek /******************************************************************************* 3*2dcb8e87SMartin Jerabek * 4*2dcb8e87SMartin Jerabek * CTU CAN FD IP Core 5*2dcb8e87SMartin Jerabek * 6*2dcb8e87SMartin Jerabek * Copyright (C) 2015-2018 Ondrej Ille <ondrej.ille@gmail.com> FEE CTU 7*2dcb8e87SMartin Jerabek * Copyright (C) 2018-2021 Ondrej Ille <ondrej.ille@gmail.com> self-funded 8*2dcb8e87SMartin Jerabek * Copyright (C) 2018-2019 Martin Jerabek <martin.jerabek01@gmail.com> FEE CTU 9*2dcb8e87SMartin Jerabek * Copyright (C) 2018-2021 Pavel Pisa <pisa@cmp.felk.cvut.cz> FEE CTU/self-funded 10*2dcb8e87SMartin Jerabek * 11*2dcb8e87SMartin Jerabek * Project advisors: 12*2dcb8e87SMartin Jerabek * Jiri Novak <jnovak@fel.cvut.cz> 13*2dcb8e87SMartin Jerabek * Pavel Pisa <pisa@cmp.felk.cvut.cz> 14*2dcb8e87SMartin Jerabek * 15*2dcb8e87SMartin Jerabek * Department of Measurement (http://meas.fel.cvut.cz/) 16*2dcb8e87SMartin Jerabek * Faculty of Electrical Engineering (http://www.fel.cvut.cz) 17*2dcb8e87SMartin Jerabek * Czech Technical University (http://www.cvut.cz/) 18*2dcb8e87SMartin Jerabek ******************************************************************************/ 19*2dcb8e87SMartin Jerabek 20*2dcb8e87SMartin Jerabek #ifndef __CTUCANFD__ 21*2dcb8e87SMartin Jerabek #define __CTUCANFD__ 22*2dcb8e87SMartin Jerabek 23*2dcb8e87SMartin Jerabek #include <linux/netdevice.h> 24*2dcb8e87SMartin Jerabek #include <linux/can/dev.h> 25*2dcb8e87SMartin Jerabek #include <linux/list.h> 26*2dcb8e87SMartin Jerabek 27*2dcb8e87SMartin Jerabek enum ctu_can_fd_can_registers; 28*2dcb8e87SMartin Jerabek 29*2dcb8e87SMartin Jerabek struct ctucan_priv { 30*2dcb8e87SMartin Jerabek struct can_priv can; /* must be first member! */ 31*2dcb8e87SMartin Jerabek 32*2dcb8e87SMartin Jerabek void __iomem *mem_base; 33*2dcb8e87SMartin Jerabek u32 (*read_reg)(struct ctucan_priv *priv, 34*2dcb8e87SMartin Jerabek enum ctu_can_fd_can_registers reg); 35*2dcb8e87SMartin Jerabek void (*write_reg)(struct ctucan_priv *priv, 36*2dcb8e87SMartin Jerabek enum ctu_can_fd_can_registers reg, u32 val); 37*2dcb8e87SMartin Jerabek 38*2dcb8e87SMartin Jerabek unsigned int txb_head; 39*2dcb8e87SMartin Jerabek unsigned int txb_tail; 40*2dcb8e87SMartin Jerabek u32 txb_prio; 41*2dcb8e87SMartin Jerabek unsigned int ntxbufs; 42*2dcb8e87SMartin Jerabek spinlock_t tx_lock; /* spinlock to serialize allocation and processing of TX buffers */ 43*2dcb8e87SMartin Jerabek 44*2dcb8e87SMartin Jerabek struct napi_struct napi; 45*2dcb8e87SMartin Jerabek struct device *dev; 46*2dcb8e87SMartin Jerabek struct clk *can_clk; 47*2dcb8e87SMartin Jerabek 48*2dcb8e87SMartin Jerabek int irq_flags; 49*2dcb8e87SMartin Jerabek unsigned long drv_flags; 50*2dcb8e87SMartin Jerabek 51*2dcb8e87SMartin Jerabek u32 rxfrm_first_word; 52*2dcb8e87SMartin Jerabek 53*2dcb8e87SMartin Jerabek struct list_head peers_on_pdev; 54*2dcb8e87SMartin Jerabek }; 55*2dcb8e87SMartin Jerabek 56*2dcb8e87SMartin Jerabek /** 57*2dcb8e87SMartin Jerabek * ctucan_probe_common - Device type independent registration call 58*2dcb8e87SMartin Jerabek * 59*2dcb8e87SMartin Jerabek * This function does all the memory allocation and registration for the CAN 60*2dcb8e87SMartin Jerabek * device. 61*2dcb8e87SMartin Jerabek * 62*2dcb8e87SMartin Jerabek * @dev: Handle to the generic device structure 63*2dcb8e87SMartin Jerabek * @addr: Base address of CTU CAN FD core address 64*2dcb8e87SMartin Jerabek * @irq: Interrupt number 65*2dcb8e87SMartin Jerabek * @ntxbufs: Number of implemented Tx buffers 66*2dcb8e87SMartin Jerabek * @can_clk_rate: Clock rate, if 0 then clock are taken from device node 67*2dcb8e87SMartin Jerabek * @pm_enable_call: Whether pm_runtime_enable should be called 68*2dcb8e87SMartin Jerabek * @set_drvdata_fnc: Function to set network driver data for physical device 69*2dcb8e87SMartin Jerabek * 70*2dcb8e87SMartin Jerabek * Return: 0 on success and failure value on error 71*2dcb8e87SMartin Jerabek */ 72*2dcb8e87SMartin Jerabek int ctucan_probe_common(struct device *dev, void __iomem *addr, 73*2dcb8e87SMartin Jerabek int irq, unsigned int ntxbufs, 74*2dcb8e87SMartin Jerabek unsigned long can_clk_rate, 75*2dcb8e87SMartin Jerabek int pm_enable_call, 76*2dcb8e87SMartin Jerabek void (*set_drvdata_fnc)(struct device *dev, 77*2dcb8e87SMartin Jerabek struct net_device *ndev)); 78*2dcb8e87SMartin Jerabek 79*2dcb8e87SMartin Jerabek int ctucan_suspend(struct device *dev) __maybe_unused; 80*2dcb8e87SMartin Jerabek int ctucan_resume(struct device *dev) __maybe_unused; 81*2dcb8e87SMartin Jerabek 82*2dcb8e87SMartin Jerabek #endif /*__CTUCANFD__*/ 83