forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/net/can/m_can/m_can.c
....@@ -1,20 +1,14 @@
1
-/*
2
- * CAN bus driver for Bosch M_CAN controller
3
- *
4
- * Copyright (C) 2014 Freescale Semiconductor, Inc.
5
- * Dong Aisheng <b29396@freescale.com>
6
- *
7
- * Bosch M_CAN user manual can be obtained from:
1
+// SPDX-License-Identifier: GPL-2.0
2
+// CAN bus driver for Bosch M_CAN controller
3
+// Copyright (C) 2014 Freescale Semiconductor, Inc.
4
+// Dong Aisheng <b29396@freescale.com>
5
+// Copyright (C) 2018-19 Texas Instruments Incorporated - http://www.ti.com/
6
+
7
+/* Bosch M_CAN user manual can be obtained from:
88 * http://www.bosch-semiconductors.de/media/pdf_1/ipmodules_1/m_can/
99 * mcan_users_manual_v302.pdf
10
- *
11
- * This file is licensed under the terms of the GNU General Public
12
- * License version 2. This program is licensed "as is" without any
13
- * warranty of any kind, whether express or implied.
1410 */
1511
16
-#include <linux/clk.h>
17
-#include <linux/delay.h>
1812 #include <linux/interrupt.h>
1913 #include <linux/io.h>
2014 #include <linux/kernel.h>
....@@ -28,11 +22,7 @@
2822 #include <linux/can/dev.h>
2923 #include <linux/pinctrl/consumer.h>
3024
31
-/* napi related */
32
-#define M_CAN_NAPI_WEIGHT 64
33
-
34
-/* message ram configuration data length */
35
-#define MRAM_CFG_LEN 8
25
+#include "m_can.h"
3626
3727 /* registers definition */
3828 enum m_can_reg {
....@@ -86,28 +76,11 @@
8676 M_CAN_TXEFA = 0xf8,
8777 };
8878
89
-/* m_can lec values */
90
-enum m_can_lec_type {
91
- LEC_NO_ERROR = 0,
92
- LEC_STUFF_ERROR,
93
- LEC_FORM_ERROR,
94
- LEC_ACK_ERROR,
95
- LEC_BIT1_ERROR,
96
- LEC_BIT0_ERROR,
97
- LEC_CRC_ERROR,
98
- LEC_UNUSED,
99
-};
79
+/* napi related */
80
+#define M_CAN_NAPI_WEIGHT 64
10081
101
-enum m_can_mram_cfg {
102
- MRAM_SIDF = 0,
103
- MRAM_XIDF,
104
- MRAM_RXF0,
105
- MRAM_RXF1,
106
- MRAM_RXB,
107
- MRAM_TXE,
108
- MRAM_TXB,
109
- MRAM_CFG_NUM,
110
-};
82
+/* message ram configuration data length */
83
+#define MRAM_CFG_LEN 8
11184
11285 /* Core Release Register (CREL) */
11386 #define CREL_REL_SHIFT 28
....@@ -150,6 +123,7 @@
150123 #define CCCR_CME_CANFD_BRS 0x2
151124 #define CCCR_TXP BIT(14)
152125 #define CCCR_TEST BIT(7)
126
+#define CCCR_DAR BIT(6)
153127 #define CCCR_MON BIT(5)
154128 #define CCCR_CSR BIT(4)
155129 #define CCCR_CSA BIT(3)
....@@ -347,90 +321,81 @@
347321 #define TX_EVENT_MM_SHIFT TX_BUF_MM_SHIFT
348322 #define TX_EVENT_MM_MASK (0xff << TX_EVENT_MM_SHIFT)
349323
350
-/* address offset and element number for each FIFO/Buffer in the Message RAM */
351
-struct mram_cfg {
352
- u16 off;
353
- u8 num;
354
-};
355
-
356
-/* m_can private data structure */
357
-struct m_can_priv {
358
- struct can_priv can; /* must be the first member */
359
- struct napi_struct napi;
360
- struct net_device *dev;
361
- struct device *device;
362
- struct clk *hclk;
363
- struct clk *cclk;
364
- void __iomem *base;
365
- u32 irqstatus;
366
- int version;
367
-
368
- /* message ram configuration */
369
- void __iomem *mram_base;
370
- struct mram_cfg mcfg[MRAM_CFG_NUM];
371
-};
372
-
373
-static inline u32 m_can_read(const struct m_can_priv *priv, enum m_can_reg reg)
324
+static inline u32 m_can_read(struct m_can_classdev *cdev, enum m_can_reg reg)
374325 {
375
- return readl(priv->base + reg);
326
+ return cdev->ops->read_reg(cdev, reg);
376327 }
377328
378
-static inline void m_can_write(const struct m_can_priv *priv,
379
- enum m_can_reg reg, u32 val)
329
+static inline void m_can_write(struct m_can_classdev *cdev, enum m_can_reg reg,
330
+ u32 val)
380331 {
381
- writel(val, priv->base + reg);
332
+ cdev->ops->write_reg(cdev, reg, val);
382333 }
383334
384
-static inline u32 m_can_fifo_read(const struct m_can_priv *priv,
385
- u32 fgi, unsigned int offset)
335
+static u32 m_can_fifo_read(struct m_can_classdev *cdev,
336
+ u32 fgi, unsigned int offset)
386337 {
387
- return readl(priv->mram_base + priv->mcfg[MRAM_RXF0].off +
388
- fgi * RXF0_ELEMENT_SIZE + offset);
338
+ u32 addr_offset = cdev->mcfg[MRAM_RXF0].off + fgi * RXF0_ELEMENT_SIZE +
339
+ offset;
340
+
341
+ return cdev->ops->read_fifo(cdev, addr_offset);
389342 }
390343
391
-static inline void m_can_fifo_write(const struct m_can_priv *priv,
392
- u32 fpi, unsigned int offset, u32 val)
344
+static void m_can_fifo_write(struct m_can_classdev *cdev,
345
+ u32 fpi, unsigned int offset, u32 val)
393346 {
394
- writel(val, priv->mram_base + priv->mcfg[MRAM_TXB].off +
395
- fpi * TXB_ELEMENT_SIZE + offset);
347
+ u32 addr_offset = cdev->mcfg[MRAM_TXB].off + fpi * TXB_ELEMENT_SIZE +
348
+ offset;
349
+
350
+ cdev->ops->write_fifo(cdev, addr_offset, val);
396351 }
397352
398
-static inline u32 m_can_txe_fifo_read(const struct m_can_priv *priv,
399
- u32 fgi,
400
- u32 offset) {
401
- return readl(priv->mram_base + priv->mcfg[MRAM_TXE].off +
402
- fgi * TXE_ELEMENT_SIZE + offset);
353
+static inline void m_can_fifo_write_no_off(struct m_can_classdev *cdev,
354
+ u32 fpi, u32 val)
355
+{
356
+ cdev->ops->write_fifo(cdev, fpi, val);
403357 }
404358
405
-static inline bool m_can_tx_fifo_full(const struct m_can_priv *priv)
359
+static u32 m_can_txe_fifo_read(struct m_can_classdev *cdev, u32 fgi, u32 offset)
406360 {
407
- return !!(m_can_read(priv, M_CAN_TXFQS) & TXFQS_TFQF);
361
+ u32 addr_offset = cdev->mcfg[MRAM_TXE].off + fgi * TXE_ELEMENT_SIZE +
362
+ offset;
363
+
364
+ return cdev->ops->read_fifo(cdev, addr_offset);
408365 }
409366
410
-static inline void m_can_config_endisable(const struct m_can_priv *priv,
411
- bool enable)
367
+static inline bool m_can_tx_fifo_full(struct m_can_classdev *cdev)
412368 {
413
- u32 cccr = m_can_read(priv, M_CAN_CCCR);
369
+ return !!(m_can_read(cdev, M_CAN_TXFQS) & TXFQS_TFQF);
370
+}
371
+
372
+void m_can_config_endisable(struct m_can_classdev *cdev, bool enable)
373
+{
374
+ u32 cccr = m_can_read(cdev, M_CAN_CCCR);
414375 u32 timeout = 10;
415376 u32 val = 0;
416377
378
+ /* Clear the Clock stop request if it was set */
379
+ if (cccr & CCCR_CSR)
380
+ cccr &= ~CCCR_CSR;
381
+
417382 if (enable) {
418383 /* enable m_can configuration */
419
- m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT);
384
+ m_can_write(cdev, M_CAN_CCCR, cccr | CCCR_INIT);
420385 udelay(5);
421386 /* CCCR.CCE can only be set/reset while CCCR.INIT = '1' */
422
- m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT | CCCR_CCE);
387
+ m_can_write(cdev, M_CAN_CCCR, cccr | CCCR_INIT | CCCR_CCE);
423388 } else {
424
- m_can_write(priv, M_CAN_CCCR, cccr & ~(CCCR_INIT | CCCR_CCE));
389
+ m_can_write(cdev, M_CAN_CCCR, cccr & ~(CCCR_INIT | CCCR_CCE));
425390 }
426391
427392 /* there's a delay for module initialization */
428393 if (enable)
429394 val = CCCR_INIT | CCCR_CCE;
430395
431
- while ((m_can_read(priv, M_CAN_CCCR) & (CCCR_INIT | CCCR_CCE)) != val) {
396
+ while ((m_can_read(cdev, M_CAN_CCCR) & (CCCR_INIT | CCCR_CCE)) != val) {
432397 if (timeout == 0) {
433
- netdev_warn(priv->dev, "Failed to init module\n");
398
+ netdev_warn(cdev->net, "Failed to init module\n");
434399 return;
435400 }
436401 timeout--;
....@@ -438,21 +403,38 @@
438403 }
439404 }
440405
441
-static inline void m_can_enable_all_interrupts(const struct m_can_priv *priv)
406
+static inline void m_can_enable_all_interrupts(struct m_can_classdev *cdev)
442407 {
443408 /* Only interrupt line 0 is used in this driver */
444
- m_can_write(priv, M_CAN_ILE, ILE_EINT0);
409
+ m_can_write(cdev, M_CAN_ILE, ILE_EINT0);
445410 }
446411
447
-static inline void m_can_disable_all_interrupts(const struct m_can_priv *priv)
412
+static inline void m_can_disable_all_interrupts(struct m_can_classdev *cdev)
448413 {
449
- m_can_write(priv, M_CAN_ILE, 0x0);
414
+ m_can_write(cdev, M_CAN_ILE, 0x0);
415
+}
416
+
417
+static void m_can_clean(struct net_device *net)
418
+{
419
+ struct m_can_classdev *cdev = netdev_priv(net);
420
+
421
+ if (cdev->tx_skb) {
422
+ int putidx = 0;
423
+
424
+ net->stats.tx_errors++;
425
+ if (cdev->version > 30)
426
+ putidx = ((m_can_read(cdev, M_CAN_TXFQS) &
427
+ TXFQS_TFQPI_MASK) >> TXFQS_TFQPI_SHIFT);
428
+
429
+ can_free_echo_skb(cdev->net, putidx);
430
+ cdev->tx_skb = NULL;
431
+ }
450432 }
451433
452434 static void m_can_read_fifo(struct net_device *dev, u32 rxfs)
453435 {
454436 struct net_device_stats *stats = &dev->stats;
455
- struct m_can_priv *priv = netdev_priv(dev);
437
+ struct m_can_classdev *cdev = netdev_priv(dev);
456438 struct canfd_frame *cf;
457439 struct sk_buff *skb;
458440 u32 id, fgi, dlc;
....@@ -460,7 +442,7 @@
460442
461443 /* calculate the fifo get index for where to read data */
462444 fgi = (rxfs & RXFS_FGI_MASK) >> RXFS_FGI_SHIFT;
463
- dlc = m_can_fifo_read(priv, fgi, M_CAN_FIFO_DLC);
445
+ dlc = m_can_fifo_read(cdev, fgi, M_CAN_FIFO_DLC);
464446 if (dlc & RX_BUF_FDF)
465447 skb = alloc_canfd_skb(dev, &cf);
466448 else
....@@ -475,7 +457,7 @@
475457 else
476458 cf->len = get_can_dlc((dlc >> 16) & 0x0F);
477459
478
- id = m_can_fifo_read(priv, fgi, M_CAN_FIFO_ID);
460
+ id = m_can_fifo_read(cdev, fgi, M_CAN_FIFO_ID);
479461 if (id & RX_BUF_XTD)
480462 cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG;
481463 else
....@@ -494,12 +476,12 @@
494476
495477 for (i = 0; i < cf->len; i += 4)
496478 *(u32 *)(cf->data + i) =
497
- m_can_fifo_read(priv, fgi,
479
+ m_can_fifo_read(cdev, fgi,
498480 M_CAN_FIFO_DATA(i / 4));
499481 }
500482
501483 /* acknowledge rx fifo 0 */
502
- m_can_write(priv, M_CAN_RXF0A, fgi);
484
+ m_can_write(cdev, M_CAN_RXF0A, fgi);
503485
504486 stats->rx_packets++;
505487 stats->rx_bytes += cf->len;
....@@ -509,11 +491,11 @@
509491
510492 static int m_can_do_rx_poll(struct net_device *dev, int quota)
511493 {
512
- struct m_can_priv *priv = netdev_priv(dev);
494
+ struct m_can_classdev *cdev = netdev_priv(dev);
513495 u32 pkts = 0;
514496 u32 rxfs;
515497
516
- rxfs = m_can_read(priv, M_CAN_RXF0S);
498
+ rxfs = m_can_read(cdev, M_CAN_RXF0S);
517499 if (!(rxfs & RXFS_FFL_MASK)) {
518500 netdev_dbg(dev, "no messages in fifo0\n");
519501 return 0;
....@@ -524,7 +506,7 @@
524506
525507 quota--;
526508 pkts++;
527
- rxfs = m_can_read(priv, M_CAN_RXF0S);
509
+ rxfs = m_can_read(cdev, M_CAN_RXF0S);
528510 }
529511
530512 if (pkts)
....@@ -559,12 +541,12 @@
559541 static int m_can_handle_lec_err(struct net_device *dev,
560542 enum m_can_lec_type lec_type)
561543 {
562
- struct m_can_priv *priv = netdev_priv(dev);
544
+ struct m_can_classdev *cdev = netdev_priv(dev);
563545 struct net_device_stats *stats = &dev->stats;
564546 struct can_frame *cf;
565547 struct sk_buff *skb;
566548
567
- priv->can.can_stats.bus_error++;
549
+ cdev->can.can_stats.bus_error++;
568550 stats->rx_errors++;
569551
570552 /* propagate the error condition to the CAN stack */
....@@ -616,47 +598,51 @@
616598 static int __m_can_get_berr_counter(const struct net_device *dev,
617599 struct can_berr_counter *bec)
618600 {
619
- struct m_can_priv *priv = netdev_priv(dev);
601
+ struct m_can_classdev *cdev = netdev_priv(dev);
620602 unsigned int ecr;
621603
622
- ecr = m_can_read(priv, M_CAN_ECR);
604
+ ecr = m_can_read(cdev, M_CAN_ECR);
623605 bec->rxerr = (ecr & ECR_REC_MASK) >> ECR_REC_SHIFT;
624606 bec->txerr = (ecr & ECR_TEC_MASK) >> ECR_TEC_SHIFT;
625607
626608 return 0;
627609 }
628610
629
-static int m_can_clk_start(struct m_can_priv *priv)
611
+static int m_can_clk_start(struct m_can_classdev *cdev)
630612 {
631613 int err;
632614
633
- err = pm_runtime_get_sync(priv->device);
615
+ if (cdev->pm_clock_support == 0)
616
+ return 0;
617
+
618
+ err = pm_runtime_get_sync(cdev->dev);
634619 if (err < 0) {
635
- pm_runtime_put_noidle(priv->device);
620
+ pm_runtime_put_noidle(cdev->dev);
636621 return err;
637622 }
638623
639624 return 0;
640625 }
641626
642
-static void m_can_clk_stop(struct m_can_priv *priv)
627
+static void m_can_clk_stop(struct m_can_classdev *cdev)
643628 {
644
- pm_runtime_put_sync(priv->device);
629
+ if (cdev->pm_clock_support)
630
+ pm_runtime_put_sync(cdev->dev);
645631 }
646632
647633 static int m_can_get_berr_counter(const struct net_device *dev,
648634 struct can_berr_counter *bec)
649635 {
650
- struct m_can_priv *priv = netdev_priv(dev);
636
+ struct m_can_classdev *cdev = netdev_priv(dev);
651637 int err;
652638
653
- err = m_can_clk_start(priv);
639
+ err = m_can_clk_start(cdev);
654640 if (err)
655641 return err;
656642
657643 __m_can_get_berr_counter(dev, bec);
658644
659
- m_can_clk_stop(priv);
645
+ m_can_clk_stop(cdev);
660646
661647 return 0;
662648 }
....@@ -664,7 +650,7 @@
664650 static int m_can_handle_state_change(struct net_device *dev,
665651 enum can_state new_state)
666652 {
667
- struct m_can_priv *priv = netdev_priv(dev);
653
+ struct m_can_classdev *cdev = netdev_priv(dev);
668654 struct net_device_stats *stats = &dev->stats;
669655 struct can_frame *cf;
670656 struct sk_buff *skb;
....@@ -674,19 +660,19 @@
674660 switch (new_state) {
675661 case CAN_STATE_ERROR_WARNING:
676662 /* error warning state */
677
- priv->can.can_stats.error_warning++;
678
- priv->can.state = CAN_STATE_ERROR_WARNING;
663
+ cdev->can.can_stats.error_warning++;
664
+ cdev->can.state = CAN_STATE_ERROR_WARNING;
679665 break;
680666 case CAN_STATE_ERROR_PASSIVE:
681667 /* error passive state */
682
- priv->can.can_stats.error_passive++;
683
- priv->can.state = CAN_STATE_ERROR_PASSIVE;
668
+ cdev->can.can_stats.error_passive++;
669
+ cdev->can.state = CAN_STATE_ERROR_PASSIVE;
684670 break;
685671 case CAN_STATE_BUS_OFF:
686672 /* bus-off state */
687
- priv->can.state = CAN_STATE_BUS_OFF;
688
- m_can_disable_all_interrupts(priv);
689
- priv->can.can_stats.bus_off++;
673
+ cdev->can.state = CAN_STATE_BUS_OFF;
674
+ m_can_disable_all_interrupts(cdev);
675
+ cdev->can.can_stats.bus_off++;
690676 can_bus_off(dev);
691677 break;
692678 default:
....@@ -713,7 +699,7 @@
713699 case CAN_STATE_ERROR_PASSIVE:
714700 /* error passive state */
715701 cf->can_id |= CAN_ERR_CRTL;
716
- ecr = m_can_read(priv, M_CAN_ECR);
702
+ ecr = m_can_read(cdev, M_CAN_ECR);
717703 if (ecr & ECR_RP)
718704 cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
719705 if (bec.txerr > 127)
....@@ -738,25 +724,22 @@
738724
739725 static int m_can_handle_state_errors(struct net_device *dev, u32 psr)
740726 {
741
- struct m_can_priv *priv = netdev_priv(dev);
727
+ struct m_can_classdev *cdev = netdev_priv(dev);
742728 int work_done = 0;
743729
744
- if ((psr & PSR_EW) &&
745
- (priv->can.state != CAN_STATE_ERROR_WARNING)) {
730
+ if (psr & PSR_EW && cdev->can.state != CAN_STATE_ERROR_WARNING) {
746731 netdev_dbg(dev, "entered error warning state\n");
747732 work_done += m_can_handle_state_change(dev,
748733 CAN_STATE_ERROR_WARNING);
749734 }
750735
751
- if ((psr & PSR_EP) &&
752
- (priv->can.state != CAN_STATE_ERROR_PASSIVE)) {
736
+ if (psr & PSR_EP && cdev->can.state != CAN_STATE_ERROR_PASSIVE) {
753737 netdev_dbg(dev, "entered error passive state\n");
754738 work_done += m_can_handle_state_change(dev,
755739 CAN_STATE_ERROR_PASSIVE);
756740 }
757741
758
- if ((psr & PSR_BO) &&
759
- (priv->can.state != CAN_STATE_BUS_OFF)) {
742
+ if (psr & PSR_BO && cdev->can.state != CAN_STATE_BUS_OFF) {
760743 netdev_dbg(dev, "entered error bus off state\n");
761744 work_done += m_can_handle_state_change(dev,
762745 CAN_STATE_BUS_OFF);
....@@ -786,19 +769,61 @@
786769 return psr && (psr != LEC_UNUSED);
787770 }
788771
772
+static inline bool m_can_is_protocol_err(u32 irqstatus)
773
+{
774
+ return irqstatus & IR_ERR_LEC_31X;
775
+}
776
+
777
+static int m_can_handle_protocol_error(struct net_device *dev, u32 irqstatus)
778
+{
779
+ struct net_device_stats *stats = &dev->stats;
780
+ struct m_can_classdev *cdev = netdev_priv(dev);
781
+ struct can_frame *cf;
782
+ struct sk_buff *skb;
783
+
784
+ /* propagate the error condition to the CAN stack */
785
+ skb = alloc_can_err_skb(dev, &cf);
786
+
787
+ /* update tx error stats since there is protocol error */
788
+ stats->tx_errors++;
789
+
790
+ /* update arbitration lost status */
791
+ if (cdev->version >= 31 && (irqstatus & IR_PEA)) {
792
+ netdev_dbg(dev, "Protocol error in Arbitration fail\n");
793
+ cdev->can.can_stats.arbitration_lost++;
794
+ if (skb) {
795
+ cf->can_id |= CAN_ERR_LOSTARB;
796
+ cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC;
797
+ }
798
+ }
799
+
800
+ if (unlikely(!skb)) {
801
+ netdev_dbg(dev, "allocation of skb failed\n");
802
+ return 0;
803
+ }
804
+ netif_receive_skb(skb);
805
+
806
+ return 1;
807
+}
808
+
789809 static int m_can_handle_bus_errors(struct net_device *dev, u32 irqstatus,
790810 u32 psr)
791811 {
792
- struct m_can_priv *priv = netdev_priv(dev);
812
+ struct m_can_classdev *cdev = netdev_priv(dev);
793813 int work_done = 0;
794814
795815 if (irqstatus & IR_RF0L)
796816 work_done += m_can_handle_lost_msg(dev);
797817
798818 /* handle lec errors on the bus */
799
- if ((priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) &&
819
+ if ((cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) &&
800820 is_lec_err(psr))
801821 work_done += m_can_handle_lec_err(dev, psr & LEC_UNUSED);
822
+
823
+ /* handle protocol errors in arbitration phase */
824
+ if ((cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) &&
825
+ m_can_is_protocol_err(irqstatus))
826
+ work_done += m_can_handle_protocol_error(dev, irqstatus);
802827
803828 /* other unproccessed error interrupts */
804829 m_can_handle_other_err(dev, irqstatus);
....@@ -806,14 +831,13 @@
806831 return work_done;
807832 }
808833
809
-static int m_can_poll(struct napi_struct *napi, int quota)
834
+static int m_can_rx_handler(struct net_device *dev, int quota)
810835 {
811
- struct net_device *dev = napi->dev;
812
- struct m_can_priv *priv = netdev_priv(dev);
836
+ struct m_can_classdev *cdev = netdev_priv(dev);
813837 int work_done = 0;
814838 u32 irqstatus, psr;
815839
816
- irqstatus = priv->irqstatus | m_can_read(priv, M_CAN_IR);
840
+ irqstatus = cdev->irqstatus | m_can_read(cdev, M_CAN_IR);
817841 if (!irqstatus)
818842 goto end;
819843
....@@ -827,18 +851,19 @@
827851 * whether MCAN_ECR.RP = ’1’ and MCAN_ECR.REC = 127.
828852 * In this case, reset MCAN_IR.MRAF. No further action is required.
829853 */
830
- if ((priv->version <= 31) && (irqstatus & IR_MRAF) &&
831
- (m_can_read(priv, M_CAN_ECR) & ECR_RP)) {
854
+ if (cdev->version <= 31 && irqstatus & IR_MRAF &&
855
+ m_can_read(cdev, M_CAN_ECR) & ECR_RP) {
832856 struct can_berr_counter bec;
833857
834858 __m_can_get_berr_counter(dev, &bec);
835859 if (bec.rxerr == 127) {
836
- m_can_write(priv, M_CAN_IR, IR_MRAF);
860
+ m_can_write(cdev, M_CAN_IR, IR_MRAF);
837861 irqstatus &= ~IR_MRAF;
838862 }
839863 }
840864
841
- psr = m_can_read(priv, M_CAN_PSR);
865
+ psr = m_can_read(cdev, M_CAN_PSR);
866
+
842867 if (irqstatus & IR_ERR_STATE)
843868 work_done += m_can_handle_state_errors(dev, psr);
844869
....@@ -847,13 +872,33 @@
847872
848873 if (irqstatus & IR_RF0N)
849874 work_done += m_can_do_rx_poll(dev, (quota - work_done));
875
+end:
876
+ return work_done;
877
+}
850878
879
+static int m_can_rx_peripheral(struct net_device *dev)
880
+{
881
+ struct m_can_classdev *cdev = netdev_priv(dev);
882
+
883
+ m_can_rx_handler(dev, M_CAN_NAPI_WEIGHT);
884
+
885
+ m_can_enable_all_interrupts(cdev);
886
+
887
+ return 0;
888
+}
889
+
890
+static int m_can_poll(struct napi_struct *napi, int quota)
891
+{
892
+ struct net_device *dev = napi->dev;
893
+ struct m_can_classdev *cdev = netdev_priv(dev);
894
+ int work_done;
895
+
896
+ work_done = m_can_rx_handler(dev, quota);
851897 if (work_done < quota) {
852898 napi_complete_done(napi, work_done);
853
- m_can_enable_all_interrupts(priv);
899
+ m_can_enable_all_interrupts(cdev);
854900 }
855901
856
-end:
857902 return work_done;
858903 }
859904
....@@ -865,11 +910,11 @@
865910 int i = 0;
866911 unsigned int msg_mark;
867912
868
- struct m_can_priv *priv = netdev_priv(dev);
913
+ struct m_can_classdev *cdev = netdev_priv(dev);
869914 struct net_device_stats *stats = &dev->stats;
870915
871916 /* read tx event fifo status */
872
- m_can_txefs = m_can_read(priv, M_CAN_TXEFS);
917
+ m_can_txefs = m_can_read(cdev, M_CAN_TXEFS);
873918
874919 /* Get Tx Event fifo element count */
875920 txe_count = (m_can_txefs & TXEFS_EFFL_MASK)
....@@ -878,15 +923,15 @@
878923 /* Get and process all sent elements */
879924 for (i = 0; i < txe_count; i++) {
880925 /* retrieve get index */
881
- fgi = (m_can_read(priv, M_CAN_TXEFS) & TXEFS_EFGI_MASK)
926
+ fgi = (m_can_read(cdev, M_CAN_TXEFS) & TXEFS_EFGI_MASK)
882927 >> TXEFS_EFGI_SHIFT;
883928
884929 /* get message marker */
885
- msg_mark = (m_can_txe_fifo_read(priv, fgi, 4) &
930
+ msg_mark = (m_can_txe_fifo_read(cdev, fgi, 4) &
886931 TX_EVENT_MM_MASK) >> TX_EVENT_MM_SHIFT;
887932
888933 /* ack txe element */
889
- m_can_write(priv, M_CAN_TXEFA, (TXEFA_EFAI_MASK &
934
+ m_can_write(cdev, M_CAN_TXEFA, (TXEFA_EFAI_MASK &
890935 (fgi << TXEFA_EFAI_SHIFT)));
891936
892937 /* update stats */
....@@ -898,17 +943,22 @@
898943 static irqreturn_t m_can_isr(int irq, void *dev_id)
899944 {
900945 struct net_device *dev = (struct net_device *)dev_id;
901
- struct m_can_priv *priv = netdev_priv(dev);
946
+ struct m_can_classdev *cdev = netdev_priv(dev);
902947 struct net_device_stats *stats = &dev->stats;
903948 u32 ir;
904949
905
- ir = m_can_read(priv, M_CAN_IR);
950
+ if (pm_runtime_suspended(cdev->dev))
951
+ return IRQ_NONE;
952
+ ir = m_can_read(cdev, M_CAN_IR);
906953 if (!ir)
907954 return IRQ_NONE;
908955
909956 /* ACK all irqs */
910957 if (ir & IR_ALL_INT)
911
- m_can_write(priv, M_CAN_IR, ir);
958
+ m_can_write(cdev, M_CAN_IR, ir);
959
+
960
+ if (cdev->ops->clear_interrupts)
961
+ cdev->ops->clear_interrupts(cdev);
912962
913963 /* schedule NAPI in case of
914964 * - rx IRQ
....@@ -916,12 +966,15 @@
916966 * - bus error IRQ and bus error reporting
917967 */
918968 if ((ir & IR_RF0N) || (ir & IR_ERR_ALL_30X)) {
919
- priv->irqstatus = ir;
920
- m_can_disable_all_interrupts(priv);
921
- napi_schedule(&priv->napi);
969
+ cdev->irqstatus = ir;
970
+ m_can_disable_all_interrupts(cdev);
971
+ if (!cdev->is_peripheral)
972
+ napi_schedule(&cdev->napi);
973
+ else
974
+ m_can_rx_peripheral(dev);
922975 }
923976
924
- if (priv->version == 30) {
977
+ if (cdev->version == 30) {
925978 if (ir & IR_TC) {
926979 /* Transmission Complete Interrupt*/
927980 stats->tx_bytes += can_get_echo_skb(dev, 0);
....@@ -935,7 +988,7 @@
935988 m_can_echo_tx_event(dev);
936989 can_led_event(dev, CAN_LED_EVENT_TX);
937990 if (netif_queue_stopped(dev) &&
938
- !m_can_tx_fifo_full(priv))
991
+ !m_can_tx_fifo_full(cdev))
939992 netif_wake_queue(dev);
940993 }
941994 }
....@@ -993,9 +1046,9 @@
9931046
9941047 static int m_can_set_bittiming(struct net_device *dev)
9951048 {
996
- struct m_can_priv *priv = netdev_priv(dev);
997
- const struct can_bittiming *bt = &priv->can.bittiming;
998
- const struct can_bittiming *dbt = &priv->can.data_bittiming;
1049
+ struct m_can_classdev *cdev = netdev_priv(dev);
1050
+ const struct can_bittiming *bt = &cdev->can.bittiming;
1051
+ const struct can_bittiming *dbt = &cdev->can.data_bittiming;
9991052 u16 brp, sjw, tseg1, tseg2;
10001053 u32 reg_btp;
10011054
....@@ -1005,9 +1058,9 @@
10051058 tseg2 = bt->phase_seg2 - 1;
10061059 reg_btp = (brp << NBTP_NBRP_SHIFT) | (sjw << NBTP_NSJW_SHIFT) |
10071060 (tseg1 << NBTP_NTSEG1_SHIFT) | (tseg2 << NBTP_NTSEG2_SHIFT);
1008
- m_can_write(priv, M_CAN_NBTP, reg_btp);
1061
+ m_can_write(cdev, M_CAN_NBTP, reg_btp);
10091062
1010
- if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
1063
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) {
10111064 reg_btp = 0;
10121065 brp = dbt->brp - 1;
10131066 sjw = dbt->sjw - 1;
....@@ -1029,7 +1082,7 @@
10291082 /* Equation based on Bosch's M_CAN User Manual's
10301083 * Transmitter Delay Compensation Section
10311084 */
1032
- tdco = (priv->can.clock.freq / 1000) *
1085
+ tdco = (cdev->can.clock.freq / 1000) *
10331086 ssp / dbt->bitrate;
10341087
10351088 /* Max valid TDCO value is 127 */
....@@ -1040,7 +1093,7 @@
10401093 }
10411094
10421095 reg_btp |= DBTP_TDC;
1043
- m_can_write(priv, M_CAN_TDCR,
1096
+ m_can_write(cdev, M_CAN_TDCR,
10441097 tdco << TDCR_TDCO_SHIFT);
10451098 }
10461099
....@@ -1049,7 +1102,7 @@
10491102 (tseg1 << DBTP_DTSEG1_SHIFT) |
10501103 (tseg2 << DBTP_DTSEG2_SHIFT);
10511104
1052
- m_can_write(priv, M_CAN_DBTP, reg_btp);
1105
+ m_can_write(cdev, M_CAN_DBTP, reg_btp);
10531106 }
10541107
10551108 return 0;
....@@ -1066,129 +1119,137 @@
10661119 */
10671120 static void m_can_chip_config(struct net_device *dev)
10681121 {
1069
- struct m_can_priv *priv = netdev_priv(dev);
1122
+ struct m_can_classdev *cdev = netdev_priv(dev);
10701123 u32 cccr, test;
10711124
1072
- m_can_config_endisable(priv, true);
1125
+ m_can_config_endisable(cdev, true);
10731126
10741127 /* RX Buffer/FIFO Element Size 64 bytes data field */
1075
- m_can_write(priv, M_CAN_RXESC, M_CAN_RXESC_64BYTES);
1128
+ m_can_write(cdev, M_CAN_RXESC, M_CAN_RXESC_64BYTES);
10761129
10771130 /* Accept Non-matching Frames Into FIFO 0 */
1078
- m_can_write(priv, M_CAN_GFC, 0x0);
1131
+ m_can_write(cdev, M_CAN_GFC, 0x0);
10791132
1080
- if (priv->version == 30) {
1133
+ if (cdev->version == 30) {
10811134 /* only support one Tx Buffer currently */
1082
- m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_SHIFT) |
1083
- priv->mcfg[MRAM_TXB].off);
1135
+ m_can_write(cdev, M_CAN_TXBC, (1 << TXBC_NDTB_SHIFT) |
1136
+ cdev->mcfg[MRAM_TXB].off);
10841137 } else {
10851138 /* TX FIFO is used for newer IP Core versions */
1086
- m_can_write(priv, M_CAN_TXBC,
1087
- (priv->mcfg[MRAM_TXB].num << TXBC_TFQS_SHIFT) |
1088
- (priv->mcfg[MRAM_TXB].off));
1139
+ m_can_write(cdev, M_CAN_TXBC,
1140
+ (cdev->mcfg[MRAM_TXB].num << TXBC_TFQS_SHIFT) |
1141
+ (cdev->mcfg[MRAM_TXB].off));
10891142 }
10901143
10911144 /* support 64 bytes payload */
1092
- m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_64BYTES);
1145
+ m_can_write(cdev, M_CAN_TXESC, TXESC_TBDS_64BYTES);
10931146
10941147 /* TX Event FIFO */
1095
- if (priv->version == 30) {
1096
- m_can_write(priv, M_CAN_TXEFC, (1 << TXEFC_EFS_SHIFT) |
1097
- priv->mcfg[MRAM_TXE].off);
1148
+ if (cdev->version == 30) {
1149
+ m_can_write(cdev, M_CAN_TXEFC, (1 << TXEFC_EFS_SHIFT) |
1150
+ cdev->mcfg[MRAM_TXE].off);
10981151 } else {
10991152 /* Full TX Event FIFO is used */
1100
- m_can_write(priv, M_CAN_TXEFC,
1101
- ((priv->mcfg[MRAM_TXE].num << TXEFC_EFS_SHIFT)
1153
+ m_can_write(cdev, M_CAN_TXEFC,
1154
+ ((cdev->mcfg[MRAM_TXE].num << TXEFC_EFS_SHIFT)
11021155 & TXEFC_EFS_MASK) |
1103
- priv->mcfg[MRAM_TXE].off);
1156
+ cdev->mcfg[MRAM_TXE].off);
11041157 }
11051158
11061159 /* rx fifo configuration, blocking mode, fifo size 1 */
1107
- m_can_write(priv, M_CAN_RXF0C,
1108
- (priv->mcfg[MRAM_RXF0].num << RXFC_FS_SHIFT) |
1109
- priv->mcfg[MRAM_RXF0].off);
1160
+ m_can_write(cdev, M_CAN_RXF0C,
1161
+ (cdev->mcfg[MRAM_RXF0].num << RXFC_FS_SHIFT) |
1162
+ cdev->mcfg[MRAM_RXF0].off);
11101163
1111
- m_can_write(priv, M_CAN_RXF1C,
1112
- (priv->mcfg[MRAM_RXF1].num << RXFC_FS_SHIFT) |
1113
- priv->mcfg[MRAM_RXF1].off);
1164
+ m_can_write(cdev, M_CAN_RXF1C,
1165
+ (cdev->mcfg[MRAM_RXF1].num << RXFC_FS_SHIFT) |
1166
+ cdev->mcfg[MRAM_RXF1].off);
11141167
1115
- cccr = m_can_read(priv, M_CAN_CCCR);
1116
- test = m_can_read(priv, M_CAN_TEST);
1168
+ cccr = m_can_read(cdev, M_CAN_CCCR);
1169
+ test = m_can_read(cdev, M_CAN_TEST);
11171170 test &= ~TEST_LBCK;
1118
- if (priv->version == 30) {
1171
+ if (cdev->version == 30) {
11191172 /* Version 3.0.x */
11201173
1121
- cccr &= ~(CCCR_TEST | CCCR_MON |
1174
+ cccr &= ~(CCCR_TEST | CCCR_MON | CCCR_DAR |
11221175 (CCCR_CMR_MASK << CCCR_CMR_SHIFT) |
11231176 (CCCR_CME_MASK << CCCR_CME_SHIFT));
11241177
1125
- if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
1178
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_FD)
11261179 cccr |= CCCR_CME_CANFD_BRS << CCCR_CME_SHIFT;
11271180
11281181 } else {
11291182 /* Version 3.1.x or 3.2.x */
11301183 cccr &= ~(CCCR_TEST | CCCR_MON | CCCR_BRSE | CCCR_FDOE |
1131
- CCCR_NISO);
1184
+ CCCR_NISO | CCCR_DAR);
11321185
11331186 /* Only 3.2.x has NISO Bit implemented */
1134
- if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)
1187
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)
11351188 cccr |= CCCR_NISO;
11361189
1137
- if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
1190
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_FD)
11381191 cccr |= (CCCR_BRSE | CCCR_FDOE);
11391192 }
11401193
11411194 /* Loopback Mode */
1142
- if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
1195
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
11431196 cccr |= CCCR_TEST | CCCR_MON;
11441197 test |= TEST_LBCK;
11451198 }
11461199
11471200 /* Enable Monitoring (all versions) */
1148
- if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
1201
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
11491202 cccr |= CCCR_MON;
11501203
1204
+ /* Disable Auto Retransmission (all versions) */
1205
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
1206
+ cccr |= CCCR_DAR;
1207
+
11511208 /* Write config */
1152
- m_can_write(priv, M_CAN_CCCR, cccr);
1153
- m_can_write(priv, M_CAN_TEST, test);
1209
+ m_can_write(cdev, M_CAN_CCCR, cccr);
1210
+ m_can_write(cdev, M_CAN_TEST, test);
11541211
11551212 /* Enable interrupts */
1156
- m_can_write(priv, M_CAN_IR, IR_ALL_INT);
1157
- if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
1158
- if (priv->version == 30)
1159
- m_can_write(priv, M_CAN_IE, IR_ALL_INT &
1213
+ m_can_write(cdev, M_CAN_IR, IR_ALL_INT);
1214
+ if (!(cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
1215
+ if (cdev->version == 30)
1216
+ m_can_write(cdev, M_CAN_IE, IR_ALL_INT &
11601217 ~(IR_ERR_LEC_30X));
11611218 else
1162
- m_can_write(priv, M_CAN_IE, IR_ALL_INT &
1219
+ m_can_write(cdev, M_CAN_IE, IR_ALL_INT &
11631220 ~(IR_ERR_LEC_31X));
11641221 else
1165
- m_can_write(priv, M_CAN_IE, IR_ALL_INT);
1222
+ m_can_write(cdev, M_CAN_IE, IR_ALL_INT);
11661223
11671224 /* route all interrupts to INT0 */
1168
- m_can_write(priv, M_CAN_ILS, ILS_ALL_INT0);
1225
+ m_can_write(cdev, M_CAN_ILS, ILS_ALL_INT0);
11691226
11701227 /* set bittiming params */
11711228 m_can_set_bittiming(dev);
11721229
1173
- m_can_config_endisable(priv, false);
1230
+ m_can_config_endisable(cdev, false);
1231
+
1232
+ if (cdev->ops->init)
1233
+ cdev->ops->init(cdev);
11741234 }
11751235
11761236 static void m_can_start(struct net_device *dev)
11771237 {
1178
- struct m_can_priv *priv = netdev_priv(dev);
1238
+ struct m_can_classdev *cdev = netdev_priv(dev);
11791239
11801240 /* basic m_can configuration */
11811241 m_can_chip_config(dev);
11821242
1183
- priv->can.state = CAN_STATE_ERROR_ACTIVE;
1243
+ cdev->can.state = CAN_STATE_ERROR_ACTIVE;
11841244
1185
- m_can_enable_all_interrupts(priv);
1245
+ m_can_enable_all_interrupts(cdev);
11861246 }
11871247
11881248 static int m_can_set_mode(struct net_device *dev, enum can_mode mode)
11891249 {
11901250 switch (mode) {
11911251 case CAN_MODE_START:
1252
+ m_can_clean(dev);
11921253 m_can_start(dev);
11931254 netif_wake_queue(dev);
11941255 break;
....@@ -1204,20 +1265,17 @@
12041265 * else it returns the release and step coded as:
12051266 * return value = 10 * <release> + 1 * <step>
12061267 */
1207
-static int m_can_check_core_release(void __iomem *m_can_base)
1268
+static int m_can_check_core_release(struct m_can_classdev *cdev)
12081269 {
12091270 u32 crel_reg;
12101271 u8 rel;
12111272 u8 step;
12121273 int res;
1213
- struct m_can_priv temp_priv = {
1214
- .base = m_can_base
1215
- };
12161274
12171275 /* Read Core Release Version and split into version number
12181276 * Example: Version 3.2.1 => rel = 3; step = 2; substep = 1;
12191277 */
1220
- crel_reg = m_can_read(&temp_priv, M_CAN_CREL);
1278
+ crel_reg = m_can_read(cdev, M_CAN_CREL);
12211279 rel = (u8)((crel_reg & CREL_REL_MASK) >> CREL_REL_SHIFT);
12221280 step = (u8)((crel_reg & CREL_STEP_MASK) >> CREL_STEP_SHIFT);
12231281
....@@ -1235,152 +1293,148 @@
12351293 /* Selectable Non ISO support only in version 3.2.x
12361294 * This function checks if the bit is writable.
12371295 */
1238
-static bool m_can_niso_supported(const struct m_can_priv *priv)
1296
+static bool m_can_niso_supported(struct m_can_classdev *cdev)
12391297 {
1240
- u32 cccr_reg, cccr_poll;
1241
- int niso_timeout;
1298
+ u32 cccr_reg, cccr_poll = 0;
1299
+ int niso_timeout = -ETIMEDOUT;
1300
+ int i;
12421301
1243
- m_can_config_endisable(priv, true);
1244
- cccr_reg = m_can_read(priv, M_CAN_CCCR);
1302
+ m_can_config_endisable(cdev, true);
1303
+ cccr_reg = m_can_read(cdev, M_CAN_CCCR);
12451304 cccr_reg |= CCCR_NISO;
1246
- m_can_write(priv, M_CAN_CCCR, cccr_reg);
1305
+ m_can_write(cdev, M_CAN_CCCR, cccr_reg);
12471306
1248
- niso_timeout = readl_poll_timeout((priv->base + M_CAN_CCCR), cccr_poll,
1249
- (cccr_poll == cccr_reg), 0, 10);
1307
+ for (i = 0; i <= 10; i++) {
1308
+ cccr_poll = m_can_read(cdev, M_CAN_CCCR);
1309
+ if (cccr_poll == cccr_reg) {
1310
+ niso_timeout = 0;
1311
+ break;
1312
+ }
1313
+
1314
+ usleep_range(1, 5);
1315
+ }
12501316
12511317 /* Clear NISO */
12521318 cccr_reg &= ~(CCCR_NISO);
1253
- m_can_write(priv, M_CAN_CCCR, cccr_reg);
1319
+ m_can_write(cdev, M_CAN_CCCR, cccr_reg);
12541320
1255
- m_can_config_endisable(priv, false);
1321
+ m_can_config_endisable(cdev, false);
12561322
12571323 /* return false if time out (-ETIMEDOUT), else return true */
12581324 return !niso_timeout;
12591325 }
12601326
1261
-static int m_can_dev_setup(struct platform_device *pdev, struct net_device *dev,
1262
- void __iomem *addr)
1327
+static int m_can_dev_setup(struct m_can_classdev *m_can_dev)
12631328 {
1264
- struct m_can_priv *priv;
1329
+ struct net_device *dev = m_can_dev->net;
12651330 int m_can_version;
12661331
1267
- m_can_version = m_can_check_core_release(addr);
1332
+ m_can_version = m_can_check_core_release(m_can_dev);
12681333 /* return if unsupported version */
12691334 if (!m_can_version) {
1270
- dev_err(&pdev->dev, "Unsupported version number: %2d",
1335
+ dev_err(m_can_dev->dev, "Unsupported version number: %2d",
12711336 m_can_version);
12721337 return -EINVAL;
12731338 }
12741339
1275
- priv = netdev_priv(dev);
1276
- netif_napi_add(dev, &priv->napi, m_can_poll, M_CAN_NAPI_WEIGHT);
1340
+ if (!m_can_dev->is_peripheral)
1341
+ netif_napi_add(dev, &m_can_dev->napi,
1342
+ m_can_poll, M_CAN_NAPI_WEIGHT);
12771343
12781344 /* Shared properties of all M_CAN versions */
1279
- priv->version = m_can_version;
1280
- priv->dev = dev;
1281
- priv->base = addr;
1282
- priv->can.do_set_mode = m_can_set_mode;
1283
- priv->can.do_get_berr_counter = m_can_get_berr_counter;
1345
+ m_can_dev->version = m_can_version;
1346
+ m_can_dev->can.do_set_mode = m_can_set_mode;
1347
+ m_can_dev->can.do_get_berr_counter = m_can_get_berr_counter;
12841348
12851349 /* Set M_CAN supported operations */
1286
- priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
1350
+ m_can_dev->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
12871351 CAN_CTRLMODE_LISTENONLY |
12881352 CAN_CTRLMODE_BERR_REPORTING |
1289
- CAN_CTRLMODE_FD;
1353
+ CAN_CTRLMODE_FD |
1354
+ CAN_CTRLMODE_ONE_SHOT;
12901355
12911356 /* Set properties depending on M_CAN version */
1292
- switch (priv->version) {
1357
+ switch (m_can_dev->version) {
12931358 case 30:
12941359 /* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.x */
12951360 can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
1296
- priv->can.bittiming_const = &m_can_bittiming_const_30X;
1297
- priv->can.data_bittiming_const =
1298
- &m_can_data_bittiming_const_30X;
1361
+ m_can_dev->can.bittiming_const = m_can_dev->bit_timing ?
1362
+ m_can_dev->bit_timing : &m_can_bittiming_const_30X;
1363
+
1364
+ m_can_dev->can.data_bittiming_const = m_can_dev->data_timing ?
1365
+ m_can_dev->data_timing :
1366
+ &m_can_data_bittiming_const_30X;
12991367 break;
13001368 case 31:
13011369 /* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.1.x */
13021370 can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
1303
- priv->can.bittiming_const = &m_can_bittiming_const_31X;
1304
- priv->can.data_bittiming_const =
1305
- &m_can_data_bittiming_const_31X;
1371
+ m_can_dev->can.bittiming_const = m_can_dev->bit_timing ?
1372
+ m_can_dev->bit_timing : &m_can_bittiming_const_31X;
1373
+
1374
+ m_can_dev->can.data_bittiming_const = m_can_dev->data_timing ?
1375
+ m_can_dev->data_timing :
1376
+ &m_can_data_bittiming_const_31X;
13061377 break;
13071378 case 32:
1308
- priv->can.bittiming_const = &m_can_bittiming_const_31X;
1309
- priv->can.data_bittiming_const =
1310
- &m_can_data_bittiming_const_31X;
1311
- priv->can.ctrlmode_supported |= (m_can_niso_supported(priv)
1379
+ case 33:
1380
+ /* Support both MCAN version v3.2.x and v3.3.0 */
1381
+ m_can_dev->can.bittiming_const = m_can_dev->bit_timing ?
1382
+ m_can_dev->bit_timing : &m_can_bittiming_const_31X;
1383
+
1384
+ m_can_dev->can.data_bittiming_const = m_can_dev->data_timing ?
1385
+ m_can_dev->data_timing :
1386
+ &m_can_data_bittiming_const_31X;
1387
+
1388
+ m_can_dev->can.ctrlmode_supported |=
1389
+ (m_can_niso_supported(m_can_dev)
13121390 ? CAN_CTRLMODE_FD_NON_ISO
13131391 : 0);
13141392 break;
13151393 default:
1316
- dev_err(&pdev->dev, "Unsupported version number: %2d",
1317
- priv->version);
1394
+ dev_err(m_can_dev->dev, "Unsupported version number: %2d",
1395
+ m_can_dev->version);
13181396 return -EINVAL;
13191397 }
13201398
1321
- return 0;
1322
-}
1323
-
1324
-static int m_can_open(struct net_device *dev)
1325
-{
1326
- struct m_can_priv *priv = netdev_priv(dev);
1327
- int err;
1328
-
1329
- err = m_can_clk_start(priv);
1330
- if (err)
1331
- return err;
1332
-
1333
- /* open the can device */
1334
- err = open_candev(dev);
1335
- if (err) {
1336
- netdev_err(dev, "failed to open can device\n");
1337
- goto exit_disable_clks;
1338
- }
1339
-
1340
- /* register interrupt handler */
1341
- err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
1342
- dev);
1343
- if (err < 0) {
1344
- netdev_err(dev, "failed to request interrupt\n");
1345
- goto exit_irq_fail;
1346
- }
1347
-
1348
- /* start the m_can controller */
1349
- m_can_start(dev);
1350
-
1351
- can_led_event(dev, CAN_LED_EVENT_OPEN);
1352
- napi_enable(&priv->napi);
1353
- netif_start_queue(dev);
1399
+ if (m_can_dev->ops->init)
1400
+ m_can_dev->ops->init(m_can_dev);
13541401
13551402 return 0;
1356
-
1357
-exit_irq_fail:
1358
- close_candev(dev);
1359
-exit_disable_clks:
1360
- m_can_clk_stop(priv);
1361
- return err;
13621403 }
13631404
13641405 static void m_can_stop(struct net_device *dev)
13651406 {
1366
- struct m_can_priv *priv = netdev_priv(dev);
1407
+ struct m_can_classdev *cdev = netdev_priv(dev);
13671408
13681409 /* disable all interrupts */
1369
- m_can_disable_all_interrupts(priv);
1410
+ m_can_disable_all_interrupts(cdev);
1411
+
1412
+ /* Set init mode to disengage from the network */
1413
+ m_can_config_endisable(cdev, true);
13701414
13711415 /* set the state as STOPPED */
1372
- priv->can.state = CAN_STATE_STOPPED;
1416
+ cdev->can.state = CAN_STATE_STOPPED;
13731417 }
13741418
13751419 static int m_can_close(struct net_device *dev)
13761420 {
1377
- struct m_can_priv *priv = netdev_priv(dev);
1421
+ struct m_can_classdev *cdev = netdev_priv(dev);
13781422
13791423 netif_stop_queue(dev);
1380
- napi_disable(&priv->napi);
1424
+
1425
+ if (!cdev->is_peripheral)
1426
+ napi_disable(&cdev->napi);
1427
+
13811428 m_can_stop(dev);
1382
- m_can_clk_stop(priv);
1429
+ m_can_clk_stop(cdev);
13831430 free_irq(dev->irq, dev);
1431
+
1432
+ if (cdev->is_peripheral) {
1433
+ cdev->tx_skb = NULL;
1434
+ destroy_workqueue(cdev->tx_wq);
1435
+ cdev->tx_wq = NULL;
1436
+ }
1437
+
13841438 close_candev(dev);
13851439 can_led_event(dev, CAN_LED_EVENT_STOP);
13861440
....@@ -1389,29 +1443,28 @@
13891443
13901444 static int m_can_next_echo_skb_occupied(struct net_device *dev, int putidx)
13911445 {
1392
- struct m_can_priv *priv = netdev_priv(dev);
1446
+ struct m_can_classdev *cdev = netdev_priv(dev);
13931447 /*get wrap around for loopback skb index */
1394
- unsigned int wrap = priv->can.echo_skb_max;
1448
+ unsigned int wrap = cdev->can.echo_skb_max;
13951449 int next_idx;
13961450
13971451 /* calculate next index */
13981452 next_idx = (++putidx >= wrap ? 0 : putidx);
13991453
14001454 /* check if occupied */
1401
- return !!priv->can.echo_skb[next_idx];
1455
+ return !!cdev->can.echo_skb[next_idx];
14021456 }
14031457
1404
-static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
1405
- struct net_device *dev)
1458
+static netdev_tx_t m_can_tx_handler(struct m_can_classdev *cdev)
14061459 {
1407
- struct m_can_priv *priv = netdev_priv(dev);
1408
- struct canfd_frame *cf = (struct canfd_frame *)skb->data;
1460
+ struct canfd_frame *cf = (struct canfd_frame *)cdev->tx_skb->data;
1461
+ struct net_device *dev = cdev->net;
1462
+ struct sk_buff *skb = cdev->tx_skb;
14091463 u32 id, cccr, fdflags;
14101464 int i;
14111465 int putidx;
14121466
1413
- if (can_dropped_invalid_skb(dev, skb))
1414
- return NETDEV_TX_OK;
1467
+ cdev->tx_skb = NULL;
14151468
14161469 /* Generate ID field for TX buffer Element */
14171470 /* Common to all supported M_CAN versions */
....@@ -1425,23 +1478,21 @@
14251478 if (cf->can_id & CAN_RTR_FLAG)
14261479 id |= TX_BUF_RTR;
14271480
1428
- if (priv->version == 30) {
1481
+ if (cdev->version == 30) {
14291482 netif_stop_queue(dev);
14301483
14311484 /* message ram configuration */
1432
- m_can_fifo_write(priv, 0, M_CAN_FIFO_ID, id);
1433
- m_can_fifo_write(priv, 0, M_CAN_FIFO_DLC,
1485
+ m_can_fifo_write(cdev, 0, M_CAN_FIFO_ID, id);
1486
+ m_can_fifo_write(cdev, 0, M_CAN_FIFO_DLC,
14341487 can_len2dlc(cf->len) << 16);
14351488
14361489 for (i = 0; i < cf->len; i += 4)
1437
- m_can_fifo_write(priv, 0,
1490
+ m_can_fifo_write(cdev, 0,
14381491 M_CAN_FIFO_DATA(i / 4),
14391492 *(u32 *)(cf->data + i));
14401493
1441
- can_put_echo_skb(skb, dev, 0);
1442
-
1443
- if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
1444
- cccr = m_can_read(priv, M_CAN_CCCR);
1494
+ if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) {
1495
+ cccr = m_can_read(cdev, M_CAN_CCCR);
14451496 cccr &= ~(CCCR_CMR_MASK << CCCR_CMR_SHIFT);
14461497 if (can_is_canfd_skb(skb)) {
14471498 if (cf->flags & CANFD_BRS)
....@@ -1453,28 +1504,38 @@
14531504 } else {
14541505 cccr |= CCCR_CMR_CAN << CCCR_CMR_SHIFT;
14551506 }
1456
- m_can_write(priv, M_CAN_CCCR, cccr);
1507
+ m_can_write(cdev, M_CAN_CCCR, cccr);
14571508 }
1458
- m_can_write(priv, M_CAN_TXBTIE, 0x1);
1459
- m_can_write(priv, M_CAN_TXBAR, 0x1);
1509
+ m_can_write(cdev, M_CAN_TXBTIE, 0x1);
1510
+
1511
+ can_put_echo_skb(skb, dev, 0);
1512
+
1513
+ m_can_write(cdev, M_CAN_TXBAR, 0x1);
14601514 /* End of xmit function for version 3.0.x */
14611515 } else {
14621516 /* Transmit routine for version >= v3.1.x */
14631517
14641518 /* Check if FIFO full */
1465
- if (m_can_tx_fifo_full(priv)) {
1519
+ if (m_can_tx_fifo_full(cdev)) {
14661520 /* This shouldn't happen */
14671521 netif_stop_queue(dev);
14681522 netdev_warn(dev,
14691523 "TX queue active although FIFO is full.");
1470
- return NETDEV_TX_BUSY;
1524
+
1525
+ if (cdev->is_peripheral) {
1526
+ kfree_skb(skb);
1527
+ dev->stats.tx_dropped++;
1528
+ return NETDEV_TX_OK;
1529
+ } else {
1530
+ return NETDEV_TX_BUSY;
1531
+ }
14711532 }
14721533
14731534 /* get put index for frame */
1474
- putidx = ((m_can_read(priv, M_CAN_TXFQS) & TXFQS_TFQPI_MASK)
1535
+ putidx = ((m_can_read(cdev, M_CAN_TXFQS) & TXFQS_TFQPI_MASK)
14751536 >> TXFQS_TFQPI_SHIFT);
14761537 /* Write ID Field to FIFO Element */
1477
- m_can_fifo_write(priv, putidx, M_CAN_FIFO_ID, id);
1538
+ m_can_fifo_write(cdev, putidx, M_CAN_FIFO_ID, id);
14781539
14791540 /* get CAN FD configuration of frame */
14801541 fdflags = 0;
....@@ -1489,14 +1550,14 @@
14891550 * it is used in TX interrupt for
14901551 * sending the correct echo frame
14911552 */
1492
- m_can_fifo_write(priv, putidx, M_CAN_FIFO_DLC,
1553
+ m_can_fifo_write(cdev, putidx, M_CAN_FIFO_DLC,
14931554 ((putidx << TX_BUF_MM_SHIFT) &
14941555 TX_BUF_MM_MASK) |
14951556 (can_len2dlc(cf->len) << 16) |
14961557 fdflags | TX_BUF_EFC);
14971558
14981559 for (i = 0; i < cf->len; i += 4)
1499
- m_can_fifo_write(priv, putidx, M_CAN_FIFO_DATA(i / 4),
1560
+ m_can_fifo_write(cdev, putidx, M_CAN_FIFO_DATA(i / 4),
15001561 *(u32 *)(cf->data + i));
15011562
15021563 /* Push loopback echo.
....@@ -1505,15 +1566,120 @@
15051566 can_put_echo_skb(skb, dev, putidx);
15061567
15071568 /* Enable TX FIFO element to start transfer */
1508
- m_can_write(priv, M_CAN_TXBAR, (1 << putidx));
1569
+ m_can_write(cdev, M_CAN_TXBAR, (1 << putidx));
15091570
15101571 /* stop network queue if fifo full */
1511
- if (m_can_tx_fifo_full(priv) ||
1512
- m_can_next_echo_skb_occupied(dev, putidx))
1513
- netif_stop_queue(dev);
1572
+ if (m_can_tx_fifo_full(cdev) ||
1573
+ m_can_next_echo_skb_occupied(dev, putidx))
1574
+ netif_stop_queue(dev);
15141575 }
15151576
15161577 return NETDEV_TX_OK;
1578
+}
1579
+
1580
+static void m_can_tx_work_queue(struct work_struct *ws)
1581
+{
1582
+ struct m_can_classdev *cdev = container_of(ws, struct m_can_classdev,
1583
+ tx_work);
1584
+
1585
+ m_can_tx_handler(cdev);
1586
+}
1587
+
1588
+static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
1589
+ struct net_device *dev)
1590
+{
1591
+ struct m_can_classdev *cdev = netdev_priv(dev);
1592
+
1593
+ if (can_dropped_invalid_skb(dev, skb))
1594
+ return NETDEV_TX_OK;
1595
+
1596
+ if (cdev->is_peripheral) {
1597
+ if (cdev->tx_skb) {
1598
+ netdev_err(dev, "hard_xmit called while tx busy\n");
1599
+ return NETDEV_TX_BUSY;
1600
+ }
1601
+
1602
+ if (cdev->can.state == CAN_STATE_BUS_OFF) {
1603
+ m_can_clean(dev);
1604
+ } else {
1605
+ /* Need to stop the queue to avoid numerous requests
1606
+ * from being sent. Suggested improvement is to create
1607
+ * a queueing mechanism that will queue the skbs and
1608
+ * process them in order.
1609
+ */
1610
+ cdev->tx_skb = skb;
1611
+ netif_stop_queue(cdev->net);
1612
+ queue_work(cdev->tx_wq, &cdev->tx_work);
1613
+ }
1614
+ } else {
1615
+ cdev->tx_skb = skb;
1616
+ return m_can_tx_handler(cdev);
1617
+ }
1618
+
1619
+ return NETDEV_TX_OK;
1620
+}
1621
+
1622
+static int m_can_open(struct net_device *dev)
1623
+{
1624
+ struct m_can_classdev *cdev = netdev_priv(dev);
1625
+ int err;
1626
+
1627
+ err = m_can_clk_start(cdev);
1628
+ if (err)
1629
+ return err;
1630
+
1631
+ /* open the can device */
1632
+ err = open_candev(dev);
1633
+ if (err) {
1634
+ netdev_err(dev, "failed to open can device\n");
1635
+ goto exit_disable_clks;
1636
+ }
1637
+
1638
+ /* register interrupt handler */
1639
+ if (cdev->is_peripheral) {
1640
+ cdev->tx_skb = NULL;
1641
+ cdev->tx_wq = alloc_workqueue("mcan_wq",
1642
+ WQ_FREEZABLE | WQ_MEM_RECLAIM, 0);
1643
+ if (!cdev->tx_wq) {
1644
+ err = -ENOMEM;
1645
+ goto out_wq_fail;
1646
+ }
1647
+
1648
+ INIT_WORK(&cdev->tx_work, m_can_tx_work_queue);
1649
+
1650
+ err = request_threaded_irq(dev->irq, NULL, m_can_isr,
1651
+ IRQF_ONESHOT,
1652
+ dev->name, dev);
1653
+ } else {
1654
+ err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
1655
+ dev);
1656
+ }
1657
+
1658
+ if (err < 0) {
1659
+ netdev_err(dev, "failed to request interrupt\n");
1660
+ goto exit_irq_fail;
1661
+ }
1662
+
1663
+ /* start the m_can controller */
1664
+ m_can_start(dev);
1665
+
1666
+ can_led_event(dev, CAN_LED_EVENT_OPEN);
1667
+
1668
+ if (!cdev->is_peripheral)
1669
+ napi_enable(&cdev->napi);
1670
+
1671
+ netif_start_queue(dev);
1672
+
1673
+ return 0;
1674
+
1675
+exit_irq_fail:
1676
+ if (cdev->is_peripheral)
1677
+ destroy_workqueue(cdev->tx_wq);
1678
+out_wq_fail:
1679
+ close_candev(dev);
1680
+exit_disable_clks:
1681
+ m_can_clk_stop(cdev);
1682
+ return err;
15171683 }
15181684
15191685 static const struct net_device_ops m_can_netdev_ops = {
....@@ -1531,114 +1697,91 @@
15311697 return register_candev(dev);
15321698 }
15331699
1534
-static void m_can_init_ram(struct m_can_priv *priv)
1700
+static void m_can_of_parse_mram(struct m_can_classdev *cdev,
1701
+ const u32 *mram_config_vals)
1702
+{
1703
+ cdev->mcfg[MRAM_SIDF].off = mram_config_vals[0];
1704
+ cdev->mcfg[MRAM_SIDF].num = mram_config_vals[1];
1705
+ cdev->mcfg[MRAM_XIDF].off = cdev->mcfg[MRAM_SIDF].off +
1706
+ cdev->mcfg[MRAM_SIDF].num * SIDF_ELEMENT_SIZE;
1707
+ cdev->mcfg[MRAM_XIDF].num = mram_config_vals[2];
1708
+ cdev->mcfg[MRAM_RXF0].off = cdev->mcfg[MRAM_XIDF].off +
1709
+ cdev->mcfg[MRAM_XIDF].num * XIDF_ELEMENT_SIZE;
1710
+ cdev->mcfg[MRAM_RXF0].num = mram_config_vals[3] &
1711
+ (RXFC_FS_MASK >> RXFC_FS_SHIFT);
1712
+ cdev->mcfg[MRAM_RXF1].off = cdev->mcfg[MRAM_RXF0].off +
1713
+ cdev->mcfg[MRAM_RXF0].num * RXF0_ELEMENT_SIZE;
1714
+ cdev->mcfg[MRAM_RXF1].num = mram_config_vals[4] &
1715
+ (RXFC_FS_MASK >> RXFC_FS_SHIFT);
1716
+ cdev->mcfg[MRAM_RXB].off = cdev->mcfg[MRAM_RXF1].off +
1717
+ cdev->mcfg[MRAM_RXF1].num * RXF1_ELEMENT_SIZE;
1718
+ cdev->mcfg[MRAM_RXB].num = mram_config_vals[5];
1719
+ cdev->mcfg[MRAM_TXE].off = cdev->mcfg[MRAM_RXB].off +
1720
+ cdev->mcfg[MRAM_RXB].num * RXB_ELEMENT_SIZE;
1721
+ cdev->mcfg[MRAM_TXE].num = mram_config_vals[6];
1722
+ cdev->mcfg[MRAM_TXB].off = cdev->mcfg[MRAM_TXE].off +
1723
+ cdev->mcfg[MRAM_TXE].num * TXE_ELEMENT_SIZE;
1724
+ cdev->mcfg[MRAM_TXB].num = mram_config_vals[7] &
1725
+ (TXBC_NDTB_MASK >> TXBC_NDTB_SHIFT);
1726
+
1727
+ dev_dbg(cdev->dev,
1728
+ "sidf 0x%x %d xidf 0x%x %d rxf0 0x%x %d rxf1 0x%x %d rxb 0x%x %d txe 0x%x %d txb 0x%x %d\n",
1729
+ cdev->mcfg[MRAM_SIDF].off, cdev->mcfg[MRAM_SIDF].num,
1730
+ cdev->mcfg[MRAM_XIDF].off, cdev->mcfg[MRAM_XIDF].num,
1731
+ cdev->mcfg[MRAM_RXF0].off, cdev->mcfg[MRAM_RXF0].num,
1732
+ cdev->mcfg[MRAM_RXF1].off, cdev->mcfg[MRAM_RXF1].num,
1733
+ cdev->mcfg[MRAM_RXB].off, cdev->mcfg[MRAM_RXB].num,
1734
+ cdev->mcfg[MRAM_TXE].off, cdev->mcfg[MRAM_TXE].num,
1735
+ cdev->mcfg[MRAM_TXB].off, cdev->mcfg[MRAM_TXB].num);
1736
+}
1737
+
1738
+void m_can_init_ram(struct m_can_classdev *cdev)
15351739 {
15361740 int end, i, start;
15371741
15381742 /* initialize the entire Message RAM in use to avoid possible
15391743 * ECC/parity checksum errors when reading an uninitialized buffer
15401744 */
1541
- start = priv->mcfg[MRAM_SIDF].off;
1542
- end = priv->mcfg[MRAM_TXB].off +
1543
- priv->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE;
1745
+ start = cdev->mcfg[MRAM_SIDF].off;
1746
+ end = cdev->mcfg[MRAM_TXB].off +
1747
+ cdev->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE;
1748
+
15441749 for (i = start; i < end; i += 4)
1545
- writel(0x0, priv->mram_base + i);
1750
+ m_can_fifo_write_no_off(cdev, i, 0x0);
15461751 }
1752
+EXPORT_SYMBOL_GPL(m_can_init_ram);
15471753
1548
-static void m_can_of_parse_mram(struct m_can_priv *priv,
1549
- const u32 *mram_config_vals)
1754
+int m_can_class_get_clocks(struct m_can_classdev *m_can_dev)
15501755 {
1551
- priv->mcfg[MRAM_SIDF].off = mram_config_vals[0];
1552
- priv->mcfg[MRAM_SIDF].num = mram_config_vals[1];
1553
- priv->mcfg[MRAM_XIDF].off = priv->mcfg[MRAM_SIDF].off +
1554
- priv->mcfg[MRAM_SIDF].num * SIDF_ELEMENT_SIZE;
1555
- priv->mcfg[MRAM_XIDF].num = mram_config_vals[2];
1556
- priv->mcfg[MRAM_RXF0].off = priv->mcfg[MRAM_XIDF].off +
1557
- priv->mcfg[MRAM_XIDF].num * XIDF_ELEMENT_SIZE;
1558
- priv->mcfg[MRAM_RXF0].num = mram_config_vals[3] &
1559
- (RXFC_FS_MASK >> RXFC_FS_SHIFT);
1560
- priv->mcfg[MRAM_RXF1].off = priv->mcfg[MRAM_RXF0].off +
1561
- priv->mcfg[MRAM_RXF0].num * RXF0_ELEMENT_SIZE;
1562
- priv->mcfg[MRAM_RXF1].num = mram_config_vals[4] &
1563
- (RXFC_FS_MASK >> RXFC_FS_SHIFT);
1564
- priv->mcfg[MRAM_RXB].off = priv->mcfg[MRAM_RXF1].off +
1565
- priv->mcfg[MRAM_RXF1].num * RXF1_ELEMENT_SIZE;
1566
- priv->mcfg[MRAM_RXB].num = mram_config_vals[5];
1567
- priv->mcfg[MRAM_TXE].off = priv->mcfg[MRAM_RXB].off +
1568
- priv->mcfg[MRAM_RXB].num * RXB_ELEMENT_SIZE;
1569
- priv->mcfg[MRAM_TXE].num = mram_config_vals[6];
1570
- priv->mcfg[MRAM_TXB].off = priv->mcfg[MRAM_TXE].off +
1571
- priv->mcfg[MRAM_TXE].num * TXE_ELEMENT_SIZE;
1572
- priv->mcfg[MRAM_TXB].num = mram_config_vals[7] &
1573
- (TXBC_NDTB_MASK >> TXBC_NDTB_SHIFT);
1756
+ int ret = 0;
15741757
1575
- dev_dbg(priv->device,
1576
- "mram_base %p sidf 0x%x %d xidf 0x%x %d rxf0 0x%x %d rxf1 0x%x %d rxb 0x%x %d txe 0x%x %d txb 0x%x %d\n",
1577
- priv->mram_base,
1578
- priv->mcfg[MRAM_SIDF].off, priv->mcfg[MRAM_SIDF].num,
1579
- priv->mcfg[MRAM_XIDF].off, priv->mcfg[MRAM_XIDF].num,
1580
- priv->mcfg[MRAM_RXF0].off, priv->mcfg[MRAM_RXF0].num,
1581
- priv->mcfg[MRAM_RXF1].off, priv->mcfg[MRAM_RXF1].num,
1582
- priv->mcfg[MRAM_RXB].off, priv->mcfg[MRAM_RXB].num,
1583
- priv->mcfg[MRAM_TXE].off, priv->mcfg[MRAM_TXE].num,
1584
- priv->mcfg[MRAM_TXB].off, priv->mcfg[MRAM_TXB].num);
1758
+ m_can_dev->hclk = devm_clk_get(m_can_dev->dev, "hclk");
1759
+ m_can_dev->cclk = devm_clk_get(m_can_dev->dev, "cclk");
15851760
1586
- m_can_init_ram(priv);
1761
+ if (IS_ERR(m_can_dev->cclk)) {
1762
+ dev_err(m_can_dev->dev, "no clock found\n");
1763
+ ret = -ENODEV;
1764
+ }
1765
+
1766
+ return ret;
15871767 }
1768
+EXPORT_SYMBOL_GPL(m_can_class_get_clocks);
15881769
1589
-static int m_can_plat_probe(struct platform_device *pdev)
1770
+struct m_can_classdev *m_can_class_allocate_dev(struct device *dev)
15901771 {
1591
- struct net_device *dev;
1592
- struct m_can_priv *priv;
1593
- struct resource *res;
1594
- void __iomem *addr;
1595
- void __iomem *mram_addr;
1596
- struct clk *hclk, *cclk;
1597
- int irq, ret;
1598
- struct device_node *np;
1772
+ struct m_can_classdev *class_dev = NULL;
15991773 u32 mram_config_vals[MRAM_CFG_LEN];
1774
+ struct net_device *net_dev;
16001775 u32 tx_fifo_size;
1776
+ int ret;
16011777
1602
- np = pdev->dev.of_node;
1603
-
1604
- hclk = devm_clk_get(&pdev->dev, "hclk");
1605
- cclk = devm_clk_get(&pdev->dev, "cclk");
1606
-
1607
- if (IS_ERR(hclk) || IS_ERR(cclk)) {
1608
- dev_err(&pdev->dev, "no clock found\n");
1609
- ret = -ENODEV;
1610
- goto failed_ret;
1611
- }
1612
-
1613
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "m_can");
1614
- addr = devm_ioremap_resource(&pdev->dev, res);
1615
- irq = platform_get_irq_byname(pdev, "int0");
1616
-
1617
- if (IS_ERR(addr) || irq < 0) {
1618
- ret = -EINVAL;
1619
- goto failed_ret;
1620
- }
1621
-
1622
- /* message ram could be shared */
1623
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
1624
- if (!res) {
1625
- ret = -ENODEV;
1626
- goto failed_ret;
1627
- }
1628
-
1629
- mram_addr = devm_ioremap(&pdev->dev, res->start, resource_size(res));
1630
- if (!mram_addr) {
1631
- ret = -ENOMEM;
1632
- goto failed_ret;
1633
- }
1634
-
1635
- /* get message ram configuration */
1636
- ret = of_property_read_u32_array(np, "bosch,mram-cfg",
1637
- mram_config_vals,
1638
- sizeof(mram_config_vals) / 4);
1778
+ ret = fwnode_property_read_u32_array(dev_fwnode(dev),
1779
+ "bosch,mram-cfg",
1780
+ mram_config_vals,
1781
+ sizeof(mram_config_vals) / 4);
16391782 if (ret) {
1640
- dev_err(&pdev->dev, "Could not get Message RAM configuration.");
1641
- goto failed_ret;
1783
+ dev_err(dev, "Could not get Message RAM configuration.");
1784
+ goto out;
16421785 }
16431786
16441787 /* Get TX FIFO size
....@@ -1647,101 +1790,115 @@
16471790 tx_fifo_size = mram_config_vals[7];
16481791
16491792 /* allocate the m_can device */
1650
- dev = alloc_candev(sizeof(*priv), tx_fifo_size);
1651
- if (!dev) {
1652
- ret = -ENOMEM;
1653
- goto failed_ret;
1793
+ net_dev = alloc_candev(sizeof(*class_dev), tx_fifo_size);
1794
+ if (!net_dev) {
1795
+ dev_err(dev, "Failed to allocate CAN device");
1796
+ goto out;
16541797 }
16551798
1656
- priv = netdev_priv(dev);
1657
- dev->irq = irq;
1658
- priv->device = &pdev->dev;
1659
- priv->hclk = hclk;
1660
- priv->cclk = cclk;
1661
- priv->can.clock.freq = clk_get_rate(cclk);
1662
- priv->mram_base = mram_addr;
1799
+ class_dev = netdev_priv(net_dev);
1800
+ if (!class_dev) {
1801
+ dev_err(dev, "Failed to init netdev cdevate");
1802
+ goto out;
1803
+ }
16631804
1664
- platform_set_drvdata(pdev, dev);
1665
- SET_NETDEV_DEV(dev, &pdev->dev);
1805
+ class_dev->net = net_dev;
1806
+ class_dev->dev = dev;
1807
+ SET_NETDEV_DEV(net_dev, dev);
16661808
1667
- /* Enable clocks. Necessary to read Core Release in order to determine
1668
- * M_CAN version
1669
- */
1670
- pm_runtime_enable(&pdev->dev);
1671
- ret = m_can_clk_start(priv);
1672
- if (ret)
1673
- goto pm_runtime_fail;
1809
+ m_can_of_parse_mram(class_dev, mram_config_vals);
1810
+out:
1811
+ return class_dev;
1812
+}
1813
+EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
16741814
1675
- ret = m_can_dev_setup(pdev, dev, addr);
1815
+void m_can_class_free_dev(struct net_device *net)
1816
+{
1817
+ free_candev(net);
1818
+}
1819
+EXPORT_SYMBOL_GPL(m_can_class_free_dev);
1820
+
1821
+int m_can_class_register(struct m_can_classdev *m_can_dev)
1822
+{
1823
+ int ret;
1824
+
1825
+ if (m_can_dev->pm_clock_support) {
1826
+ pm_runtime_enable(m_can_dev->dev);
1827
+ ret = m_can_clk_start(m_can_dev);
1828
+ if (ret)
1829
+ goto pm_runtime_fail;
1830
+ }
1831
+
1832
+ ret = m_can_dev_setup(m_can_dev);
16761833 if (ret)
16771834 goto clk_disable;
16781835
1679
- ret = register_m_can_dev(dev);
1836
+ ret = register_m_can_dev(m_can_dev->net);
16801837 if (ret) {
1681
- dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
1682
- KBUILD_MODNAME, ret);
1838
+ dev_err(m_can_dev->dev, "registering %s failed (err=%d)\n",
1839
+ m_can_dev->net->name, ret);
16831840 goto clk_disable;
16841841 }
16851842
1686
- m_can_of_parse_mram(priv, mram_config_vals);
1843
+ devm_can_led_init(m_can_dev->net);
16871844
1688
- devm_can_led_init(dev);
1845
+ of_can_transceiver(m_can_dev->net);
16891846
1690
- of_can_transceiver(dev);
1691
-
1692
- dev_info(&pdev->dev, "%s device registered (irq=%d, version=%d)\n",
1693
- KBUILD_MODNAME, dev->irq, priv->version);
1847
+ dev_info(m_can_dev->dev, "%s device registered (irq=%d, version=%d)\n",
1848
+ KBUILD_MODNAME, m_can_dev->net->irq, m_can_dev->version);
16941849
16951850 /* Probe finished
16961851 * Stop clocks. They will be reactivated once the M_CAN device is opened
16971852 */
16981853 clk_disable:
1699
- m_can_clk_stop(priv);
1854
+ m_can_clk_stop(m_can_dev);
17001855 pm_runtime_fail:
17011856 if (ret) {
1702
- pm_runtime_disable(&pdev->dev);
1703
- free_candev(dev);
1857
+ if (m_can_dev->pm_clock_support)
1858
+ pm_runtime_disable(m_can_dev->dev);
17041859 }
1705
-failed_ret:
1860
+
17061861 return ret;
17071862 }
1863
+EXPORT_SYMBOL_GPL(m_can_class_register);
17081864
1709
-static __maybe_unused int m_can_suspend(struct device *dev)
1865
+int m_can_class_suspend(struct device *dev)
17101866 {
17111867 struct net_device *ndev = dev_get_drvdata(dev);
1712
- struct m_can_priv *priv = netdev_priv(ndev);
1868
+ struct m_can_classdev *cdev = netdev_priv(ndev);
17131869
17141870 if (netif_running(ndev)) {
17151871 netif_stop_queue(ndev);
17161872 netif_device_detach(ndev);
17171873 m_can_stop(ndev);
1718
- m_can_clk_stop(priv);
1874
+ m_can_clk_stop(cdev);
17191875 }
17201876
17211877 pinctrl_pm_select_sleep_state(dev);
17221878
1723
- priv->can.state = CAN_STATE_SLEEPING;
1879
+ cdev->can.state = CAN_STATE_SLEEPING;
17241880
17251881 return 0;
17261882 }
1883
+EXPORT_SYMBOL_GPL(m_can_class_suspend);
17271884
1728
-static __maybe_unused int m_can_resume(struct device *dev)
1885
+int m_can_class_resume(struct device *dev)
17291886 {
17301887 struct net_device *ndev = dev_get_drvdata(dev);
1731
- struct m_can_priv *priv = netdev_priv(ndev);
1888
+ struct m_can_classdev *cdev = netdev_priv(ndev);
17321889
17331890 pinctrl_pm_select_default_state(dev);
17341891
1735
- priv->can.state = CAN_STATE_ERROR_ACTIVE;
1892
+ cdev->can.state = CAN_STATE_ERROR_ACTIVE;
17361893
17371894 if (netif_running(ndev)) {
17381895 int ret;
17391896
1740
- ret = m_can_clk_start(priv);
1897
+ ret = m_can_clk_start(cdev);
17411898 if (ret)
17421899 return ret;
17431900
1744
- m_can_init_ram(priv);
1901
+ m_can_init_ram(cdev);
17451902 m_can_start(ndev);
17461903 netif_device_attach(ndev);
17471904 netif_start_queue(ndev);
....@@ -1749,79 +1906,15 @@
17491906
17501907 return 0;
17511908 }
1909
+EXPORT_SYMBOL_GPL(m_can_class_resume);
17521910
1753
-static void unregister_m_can_dev(struct net_device *dev)
1911
+void m_can_class_unregister(struct m_can_classdev *m_can_dev)
17541912 {
1755
- unregister_candev(dev);
1913
+ unregister_candev(m_can_dev->net);
17561914 }
1757
-
1758
-static int m_can_plat_remove(struct platform_device *pdev)
1759
-{
1760
- struct net_device *dev = platform_get_drvdata(pdev);
1761
-
1762
- unregister_m_can_dev(dev);
1763
-
1764
- pm_runtime_disable(&pdev->dev);
1765
-
1766
- platform_set_drvdata(pdev, NULL);
1767
-
1768
- free_candev(dev);
1769
-
1770
- return 0;
1771
-}
1772
-
1773
-static int __maybe_unused m_can_runtime_suspend(struct device *dev)
1774
-{
1775
- struct net_device *ndev = dev_get_drvdata(dev);
1776
- struct m_can_priv *priv = netdev_priv(ndev);
1777
-
1778
- clk_disable_unprepare(priv->cclk);
1779
- clk_disable_unprepare(priv->hclk);
1780
-
1781
- return 0;
1782
-}
1783
-
1784
-static int __maybe_unused m_can_runtime_resume(struct device *dev)
1785
-{
1786
- struct net_device *ndev = dev_get_drvdata(dev);
1787
- struct m_can_priv *priv = netdev_priv(ndev);
1788
- int err;
1789
-
1790
- err = clk_prepare_enable(priv->hclk);
1791
- if (err)
1792
- return err;
1793
-
1794
- err = clk_prepare_enable(priv->cclk);
1795
- if (err)
1796
- clk_disable_unprepare(priv->hclk);
1797
-
1798
- return err;
1799
-}
1800
-
1801
-static const struct dev_pm_ops m_can_pmops = {
1802
- SET_RUNTIME_PM_OPS(m_can_runtime_suspend,
1803
- m_can_runtime_resume, NULL)
1804
- SET_SYSTEM_SLEEP_PM_OPS(m_can_suspend, m_can_resume)
1805
-};
1806
-
1807
-static const struct of_device_id m_can_of_table[] = {
1808
- { .compatible = "bosch,m_can", .data = NULL },
1809
- { /* sentinel */ },
1810
-};
1811
-MODULE_DEVICE_TABLE(of, m_can_of_table);
1812
-
1813
-static struct platform_driver m_can_plat_driver = {
1814
- .driver = {
1815
- .name = KBUILD_MODNAME,
1816
- .of_match_table = m_can_of_table,
1817
- .pm = &m_can_pmops,
1818
- },
1819
- .probe = m_can_plat_probe,
1820
- .remove = m_can_plat_remove,
1821
-};
1822
-
1823
-module_platform_driver(m_can_plat_driver);
1915
+EXPORT_SYMBOL_GPL(m_can_class_unregister);
18241916
18251917 MODULE_AUTHOR("Dong Aisheng <b29396@freescale.com>");
1918
+MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
18261919 MODULE_LICENSE("GPL v2");
18271920 MODULE_DESCRIPTION("CAN bus driver for Bosch M_CAN controller");