summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mx6/board-apalis_imx6.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-mx6/board-apalis_imx6.c')
-rw-r--r--arch/arm/mach-mx6/board-apalis_imx6.c237
1 files changed, 197 insertions, 40 deletions
diff --git a/arch/arm/mach-mx6/board-apalis_imx6.c b/arch/arm/mach-mx6/board-apalis_imx6.c
index a4e76c4392d6..6fd73fe22025 100644
--- a/arch/arm/mach-mx6/board-apalis_imx6.c
+++ b/arch/arm/mach-mx6/board-apalis_imx6.c
@@ -32,6 +32,10 @@
#include <linux/spi/flash.h>
#include <linux/i2c.h>
#include <linux/ata.h>
+#ifdef TODO
+#include <linux/input/fusion_F0710A.h>
+#endif
+#include <linux/mfd/stmpe.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/regulator/consumer.h>
@@ -79,12 +83,13 @@
#define GP_SD1_WP (-1)
#define GP_SD2_CD IMX_GPIO_NR(6, 14) /* Apalis SD1 */
#define GP_SD2_WP (-1)
-#define GP_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
+#define GP_ECSPI1_CS1 IMX_GPIO_NR(5, 25) /* TODO muxing uses not GPIO!*/
#define GP_USB_OTG_PWR IMX_GPIO_NR(3, 22)
-#define GP_CAP_TCH_INT1 IMX_GPIO_NR(1, 9)
+#define GP_CAP_TCH_INT1 IMX_GPIO_NR(1, 9) /* TODO PCIe RESET */
#define GP_USB_PEN IMX_GPIO_NR(1, 0) /* USBH_EN */
#define GP_USB_HUB_VBUS IMX_GPIO_NR(3, 28) /* USB_VBUS_DET */
-#define GP_ENET_PHY_INT IMX_GPIO_NR(1, 28)
+#define GP_ENET_PHY_INT IMX_GPIO_NR(1, 30)
+#define STMPE811_IRQ IMX_GPIO_NR(4, 10)
#define CAN1_ERR_TEST_PADCFG (PAD_CTL_PKE | PAD_CTL_PUE | \
PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED | \
@@ -151,13 +156,14 @@ static int plt_sd_pad_change(unsigned int index, int clock)
{
/* LOW speed is the default state of SD pads */
static enum sd_pad_mode pad_mode = SD_PAD_MODE_LOW_SPEED;
- int i = (index - 1) * SD_SPEED_CNT;
+ int i = index * SD_SPEED_CNT;
+
+ printk("plt_sd_pad_change index %d, clock %d\n", index, clock);
- if ((index < 1) || (index > 3)) {
+ if (index > 3) {
printk(KERN_ERR "no such SD host controller index %d\n", index);
return -EINVAL;
}
-
if (clock > 100000000) {
if (pad_mode == SD_PAD_MODE_HIGH_SPEED)
return 0;
@@ -403,14 +409,146 @@ static struct platform_device audio_device = {
.name = "imx-sgtl5000",
};
-static struct imxi2c_platform_data i2c_data = {
- .bitrate = 100000,
+//**************************************************************************************************
+/*
+ * Fusion touch screen GPIOs (using Toradex display/touch adapater)
+ * Apalis GPIO 5, MXM-11, Ixora X27-17, pen down interrupt
+ * Apalis GPIO 6, MXM-13, Ixora X27-18, reset
+ * gpio_request muxes the GPIO function automatically, we only have to make
+ * sure input/output muxing is done and the GPIO is freed here.
+ */
+#ifdef TODO
+static int pinmux_fusion_pins(void);
+
+static struct fusion_f0710a_init_data apalis_fusion_pdata = {
+ .pinmux_fusion_pins = &pinmux_fusion_pins,
+ .gpio_int = APALIS_GPIO5, /* MXM-11, Pen down interrupt */
+ .gpio_reset = APALIS_GPIO6, /* MXM-13, Reset interrupt */
};
+static int pinmux_fusion_pins(void)
+{
+ gpio_free(apalis_fusion_pdata.gpio_int);
+ gpio_free(apalis_fusion_pdata.gpio_reset);
+ apalis_fusion_pdata.pinmux_fusion_pins = NULL;
+ return 0;
+}
+#endif
+/* I2C */
+
+/* Make sure that the pinmuxing enable the 'open drain' feature for pins used
+ for I2C */
+
+/* I2C1_SDA/SCL on MXM3 pin 209/211 (e.g. RTC on carrier board) */
static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
{
+ /* M41T0M6 real time clock on Iris carrier board */
+ I2C_BOARD_INFO("rtc-ds1307", 0x68),
+ .type = "m41t00",
+ },
+#ifdef TODO
+ {
+ /* TouchRevolution Fusion 7 and 10 multi-touch controller */
+ I2C_BOARD_INFO("fusion_F0710A", 0x10),
+ .platform_data = &apalis_fusion_pdata,
+ },
+#endif
+};
+
+/* DDC: I2C_SDA/SCL on MXM3 pin 205/207 (e.g. display EDID) */
+
+/* CAM_I2C: I2C3_SDA/SCL on MXM3 pin 201/203 (e.g. camera sensor on carrier
+ board) */
+static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
+};
+
+/* PWR_I2C: power I2C to audio codec, PMIC and touch screen controller */
+
+/* STMPE811 touch screen controller */
+static struct stmpe_ts_platform_data stmpe811_ts_data = {
+ .adc_freq = 1, /* 3.25 MHz ADC clock speed */
+ .ave_ctrl = 3, /* 8 sample average control */
+ .fraction_z = 7, /* 7 length fractional part in z */
+ .i_drive = 1, /* 50 mA typical 80 mA max touchscreen
+ drivers current limit value */
+ .mod_12b = 1, /* 12-bit ADC */
+ .ref_sel = 0, /* internal ADC reference */
+ .sample_time = 4, /* ADC converstion time: 80 clocks */
+ .settling = 3, /* 1 ms panel driver settling time */
+ .touch_det_delay = 5, /* 5 ms touch detect interrupt delay */
+};
+#ifdef TODO
+/* STMPE811 ADC controller */
+static struct stmpe_adc_platform_data stmpe811_adc_data = {
+ .sample_time = 4, /* ADC converstion time: 80 clocks */
+ .mod_12b = 1, /* 12-bit ADC */
+ .ref_sel = 0, /* internal ADC reference */
+ .adc_freq = 1, /* 3.25 MHz ADC clock speed */
+};
+#endif
+static struct stmpe_platform_data stmpe811_data = {
+ .blocks = STMPE_BLOCK_TOUCHSCREEN | STMPE_BLOCK_ADC,
+ .id = 1,
+ .irq_base = STMPE811_IRQ,
+ .irq_trigger = IRQF_TRIGGER_FALLING,
+ .ts = &stmpe811_ts_data,
+#ifdef TODO
+ .adc = &stmpe811_adc_data,
+#endif
+};
+
+static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
+ {
+ /* SGTL5000 audio codec */
I2C_BOARD_INFO("sgtl5000", 0x0a),
},
+ {
+ /* STMPE811 touch screen controller */
+ I2C_BOARD_INFO("stmpe", 0x41),
+ .flags = I2C_CLIENT_WAKE,
+ .platform_data = &stmpe811_data,
+ .type = "stmpe811",
+ },
+#if 0
+ {
+ /* PMIC */
+ I2C_BOARD_INFO("pf0100", 0x08),
+ },
+#endif
+ {
+ I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
+ },
+};
+
+#if 0
+static void __init apalis_t30_i2c_init(void)
+{
+ tegra_i2c_device1.dev.platform_data = &apalis_t30_i2c1_platform_data;
+ tegra_i2c_device3.dev.platform_data = &apalis_t30_i2c3_platform_data;
+ tegra_i2c_device4.dev.platform_data = &apalis_t30_i2c4_platform_data;
+ tegra_i2c_device5.dev.platform_data = &apalis_t30_i2c5_platform_data;
+
+ platform_device_register(&tegra_i2c_device1);
+ platform_device_register(&tegra_i2c_device3);
+ platform_device_register(&tegra_i2c_device4);
+ platform_device_register(&tegra_i2c_device5);
+
+ i2c_register_board_info(0, apalis_t30_i2c_bus1_board_info,
+ ARRAY_SIZE(apalis_t30_i2c_bus1_board_info));
+
+ /* enable touch interrupt GPIO */
+ gpio_request(TOUCH_PEN_INT, "TOUCH_PEN_INT");
+ gpio_direction_input(TOUCH_PEN_INT);
+
+ apalis_t30_i2c_bus5_board_info[1].irq = gpio_to_irq(TOUCH_PEN_INT);
+ i2c_register_board_info(4, apalis_t30_i2c_bus5_board_info,
+ ARRAY_SIZE(apalis_t30_i2c_bus5_board_info));
+}
+#endif
+//***********************************************************************************************************************
+
+static struct imxi2c_platform_data i2c_data = {
+ .bitrate = 100000,
};
static void camera_reset(int power_gp, int poweroff_level, int reset_gp, int reset_gp2)
@@ -566,17 +704,20 @@ static struct fsl_mxc_tvin_platform_data adv7180_data = {
.csi = 1,
};
+#if 0
static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
{
I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
},
};
-
+#endif
+#if 0
static struct fsl_mxc_lcd_platform_data adv7391_data = {
.ipu_id = 0,
.disp_id = 0,
.default_ifmt = IPU_PIX_FMT_BT656,
};
+#endif
static void usbotg_vbus(bool on)
{
@@ -586,7 +727,7 @@ static void usbotg_vbus(bool on)
gpio_set_value(GP_USB_OTG_PWR, 0);
}
-static void __init init_usb(void)
+static void __init init_usb_otg(void)
{
int ret = 0;
@@ -606,6 +747,16 @@ static void __init init_usb(void)
mx6_set_otghost_vbus_func(usbotg_vbus);
}
+static void __init init_usb_host(void)
+{
+ /* VBUS to hub on module */
+ gpio_request(GP_USB_HUB_VBUS, "USB_HUB_EN");
+ gpio_direction_output(GP_USB_HUB_VBUS, 1);
+ /* USBH Power Enable */
+ gpio_request(GP_USB_PEN, "USBH_PEN");
+ gpio_direction_output(GP_USB_PEN, 1);
+}
+
/* HW Initialization, if return 0, initialization is successful. */
static int init_sata(struct device *dev, void __iomem *addr)
{
@@ -716,29 +867,29 @@ static struct imx_asrc_platform_data imx_asrc_data = {
.clk_map_ver = 2,
};
-static struct ipuv3_fb_platform_data fb_data[] = {
- { /*fb0*/
- .disp_dev = "ldb",
- .interface_pix_fmt = IPU_PIX_FMT_RGB666,
- .mode_str = "LDB-XGA",
+static struct ipuv3_fb_platform_data fb_data[] = { {
+ /*fb0*/
+ .disp_dev = "hdmi",
+ .interface_pix_fmt = IPU_PIX_FMT_RGB24,
+ .mode_str = "EDT-WVGA",
.default_bpp = 16,
.int_clk = false,
- }, {
+ },{
.disp_dev = "lcd",
- .interface_pix_fmt = IPU_PIX_FMT_RGB565,
- .mode_str = "CLAA-WVGA",
+ .interface_pix_fmt = IPU_PIX_FMT_RGB666,
+ .mode_str = "EDT-WVGA",
.default_bpp = 16,
.int_clk = false,
}, {
.disp_dev = "ldb",
.interface_pix_fmt = IPU_PIX_FMT_RGB666,
- .mode_str = "LDB-SVGA",
+ .mode_str = "LDB-XGA",
.default_bpp = 16,
.int_clk = false,
}, {
.disp_dev = "ldb",
.interface_pix_fmt = IPU_PIX_FMT_RGB666,
- .mode_str = "LDB-VGA",
+ .mode_str = "800x480M@60",
.default_bpp = 16,
.int_clk = false,
},
@@ -775,11 +926,13 @@ static void hdmi_init(int ipu_id, int disp_id)
static void hdmi_enable_ddc_pin(void)
{
+ printk("hdmi: pinmux for EDID");
IOMUX_SETUP(hdmi_ddc_pads);
}
static void hdmi_disable_ddc_pin(void)
{
+ printk("hdmi: pinmux for PWR_I2C\n");
IOMUX_SETUP(i2c2_pads);
}
@@ -791,7 +944,7 @@ static struct fsl_mxc_hdmi_platform_data hdmi_data = {
static struct fsl_mxc_hdmi_core_platform_data hdmi_core_data = {
.ipu_id = 0,
- .disp_id = 1,
+ .disp_id = 0,
};
static void lcd_enable_pins(void)
@@ -803,7 +956,7 @@ static void lcd_enable_pins(void)
static void lcd_disable_pins(void)
{
pr_info("%s\n", __func__);
-// IOMUX_SETUP(lcd_pads_disable);
+ IOMUX_SETUP(lcd_pads_disable);
}
static void vga_dac_enable_pins(void)
@@ -819,7 +972,7 @@ static void vga_dac_disable_pins(void)
}
static struct fsl_mxc_lcd_platform_data lcdif_data = {
- .ipu_id = 1,
+ .ipu_id = 0,
.disp_id = 1,
.default_ifmt = IPU_PIX_FMT_RGB24,
.enable_pins = lcd_enable_pins,
@@ -828,7 +981,7 @@ static struct fsl_mxc_lcd_platform_data lcdif_data = {
static struct fsl_mxc_lcd_platform_data vgadacif_data = {
.ipu_id = 1,
- .disp_id = 0,
+ .disp_id = 1,
.default_ifmt = IPU_PIX_FMT_RGB565,
.enable_pins = vga_dac_enable_pins,
.disable_pins = vga_dac_disable_pins,
@@ -842,13 +995,13 @@ static struct fsl_mxc_ldb_platform_data ldb_data = {
.sec_ipu_id = 1,
.sec_disp_id = 1,
};
-
+#if 0
static struct fsl_mxc_lcd_platform_data bt656_data = {
.ipu_id = 0,
.disp_id = 0,
.default_ifmt = IPU_PIX_FMT_BT656,
};
-
+#endif
static struct imx_ipuv3_platform_data ipu_data[] = {
{
.rev = 4,
@@ -1199,6 +1352,10 @@ static const struct imx_pcie_platform_data pcie_data __initconst = {
/*!
* Board specific initialization.
*/
+#define imx6q_add_lcdif1(pdata) \
+ platform_device_register_resndata(NULL, "mxc_lcdif",\
+ 1, NULL, 0, pdata, sizeof(*pdata));
+
static void __init board_init(void)
{
int i, j;
@@ -1206,15 +1363,18 @@ static void __init board_init(void)
struct clk *clko2;
struct clk *new_parent;
int rate;
- int isn6 ;
#ifdef ONE_WIRE
int one_wire_gp;
#endif
IOMUX_SETUP(common_pads);
- lcd_disable_pins();
- //vga_dac_enable_pins();
+ IOMUX_SETUP(hdmi_ddc_pads);
+ /* setup MMC/SD pads with settings for slow clock */
+ plt_sd_pad_change(0, 400000);
+ plt_sd_pad_change(1, 400000);
+ plt_sd_pad_change(2, 400000);
- isn6 = is_nitrogen6w();
+ lcd_disable_pins();
+ vga_dac_enable_pins();
#ifdef CONFIG_FEC_1588
/* Set GPIO_16 input for IEEE-1588 ts_clk and RMII reference clock
@@ -1260,9 +1420,10 @@ static void __init board_init(void)
imx6q_add_vdoa();
imx6q_add_lcdif(&lcdif_data);
+// imx6q_add_lcdif1(&vgadacif_data);
imx6q_add_ldb(&ldb_data);
imx6q_add_v4l2_output(0);
- imx6q_add_bt656(&bt656_data);
+// imx6q_add_bt656(&bt656_data);
for (i = 0; i < ARRAY_SIZE(capture_data); i++) {
if (!cpu_is_mx6q())
@@ -1279,12 +1440,8 @@ static void __init board_init(void)
imx6q_add_imx_i2c(0, &i2c_data);
imx6q_add_imx_i2c(1, &i2c_data);
imx6q_add_imx_i2c(2, &i2c_data);
- /*
- * SABRE Lite does not have an ISL1208 RTC
- */
i2c_register_board_info(0, mxc_i2c0_board_info,
- isn6 ? ARRAY_SIZE(mxc_i2c0_board_info)
- : ARRAY_SIZE(mxc_i2c0_board_info)-1);
+ ARRAY_SIZE(mxc_i2c0_board_info));
i2c_register_board_info(1, mxc_i2c1_board_info,
ARRAY_SIZE(mxc_i2c1_board_info));
i2c_register_board_info(2, mxc_i2c2_board_info,
@@ -1302,11 +1459,12 @@ static void __init board_init(void)
imx6q_add_anatop_thermal_imx(1, &anatop_thermal_data);
imx6_init_fec(fec_data);
imx6q_add_pm_imx(0, &pm_data);
+ /* register onboard eMMC first */
+ imx6q_add_sdhci_usdhc_imx(2, &sd3_data);
imx6q_add_sdhci_usdhc_imx(0, &sd1_data);
imx6q_add_sdhci_usdhc_imx(1, &sd2_data);
- imx6q_add_sdhci_usdhc_imx(2, &sd3_data);
imx_add_viv_gpu(&imx6_gpu_data, &imx6_gpu_pdata);
- init_usb();
+ init_usb_otg();
if (cpu_is_mx6q())
imx6q_add_ahci(0, &sata_data);
imx6q_add_vpu();
@@ -1317,8 +1475,7 @@ static void __init board_init(void)
imx6q_add_asrc(&imx_asrc_data);
/* USB host */
- gpio_set_value(GP_USB_HUB_VBUS, 1);
- gpio_set_value(GP_USB_PEN, 1);
+ init_usb_host();
imx6q_add_mxc_pwm(0);
imx6q_add_mxc_pwm(1);