From e22e679c7dc63204157d70e04df1fc23cb5b009f Mon Sep 17 00:00:00 2001 From: Vladimir Barinov Date: Mon, 30 May 2016 01:51:47 +0300 Subject: [PATCH 008/122] can: rcar_canfd: add enable and standby control pins Add enable and standby can transceiver control pins Signed-off-by: Vladimir Barinov --- .../devicetree/bindings/net/can/rcar_canfd.txt | 5 ++++ drivers/net/can/rcar/rcar_canfd.c | 33 +++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/net/can/rcar_canfd.txt b/Documentation/devicetree/bindings/net/can/rcar_canfd.txt index ac71daa..829604a 100644 --- a/Documentation/devicetree/bindings/net/can/rcar_canfd.txt +++ b/Documentation/devicetree/bindings/net/can/rcar_canfd.txt @@ -19,6 +19,7 @@ Required properties: - clock-names: 3 clock input name strings: "fck", "canfd", "can_clk". - pinctrl-0: pin control group to be used for this controller. - pinctrl-names: must be "default". +- gpios: GPIO used for controlling the enable pin and standby pin Required child nodes: The controller supports two channels and each is represented as a child node. @@ -62,6 +63,10 @@ SoC common .dtsi file: power-domains = <&cpg>; status = "disabled"; + gpios = <&gpio5 29 GPIO_ACTIVE_HIGH /* enable */ + &gpio5 30 GPIO_ACTIVE_LOW /* standby */ + >; + channel0 { status = "disabled"; }; diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c index 602c19e..5b98f8c 100644 --- a/drivers/net/can/rcar/rcar_canfd.c +++ b/drivers/net/can/rcar/rcar_canfd.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -517,6 +518,8 @@ struct rcar_canfd_global { enum rcar_canfd_fcanclk fcan; /* CANFD or Ext clock */ unsigned long channels_mask; /* Enabled channels mask */ bool fdmode; /* CAN FD or Classical CAN only mode */ + unsigned int enable_pin; /* transceiver enable */ + unsigned int standby_pin; /* transceiver standby */ }; /* CAN FD mode nominal rate constants */ @@ -1268,6 +1271,10 @@ static int rcar_canfd_open(struct net_device *ndev) struct rcar_canfd_global *gpriv = priv->gpriv; int err; + /* transceiver normal mode */ + if (gpio_is_valid(gpriv->standby_pin)) + gpio_set_value(gpriv->standby_pin, 1); + /* Peripheral clock is already enabled in probe */ err = clk_prepare_enable(gpriv->can_clk); if (err) { @@ -1336,6 +1343,9 @@ static int rcar_canfd_close(struct net_device *ndev) clk_disable_unprepare(gpriv->can_clk); close_candev(ndev); can_led_event(ndev, CAN_LED_EVENT_STOP); + /* transceiver stanby mode */ + if (gpio_is_valid(gpriv->standby_pin)) + gpio_set_value(gpriv->standby_pin, 0); return 0; } @@ -1639,8 +1649,9 @@ static int rcar_canfd_probe(struct platform_device *pdev) struct rcar_canfd_global *gpriv; struct device_node *of_child; unsigned long channels_mask = 0; - int err, ch_irq, g_irq; + int err, ret, ch_irq, g_irq; bool fdmode = true; /* CAN FD only mode - default */ + enum of_gpio_flags enable_flags, standby_flags; if (of_property_read_bool(pdev->dev.of_node, "renesas,no-can-fd")) fdmode = false; /* Classical CAN only mode */ @@ -1785,6 +1796,26 @@ static int rcar_canfd_probe(struct platform_device *pdev) goto fail_channel; } + gpriv->enable_pin = of_get_gpio_flags(pdev->dev.of_node, 0, &enable_flags); + gpriv->standby_pin = of_get_gpio_flags(pdev->dev.of_node, 1, &standby_flags); + + if (gpio_is_valid(gpriv->enable_pin)) { + int val = enable_flags & OF_GPIO_ACTIVE_LOW ? + GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; + ret = devm_gpio_request_one(&pdev->dev, gpriv->enable_pin, val, "enable"); + if (ret) + dev_info(&pdev->dev, "Failed to request enable pin\n"); + } + + if (gpio_is_valid(gpriv->standby_pin)) { + int val = standby_flags & OF_GPIO_ACTIVE_LOW ? + GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; + /* transceiver standby mode */ + ret = devm_gpio_request_one(&pdev->dev, gpriv->standby_pin, val, "standby"); + if (ret) + dev_info(&pdev->dev, "Failed to request standby pin\n"); + } + platform_set_drvdata(pdev, gpriv); dev_info(&pdev->dev, "global operational state (clk %d, fdmode %d)\n", gpriv->fcan, gpriv->fdmode); -- 2.7.4