Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'linux-can-next-for-6.15-20250314' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2025-03-14

this is a pull request of 4 patches for net-next/main.

In the first 2 patches by Dimitri Fedrau add CAN transceiver support
to the flexcan driver.

Frank Li's patch adds i.MX94 support to the flexcan device tree
bindings.

The last patch is by Davide Caratti and adds protocol counter for
AF_CAN sockets.

linux-can-next-for-6.15-20250314

* tag 'linux-can-next-for-6.15-20250314' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next:
can: add protocol counter for AF_CAN sockets
dt-bindings: can: fsl,flexcan: add i.MX94 support
can: flexcan: add transceiver capabilities
dt-bindings: can: fsl,flexcan: add transceiver capabilities
====================

Link: https://patch.msgid.link/20250314132327.2905693-1-mkl@pengutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+43 -7
+13
Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml
··· 45 45 - enum: 46 46 - nxp,s32g3-flexcan 47 47 - const: nxp,s32g2-flexcan 48 + - items: 49 + - enum: 50 + - fsl,imx94-flexcan 51 + - const: fsl,imx95-flexcan 48 52 49 53 reg: 50 54 maxItems: 1 ··· 80 76 81 77 xceiver-supply: 82 78 description: Regulator that powers the CAN transceiver. 79 + 80 + phys: 81 + maxItems: 1 83 82 84 83 big-endian: 85 84 $ref: /schemas/types.yaml#/definitions/flag ··· 178 171 interrupts: 179 172 maxItems: 1 180 173 interrupt-names: false 174 + - if: 175 + required: 176 + - xceiver-supply 177 + then: 178 + properties: 179 + phys: false 181 180 182 181 additionalProperties: false 183 182
+21 -6
drivers/net/can/flexcan/flexcan-core.c
··· 26 26 #include <linux/pinctrl/consumer.h> 27 27 #include <linux/platform_device.h> 28 28 #include <linux/can/platform/flexcan.h> 29 + #include <linux/phy/phy.h> 29 30 #include <linux/pm_runtime.h> 30 31 #include <linux/property.h> 31 32 #include <linux/regmap.h> ··· 645 644 646 645 static inline int flexcan_transceiver_enable(const struct flexcan_priv *priv) 647 646 { 648 - if (!priv->reg_xceiver) 649 - return 0; 647 + if (priv->reg_xceiver) 648 + return regulator_enable(priv->reg_xceiver); 649 + else if (priv->transceiver) 650 + return phy_power_on(priv->transceiver); 650 651 651 - return regulator_enable(priv->reg_xceiver); 652 + return 0; 652 653 } 653 654 654 655 static inline int flexcan_transceiver_disable(const struct flexcan_priv *priv) 655 656 { 656 - if (!priv->reg_xceiver) 657 - return 0; 657 + if (priv->reg_xceiver) 658 + return regulator_disable(priv->reg_xceiver); 659 + else if (priv->transceiver) 660 + return phy_power_off(priv->transceiver); 658 661 659 - return regulator_disable(priv->reg_xceiver); 662 + return 0; 660 663 } 661 664 662 665 static int flexcan_chip_enable(struct flexcan_priv *priv) ··· 2091 2086 struct net_device *dev; 2092 2087 struct flexcan_priv *priv; 2093 2088 struct regulator *reg_xceiver; 2089 + struct phy *transceiver; 2094 2090 struct clk *clk_ipg = NULL, *clk_per = NULL; 2095 2091 struct flexcan_regs __iomem *regs; 2096 2092 struct flexcan_platform_data *pdata; ··· 2106 2100 reg_xceiver = NULL; 2107 2101 else if (IS_ERR(reg_xceiver)) 2108 2102 return PTR_ERR(reg_xceiver); 2103 + 2104 + transceiver = devm_phy_optional_get(&pdev->dev, NULL); 2105 + if (IS_ERR(transceiver)) 2106 + return dev_err_probe(&pdev->dev, PTR_ERR(transceiver), 2107 + "failed to get phy\n"); 2109 2108 2110 2109 if (pdev->dev.of_node) { 2111 2110 of_property_read_u32(pdev->dev.of_node, ··· 2209 2198 priv->clk_per = clk_per; 2210 2199 priv->clk_src = clk_src; 2211 2200 priv->reg_xceiver = reg_xceiver; 2201 + priv->transceiver = transceiver; 2202 + 2203 + if (transceiver) 2204 + priv->can.bitrate_max = transceiver->attrs.max_link_rate; 2212 2205 2213 2206 if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) { 2214 2207 priv->irq_boff = platform_get_irq(pdev, 1);
+1
drivers/net/can/flexcan/flexcan.h
··· 107 107 struct clk *clk_per; 108 108 struct flexcan_devtype_data devtype_data; 109 109 struct regulator *reg_xceiver; 110 + struct phy *transceiver; 110 111 struct flexcan_stop_mode stm; 111 112 112 113 int irq_boff;
+2
net/can/af_can.c
··· 172 172 sock_orphan(sk); 173 173 sock_put(sk); 174 174 sock->sk = NULL; 175 + } else { 176 + sock_prot_inuse_add(net, sk->sk_prot, 1); 175 177 } 176 178 177 179 errout:
+1
net/can/bcm.c
··· 1625 1625 sock->sk = NULL; 1626 1626 1627 1627 release_sock(sk); 1628 + sock_prot_inuse_add(net, sk->sk_prot, -1); 1628 1629 sock_put(sk); 1629 1630 1630 1631 return 0;
+1
net/can/isotp.c
··· 1239 1239 sock->sk = NULL; 1240 1240 1241 1241 release_sock(sk); 1242 + sock_prot_inuse_add(net, sk->sk_prot, -1); 1242 1243 sock_put(sk); 1243 1244 1244 1245 return 0;
+4 -1
net/can/raw.c
··· 397 397 { 398 398 struct sock *sk = sock->sk; 399 399 struct raw_sock *ro; 400 + struct net *net; 400 401 401 402 if (!sk) 402 403 return 0; 403 404 404 405 ro = raw_sk(sk); 406 + net = sock_net(sk); 405 407 406 408 spin_lock(&raw_notifier_lock); 407 409 while (raw_busy_notifier == ro) { ··· 423 421 raw_disable_allfilters(dev_net(ro->dev), ro->dev, sk); 424 422 netdev_put(ro->dev, &ro->dev_tracker); 425 423 } else { 426 - raw_disable_allfilters(sock_net(sk), NULL, sk); 424 + raw_disable_allfilters(net, NULL, sk); 427 425 } 428 426 } 429 427 ··· 442 440 release_sock(sk); 443 441 rtnl_unlock(); 444 442 443 + sock_prot_inuse_add(net, sk->sk_prot, -1); 445 444 sock_put(sk); 446 445 447 446 return 0;