Commit 44ffb78f authored by Shawn Guo's avatar Shawn Guo

ARM: mxs: use auxdata to pass flexcan_switch function hook

There are some efforts going on to have flexcan_switch function
implemented in flexcan driver, so that this platform function hook
can be saved for device tree boot.  But due to the mx28evk board
design oddness that two flexcan transceivers share one switch gpio,
we have to come up a separate and generic gpio-switch driver to handle
all these gpio switch use cases.

Before that happens, we choose to use auxdata to pass flexcan_switch
function hook, so that the DT conversion is not blocked there.
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
parent 2c7c2c1d
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/can/platform/flexcan.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/gpio.h> #include <linux/gpio.h>
...@@ -103,9 +104,40 @@ static struct fb_videomode apx4devkit_video_modes[] = { ...@@ -103,9 +104,40 @@ static struct fb_videomode apx4devkit_video_modes[] = {
static struct mxsfb_platform_data mxsfb_pdata __initdata; static struct mxsfb_platform_data mxsfb_pdata __initdata;
/*
* 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 = { static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = {
OF_DEV_AUXDATA("fsl,imx23-lcdif", 0x80030000, NULL, &mxsfb_pdata), OF_DEV_AUXDATA("fsl,imx23-lcdif", 0x80030000, NULL, &mxsfb_pdata),
OF_DEV_AUXDATA("fsl,imx28-lcdif", 0x80030000, NULL, &mxsfb_pdata), OF_DEV_AUXDATA("fsl,imx28-lcdif", 0x80030000, NULL, &mxsfb_pdata),
OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80032000, NULL, &flexcan_pdata[0]),
OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80034000, NULL, &flexcan_pdata[1]),
{ /* sentinel */ } { /* sentinel */ }
}; };
...@@ -245,6 +277,15 @@ static void __init imx28_evk_init(void) ...@@ -245,6 +277,15 @@ static void __init imx28_evk_init(void)
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0); 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 void __init m28evk_init(void) static void __init m28evk_init(void)
{ {
enable_clk_enet_out(); enable_clk_enet_out();
...@@ -366,6 +407,9 @@ static void __init mxs_machine_init(void) ...@@ -366,6 +407,9 @@ static void __init mxs_machine_init(void)
if (of_machine_is_compatible("karo,tx28")) if (of_machine_is_compatible("karo,tx28"))
tx28_post_init(); tx28_post_init();
if (of_machine_is_compatible("fsl,imx28-evk"))
imx28_evk_post_init();
} }
static const char *imx23_dt_compat[] __initdata = { static const char *imx23_dt_compat[] __initdata = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment