flexcan.c 40.0 KB
Newer Older
1 2 3 4 5
/*
 * flexcan.c - FLEXCAN CAN controller driver
 *
 * Copyright (c) 2005-2006 Varma Electronics Oy
 * Copyright (c) 2009 Sascha Hauer, Pengutronix
6 7
 * Copyright (c) 2010-2017 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de>
 * Copyright (c) 2014 David Jander, Protonic Holland
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * Based on code originally by Andrey Volkov <avolkov@varma-el.com>
 *
 * LICENCE:
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation version 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <linux/netdevice.h>
#include <linux/can.h>
#include <linux/can/dev.h>
#include <linux/can/error.h>
27
#include <linux/can/led.h>
28
#include <linux/can/rx-offload.h>
29 30 31 32 33
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/module.h>
34
#include <linux/of.h>
35
#include <linux/of_device.h>
36
#include <linux/platform_device.h>
37
#include <linux/regulator/consumer.h>
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

#define DRV_NAME			"flexcan"

/* 8 for RX fifo and 2 error handling */
#define FLEXCAN_NAPI_WEIGHT		(8 + 2)

/* FLEXCAN module configuration register (CANMCR) bits */
#define FLEXCAN_MCR_MDIS		BIT(31)
#define FLEXCAN_MCR_FRZ			BIT(30)
#define FLEXCAN_MCR_FEN			BIT(29)
#define FLEXCAN_MCR_HALT		BIT(28)
#define FLEXCAN_MCR_NOT_RDY		BIT(27)
#define FLEXCAN_MCR_WAK_MSK		BIT(26)
#define FLEXCAN_MCR_SOFTRST		BIT(25)
#define FLEXCAN_MCR_FRZ_ACK		BIT(24)
#define FLEXCAN_MCR_SUPV		BIT(23)
#define FLEXCAN_MCR_SLF_WAK		BIT(22)
#define FLEXCAN_MCR_WRN_EN		BIT(21)
#define FLEXCAN_MCR_LPM_ACK		BIT(20)
#define FLEXCAN_MCR_WAK_SRC		BIT(19)
#define FLEXCAN_MCR_DOZE		BIT(18)
#define FLEXCAN_MCR_SRX_DIS		BIT(17)
60
#define FLEXCAN_MCR_IRMQ		BIT(16)
61 62
#define FLEXCAN_MCR_LPRIO_EN		BIT(13)
#define FLEXCAN_MCR_AEN			BIT(12)
63
/* MCR_MAXMB: maximum used MBs is MAXMB + 1 */
64
#define FLEXCAN_MCR_MAXMB(x)		((x) & 0x7f)
65 66 67 68
#define FLEXCAN_MCR_IDAM_A		(0x0 << 8)
#define FLEXCAN_MCR_IDAM_B		(0x1 << 8)
#define FLEXCAN_MCR_IDAM_C		(0x2 << 8)
#define FLEXCAN_MCR_IDAM_D		(0x3 << 8)
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

/* FLEXCAN control register (CANCTRL) bits */
#define FLEXCAN_CTRL_PRESDIV(x)		(((x) & 0xff) << 24)
#define FLEXCAN_CTRL_RJW(x)		(((x) & 0x03) << 22)
#define FLEXCAN_CTRL_PSEG1(x)		(((x) & 0x07) << 19)
#define FLEXCAN_CTRL_PSEG2(x)		(((x) & 0x07) << 16)
#define FLEXCAN_CTRL_BOFF_MSK		BIT(15)
#define FLEXCAN_CTRL_ERR_MSK		BIT(14)
#define FLEXCAN_CTRL_CLK_SRC		BIT(13)
#define FLEXCAN_CTRL_LPB		BIT(12)
#define FLEXCAN_CTRL_TWRN_MSK		BIT(11)
#define FLEXCAN_CTRL_RWRN_MSK		BIT(10)
#define FLEXCAN_CTRL_SMP		BIT(7)
#define FLEXCAN_CTRL_BOFF_REC		BIT(6)
#define FLEXCAN_CTRL_TSYN		BIT(5)
#define FLEXCAN_CTRL_LBUF		BIT(4)
#define FLEXCAN_CTRL_LOM		BIT(3)
#define FLEXCAN_CTRL_PROPSEG(x)		((x) & 0x07)
#define FLEXCAN_CTRL_ERR_BUS		(FLEXCAN_CTRL_ERR_MSK)
#define FLEXCAN_CTRL_ERR_STATE \
	(FLEXCAN_CTRL_TWRN_MSK | FLEXCAN_CTRL_RWRN_MSK | \
	 FLEXCAN_CTRL_BOFF_MSK)
#define FLEXCAN_CTRL_ERR_ALL \
	(FLEXCAN_CTRL_ERR_BUS | FLEXCAN_CTRL_ERR_STATE)

94
/* FLEXCAN control register 2 (CTRL2) bits */
95 96 97 98 99 100 101
#define FLEXCAN_CTRL2_ECRWRE		BIT(29)
#define FLEXCAN_CTRL2_WRMFRZ		BIT(28)
#define FLEXCAN_CTRL2_RFFN(x)		(((x) & 0x0f) << 24)
#define FLEXCAN_CTRL2_TASD(x)		(((x) & 0x1f) << 19)
#define FLEXCAN_CTRL2_MRP		BIT(18)
#define FLEXCAN_CTRL2_RRS		BIT(17)
#define FLEXCAN_CTRL2_EACEN		BIT(16)
102 103 104 105 106 107 108 109 110 111 112 113 114

/* FLEXCAN memory error control register (MECR) bits */
#define FLEXCAN_MECR_ECRWRDIS		BIT(31)
#define FLEXCAN_MECR_HANCEI_MSK		BIT(19)
#define FLEXCAN_MECR_FANCEI_MSK		BIT(18)
#define FLEXCAN_MECR_CEI_MSK		BIT(16)
#define FLEXCAN_MECR_HAERRIE		BIT(15)
#define FLEXCAN_MECR_FAERRIE		BIT(14)
#define FLEXCAN_MECR_EXTERRIE		BIT(13)
#define FLEXCAN_MECR_RERRDIS		BIT(9)
#define FLEXCAN_MECR_ECCDIS		BIT(8)
#define FLEXCAN_MECR_NCEFAFRZ		BIT(7)

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
/* FLEXCAN error and status register (ESR) bits */
#define FLEXCAN_ESR_TWRN_INT		BIT(17)
#define FLEXCAN_ESR_RWRN_INT		BIT(16)
#define FLEXCAN_ESR_BIT1_ERR		BIT(15)
#define FLEXCAN_ESR_BIT0_ERR		BIT(14)
#define FLEXCAN_ESR_ACK_ERR		BIT(13)
#define FLEXCAN_ESR_CRC_ERR		BIT(12)
#define FLEXCAN_ESR_FRM_ERR		BIT(11)
#define FLEXCAN_ESR_STF_ERR		BIT(10)
#define FLEXCAN_ESR_TX_WRN		BIT(9)
#define FLEXCAN_ESR_RX_WRN		BIT(8)
#define FLEXCAN_ESR_IDLE		BIT(7)
#define FLEXCAN_ESR_TXRX		BIT(6)
#define FLEXCAN_EST_FLT_CONF_SHIFT	(4)
#define FLEXCAN_ESR_FLT_CONF_MASK	(0x3 << FLEXCAN_EST_FLT_CONF_SHIFT)
#define FLEXCAN_ESR_FLT_CONF_ACTIVE	(0x0 << FLEXCAN_EST_FLT_CONF_SHIFT)
#define FLEXCAN_ESR_FLT_CONF_PASSIVE	(0x1 << FLEXCAN_EST_FLT_CONF_SHIFT)
#define FLEXCAN_ESR_BOFF_INT		BIT(2)
#define FLEXCAN_ESR_ERR_INT		BIT(1)
#define FLEXCAN_ESR_WAK_INT		BIT(0)
#define FLEXCAN_ESR_ERR_BUS \
	(FLEXCAN_ESR_BIT1_ERR | FLEXCAN_ESR_BIT0_ERR | \
	 FLEXCAN_ESR_ACK_ERR | FLEXCAN_ESR_CRC_ERR | \
	 FLEXCAN_ESR_FRM_ERR | FLEXCAN_ESR_STF_ERR)
#define FLEXCAN_ESR_ERR_STATE \
	(FLEXCAN_ESR_TWRN_INT | FLEXCAN_ESR_RWRN_INT | FLEXCAN_ESR_BOFF_INT)
#define FLEXCAN_ESR_ERR_ALL \
	(FLEXCAN_ESR_ERR_BUS | FLEXCAN_ESR_ERR_STATE)
143 144 145
#define FLEXCAN_ESR_ALL_INT \
	(FLEXCAN_ESR_TWRN_INT | FLEXCAN_ESR_RWRN_INT | \
	 FLEXCAN_ESR_BOFF_INT | FLEXCAN_ESR_ERR_INT)
146 147

/* FLEXCAN interrupt flag register (IFLAG) bits */
148
/* Errata ERR005829 step7: Reserve first valid MB */
149 150
#define FLEXCAN_TX_MB_RESERVED_OFF_FIFO	8
#define FLEXCAN_TX_MB_OFF_FIFO		9
151 152 153 154
#define FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP	0
#define FLEXCAN_TX_MB_OFF_TIMESTAMP		1
#define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST	(FLEXCAN_TX_MB_OFF_TIMESTAMP + 1)
#define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST	63
155
#define FLEXCAN_IFLAG_MB(x)		BIT(x)
156 157 158 159 160
#define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW	BIT(7)
#define FLEXCAN_IFLAG_RX_FIFO_WARN	BIT(6)
#define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE	BIT(5)

/* FLEXCAN message buffers */
161 162
#define FLEXCAN_MB_CODE_MASK		(0xf << 24)
#define FLEXCAN_MB_CODE_RX_BUSY_BIT	(0x1 << 24)
163 164 165
#define FLEXCAN_MB_CODE_RX_INACTIVE	(0x0 << 24)
#define FLEXCAN_MB_CODE_RX_EMPTY	(0x4 << 24)
#define FLEXCAN_MB_CODE_RX_FULL		(0x2 << 24)
166
#define FLEXCAN_MB_CODE_RX_OVERRUN	(0x6 << 24)
167 168 169 170 171 172 173
#define FLEXCAN_MB_CODE_RX_RANSWER	(0xa << 24)

#define FLEXCAN_MB_CODE_TX_INACTIVE	(0x8 << 24)
#define FLEXCAN_MB_CODE_TX_ABORT	(0x9 << 24)
#define FLEXCAN_MB_CODE_TX_DATA		(0xc << 24)
#define FLEXCAN_MB_CODE_TX_TANSWER	(0xe << 24)

174 175 176 177 178 179
#define FLEXCAN_MB_CNT_SRR		BIT(22)
#define FLEXCAN_MB_CNT_IDE		BIT(21)
#define FLEXCAN_MB_CNT_RTR		BIT(20)
#define FLEXCAN_MB_CNT_LENGTH(x)	(((x) & 0xf) << 16)
#define FLEXCAN_MB_CNT_TIMESTAMP(x)	((x) & 0xffff)

180
#define FLEXCAN_TIMEOUT_US		(50)
181

182
/* FLEXCAN hardware feature flags
183 184
 *
 * Below is some version info we got:
185 186
 *    SOC   Version   IP-Version  Glitch- [TR]WRN_INT IRQ Err Memory err RTR re-
 *                                Filter? connected?  Passive detection  ception in MB
187
 *   MX25  FlexCAN2  03.00.00.00     no        no        no       no        no
188
 *   MX28  FlexCAN2  03.00.04.00    yes       yes        no       no        no
189
 *   MX35  FlexCAN2  03.00.00.00     no        no        no       no        no
190 191
 *   MX53  FlexCAN2  03.00.00.00    yes        no        no       no        no
 *   MX6s  FlexCAN3  10.00.12.00    yes       yes        no       no       yes
192
 *   VF610 FlexCAN3  ?               no       yes        no      yes       yes?
193 194 195
 *
 * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected.
 */
196
#define FLEXCAN_QUIRK_BROKEN_WERR_STATE	BIT(1) /* [TR]WRN_INT not connected */
197
#define FLEXCAN_QUIRK_DISABLE_RXFG	BIT(2) /* Disable RX FIFO Global mask */
198
#define FLEXCAN_QUIRK_ENABLE_EACEN_RRS	BIT(3) /* Enable EACEN and RRS bit in ctrl2 */
199
#define FLEXCAN_QUIRK_DISABLE_MECR	BIT(4) /* Disable Memory error detection */
200
#define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP	BIT(5) /* Use timestamp based offloading */
201
#define FLEXCAN_QUIRK_BROKEN_PERR_STATE	BIT(6) /* No interrupt for error passive */
202

203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
/* Structure of the message buffer */
struct flexcan_mb {
	u32 can_ctrl;
	u32 can_id;
	u32 data[2];
};

/* Structure of the hardware registers */
struct flexcan_regs {
	u32 mcr;		/* 0x00 */
	u32 ctrl;		/* 0x04 */
	u32 timer;		/* 0x08 */
	u32 _reserved1;		/* 0x0c */
	u32 rxgmask;		/* 0x10 */
	u32 rx14mask;		/* 0x14 */
	u32 rx15mask;		/* 0x18 */
	u32 ecr;		/* 0x1c */
	u32 esr;		/* 0x20 */
	u32 imask2;		/* 0x24 */
	u32 imask1;		/* 0x28 */
	u32 iflag2;		/* 0x2c */
	u32 iflag1;		/* 0x30 */
225 226 227 228
	union {			/* 0x34 */
		u32 gfwr_mx28;	/* MX28, MX53 */
		u32 ctrl2;	/* MX6, VF610 */
	};
229 230 231 232 233 234
	u32 esr2;		/* 0x38 */
	u32 imeur;		/* 0x3c */
	u32 lrfr;		/* 0x40 */
	u32 crcr;		/* 0x44 */
	u32 rxfgmask;		/* 0x48 */
	u32 rxfir;		/* 0x4c */
235
	u32 _reserved3[12];	/* 0x50 */
236
	struct flexcan_mb mb[64];	/* 0x80 */
237 238 239 240 241 242 243
	/* FIFO-mode:
	 *			MB
	 * 0x080...0x08f	0	RX message buffer
	 * 0x090...0x0df	1-5	reserverd
	 * 0x0e0...0x0ff	6-7	8 entry ID table
	 *				(mx25, mx28, mx35, mx53)
	 * 0x0e0...0x2df	6-7..37	8..128 entry ID table
244
	 *				size conf'ed via ctrl2::RFFN
245 246
	 *				(mx6, vf610)
	 */
247 248 249 250 251
	u32 _reserved4[256];	/* 0x480 */
	u32 rximr[64];		/* 0x880 */
	u32 _reserved5[24];	/* 0x980 */
	u32 gfwr_mx6;		/* 0x9e0 - MX6 */
	u32 _reserved6[63];	/* 0x9e4 */
252 253 254 255 256 257 258 259
	u32 mecr;		/* 0xae0 */
	u32 erriar;		/* 0xae4 */
	u32 erridpr;		/* 0xae8 */
	u32 errippr;		/* 0xaec */
	u32 rerrar;		/* 0xaf0 */
	u32 rerrdr;		/* 0xaf4 */
	u32 rerrsynr;		/* 0xaf8 */
	u32 errsr;		/* 0xafc */
260 261
};

262
struct flexcan_devtype_data {
263
	u32 quirks;		/* quirks needed for different IP cores */
264 265
};

266 267
struct flexcan_priv {
	struct can_priv can;
268
	struct can_rx_offload offload;
269

270
	struct flexcan_regs __iomem *regs;
271 272 273
	struct flexcan_mb __iomem *tx_mb;
	struct flexcan_mb __iomem *tx_mb_reserved;
	u8 tx_mb_idx;
274
	u32 reg_ctrl_default;
275
	u32 reg_imask1_default;
276
	u32 reg_imask2_default;
277

278 279
	struct clk *clk_ipg;
	struct clk *clk_per;
280
	const struct flexcan_devtype_data *devtype_data;
281
	struct regulator *reg_xceiver;
282 283
};

284
static const struct flexcan_devtype_data fsl_p1010_devtype_data = {
285 286
	.quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE |
		FLEXCAN_QUIRK_BROKEN_PERR_STATE,
287
};
288

289 290 291
static const struct flexcan_devtype_data fsl_imx28_devtype_data = {
	.quirks = FLEXCAN_QUIRK_BROKEN_PERR_STATE,
};
292

293
static const struct flexcan_devtype_data fsl_imx6q_devtype_data = {
294
	.quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS |
295
		FLEXCAN_QUIRK_USE_OFF_TIMESTAMP | FLEXCAN_QUIRK_BROKEN_PERR_STATE,
296
};
297

298
static const struct flexcan_devtype_data fsl_vf610_devtype_data = {
299
	.quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS |
300 301
		FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_OFF_TIMESTAMP |
		FLEXCAN_QUIRK_BROKEN_PERR_STATE,
302
};
303

304
static const struct can_bittiming_const flexcan_bittiming_const = {
305 306 307 308 309 310 311 312 313 314 315
	.name = DRV_NAME,
	.tseg1_min = 4,
	.tseg1_max = 16,
	.tseg2_min = 2,
	.tseg2_max = 8,
	.sjw_max = 4,
	.brp_min = 1,
	.brp_max = 256,
	.brp_inc = 1,
};

316
/* Abstract off the read/write for arm versus ppc. This
317 318
 * assumes that PPC uses big-endian registers and everything
 * else uses little-endian registers, independent of CPU
319
 * endianness.
320
 */
321
#if defined(CONFIG_PPC)
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
static inline u32 flexcan_read(void __iomem *addr)
{
	return in_be32(addr);
}

static inline void flexcan_write(u32 val, void __iomem *addr)
{
	out_be32(addr, val);
}
#else
static inline u32 flexcan_read(void __iomem *addr)
{
	return readl(addr);
}

static inline void flexcan_write(u32 val, void __iomem *addr)
{
	writel(val, addr);
}
#endif

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv)
{
	struct flexcan_regs __iomem *regs = priv->regs;
	u32 reg_ctrl = (priv->reg_ctrl_default | FLEXCAN_CTRL_ERR_MSK);

	flexcan_write(reg_ctrl, &regs->ctrl);
}

static inline void flexcan_error_irq_disable(const struct flexcan_priv *priv)
{
	struct flexcan_regs __iomem *regs = priv->regs;
	u32 reg_ctrl = (priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_MSK);

	flexcan_write(reg_ctrl, &regs->ctrl);
}

359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv)
{
	if (!priv->reg_xceiver)
		return 0;

	return regulator_enable(priv->reg_xceiver);
}

static inline int flexcan_transceiver_disable(const struct flexcan_priv *priv)
{
	if (!priv->reg_xceiver)
		return 0;

	return regulator_disable(priv->reg_xceiver);
}

375
static int flexcan_chip_enable(struct flexcan_priv *priv)
376
{
377
	struct flexcan_regs __iomem *regs = priv->regs;
378
	unsigned int timeout = FLEXCAN_TIMEOUT_US / 10;
379 380
	u32 reg;

381
	reg = flexcan_read(&regs->mcr);
382
	reg &= ~FLEXCAN_MCR_MDIS;
383
	flexcan_write(reg, &regs->mcr);
384

385
	while (timeout-- && (flexcan_read(&regs->mcr) & FLEXCAN_MCR_LPM_ACK))
386
		udelay(10);
387 388 389 390 391

	if (flexcan_read(&regs->mcr) & FLEXCAN_MCR_LPM_ACK)
		return -ETIMEDOUT;

	return 0;
392 393
}

394
static int flexcan_chip_disable(struct flexcan_priv *priv)
395
{
396
	struct flexcan_regs __iomem *regs = priv->regs;
397
	unsigned int timeout = FLEXCAN_TIMEOUT_US / 10;
398 399
	u32 reg;

400
	reg = flexcan_read(&regs->mcr);
401
	reg |= FLEXCAN_MCR_MDIS;
402
	flexcan_write(reg, &regs->mcr);
403 404

	while (timeout-- && !(flexcan_read(&regs->mcr) & FLEXCAN_MCR_LPM_ACK))
405
		udelay(10);
406 407 408 409 410

	if (!(flexcan_read(&regs->mcr) & FLEXCAN_MCR_LPM_ACK))
		return -ETIMEDOUT;

	return 0;
411 412
}

413 414
static int flexcan_chip_freeze(struct flexcan_priv *priv)
{
415
	struct flexcan_regs __iomem *regs = priv->regs;
416 417 418 419 420 421 422 423
	unsigned int timeout = 1000 * 1000 * 10 / priv->can.bittiming.bitrate;
	u32 reg;

	reg = flexcan_read(&regs->mcr);
	reg |= FLEXCAN_MCR_HALT;
	flexcan_write(reg, &regs->mcr);

	while (timeout-- && !(flexcan_read(&regs->mcr) & FLEXCAN_MCR_FRZ_ACK))
424
		udelay(100);
425 426 427 428 429 430 431 432 433

	if (!(flexcan_read(&regs->mcr) & FLEXCAN_MCR_FRZ_ACK))
		return -ETIMEDOUT;

	return 0;
}

static int flexcan_chip_unfreeze(struct flexcan_priv *priv)
{
434
	struct flexcan_regs __iomem *regs = priv->regs;
435 436 437 438 439 440 441 442
	unsigned int timeout = FLEXCAN_TIMEOUT_US / 10;
	u32 reg;

	reg = flexcan_read(&regs->mcr);
	reg &= ~FLEXCAN_MCR_HALT;
	flexcan_write(reg, &regs->mcr);

	while (timeout-- && (flexcan_read(&regs->mcr) & FLEXCAN_MCR_FRZ_ACK))
443
		udelay(10);
444 445 446 447 448 449 450

	if (flexcan_read(&regs->mcr) & FLEXCAN_MCR_FRZ_ACK)
		return -ETIMEDOUT;

	return 0;
}

451 452
static int flexcan_chip_softreset(struct flexcan_priv *priv)
{
453
	struct flexcan_regs __iomem *regs = priv->regs;
454 455 456 457
	unsigned int timeout = FLEXCAN_TIMEOUT_US / 10;

	flexcan_write(FLEXCAN_MCR_SOFTRST, &regs->mcr);
	while (timeout-- && (flexcan_read(&regs->mcr) & FLEXCAN_MCR_SOFTRST))
458
		udelay(10);
459 460 461 462 463 464 465

	if (flexcan_read(&regs->mcr) & FLEXCAN_MCR_SOFTRST)
		return -ETIMEDOUT;

	return 0;
}

466 467
static int __flexcan_get_berr_counter(const struct net_device *dev,
				      struct can_berr_counter *bec)
468 469
{
	const struct flexcan_priv *priv = netdev_priv(dev);
470
	struct flexcan_regs __iomem *regs = priv->regs;
471
	u32 reg = flexcan_read(&regs->ecr);
472 473 474 475 476 477 478

	bec->txerr = (reg >> 0) & 0xff;
	bec->rxerr = (reg >> 8) & 0xff;

	return 0;
}

479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
static int flexcan_get_berr_counter(const struct net_device *dev,
				    struct can_berr_counter *bec)
{
	const struct flexcan_priv *priv = netdev_priv(dev);
	int err;

	err = clk_prepare_enable(priv->clk_ipg);
	if (err)
		return err;

	err = clk_prepare_enable(priv->clk_per);
	if (err)
		goto out_disable_ipg;

	err = __flexcan_get_berr_counter(dev, bec);

	clk_disable_unprepare(priv->clk_per);
 out_disable_ipg:
	clk_disable_unprepare(priv->clk_ipg);

	return err;
}

502 503 504 505 506
static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
	const struct flexcan_priv *priv = netdev_priv(dev);
	struct can_frame *cf = (struct can_frame *)skb->data;
	u32 can_id;
507
	u32 data;
508
	u32 ctrl = FLEXCAN_MB_CODE_TX_DATA | (cf->can_dlc << 16);
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525

	if (can_dropped_invalid_skb(dev, skb))
		return NETDEV_TX_OK;

	netif_stop_queue(dev);

	if (cf->can_id & CAN_EFF_FLAG) {
		can_id = cf->can_id & CAN_EFF_MASK;
		ctrl |= FLEXCAN_MB_CNT_IDE | FLEXCAN_MB_CNT_SRR;
	} else {
		can_id = (cf->can_id & CAN_SFF_MASK) << 18;
	}

	if (cf->can_id & CAN_RTR_FLAG)
		ctrl |= FLEXCAN_MB_CNT_RTR;

	if (cf->can_dlc > 0) {
526
		data = be32_to_cpup((__be32 *)&cf->data[0]);
527
		flexcan_write(data, &priv->tx_mb->data[0]);
528 529
	}
	if (cf->can_dlc > 3) {
530
		data = be32_to_cpup((__be32 *)&cf->data[4]);
531
		flexcan_write(data, &priv->tx_mb->data[1]);
532 533
	}

534 535
	can_put_echo_skb(skb, dev, 0);

536 537
	flexcan_write(can_id, &priv->tx_mb->can_id);
	flexcan_write(ctrl, &priv->tx_mb->can_ctrl);
538

539 540 541 542
	/* Errata ERR005829 step8:
	 * Write twice INACTIVE(0x8) code to first MB.
	 */
	flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
543
		      &priv->tx_mb_reserved->can_ctrl);
544
	flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
545
		      &priv->tx_mb_reserved->can_ctrl);
546

547 548 549
	return NETDEV_TX_OK;
}

550
static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr)
551 552
{
	struct flexcan_priv *priv = netdev_priv(dev);
553 554
	struct sk_buff *skb;
	struct can_frame *cf;
555
	bool rx_errors = false, tx_errors = false;
556

557 558
	skb = alloc_can_err_skb(dev, &cf);
	if (unlikely(!skb))
559
		return;
560

561 562 563
	cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;

	if (reg_esr & FLEXCAN_ESR_BIT1_ERR) {
564
		netdev_dbg(dev, "BIT1_ERR irq\n");
565
		cf->data[2] |= CAN_ERR_PROT_BIT1;
566
		tx_errors = true;
567 568
	}
	if (reg_esr & FLEXCAN_ESR_BIT0_ERR) {
569
		netdev_dbg(dev, "BIT0_ERR irq\n");
570
		cf->data[2] |= CAN_ERR_PROT_BIT0;
571
		tx_errors = true;
572 573
	}
	if (reg_esr & FLEXCAN_ESR_ACK_ERR) {
574
		netdev_dbg(dev, "ACK_ERR irq\n");
575
		cf->can_id |= CAN_ERR_ACK;
576
		cf->data[3] = CAN_ERR_PROT_LOC_ACK;
577
		tx_errors = true;
578 579
	}
	if (reg_esr & FLEXCAN_ESR_CRC_ERR) {
580
		netdev_dbg(dev, "CRC_ERR irq\n");
581
		cf->data[2] |= CAN_ERR_PROT_BIT;
582
		cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
583
		rx_errors = true;
584 585
	}
	if (reg_esr & FLEXCAN_ESR_FRM_ERR) {
586
		netdev_dbg(dev, "FRM_ERR irq\n");
587
		cf->data[2] |= CAN_ERR_PROT_FORM;
588
		rx_errors = true;
589 590
	}
	if (reg_esr & FLEXCAN_ESR_STF_ERR) {
591
		netdev_dbg(dev, "STF_ERR irq\n");
592
		cf->data[2] |= CAN_ERR_PROT_STUFF;
593
		rx_errors = true;
594 595 596 597 598 599 600 601
	}

	priv->can.can_stats.bus_error++;
	if (rx_errors)
		dev->stats.rx_errors++;
	if (tx_errors)
		dev->stats.tx_errors++;

602
	can_rx_offload_irq_queue_err_skb(&priv->offload, skb);
603 604
}

605
static void flexcan_irq_state(struct net_device *dev, u32 reg_esr)
606 607 608 609
{
	struct flexcan_priv *priv = netdev_priv(dev);
	struct sk_buff *skb;
	struct can_frame *cf;
610
	enum can_state new_state, rx_state, tx_state;
611
	int flt;
612
	struct can_berr_counter bec;
613 614 615

	flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK;
	if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) {
616
		tx_state = unlikely(reg_esr & FLEXCAN_ESR_TX_WRN) ?
617
			CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
618
		rx_state = unlikely(reg_esr & FLEXCAN_ESR_RX_WRN) ?
619
			CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
620
		new_state = max(tx_state, rx_state);
621
	} else {
622
		__flexcan_get_berr_counter(dev, &bec);
623
		new_state = flt == FLEXCAN_ESR_FLT_CONF_PASSIVE ?
624
			CAN_STATE_ERROR_PASSIVE : CAN_STATE_BUS_OFF;
625 626 627
		rx_state = bec.rxerr >= bec.txerr ? new_state : 0;
		tx_state = bec.rxerr <= bec.txerr ? new_state : 0;
	}
628 629 630

	/* state hasn't changed */
	if (likely(new_state == priv->can.state))
631
		return;
632 633 634

	skb = alloc_can_err_skb(dev, &cf);
	if (unlikely(!skb))
635
		return;
636

637 638 639 640 641
	can_change_state(dev, cf, tx_state, rx_state);

	if (unlikely(new_state == CAN_STATE_BUS_OFF))
		can_bus_off(dev);

642 643
	can_rx_offload_irq_queue_err_skb(&priv->offload, skb);
}
644

645 646 647
static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload)
{
	return container_of(offload, struct flexcan_priv, offload);
648 649
}

650 651 652
static unsigned int flexcan_mailbox_read(struct can_rx_offload *offload,
					 struct can_frame *cf,
					 u32 *timestamp, unsigned int n)
653
{
654
	struct flexcan_priv *priv = rx_offload_to_priv(offload);
655
	struct flexcan_regs __iomem *regs = priv->regs;
656 657 658
	struct flexcan_mb __iomem *mb = &regs->mb[n];
	u32 reg_ctrl, reg_id, reg_iflag1;

659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		u32 code;

		do {
			reg_ctrl = flexcan_read(&mb->can_ctrl);
		} while (reg_ctrl & FLEXCAN_MB_CODE_RX_BUSY_BIT);

		/* is this MB empty? */
		code = reg_ctrl & FLEXCAN_MB_CODE_MASK;
		if ((code != FLEXCAN_MB_CODE_RX_FULL) &&
		    (code != FLEXCAN_MB_CODE_RX_OVERRUN))
			return 0;

		if (code == FLEXCAN_MB_CODE_RX_OVERRUN) {
			/* This MB was overrun, we lost data */
			offload->dev->stats.rx_over_errors++;
			offload->dev->stats.rx_errors++;
		}
	} else {
		reg_iflag1 = flexcan_read(&regs->iflag1);
		if (!(reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE))
			return 0;

		reg_ctrl = flexcan_read(&mb->can_ctrl);
	}
684

685 686 687
	/* increase timstamp to full 32 bit */
	*timestamp = reg_ctrl << 16;

688
	reg_id = flexcan_read(&mb->can_id);
689 690 691 692 693 694 695 696 697
	if (reg_ctrl & FLEXCAN_MB_CNT_IDE)
		cf->can_id = ((reg_id >> 0) & CAN_EFF_MASK) | CAN_EFF_FLAG;
	else
		cf->can_id = (reg_id >> 18) & CAN_SFF_MASK;

	if (reg_ctrl & FLEXCAN_MB_CNT_RTR)
		cf->can_id |= CAN_RTR_FLAG;
	cf->can_dlc = get_can_dlc((reg_ctrl >> 16) & 0xf);

698 699
	*(__be32 *)(cf->data + 0) = cpu_to_be32(flexcan_read(&mb->data[0]));
	*(__be32 *)(cf->data + 4) = cpu_to_be32(flexcan_read(&mb->data[1]));
700 701

	/* mark as read */
702 703 704 705 706 707 708 709 710 711
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		/* Clear IRQ */
		if (n < 32)
			flexcan_write(BIT(n), &regs->iflag1);
		else
			flexcan_write(BIT(n - 32), &regs->iflag2);
	} else {
		flexcan_write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->iflag1);
		flexcan_read(&regs->timer);
	}
712

713 714 715
	return 1;
}

716 717 718 719 720 721 722 723 724 725 726 727 728

static inline u64 flexcan_read_reg_iflag_rx(struct flexcan_priv *priv)
{
	struct flexcan_regs __iomem *regs = priv->regs;
	u32 iflag1, iflag2;

	iflag2 = flexcan_read(&regs->iflag2) & priv->reg_imask2_default;
	iflag1 = flexcan_read(&regs->iflag1) & priv->reg_imask1_default &
		~FLEXCAN_IFLAG_MB(priv->tx_mb_idx);

	return (u64)iflag2 << 32 | iflag1;
}

729 730 731 732 733
static irqreturn_t flexcan_irq(int irq, void *dev_id)
{
	struct net_device *dev = dev_id;
	struct net_device_stats *stats = &dev->stats;
	struct flexcan_priv *priv = netdev_priv(dev);
734
	struct flexcan_regs __iomem *regs = priv->regs;
735
	irqreturn_t handled = IRQ_NONE;
736
	u32 reg_iflag1, reg_esr;
737
	enum can_state last_state = priv->can.state;
738

739
	reg_iflag1 = flexcan_read(&regs->iflag1);
740

741
	/* reception interrupt */
742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		u64 reg_iflag;
		int ret;

		while ((reg_iflag = flexcan_read_reg_iflag_rx(priv))) {
			handled = IRQ_HANDLED;
			ret = can_rx_offload_irq_offload_timestamp(&priv->offload,
								   reg_iflag);
			if (!ret)
				break;
		}
	} else {
		if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) {
			handled = IRQ_HANDLED;
			can_rx_offload_irq_offload_fifo(&priv->offload);
		}
758

759 760 761 762 763 764 765
		/* FIFO overflow interrupt */
		if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) {
			handled = IRQ_HANDLED;
			flexcan_write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, &regs->iflag1);
			dev->stats.rx_over_errors++;
			dev->stats.rx_errors++;
		}
766 767 768
	}

	/* transmission complete interrupt */
769
	if (reg_iflag1 & FLEXCAN_IFLAG_MB(priv->tx_mb_idx)) {
770
		handled = IRQ_HANDLED;
771
		stats->tx_bytes += can_get_echo_skb(dev, 0);
772
		stats->tx_packets++;
773
		can_led_event(dev, CAN_LED_EVENT_TX);
774 775

		/* after sending a RTR frame MB is in RX mode */
776
		flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
777 778
			      &priv->tx_mb->can_ctrl);
		flexcan_write(FLEXCAN_IFLAG_MB(priv->tx_mb_idx), &regs->iflag1);
779 780 781
		netif_wake_queue(dev);
	}

782 783
	reg_esr = flexcan_read(&regs->esr);

784 785 786 787 788 789
	/* ACK all bus error and state change IRQ sources */
	if (reg_esr & FLEXCAN_ESR_ALL_INT) {
		handled = IRQ_HANDLED;
		flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, &regs->esr);
	}

790 791
	/* state change interrupt or broken error state quirk fix is enabled */
	if ((reg_esr & FLEXCAN_ESR_ERR_STATE) ||
792 793
	    (priv->devtype_data->quirks & (FLEXCAN_QUIRK_BROKEN_WERR_STATE |
	                                   FLEXCAN_QUIRK_BROKEN_PERR_STATE)))
794 795 796 797 798 799 800
		flexcan_irq_state(dev, reg_esr);

	/* bus error IRQ - handle if bus error reporting is activated */
	if ((reg_esr & FLEXCAN_ESR_ERR_BUS) &&
	    (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
		flexcan_irq_bus_err(dev, reg_esr);

801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838
	/* availability of error interrupt among state transitions in case
	 * bus error reporting is de-activated and
	 * FLEXCAN_QUIRK_BROKEN_PERR_STATE is enabled:
	 *  +--------------------------------------------------------------+
	 *  | +----------------------------------------------+ [stopped /  |
	 *  | |                                              |  sleeping] -+
	 *  +-+-> active <-> warning <-> passive -> bus off -+
	 *        ___________^^^^^^^^^^^^_______________________________
	 *        disabled(1)  enabled             disabled
	 *
	 * (1): enabled if FLEXCAN_QUIRK_BROKEN_WERR_STATE is enabled
	 */
	if ((last_state != priv->can.state) &&
	    (priv->devtype_data->quirks & FLEXCAN_QUIRK_BROKEN_PERR_STATE) &&
	    !(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) {
		switch (priv->can.state) {
		case CAN_STATE_ERROR_ACTIVE:
			if (priv->devtype_data->quirks &
			    FLEXCAN_QUIRK_BROKEN_WERR_STATE)
				flexcan_error_irq_enable(priv);
			else
				flexcan_error_irq_disable(priv);
			break;

		case CAN_STATE_ERROR_WARNING:
			flexcan_error_irq_enable(priv);
			break;

		case CAN_STATE_ERROR_PASSIVE:
		case CAN_STATE_BUS_OFF:
			flexcan_error_irq_disable(priv);
			break;

		default:
			break;
		}
	}

839
	return handled;
840 841 842 843 844 845
}

static void flexcan_set_bittiming(struct net_device *dev)
{
	const struct flexcan_priv *priv = netdev_priv(dev);
	const struct can_bittiming *bt = &priv->can.bittiming;
846
	struct flexcan_regs __iomem *regs = priv->regs;
847 848
	u32 reg;

849
	reg = flexcan_read(&regs->ctrl);
850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871
	reg &= ~(FLEXCAN_CTRL_PRESDIV(0xff) |
		 FLEXCAN_CTRL_RJW(0x3) |
		 FLEXCAN_CTRL_PSEG1(0x7) |
		 FLEXCAN_CTRL_PSEG2(0x7) |
		 FLEXCAN_CTRL_PROPSEG(0x7) |
		 FLEXCAN_CTRL_LPB |
		 FLEXCAN_CTRL_SMP |
		 FLEXCAN_CTRL_LOM);

	reg |= FLEXCAN_CTRL_PRESDIV(bt->brp - 1) |
		FLEXCAN_CTRL_PSEG1(bt->phase_seg1 - 1) |
		FLEXCAN_CTRL_PSEG2(bt->phase_seg2 - 1) |
		FLEXCAN_CTRL_RJW(bt->sjw - 1) |
		FLEXCAN_CTRL_PROPSEG(bt->prop_seg - 1);

	if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
		reg |= FLEXCAN_CTRL_LPB;
	if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
		reg |= FLEXCAN_CTRL_LOM;
	if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
		reg |= FLEXCAN_CTRL_SMP;

872
	netdev_dbg(dev, "writing ctrl=0x%08x\n", reg);
873
	flexcan_write(reg, &regs->ctrl);
874 875

	/* print chip status */
876 877
	netdev_dbg(dev, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__,
		   flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
878 879
}

880
/* flexcan_chip_start
881 882 883 884 885 886 887
 *
 * this functions is entered with clocks enabled
 *
 */
static int flexcan_chip_start(struct net_device *dev)
{
	struct flexcan_priv *priv = netdev_priv(dev);
888
	struct flexcan_regs __iomem *regs = priv->regs;
889
	u32 reg_mcr, reg_ctrl, reg_ctrl2, reg_mecr;
890
	int err, i;
891 892

	/* enable module */
893 894 895
	err = flexcan_chip_enable(priv);
	if (err)
		return err;
896 897

	/* soft reset */
898 899
	err = flexcan_chip_softreset(priv);
	if (err)
900
		goto out_chip_disable;
901 902 903

	flexcan_set_bittiming(dev);

904
	/* MCR
905 906 907 908 909 910
	 *
	 * enable freeze
	 * enable fifo
	 * halt now
	 * only supervisor access
	 * enable warning int
911
	 * disable local echo
912
	 * enable individual RX masking
913 914
	 * choose format C
	 * set max mailbox number
915
	 */
916
	reg_mcr = flexcan_read(&regs->mcr);
917
	reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff);
918 919 920 921 922 923 924 925 926 927 928
	reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV |
		FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_SRX_DIS | FLEXCAN_MCR_IRMQ |
		FLEXCAN_MCR_IDAM_C;

	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		reg_mcr &= ~FLEXCAN_MCR_FEN;
		reg_mcr |= FLEXCAN_MCR_MAXMB(priv->offload.mb_last);
	} else {
		reg_mcr |= FLEXCAN_MCR_FEN |
			FLEXCAN_MCR_MAXMB(priv->tx_mb_idx);
	}
929
	netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr);
930
	flexcan_write(reg_mcr, &regs->mcr);
931

932
	/* CTRL
933 934 935 936 937 938 939 940 941 942
	 *
	 * disable timer sync feature
	 *
	 * disable auto busoff recovery
	 * transmit lowest buffer first
	 *
	 * enable tx and rx warning interrupt
	 * enable bus off interrupt
	 * (== FLEXCAN_CTRL_ERR_STATE)
	 */
943
	reg_ctrl = flexcan_read(&regs->ctrl);
944 945
	reg_ctrl &= ~FLEXCAN_CTRL_TSYN;
	reg_ctrl |= FLEXCAN_CTRL_BOFF_REC | FLEXCAN_CTRL_LBUF |
946
		FLEXCAN_CTRL_ERR_STATE;
947 948

	/* enable the "error interrupt" (FLEXCAN_CTRL_ERR_MSK),
949 950 951
	 * on most Flexcan cores, too. Otherwise we don't get
	 * any error warning or passive interrupts.
	 */
952
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_BROKEN_WERR_STATE ||
953 954
	    priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
		reg_ctrl |= FLEXCAN_CTRL_ERR_MSK;
955 956
	else
		reg_ctrl &= ~FLEXCAN_CTRL_ERR_MSK;
957 958 959

	/* save for later use */
	priv->reg_ctrl_default = reg_ctrl;
960 961
	/* leave interrupts disabled for now */
	reg_ctrl &= ~FLEXCAN_CTRL_ERR_ALL;
962
	netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
963
	flexcan_write(reg_ctrl, &regs->ctrl);
964

965 966 967 968 969 970
	if ((priv->devtype_data->quirks & FLEXCAN_QUIRK_ENABLE_EACEN_RRS)) {
		reg_ctrl2 = flexcan_read(&regs->ctrl2);
		reg_ctrl2 |= FLEXCAN_CTRL2_EACEN | FLEXCAN_CTRL2_RRS;
		flexcan_write(reg_ctrl2, &regs->ctrl2);
	}

971
	/* clear and invalidate all mailboxes first */
972
	for (i = priv->tx_mb_idx; i < ARRAY_SIZE(regs->mb); i++) {
973
		flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
974
			      &regs->mb[i].can_ctrl);
975 976
	}

977 978 979 980 981 982
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		for (i = priv->offload.mb_first; i <= priv->offload.mb_last; i++)
			flexcan_write(FLEXCAN_MB_CODE_RX_EMPTY,
				      &regs->mb[i].can_ctrl);
	}

983 984
	/* Errata ERR005829: mark first TX mailbox as INACTIVE */
	flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
985
		      &priv->tx_mb_reserved->can_ctrl);
986

987 988
	/* mark TX mailbox as INACTIVE */
	flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
989
		      &priv->tx_mb->can_ctrl);
990

991
	/* acceptance mask/acceptance code (accept everything) */
992 993 994
	flexcan_write(0x0, &regs->rxgmask);
	flexcan_write(0x0, &regs->rx14mask);
	flexcan_write(0x0, &regs->rx15mask);
995

996
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_DISABLE_RXFG)
997 998
		flexcan_write(0x0, &regs->rxfgmask);

999 1000 1001 1002
	/* clear acceptance filters */
	for (i = 0; i < ARRAY_SIZE(regs->mb); i++)
		flexcan_write(0, &regs->rximr[i]);

1003
	/* On Vybrid, disable memory error detection interrupts
1004 1005 1006 1007 1008
	 * and freeze mode.
	 * This also works around errata e5295 which generates
	 * false positive memory errors and put the device in
	 * freeze mode.
	 */
1009
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_DISABLE_MECR) {
1010
		/* Follow the protocol as described in "Detection
1011 1012 1013
		 * and Correction of Memory Errors" to write to
		 * MECR register
		 */
1014 1015 1016
		reg_ctrl2 = flexcan_read(&regs->ctrl2);
		reg_ctrl2 |= FLEXCAN_CTRL2_ECRWRE;
		flexcan_write(reg_ctrl2, &regs->ctrl2);
1017 1018 1019 1020 1021

		reg_mecr = flexcan_read(&regs->mecr);
		reg_mecr &= ~FLEXCAN_MECR_ECRWRDIS;
		flexcan_write(reg_mecr, &regs->mecr);
		reg_mecr &= ~(FLEXCAN_MECR_NCEFAFRZ | FLEXCAN_MECR_HANCEI_MSK |
1022
			      FLEXCAN_MECR_FANCEI_MSK);
1023 1024 1025
		flexcan_write(reg_mecr, &regs->mecr);
	}

1026 1027
	err = flexcan_transceiver_enable(priv);
	if (err)
1028
		goto out_chip_disable;
1029 1030

	/* synchronize with the can bus */
1031 1032 1033
	err = flexcan_chip_unfreeze(priv);
	if (err)
		goto out_transceiver_disable;
1034 1035 1036

	priv->can.state = CAN_STATE_ERROR_ACTIVE;

1037 1038 1039
	/* enable interrupts atomically */
	disable_irq(dev->irq);
	flexcan_write(priv->reg_ctrl_default, &regs->ctrl);
1040
	flexcan_write(priv->reg_imask1_default, &regs->imask1);
1041
	flexcan_write(priv->reg_imask2_default, &regs->imask2);
1042
	enable_irq(dev->irq);
1043 1044

	/* print chip status */
1045 1046
	netdev_dbg(dev, "%s: reading mcr=0x%08x ctrl=0x%08x\n", __func__,
		   flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl));
1047 1048 1049

	return 0;

1050 1051 1052
 out_transceiver_disable:
	flexcan_transceiver_disable(priv);
 out_chip_disable:
1053 1054 1055 1056
	flexcan_chip_disable(priv);
	return err;
}

1057
/* flexcan_chip_stop
1058 1059 1060 1061 1062 1063
 *
 * this functions is entered with clocks enabled
 */
static void flexcan_chip_stop(struct net_device *dev)
{
	struct flexcan_priv *priv = netdev_priv(dev);
1064
	struct flexcan_regs __iomem *regs = priv->regs;
1065

1066 1067 1068
	/* freeze + disable module */
	flexcan_chip_freeze(priv);
	flexcan_chip_disable(priv);
1069

1070
	/* Disable all interrupts */
1071
	flexcan_write(0, &regs->imask2);
1072 1073 1074 1075
	flexcan_write(0, &regs->imask1);
	flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
		      &regs->ctrl);

1076
	flexcan_transceiver_disable(priv);
1077 1078 1079 1080 1081 1082 1083 1084
	priv->can.state = CAN_STATE_STOPPED;
}

static int flexcan_open(struct net_device *dev)
{
	struct flexcan_priv *priv = netdev_priv(dev);
	int err;

1085 1086 1087 1088 1089 1090 1091
	err = clk_prepare_enable(priv->clk_ipg);
	if (err)
		return err;

	err = clk_prepare_enable(priv->clk_per);
	if (err)
		goto out_disable_ipg;
1092 1093 1094

	err = open_candev(dev);
	if (err)
1095
		goto out_disable_per;
1096 1097 1098 1099 1100 1101 1102 1103

	err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
	if (err)
		goto out_close;

	/* start chip and queuing */
	err = flexcan_chip_start(dev);
	if (err)
1104
		goto out_free_irq;
1105 1106 1107

	can_led_event(dev, CAN_LED_EVENT_OPEN);

1108
	can_rx_offload_enable(&priv->offload);
1109 1110 1111 1112
	netif_start_queue(dev);

	return 0;

1113 1114
 out_free_irq:
	free_irq(dev->irq, dev);
1115 1116
 out_close:
	close_candev(dev);
1117
 out_disable_per:
1118
	clk_disable_unprepare(priv->clk_per);
1119
 out_disable_ipg:
1120
	clk_disable_unprepare(priv->clk_ipg);
1121 1122 1123 1124 1125 1126 1127 1128 1129

	return err;
}

static int flexcan_close(struct net_device *dev)
{
	struct flexcan_priv *priv = netdev_priv(dev);

	netif_stop_queue(dev);
1130
	can_rx_offload_disable(&priv->offload);
1131 1132 1133
	flexcan_chip_stop(dev);

	free_irq(dev->irq, dev);
1134 1135
	clk_disable_unprepare(priv->clk_per);
	clk_disable_unprepare(priv->clk_ipg);
1136 1137 1138

	close_candev(dev);

1139 1140
	can_led_event(dev, CAN_LED_EVENT_STOP);

1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167
	return 0;
}

static int flexcan_set_mode(struct net_device *dev, enum can_mode mode)
{
	int err;

	switch (mode) {
	case CAN_MODE_START:
		err = flexcan_chip_start(dev);
		if (err)
			return err;

		netif_wake_queue(dev);
		break;

	default:
		return -EOPNOTSUPP;
	}

	return 0;
}

static const struct net_device_ops flexcan_netdev_ops = {
	.ndo_open	= flexcan_open,
	.ndo_stop	= flexcan_close,
	.ndo_start_xmit	= flexcan_start_xmit,
1168
	.ndo_change_mtu = can_change_mtu,
1169 1170
};

B
Bill Pemberton 已提交
1171
static int register_flexcandev(struct net_device *dev)
1172 1173
{
	struct flexcan_priv *priv = netdev_priv(dev);
1174
	struct flexcan_regs __iomem *regs = priv->regs;
1175 1176
	u32 reg, err;

1177 1178 1179 1180 1181 1182 1183
	err = clk_prepare_enable(priv->clk_ipg);
	if (err)
		return err;

	err = clk_prepare_enable(priv->clk_per);
	if (err)
		goto out_disable_ipg;
1184 1185

	/* select "bus clock", chip must be disabled */
1186 1187 1188
	err = flexcan_chip_disable(priv);
	if (err)
		goto out_disable_per;
1189
	reg = flexcan_read(&regs->ctrl);
1190
	reg |= FLEXCAN_CTRL_CLK_SRC;
1191
	flexcan_write(reg, &regs->ctrl);
1192

1193 1194 1195
	err = flexcan_chip_enable(priv);
	if (err)
		goto out_chip_disable;
1196 1197

	/* set freeze, halt and activate FIFO, restrict register access */
1198
	reg = flexcan_read(&regs->mcr);
1199 1200
	reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT |
		FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV;
1201
	flexcan_write(reg, &regs->mcr);
1202

1203
	/* Currently we only support newer versions of this core
1204 1205 1206
	 * featuring a RX hardware FIFO (although this driver doesn't
	 * make use of it on some cores). Older cores, found on some
	 * Coldfire derivates are not tested.
1207
	 */
1208
	reg = flexcan_read(&regs->mcr);
1209
	if (!(reg & FLEXCAN_MCR_FEN)) {
1210
		netdev_err(dev, "Could not enable RX FIFO, unsupported core\n");
1211
		err = -ENODEV;
1212
		goto out_chip_disable;
1213 1214 1215 1216 1217
	}

	err = register_candev(dev);

	/* disable core and turn off clocks */
1218
 out_chip_disable:
1219
	flexcan_chip_disable(priv);
1220
 out_disable_per:
1221
	clk_disable_unprepare(priv->clk_per);
1222
 out_disable_ipg:
1223
	clk_disable_unprepare(priv->clk_ipg);
1224 1225 1226 1227

	return err;
}

B
Bill Pemberton 已提交
1228
static void unregister_flexcandev(struct net_device *dev)
1229 1230 1231 1232
{
	unregister_candev(dev);
}

1233 1234
static const struct of_device_id flexcan_of_match[] = {
	{ .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, },
1235 1236
	{ .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, },
	{ .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, },
1237
	{ .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, },
1238 1239
	{ /* sentinel */ },
};
1240
MODULE_DEVICE_TABLE(of, flexcan_of_match);
1241 1242 1243 1244 1245

static const struct platform_device_id flexcan_id_table[] = {
	{ .name = "flexcan", .driver_data = (kernel_ulong_t)&fsl_p1010_devtype_data, },
	{ /* sentinel */ },
};
1246
MODULE_DEVICE_TABLE(platform, flexcan_id_table);
1247

B
Bill Pemberton 已提交
1248
static int flexcan_probe(struct platform_device *pdev)
1249
{
1250
	const struct of_device_id *of_id;
1251
	const struct flexcan_devtype_data *devtype_data;
1252 1253
	struct net_device *dev;
	struct flexcan_priv *priv;
1254
	struct regulator *reg_xceiver;
1255
	struct resource *mem;
1256
	struct clk *clk_ipg = NULL, *clk_per = NULL;
1257
	struct flexcan_regs __iomem *regs;
1258
	int err, irq;
1259 1260
	u32 clock_freq = 0;

1261 1262 1263 1264 1265 1266
	reg_xceiver = devm_regulator_get(&pdev->dev, "xceiver");
	if (PTR_ERR(reg_xceiver) == -EPROBE_DEFER)
		return -EPROBE_DEFER;
	else if (IS_ERR(reg_xceiver))
		reg_xceiver = NULL;

1267 1268
	if (pdev->dev.of_node)
		of_property_read_u32(pdev->dev.of_node,
1269
				     "clock-frequency", &clock_freq);
1270 1271

	if (!clock_freq) {
1272 1273 1274
		clk_ipg = devm_clk_get(&pdev->dev, "ipg");
		if (IS_ERR(clk_ipg)) {
			dev_err(&pdev->dev, "no ipg clock defined\n");
1275
			return PTR_ERR(clk_ipg);
1276 1277 1278 1279 1280
		}

		clk_per = devm_clk_get(&pdev->dev, "per");
		if (IS_ERR(clk_per)) {
			dev_err(&pdev->dev, "no per clock defined\n");
1281
			return PTR_ERR(clk_per);
1282
		}
1283
		clock_freq = clk_get_rate(clk_per);
1284 1285 1286 1287
	}

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1288 1289
	if (irq <= 0)
		return -ENODEV;
1290

1291 1292 1293
	regs = devm_ioremap_resource(&pdev->dev, mem);
	if (IS_ERR(regs))
		return PTR_ERR(regs);
1294

1295 1296 1297
	of_id = of_match_device(flexcan_of_match, &pdev->dev);
	if (of_id) {
		devtype_data = of_id->data;
1298
	} else if (platform_get_device_id(pdev)->driver_data) {
1299
		devtype_data = (struct flexcan_devtype_data *)
1300
			platform_get_device_id(pdev)->driver_data;
1301
	} else {
1302
		return -ENODEV;
1303 1304
	}

1305 1306 1307 1308
	dev = alloc_candev(sizeof(struct flexcan_priv), 1);
	if (!dev)
		return -ENOMEM;

1309 1310 1311
	platform_set_drvdata(pdev, dev);
	SET_NETDEV_DEV(dev, &pdev->dev);

1312 1313
	dev->netdev_ops = &flexcan_netdev_ops;
	dev->irq = irq;
1314
	dev->flags |= IFF_ECHO;
1315 1316

	priv = netdev_priv(dev);
1317
	priv->can.clock.freq = clock_freq;
1318 1319 1320 1321 1322 1323
	priv->can.bittiming_const = &flexcan_bittiming_const;
	priv->can.do_set_mode = flexcan_set_mode;
	priv->can.do_get_berr_counter = flexcan_get_berr_counter;
	priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
		CAN_CTRLMODE_LISTENONLY	| CAN_CTRLMODE_3_SAMPLES |
		CAN_CTRLMODE_BERR_REPORTING;
1324
	priv->regs = regs;
1325 1326
	priv->clk_ipg = clk_ipg;
	priv->clk_per = clk_per;
1327
	priv->devtype_data = devtype_data;
1328
	priv->reg_xceiver = reg_xceiver;
1329

1330 1331 1332 1333 1334 1335 1336
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		priv->tx_mb_idx = FLEXCAN_TX_MB_OFF_TIMESTAMP;
		priv->tx_mb_reserved = &regs->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP];
	} else {
		priv->tx_mb_idx = FLEXCAN_TX_MB_OFF_FIFO;
		priv->tx_mb_reserved = &regs->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO];
	}
1337 1338
	priv->tx_mb = &regs->mb[priv->tx_mb_idx];

1339 1340
	priv->reg_imask1_default = FLEXCAN_IFLAG_MB(priv->tx_mb_idx);
	priv->reg_imask2_default = 0;
1341

1342
	priv->offload.mailbox_read = flexcan_mailbox_read;
1343

1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
		u64 imask;

		priv->offload.mb_first = FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST;
		priv->offload.mb_last = FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST;

		imask = GENMASK_ULL(priv->offload.mb_last, priv->offload.mb_first);
		priv->reg_imask1_default |= imask;
		priv->reg_imask2_default |= imask >> 32;

		err = can_rx_offload_add_timestamp(dev, &priv->offload);
	} else {
		priv->reg_imask1_default |= FLEXCAN_IFLAG_RX_FIFO_OVERFLOW |
			FLEXCAN_IFLAG_RX_FIFO_AVAILABLE;
		err = can_rx_offload_add_fifo(dev, &priv->offload, FLEXCAN_NAPI_WEIGHT);
	}
1360 1361
	if (err)
		goto failed_offload;
1362 1363 1364 1365 1366 1367 1368

	err = register_flexcandev(dev);
	if (err) {
		dev_err(&pdev->dev, "registering netdev failed\n");
		goto failed_register;
	}

1369 1370
	devm_can_led_init(dev);

1371
	dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%d)\n",
1372
		 priv->regs, dev->irq);
1373 1374 1375

	return 0;

1376
 failed_offload:
1377 1378 1379 1380 1381
 failed_register:
	free_candev(dev);
	return err;
}

B
Bill Pemberton 已提交
1382
static int flexcan_remove(struct platform_device *pdev)
1383 1384
{
	struct net_device *dev = platform_get_drvdata(pdev);
1385
	struct flexcan_priv *priv = netdev_priv(dev);
1386 1387

	unregister_flexcandev(dev);
1388
	can_rx_offload_del(&priv->offload);
1389 1390
	free_candev(dev);

1391 1392 1393
	return 0;
}

1394
static int __maybe_unused flexcan_suspend(struct device *device)
E
Eric Bénard 已提交
1395
{
1396
	struct net_device *dev = dev_get_drvdata(device);
E
Eric Bénard 已提交
1397
	struct flexcan_priv *priv = netdev_priv(dev);
1398
	int err;
E
Eric Bénard 已提交
1399 1400

	if (netif_running(dev)) {
1401 1402 1403
		err = flexcan_chip_disable(priv);
		if (err)
			return err;
E
Eric Bénard 已提交
1404 1405 1406 1407 1408 1409 1410 1411
		netif_stop_queue(dev);
		netif_device_detach(dev);
	}
	priv->can.state = CAN_STATE_SLEEPING;

	return 0;
}

1412
static int __maybe_unused flexcan_resume(struct device *device)
E
Eric Bénard 已提交
1413
{
1414
	struct net_device *dev = dev_get_drvdata(device);
E
Eric Bénard 已提交
1415
	struct flexcan_priv *priv = netdev_priv(dev);
1416
	int err;
E
Eric Bénard 已提交
1417 1418 1419 1420 1421

	priv->can.state = CAN_STATE_ERROR_ACTIVE;
	if (netif_running(dev)) {
		netif_device_attach(dev);
		netif_start_queue(dev);
1422 1423 1424
		err = flexcan_chip_enable(priv);
		if (err)
			return err;
E
Eric Bénard 已提交
1425
	}
1426
	return 0;
E
Eric Bénard 已提交
1427
}
1428 1429

static SIMPLE_DEV_PM_OPS(flexcan_pm_ops, flexcan_suspend, flexcan_resume);
E
Eric Bénard 已提交
1430

1431
static struct platform_driver flexcan_driver = {
1432 1433
	.driver = {
		.name = DRV_NAME,
1434
		.pm = &flexcan_pm_ops,
1435 1436
		.of_match_table = flexcan_of_match,
	},
1437
	.probe = flexcan_probe,
B
Bill Pemberton 已提交
1438
	.remove = flexcan_remove,
1439
	.id_table = flexcan_id_table,
1440 1441
};

1442
module_platform_driver(flexcan_driver);
1443 1444 1445 1446 1447

MODULE_AUTHOR("Sascha Hauer <kernel@pengutronix.de>, "
	      "Marc Kleine-Budde <kernel@pengutronix.de>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("CAN port driver for flexcan based chip");