18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* CAN bus driver for Bosch M_CAN controller 38c2ecf20Sopenharmony_ci * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef _CAN_M_CAN_H_ 78c2ecf20Sopenharmony_ci#define _CAN_M_CAN_H_ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/can/core.h> 108c2ecf20Sopenharmony_ci#include <linux/can/led.h> 118c2ecf20Sopenharmony_ci#include <linux/completion.h> 128c2ecf20Sopenharmony_ci#include <linux/device.h> 138c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 148c2ecf20Sopenharmony_ci#include <linux/freezer.h> 158c2ecf20Sopenharmony_ci#include <linux/slab.h> 168c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 178c2ecf20Sopenharmony_ci#include <linux/clk.h> 188c2ecf20Sopenharmony_ci#include <linux/delay.h> 198c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 208c2ecf20Sopenharmony_ci#include <linux/io.h> 218c2ecf20Sopenharmony_ci#include <linux/kernel.h> 228c2ecf20Sopenharmony_ci#include <linux/module.h> 238c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 248c2ecf20Sopenharmony_ci#include <linux/of.h> 258c2ecf20Sopenharmony_ci#include <linux/of_device.h> 268c2ecf20Sopenharmony_ci#include <linux/pm_runtime.h> 278c2ecf20Sopenharmony_ci#include <linux/iopoll.h> 288c2ecf20Sopenharmony_ci#include <linux/can/dev.h> 298c2ecf20Sopenharmony_ci#include <linux/pinctrl/consumer.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* m_can lec values */ 328c2ecf20Sopenharmony_cienum m_can_lec_type { 338c2ecf20Sopenharmony_ci LEC_NO_ERROR = 0, 348c2ecf20Sopenharmony_ci LEC_STUFF_ERROR, 358c2ecf20Sopenharmony_ci LEC_FORM_ERROR, 368c2ecf20Sopenharmony_ci LEC_ACK_ERROR, 378c2ecf20Sopenharmony_ci LEC_BIT1_ERROR, 388c2ecf20Sopenharmony_ci LEC_BIT0_ERROR, 398c2ecf20Sopenharmony_ci LEC_CRC_ERROR, 408c2ecf20Sopenharmony_ci LEC_UNUSED, 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cienum m_can_mram_cfg { 448c2ecf20Sopenharmony_ci MRAM_SIDF = 0, 458c2ecf20Sopenharmony_ci MRAM_XIDF, 468c2ecf20Sopenharmony_ci MRAM_RXF0, 478c2ecf20Sopenharmony_ci MRAM_RXF1, 488c2ecf20Sopenharmony_ci MRAM_RXB, 498c2ecf20Sopenharmony_ci MRAM_TXE, 508c2ecf20Sopenharmony_ci MRAM_TXB, 518c2ecf20Sopenharmony_ci MRAM_CFG_NUM, 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* address offset and element number for each FIFO/Buffer in the Message RAM */ 558c2ecf20Sopenharmony_cistruct mram_cfg { 568c2ecf20Sopenharmony_ci u16 off; 578c2ecf20Sopenharmony_ci u8 num; 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistruct m_can_classdev; 618c2ecf20Sopenharmony_cistruct m_can_ops { 628c2ecf20Sopenharmony_ci /* Device specific call backs */ 638c2ecf20Sopenharmony_ci int (*clear_interrupts)(struct m_can_classdev *cdev); 648c2ecf20Sopenharmony_ci u32 (*read_reg)(struct m_can_classdev *cdev, int reg); 658c2ecf20Sopenharmony_ci int (*write_reg)(struct m_can_classdev *cdev, int reg, int val); 668c2ecf20Sopenharmony_ci u32 (*read_fifo)(struct m_can_classdev *cdev, int addr_offset); 678c2ecf20Sopenharmony_ci int (*write_fifo)(struct m_can_classdev *cdev, int addr_offset, 688c2ecf20Sopenharmony_ci int val); 698c2ecf20Sopenharmony_ci int (*init)(struct m_can_classdev *cdev); 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistruct m_can_classdev { 738c2ecf20Sopenharmony_ci struct can_priv can; 748c2ecf20Sopenharmony_ci struct napi_struct napi; 758c2ecf20Sopenharmony_ci struct net_device *net; 768c2ecf20Sopenharmony_ci struct device *dev; 778c2ecf20Sopenharmony_ci struct clk *hclk; 788c2ecf20Sopenharmony_ci struct clk *cclk; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci struct workqueue_struct *tx_wq; 818c2ecf20Sopenharmony_ci struct work_struct tx_work; 828c2ecf20Sopenharmony_ci struct sk_buff *tx_skb; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci struct can_bittiming_const *bit_timing; 858c2ecf20Sopenharmony_ci struct can_bittiming_const *data_timing; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci struct m_can_ops *ops; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci void *device_data; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci int version; 928c2ecf20Sopenharmony_ci int freq; 938c2ecf20Sopenharmony_ci u32 irqstatus; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci int pm_clock_support; 968c2ecf20Sopenharmony_ci int is_peripheral; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci struct mram_cfg mcfg[MRAM_CFG_NUM]; 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistruct m_can_classdev *m_can_class_allocate_dev(struct device *dev); 1028c2ecf20Sopenharmony_civoid m_can_class_free_dev(struct net_device *net); 1038c2ecf20Sopenharmony_ciint m_can_class_register(struct m_can_classdev *cdev); 1048c2ecf20Sopenharmony_civoid m_can_class_unregister(struct m_can_classdev *cdev); 1058c2ecf20Sopenharmony_ciint m_can_class_get_clocks(struct m_can_classdev *cdev); 1068c2ecf20Sopenharmony_civoid m_can_init_ram(struct m_can_classdev *priv); 1078c2ecf20Sopenharmony_civoid m_can_config_endisable(struct m_can_classdev *priv, bool enable); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ciint m_can_class_suspend(struct device *dev); 1108c2ecf20Sopenharmony_ciint m_can_class_resume(struct device *dev); 1118c2ecf20Sopenharmony_ci#endif /* _CAN_M_H_ */ 112