- clock-frequency : The oscillator frequency driving the flexcan device
 
+- xceiver-supply: Regulator that powers the CAN transceiver
+
 Example:
 
        can@1c000 {
 
                        can0: can@80032000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&can0_pins_a>;
+                               xceiver-supply = <®_can_3v3>;
                                status = "okay";
                        };
 
                        can1: can@80034000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&can1_pins_a>;
+                               xceiver-supply = <®_can_3v3>;
                                status = "okay";
                        };
                };
                        gpio = <&gpio3 30 0>;
                        enable-active-high;
                };
+
+               reg_can_3v3: can-3v3 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "can-3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       gpio = <&gpio2 13 0>;
+                       enable-active-high;
+               };
+
        };
 
        sound {
 
 #include <linux/clk/mxs.h>
 #include <linux/clkdev.h>
 #include <linux/clocksource.h>
-#include <linux/can/platform/flexcan.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/gpio.h>
        __raw_writel(mask, reg + MXS_TOG_ADDR);
 }
 
-/*
- * MX28EVK_FLEXCAN_SWITCH is shared between both flexcan controllers
- */
-#define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13)
-
-static int flexcan0_en, flexcan1_en;
-
-static void mx28evk_flexcan_switch(void)
-{
-       if (flexcan0_en || flexcan1_en)
-               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 1);
-       else
-               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 0);
-}
-
-static void mx28evk_flexcan0_switch(int enable)
-{
-       flexcan0_en = enable;
-       mx28evk_flexcan_switch();
-}
-
-static void mx28evk_flexcan1_switch(int enable)
-{
-       flexcan1_en = enable;
-       mx28evk_flexcan_switch();
-}
-
-static struct flexcan_platform_data flexcan_pdata[2];
-
-static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = {
-       OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80032000, NULL, &flexcan_pdata[0]),
-       OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80034000, NULL, &flexcan_pdata[1]),
-       { /* sentinel */ }
-};
-
 #define OCOTP_WORD_OFFSET              0x20
 #define OCOTP_WORD_COUNT               0x20
 
        mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
 }
 
-static void __init imx28_evk_post_init(void)
-{
-       if (!gpio_request_one(MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT,
-                             "flexcan-switch")) {
-               flexcan_pdata[0].transceiver_switch = mx28evk_flexcan0_switch;
-               flexcan_pdata[1].transceiver_switch = mx28evk_flexcan1_switch;
-       }
-}
-
 static int apx4devkit_phy_fixup(struct phy_device *phy)
 {
        phy->dev_flags |= MICREL_PHY_50MHZ_CLK;
                cfa10049_init();
 
        of_platform_populate(NULL, of_default_bus_match_table,
-                            mxs_auxdata_lookup, NULL);
+                            NULL, NULL);
 
        if (of_machine_is_compatible("karo,tx28"))
                tx28_post_init();
-
-       if (of_machine_is_compatible("fsl,imx28-evk"))
-               imx28_evk_post_init();
 }
 
 #define MX23_CLKCTRL_RESET_OFFSET      0x120
 
 #include <linux/can/dev.h>
 #include <linux/can/error.h>
 #include <linux/can/led.h>
-#include <linux/can/platform/flexcan.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/if_arp.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
 
 #define DRV_NAME                       "flexcan"
 
        struct clk *clk_per;
        struct flexcan_platform_data *pdata;
        const struct flexcan_devtype_data *devtype_data;
+       struct regulator *reg_xceiver;
 };
 
 static struct flexcan_devtype_data fsl_p1010_devtype_data = {
 }
 #endif
 
-/*
- * Swtich transceiver on or off
- */
-static void flexcan_transceiver_switch(const struct flexcan_priv *priv, int on)
-{
-       if (priv->pdata && priv->pdata->transceiver_switch)
-               priv->pdata->transceiver_switch(on);
-}
-
 static inline int flexcan_has_and_handle_berr(const struct flexcan_priv *priv,
                                              u32 reg_esr)
 {
        if (priv->devtype_data->features & FLEXCAN_HAS_V10_FEATURES)
                flexcan_write(0x0, ®s->rxfgmask);
 
-       flexcan_transceiver_switch(priv, 1);
+       if (priv->reg_xceiver)  {
+               err = regulator_enable(priv->reg_xceiver);
+               if (err)
+                       goto out;
+       }
 
        /* synchronize with the can bus */
        reg_mcr = flexcan_read(®s->mcr);
        reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT;
        flexcan_write(reg, ®s->mcr);
 
-       flexcan_transceiver_switch(priv, 0);
+       if (priv->reg_xceiver)
+               regulator_disable(priv->reg_xceiver);
        priv->can.state = CAN_STATE_STOPPED;
 
        return;
        priv->pdata = pdev->dev.platform_data;
        priv->devtype_data = devtype_data;
 
+       priv->reg_xceiver = devm_regulator_get(&pdev->dev, "xceiver");
+       if (IS_ERR(priv->reg_xceiver))
+               priv->reg_xceiver = NULL;
+
        netif_napi_add(dev, &priv->napi, flexcan_poll, FLEXCAN_NAPI_WEIGHT);
 
        dev_set_drvdata(&pdev->dev, dev);