aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2016-05-07 18:34:12 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2016-05-09 05:07:28 -0400
commitbe1861320a9ec599b6862ebb71db9bd3ad897150 (patch)
treebeffcb3f9cb39d4c95999f1c5dd3af689ed9393f /drivers/net/can
parent496c798db0b81af67572a2052ea30504c863235f (diff)
can: ifi: Update timing configuration code
The updated documentation regarding the IFI CANFD core from April 2016 adds more details regarding the timing calculation. There is no longer any distinction in the timing calculation between CANFD and CAN2.0, but instead there are two timing modes -- 4_12_6_6 and 7_9_8_8 -- where the numbers mean the width in bits of the SJW/Prescaler/TimeA/TimeB fields. The code uses 7_9_8_8 mode, which allows more fine-grained control over the timing. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Marc Kleine-Budde <mkl@pengutronix.de> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Oliver Hartkopp <socketcan@hartkopp.net> Cc: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/ifi_canfd/ifi_canfd.c54
1 files changed, 21 insertions, 33 deletions
diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c
index 1ad05f1ab942..b9efd6ec04c9 100644
--- a/drivers/net/can/ifi_canfd/ifi_canfd.c
+++ b/drivers/net/can/ifi_canfd/ifi_canfd.c
@@ -34,6 +34,7 @@
34#define IFI_CANFD_STCMD_LOOPBACK BIT(18) 34#define IFI_CANFD_STCMD_LOOPBACK BIT(18)
35#define IFI_CANFD_STCMD_DISABLE_CANFD BIT(24) 35#define IFI_CANFD_STCMD_DISABLE_CANFD BIT(24)
36#define IFI_CANFD_STCMD_ENABLE_ISO BIT(25) 36#define IFI_CANFD_STCMD_ENABLE_ISO BIT(25)
37#define IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING BIT(26)
37#define IFI_CANFD_STCMD_NORMAL_MODE ((u32)BIT(31)) 38#define IFI_CANFD_STCMD_NORMAL_MODE ((u32)BIT(31))
38 39
39#define IFI_CANFD_RXSTCMD 0x4 40#define IFI_CANFD_RXSTCMD 0x4
@@ -71,12 +72,12 @@
71#define IFI_CANFD_TIME_TIMEB_OFF 0 72#define IFI_CANFD_TIME_TIMEB_OFF 0
72#define IFI_CANFD_TIME_TIMEA_OFF 8 73#define IFI_CANFD_TIME_TIMEA_OFF 8
73#define IFI_CANFD_TIME_PRESCALE_OFF 16 74#define IFI_CANFD_TIME_PRESCALE_OFF 16
74#define IFI_CANFD_TIME_SJW_OFF_ISO 25 75#define IFI_CANFD_TIME_SJW_OFF_7_9_8_8 25
75#define IFI_CANFD_TIME_SJW_OFF_BOSCH 28 76#define IFI_CANFD_TIME_SJW_OFF_4_12_6_6 28
76#define IFI_CANFD_TIME_SET_SJW_BOSCH BIT(6) 77#define IFI_CANFD_TIME_SET_SJW_4_12_6_6 BIT(6)
77#define IFI_CANFD_TIME_SET_TIMEB_BOSCH BIT(7) 78#define IFI_CANFD_TIME_SET_TIMEB_4_12_6_6 BIT(7)
78#define IFI_CANFD_TIME_SET_PRESC_BOSCH BIT(14) 79#define IFI_CANFD_TIME_SET_PRESC_4_12_6_6 BIT(14)
79#define IFI_CANFD_TIME_SET_TIMEA_BOSCH BIT(15) 80#define IFI_CANFD_TIME_SET_TIMEA_4_12_6_6 BIT(15)
80 81
81#define IFI_CANFD_TDELAY 0x1c 82#define IFI_CANFD_TDELAY 0x1c
82 83
@@ -534,24 +535,24 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
534static const struct can_bittiming_const ifi_canfd_bittiming_const = { 535static const struct can_bittiming_const ifi_canfd_bittiming_const = {
535 .name = KBUILD_MODNAME, 536 .name = KBUILD_MODNAME,
536 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */ 537 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
537 .tseg1_max = 64, 538 .tseg1_max = 256,
538 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */ 539 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
539 .tseg2_max = 64, 540 .tseg2_max = 256,
540 .sjw_max = 16, 541 .sjw_max = 128,
541 .brp_min = 2, 542 .brp_min = 2,
542 .brp_max = 256, 543 .brp_max = 512,
543 .brp_inc = 1, 544 .brp_inc = 1,
544}; 545};
545 546
546static const struct can_bittiming_const ifi_canfd_data_bittiming_const = { 547static const struct can_bittiming_const ifi_canfd_data_bittiming_const = {
547 .name = KBUILD_MODNAME, 548 .name = KBUILD_MODNAME,
548 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */ 549 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
549 .tseg1_max = 64, 550 .tseg1_max = 256,
550 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */ 551 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
551 .tseg2_max = 64, 552 .tseg2_max = 256,
552 .sjw_max = 16, 553 .sjw_max = 128,
553 .brp_min = 2, 554 .brp_min = 2,
554 .brp_max = 256, 555 .brp_max = 512,
555 .brp_inc = 1, 556 .brp_inc = 1,
556}; 557};
557 558
@@ -561,19 +562,6 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
561 const struct can_bittiming *bt = &priv->can.bittiming; 562 const struct can_bittiming *bt = &priv->can.bittiming;
562 const struct can_bittiming *dbt = &priv->can.data_bittiming; 563 const struct can_bittiming *dbt = &priv->can.data_bittiming;
563 u16 brp, sjw, tseg1, tseg2; 564 u16 brp, sjw, tseg1, tseg2;
564 u32 noniso_arg = 0;
565 u32 time_off;
566
567 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) &&
568 !(priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)) {
569 time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
570 } else {
571 noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH |
572 IFI_CANFD_TIME_SET_TIMEA_BOSCH |
573 IFI_CANFD_TIME_SET_PRESC_BOSCH |
574 IFI_CANFD_TIME_SET_SJW_BOSCH;
575 time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH;
576 }
577 565
578 /* Configure bit timing */ 566 /* Configure bit timing */
579 brp = bt->brp - 2; 567 brp = bt->brp - 2;
@@ -583,8 +571,7 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
583 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) | 571 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
584 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) | 572 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
585 (brp << IFI_CANFD_TIME_PRESCALE_OFF) | 573 (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
586 (sjw << time_off) | 574 (sjw << IFI_CANFD_TIME_SJW_OFF_7_9_8_8),
587 noniso_arg,
588 priv->base + IFI_CANFD_TIME); 575 priv->base + IFI_CANFD_TIME);
589 576
590 /* Configure data bit timing */ 577 /* Configure data bit timing */
@@ -595,8 +582,7 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
595 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) | 582 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
596 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) | 583 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
597 (brp << IFI_CANFD_TIME_PRESCALE_OFF) | 584 (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
598 (sjw << time_off) | 585 (sjw << IFI_CANFD_TIME_SJW_OFF_7_9_8_8),
599 noniso_arg,
600 priv->base + IFI_CANFD_FTIME); 586 priv->base + IFI_CANFD_FTIME);
601} 587}
602 588
@@ -641,7 +627,8 @@ static void ifi_canfd_start(struct net_device *ndev)
641 627
642 /* Reset the IP */ 628 /* Reset the IP */
643 writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD); 629 writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD);
644 writel(0, priv->base + IFI_CANFD_STCMD); 630 writel(IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING,
631 priv->base + IFI_CANFD_STCMD);
645 632
646 ifi_canfd_set_bittiming(ndev); 633 ifi_canfd_set_bittiming(ndev);
647 ifi_canfd_set_filters(ndev); 634 ifi_canfd_set_filters(ndev);
@@ -660,7 +647,8 @@ static void ifi_canfd_start(struct net_device *ndev)
660 writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ), 647 writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ),
661 priv->base + IFI_CANFD_INTERRUPT); 648 priv->base + IFI_CANFD_INTERRUPT);
662 649
663 stcmd = IFI_CANFD_STCMD_ENABLE | IFI_CANFD_STCMD_NORMAL_MODE; 650 stcmd = IFI_CANFD_STCMD_ENABLE | IFI_CANFD_STCMD_NORMAL_MODE |
651 IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING;
664 652
665 if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) 653 if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
666 stcmd |= IFI_CANFD_STCMD_BUSMONITOR; 654 stcmd |= IFI_CANFD_STCMD_BUSMONITOR;