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