Skip to content

Commit 798fee4

Browse files
committed
Merge tag 'linux-can-next-for-4.6-20160310' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next
Marc Kleine-Budde says: ==================== pull-request: can-next 2016-03-10 this is a pull request of 5 patch for net-next/master. Marek Vasut contributes 4 patches for the ifi CAN driver, which makes it work on real hardware. There is one patch by Ramesh Shanmugasundaram for the rcar_can driver that adds support for the 3rd generation IP core. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents cdc4e47 + e481ab2 commit 798fee4

File tree

4 files changed

+75
-36
lines changed

4 files changed

+75
-36
lines changed

Documentation/devicetree/bindings/net/can/rcar_can.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ Required properties:
99
"renesas,can-r8a7792" if CAN controller is a part of R8A7792 SoC.
1010
"renesas,can-r8a7793" if CAN controller is a part of R8A7793 SoC.
1111
"renesas,can-r8a7794" if CAN controller is a part of R8A7794 SoC.
12+
"renesas,can-r8a7795" if CAN controller is a part of R8A7795 SoC.
1213
"renesas,rcar-gen1-can" for a generic R-Car Gen1 compatible device.
1314
"renesas,rcar-gen2-can" for a generic R-Car Gen2 compatible device.
15+
"renesas,rcar-gen3-can" for a generic R-Car Gen3 compatible device.
1416
When compatible with the generic version, nodes must list the
1517
SoC-specific version corresponding to the platform first
1618
followed by the generic version.
@@ -22,6 +24,15 @@ Required properties:
2224
- pinctrl-0: pin control group to be used for this controller.
2325
- pinctrl-names: must be "default".
2426

27+
Required properties for "renesas,can-r8a7795" compatible:
28+
In R8A7795 SoC, "clkp2" can be CANFD clock. This is a div6 clock and can be
29+
used by both CAN and CAN FD controller at the same time. It needs to be scaled
30+
to maximum frequency if any of these controllers use it. This is done using
31+
the below properties.
32+
33+
- assigned-clocks: phandle of clkp2(CANFD) clock.
34+
- assigned-clock-rates: maximum frequency of this clock.
35+
2536
Optional properties:
2637
- renesas,can-clock-select: R-Car CAN Clock Source Select. Valid values are:
2738
<0x0> (default) : Peripheral clock (clkp1)

drivers/net/can/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ config CAN_JANZ_ICAN3
106106

107107
config CAN_RCAR
108108
tristate "Renesas R-Car CAN controller"
109-
depends on ARM
109+
depends on ARCH_RENESAS || ARM
110110
---help---
111111
Say Y here if you want to use CAN controller found on Renesas R-Car
112112
SoCs.

drivers/net/can/ifi_canfd/ifi_canfd.c

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,12 @@
135135

136136
#define IFI_CANFD_RXFIFO_ID 0x6c
137137
#define IFI_CANFD_RXFIFO_ID_ID_OFFSET 0
138-
#define IFI_CANFD_RXFIFO_ID_ID_STD_MASK 0x3ff
139-
#define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK 0x1fffffff
138+
#define IFI_CANFD_RXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
139+
#define IFI_CANFD_RXFIFO_ID_ID_STD_OFFSET 0
140+
#define IFI_CANFD_RXFIFO_ID_ID_STD_WIDTH 10
141+
#define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
142+
#define IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET 11
143+
#define IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH 18
140144
#define IFI_CANFD_RXFIFO_ID_IDE BIT(29)
141145

142146
#define IFI_CANFD_RXFIFO_DATA 0x70 /* 0x70..0xac */
@@ -156,8 +160,12 @@
156160

157161
#define IFI_CANFD_TXFIFO_ID 0xbc
158162
#define IFI_CANFD_TXFIFO_ID_ID_OFFSET 0
159-
#define IFI_CANFD_TXFIFO_ID_ID_STD_MASK 0x3ff
160-
#define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK 0x1fffffff
163+
#define IFI_CANFD_TXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
164+
#define IFI_CANFD_TXFIFO_ID_ID_STD_OFFSET 0
165+
#define IFI_CANFD_TXFIFO_ID_ID_STD_WIDTH 10
166+
#define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
167+
#define IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET 11
168+
#define IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH 18
161169
#define IFI_CANFD_TXFIFO_ID_IDE BIT(29)
162170

163171
#define IFI_CANFD_TXFIFO_DATA 0xc0 /* 0xb0..0xfc */
@@ -229,10 +237,20 @@ static void ifi_canfd_read_fifo(struct net_device *ndev)
229237

230238
rxid = readl(priv->base + IFI_CANFD_RXFIFO_ID);
231239
id = (rxid >> IFI_CANFD_RXFIFO_ID_ID_OFFSET);
232-
if (id & IFI_CANFD_RXFIFO_ID_IDE)
240+
if (id & IFI_CANFD_RXFIFO_ID_IDE) {
233241
id &= IFI_CANFD_RXFIFO_ID_ID_XTD_MASK;
234-
else
242+
/*
243+
* In case the Extended ID frame is received, the standard
244+
* and extended part of the ID are swapped in the register,
245+
* so swap them back to obtain the correct ID.
246+
*/
247+
id = (id >> IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET) |
248+
((id & IFI_CANFD_RXFIFO_ID_ID_STD_MASK) <<
249+
IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH);
250+
id |= CAN_EFF_FLAG;
251+
} else {
235252
id &= IFI_CANFD_RXFIFO_ID_ID_STD_MASK;
253+
}
236254
cf->can_id = id;
237255

238256
if (rxdlc & IFI_CANFD_RXFIFO_DLC_ESI) {
@@ -514,25 +532,25 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
514532

515533
static const struct can_bittiming_const ifi_canfd_bittiming_const = {
516534
.name = KBUILD_MODNAME,
517-
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
535+
.tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
518536
.tseg1_max = 64,
519-
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
520-
.tseg2_max = 16,
537+
.tseg2_min = 2, /* Time segment 2 = phase_seg2 */
538+
.tseg2_max = 64,
521539
.sjw_max = 16,
522-
.brp_min = 1,
523-
.brp_max = 1024,
540+
.brp_min = 2,
541+
.brp_max = 256,
524542
.brp_inc = 1,
525543
};
526544

527545
static const struct can_bittiming_const ifi_canfd_data_bittiming_const = {
528546
.name = KBUILD_MODNAME,
529-
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
530-
.tseg1_max = 16,
531-
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
532-
.tseg2_max = 8,
533-
.sjw_max = 4,
534-
.brp_min = 1,
535-
.brp_max = 32,
547+
.tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
548+
.tseg1_max = 64,
549+
.tseg2_min = 2, /* Time segment 2 = phase_seg2 */
550+
.tseg2_max = 64,
551+
.sjw_max = 16,
552+
.brp_min = 2,
553+
.brp_max = 256,
536554
.brp_inc = 1,
537555
};
538556

@@ -545,32 +563,34 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
545563
u32 noniso_arg = 0;
546564
u32 time_off;
547565

548-
if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) {
566+
if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) &&
567+
!(priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)) {
568+
time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
569+
} else {
549570
noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH |
550571
IFI_CANFD_TIME_SET_TIMEA_BOSCH |
551572
IFI_CANFD_TIME_SET_PRESC_BOSCH |
552573
IFI_CANFD_TIME_SET_SJW_BOSCH;
553574
time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH;
554-
} else {
555-
time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
556575
}
557576

558577
/* Configure bit timing */
559-
brp = bt->brp - 1;
578+
brp = bt->brp - 2;
560579
sjw = bt->sjw - 1;
561580
tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
562-
tseg2 = bt->phase_seg2 - 1;
581+
tseg2 = bt->phase_seg2 - 2;
563582
writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
564583
(tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
565584
(brp << IFI_CANFD_TIME_PRESCALE_OFF) |
566-
(sjw << time_off),
585+
(sjw << time_off) |
586+
noniso_arg,
567587
priv->base + IFI_CANFD_TIME);
568588

569589
/* Configure data bit timing */
570-
brp = dbt->brp - 1;
590+
brp = dbt->brp - 2;
571591
sjw = dbt->sjw - 1;
572592
tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
573-
tseg2 = dbt->phase_seg2 - 1;
593+
tseg2 = dbt->phase_seg2 - 2;
574594
writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
575595
(tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
576596
(brp << IFI_CANFD_TIME_PRESCALE_OFF) |
@@ -747,8 +767,7 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
747767
{
748768
struct ifi_canfd_priv *priv = netdev_priv(ndev);
749769
struct canfd_frame *cf = (struct canfd_frame *)skb->data;
750-
u32 txst, txid;
751-
u32 txdlc = 0;
770+
u32 txst, txid, txdlc;
752771
int i;
753772

754773
if (can_dropped_invalid_skb(ndev, skb))
@@ -766,17 +785,25 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
766785

767786
if (cf->can_id & CAN_EFF_FLAG) {
768787
txid = cf->can_id & CAN_EFF_MASK;
788+
/*
789+
* In case the Extended ID frame is transmitted, the
790+
* standard and extended part of the ID are swapped
791+
* in the register, so swap them back to send the
792+
* correct ID.
793+
*/
794+
txid = (txid >> IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH) |
795+
((txid & IFI_CANFD_TXFIFO_ID_ID_XTD_MASK) <<
796+
IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET);
769797
txid |= IFI_CANFD_TXFIFO_ID_IDE;
770798
} else {
771799
txid = cf->can_id & CAN_SFF_MASK;
772800
}
773801

774-
if (priv->can.ctrlmode & (CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO)) {
775-
if (can_is_canfd_skb(skb)) {
776-
txdlc |= IFI_CANFD_TXFIFO_DLC_EDL;
777-
if (cf->flags & CANFD_BRS)
778-
txdlc |= IFI_CANFD_TXFIFO_DLC_BRS;
779-
}
802+
txdlc = can_len2dlc(cf->len);
803+
if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && can_is_canfd_skb(skb)) {
804+
txdlc |= IFI_CANFD_TXFIFO_DLC_EDL;
805+
if (cf->flags & CANFD_BRS)
806+
txdlc |= IFI_CANFD_TXFIFO_DLC_BRS;
780807
}
781808

782809
if (cf->can_id & CAN_RTR_FLAG)
@@ -847,7 +874,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
847874

848875
priv->can.state = CAN_STATE_STOPPED;
849876

850-
priv->can.clock.freq = readl(addr + IFI_CANFD_SYSCLOCK);
877+
priv->can.clock.freq = readl(addr + IFI_CANFD_CANCLOCK);
851878

852879
priv->can.bittiming_const = &ifi_canfd_bittiming_const;
853880
priv->can.data_bittiming_const = &ifi_canfd_data_bittiming_const;

drivers/net/can/rcar_can.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,7 @@ static const struct of_device_id rcar_can_of_table[] __maybe_unused = {
906906
{ .compatible = "renesas,can-r8a7791" },
907907
{ .compatible = "renesas,rcar-gen1-can" },
908908
{ .compatible = "renesas,rcar-gen2-can" },
909+
{ .compatible = "renesas,rcar-gen3-can" },
909910
{ }
910911
};
911912
MODULE_DEVICE_TABLE(of, rcar_can_of_table);

0 commit comments

Comments
 (0)