162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* CAN bus driver for Bosch M_CAN controller
362306a36Sopenharmony_ci * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _CAN_M_CAN_H_
762306a36Sopenharmony_ci#define _CAN_M_CAN_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/can/core.h>
1062306a36Sopenharmony_ci#include <linux/can/dev.h>
1162306a36Sopenharmony_ci#include <linux/can/rx-offload.h>
1262306a36Sopenharmony_ci#include <linux/clk.h>
1362306a36Sopenharmony_ci#include <linux/completion.h>
1462306a36Sopenharmony_ci#include <linux/delay.h>
1562306a36Sopenharmony_ci#include <linux/device.h>
1662306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1762306a36Sopenharmony_ci#include <linux/freezer.h>
1862306a36Sopenharmony_ci#include <linux/hrtimer.h>
1962306a36Sopenharmony_ci#include <linux/interrupt.h>
2062306a36Sopenharmony_ci#include <linux/io.h>
2162306a36Sopenharmony_ci#include <linux/iopoll.h>
2262306a36Sopenharmony_ci#include <linux/kernel.h>
2362306a36Sopenharmony_ci#include <linux/module.h>
2462306a36Sopenharmony_ci#include <linux/netdevice.h>
2562306a36Sopenharmony_ci#include <linux/of.h>
2662306a36Sopenharmony_ci#include <linux/phy/phy.h>
2762306a36Sopenharmony_ci#include <linux/pinctrl/consumer.h>
2862306a36Sopenharmony_ci#include <linux/pm_runtime.h>
2962306a36Sopenharmony_ci#include <linux/slab.h>
3062306a36Sopenharmony_ci#include <linux/uaccess.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* m_can lec values */
3362306a36Sopenharmony_cienum m_can_lec_type {
3462306a36Sopenharmony_ci	LEC_NO_ERROR = 0,
3562306a36Sopenharmony_ci	LEC_STUFF_ERROR,
3662306a36Sopenharmony_ci	LEC_FORM_ERROR,
3762306a36Sopenharmony_ci	LEC_ACK_ERROR,
3862306a36Sopenharmony_ci	LEC_BIT1_ERROR,
3962306a36Sopenharmony_ci	LEC_BIT0_ERROR,
4062306a36Sopenharmony_ci	LEC_CRC_ERROR,
4162306a36Sopenharmony_ci	LEC_NO_CHANGE,
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cienum m_can_mram_cfg {
4562306a36Sopenharmony_ci	MRAM_SIDF = 0,
4662306a36Sopenharmony_ci	MRAM_XIDF,
4762306a36Sopenharmony_ci	MRAM_RXF0,
4862306a36Sopenharmony_ci	MRAM_RXF1,
4962306a36Sopenharmony_ci	MRAM_RXB,
5062306a36Sopenharmony_ci	MRAM_TXE,
5162306a36Sopenharmony_ci	MRAM_TXB,
5262306a36Sopenharmony_ci	MRAM_CFG_NUM,
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* address offset and element number for each FIFO/Buffer in the Message RAM */
5662306a36Sopenharmony_cistruct mram_cfg {
5762306a36Sopenharmony_ci	u16 off;
5862306a36Sopenharmony_ci	u8  num;
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistruct m_can_classdev;
6262306a36Sopenharmony_cistruct m_can_ops {
6362306a36Sopenharmony_ci	/* Device specific call backs */
6462306a36Sopenharmony_ci	int (*clear_interrupts)(struct m_can_classdev *cdev);
6562306a36Sopenharmony_ci	u32 (*read_reg)(struct m_can_classdev *cdev, int reg);
6662306a36Sopenharmony_ci	int (*write_reg)(struct m_can_classdev *cdev, int reg, int val);
6762306a36Sopenharmony_ci	int (*read_fifo)(struct m_can_classdev *cdev, int addr_offset, void *val, size_t val_count);
6862306a36Sopenharmony_ci	int (*write_fifo)(struct m_can_classdev *cdev, int addr_offset,
6962306a36Sopenharmony_ci			  const void *val, size_t val_count);
7062306a36Sopenharmony_ci	int (*init)(struct m_can_classdev *cdev);
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct m_can_classdev {
7462306a36Sopenharmony_ci	struct can_priv can;
7562306a36Sopenharmony_ci	struct can_rx_offload offload;
7662306a36Sopenharmony_ci	struct napi_struct napi;
7762306a36Sopenharmony_ci	struct net_device *net;
7862306a36Sopenharmony_ci	struct device *dev;
7962306a36Sopenharmony_ci	struct clk *hclk;
8062306a36Sopenharmony_ci	struct clk *cclk;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	struct workqueue_struct *tx_wq;
8362306a36Sopenharmony_ci	struct work_struct tx_work;
8462306a36Sopenharmony_ci	struct sk_buff *tx_skb;
8562306a36Sopenharmony_ci	struct phy *transceiver;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	struct m_can_ops *ops;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	int version;
9062306a36Sopenharmony_ci	u32 irqstatus;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	int pm_clock_support;
9362306a36Sopenharmony_ci	int is_peripheral;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	struct mram_cfg mcfg[MRAM_CFG_NUM];
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	struct hrtimer hrtimer;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistruct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);
10162306a36Sopenharmony_civoid m_can_class_free_dev(struct net_device *net);
10262306a36Sopenharmony_ciint m_can_class_register(struct m_can_classdev *cdev);
10362306a36Sopenharmony_civoid m_can_class_unregister(struct m_can_classdev *cdev);
10462306a36Sopenharmony_ciint m_can_class_get_clocks(struct m_can_classdev *cdev);
10562306a36Sopenharmony_ciint m_can_init_ram(struct m_can_classdev *priv);
10662306a36Sopenharmony_ciint m_can_check_mram_cfg(struct m_can_classdev *cdev, u32 mram_max_size);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciint m_can_class_suspend(struct device *dev);
10962306a36Sopenharmony_ciint m_can_class_resume(struct device *dev);
11062306a36Sopenharmony_ci#endif	/* _CAN_M_H_ */
111