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