aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2016-03-03 14:45:55 -0500
committerMarc Kleine-Budde <mkl@pengutronix.de>2016-03-10 04:19:09 -0500
commit99312c377f82f91e7754aefe42f64b619b295fd6 (patch)
tree09fc91851a47c2c230c9b02401d8aeba5837545b /drivers/net/can
parent3b8377dca1fd1974d245b2a04a708fc434761c65 (diff)
can: ifi: Fix clock generator configuration
The clock generation does not match reality when using the CAN IP core outside of the FPGA design. This patch fixes the computation of values which are programmed into the clock generator registers. First, there are some off-by-one errors which manifest themselves only when communicating with different controller, so those are fixed. Second, the bits in the clock generator registers have different meaning depending on whether the core is in ISO CANFD mode or any of the other modes (BOSCH CANFD or CAN2.0). Detect the ISO CANFD mode and fix handling of this special case of clock configuration. Finally, the CAN clock speed is in CANCLOCK register, not SYSCLOCK register, so fix this as well. 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> Reviewed-by: Oliver Hartkopp <socketcan@hartkopp.net> 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.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c
index 0d1c164374b7..57581cb80956 100644
--- a/drivers/net/can/ifi_canfd/ifi_canfd.c
+++ b/drivers/net/can/ifi_canfd/ifi_canfd.c
@@ -514,25 +514,25 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
514 514
515static const struct can_bittiming_const ifi_canfd_bittiming_const = { 515static const struct can_bittiming_const ifi_canfd_bittiming_const = {
516 .name = KBUILD_MODNAME, 516 .name = KBUILD_MODNAME,
517 .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ 517 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
518 .tseg1_max = 64, 518 .tseg1_max = 64,
519 .tseg2_min = 1, /* Time segment 2 = phase_seg2 */ 519 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
520 .tseg2_max = 16, 520 .tseg2_max = 64,
521 .sjw_max = 16, 521 .sjw_max = 16,
522 .brp_min = 1, 522 .brp_min = 2,
523 .brp_max = 1024, 523 .brp_max = 256,
524 .brp_inc = 1, 524 .brp_inc = 1,
525}; 525};
526 526
527static const struct can_bittiming_const ifi_canfd_data_bittiming_const = { 527static const struct can_bittiming_const ifi_canfd_data_bittiming_const = {
528 .name = KBUILD_MODNAME, 528 .name = KBUILD_MODNAME,
529 .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ 529 .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
530 .tseg1_max = 16, 530 .tseg1_max = 64,
531 .tseg2_min = 1, /* Time segment 2 = phase_seg2 */ 531 .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
532 .tseg2_max = 8, 532 .tseg2_max = 64,
533 .sjw_max = 4, 533 .sjw_max = 16,
534 .brp_min = 1, 534 .brp_min = 2,
535 .brp_max = 32, 535 .brp_max = 256,
536 .brp_inc = 1, 536 .brp_inc = 1,
537}; 537};
538 538
@@ -545,32 +545,34 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
545 u32 noniso_arg = 0; 545 u32 noniso_arg = 0;
546 u32 time_off; 546 u32 time_off;
547 547
548 if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) { 548 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) &&
549 !(priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)) {
550 time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
551 } else {
549 noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH | 552 noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH |
550 IFI_CANFD_TIME_SET_TIMEA_BOSCH | 553 IFI_CANFD_TIME_SET_TIMEA_BOSCH |
551 IFI_CANFD_TIME_SET_PRESC_BOSCH | 554 IFI_CANFD_TIME_SET_PRESC_BOSCH |
552 IFI_CANFD_TIME_SET_SJW_BOSCH; 555 IFI_CANFD_TIME_SET_SJW_BOSCH;
553 time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH; 556 time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH;
554 } else {
555 time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
556 } 557 }
557 558
558 /* Configure bit timing */ 559 /* Configure bit timing */
559 brp = bt->brp - 1; 560 brp = bt->brp - 2;
560 sjw = bt->sjw - 1; 561 sjw = bt->sjw - 1;
561 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; 562 tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
562 tseg2 = bt->phase_seg2 - 1; 563 tseg2 = bt->phase_seg2 - 2;
563 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) | 564 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
564 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) | 565 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
565 (brp << IFI_CANFD_TIME_PRESCALE_OFF) | 566 (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
566 (sjw << time_off), 567 (sjw << time_off) |
568 noniso_arg,
567 priv->base + IFI_CANFD_TIME); 569 priv->base + IFI_CANFD_TIME);
568 570
569 /* Configure data bit timing */ 571 /* Configure data bit timing */
570 brp = dbt->brp - 1; 572 brp = dbt->brp - 2;
571 sjw = dbt->sjw - 1; 573 sjw = dbt->sjw - 1;
572 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; 574 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
573 tseg2 = dbt->phase_seg2 - 1; 575 tseg2 = dbt->phase_seg2 - 2;
574 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) | 576 writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
575 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) | 577 (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
576 (brp << IFI_CANFD_TIME_PRESCALE_OFF) | 578 (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
@@ -847,7 +849,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
847 849
848 priv->can.state = CAN_STATE_STOPPED; 850 priv->can.state = CAN_STATE_STOPPED;
849 851
850 priv->can.clock.freq = readl(addr + IFI_CANFD_SYSCLOCK); 852 priv->can.clock.freq = readl(addr + IFI_CANFD_CANCLOCK);
851 853
852 priv->can.bittiming_const = &ifi_canfd_bittiming_const; 854 priv->can.bittiming_const = &ifi_canfd_bittiming_const;
853 priv->can.data_bittiming_const = &ifi_canfd_data_bittiming_const; 855 priv->can.data_bittiming_const = &ifi_canfd_data_bittiming_const;