2 * Copyright (C) 2011-2012 Freescale Semiconductor, Inc. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include <linux/types.h>
20 #include <linux/sched.h>
21 #include <linux/delay.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/init.h>
26 #include <linux/input.h>
27 #include <linux/nodemask.h>
28 #include <linux/clk.h>
29 #include <linux/platform_device.h>
30 #include <linux/fsl_devices.h>
31 #include <linux/smsc911x.h>
32 #include <linux/spi/spi.h>
33 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
34 #include <linux/spi/flash.h>
36 #include <linux/mtd/physmap.h>
38 #include <linux/i2c.h>
39 #include <linux/i2c/pca953x.h>
40 #include <linux/ata.h>
41 #include <linux/mtd/mtd.h>
42 #include <linux/mtd/map.h>
43 #include <linux/mtd/partitions.h>
44 #include <linux/pmic_external.h>
45 #include <linux/pmic_status.h>
46 #include <linux/ipu.h>
47 #include <linux/mxcfb.h>
48 #include <linux/pwm_backlight.h>
49 #include <linux/fec.h>
50 #include <linux/memblock.h>
51 #include <linux/gpio.h>
52 #include <linux/etherdevice.h>
53 #include <linux/regulator/anatop-regulator.h>
54 #include <linux/regulator/consumer.h>
55 #include <linux/regulator/machine.h>
56 #include <linux/regulator/fixed.h>
57 #include <sound/pcm.h>
59 #include <mach/common.h>
60 #include <mach/hardware.h>
61 #include <mach/mxc_dvfs.h>
62 #include <mach/memory.h>
63 #include <mach/iomux-mx6q.h>
64 #include <mach/imx-uart.h>
65 #include <mach/viv_gpu.h>
66 #include <mach/ahci_sata.h>
67 #include <mach/ipu-v3.h>
68 #include <mach/mxc_hdmi.h>
69 #include <mach/mxc_asrc.h>
70 #include <mach/mipi_dsi.h>
71 #include <mach/mipi_csi2.h>
74 #include <asm/setup.h>
75 #include <asm/mach-types.h>
76 #include <asm/mach/arch.h>
77 #include <asm/mach/time.h>
80 #include "devices-imx6q.h"
82 #include "cpu_op-mx6.h"
83 #include "board-mx6q_sabreauto.h"
84 #include "board-mx6solo_sabreauto.h"
86 /* sorted by GPIO_NR */
87 #define SABREAUTO_SD1_CD IMX_GPIO_NR(1, 1)
88 #define SABREAUTO_ESAI_INT IMX_GPIO_NR(1, 10)
89 #define SABREAUTO_ANDROID_HOME IMX_GPIO_NR(1, 11)
90 #define SABREAUTO_ANDROID_BACK IMX_GPIO_NR(1, 12)
91 #define SABREAUTO_SD3_WP IMX_GPIO_NR(1, 13)
92 #define SABREAUTO_I2C_EXP_RST IMX_GPIO_NR(1, 15)
93 #define SABREAUTO_USB_OTG_OC IMX_GPIO_NR(2, 8)
94 #define SABREAUTO_LDB_BACKLIGHT3 IMX_GPIO_NR(2, 9)
95 #define SABREAUTO_LDB_BACKLIGHT4 IMX_GPIO_NR(2, 10)
96 #define SABREAUTO_ANDROID_MENU IMX_GPIO_NR(2, 12)
97 #define SABREAUTO_ANDROID_VOLUP IMX_GPIO_NR(2, 15)
98 #define SABREAUTO_CAP_TCH_INT IMX_GPIO_NR(2, 28)
99 #define SABREAUTO_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
100 #define SABREAUTO_DISP0_PWR IMX_GPIO_NR(3, 24)
101 #define SABREAUTO_DISP0_I2C_EN IMX_GPIO_NR(3, 28)
102 #define SABREAUTO_DISP0_DET_INT IMX_GPIO_NR(3, 31)
103 #define SABREAUTO_CSI0_RST IMX_GPIO_NR(4, 5)
104 #define SABREAUTO_DISP0_RESET IMX_GPIO_NR(5, 0)
105 #define SABREAUTO_I2C3_STEER IMX_GPIO_NR(5, 4)
106 #define SABREAUTO_ANDROID_VOLDOWN IMX_GPIO_NR(5, 14)
107 #define SABREAUTO_PMIC_INT IMX_GPIO_NR(5, 16)
108 #define SABREAUTO_ALS_INT IMX_GPIO_NR(5, 17)
109 #define SABREAUTO_SD1_WP IMX_GPIO_NR(5, 20)
110 #define SABREAUTO_CSI0_PWN IMX_GPIO_NR(5, 23)
111 #define SABREAUTO_USB_HOST1_OC IMX_GPIO_NR(5, 0)
112 #define SABREAUTO_SD3_CD IMX_GPIO_NR(6, 15)
114 #define SABREAUTO_MAX7310_1_BASE_ADDR IMX_GPIO_NR(8, 0)
115 #define SABREAUTO_MAX7310_2_BASE_ADDR IMX_GPIO_NR(8, 8)
116 #define SABREAUTO_MAX7310_3_BASE_ADDR IMX_GPIO_NR(8, 16)
118 #define SABREAUTO_IO_EXP_GPIO1(x) (SABREAUTO_MAX7310_1_BASE_ADDR + (x))
119 #define SABREAUTO_IO_EXP_GPIO2(x) (SABREAUTO_MAX7310_2_BASE_ADDR + (x))
120 #define SABREAUTO_IO_EXP_GPIO3(x) (SABREAUTO_MAX7310_3_BASE_ADDR + (x))
123 * CAN2 STBY and EN lines are the same as the CAN1. These lines are not
126 #define SABREAUTO_PER_RST SABREAUTO_IO_EXP_GPIO1(3)
127 #define SABREAUTO_VIDEOIN_PWR SABREAUTO_IO_EXP_GPIO2(2)
128 #define SABREAUTO_CAN1_STEER SABREAUTO_IO_EXP_GPIO2(3)
129 #define SABREAUTO_CAN_STBY SABREAUTO_IO_EXP_GPIO2(5)
130 #define SABREAUTO_CAN_EN SABREAUTO_IO_EXP_GPIO2(6)
131 #define SABREAUTO_USB_HOST1_PWR SABREAUTO_IO_EXP_GPIO2(7)
132 #define SABREAUTO_USB_OTG_PWR SABREAUTO_IO_EXP_GPIO3(1)
133 #define BMCR_PDOWN 0x0800 /* PHY Powerdown */
135 static int mma8451_position = 3;
136 static struct clk *sata_clk;
137 static int mipi_sensor;
139 static int can0_enable;
141 static int __init uart2_enable(char *p)
146 early_param("uart2", uart2_enable);
149 SD_PAD_MODE_LOW_SPEED,
150 SD_PAD_MODE_MED_SPEED,
151 SD_PAD_MODE_HIGH_SPEED,
154 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
155 #define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \
160 .active_low = act_low, \
161 .desc = "btn " descr, \
165 static struct gpio_keys_button ard_buttons[] = {
166 GPIO_BUTTON(SABREAUTO_ANDROID_HOME, KEY_HOME, 1, "home", 0),
167 GPIO_BUTTON(SABREAUTO_ANDROID_BACK, KEY_BACK, 1, "back", 0),
168 GPIO_BUTTON(SABREAUTO_ANDROID_MENU, KEY_MENU, 1, "menu", 0),
169 GPIO_BUTTON(SABREAUTO_ANDROID_VOLUP, KEY_VOLUMEUP, 1, "volume-up", 0),
170 GPIO_BUTTON(SABREAUTO_ANDROID_VOLDOWN, KEY_VOLUMEDOWN, 1, "volume-down", 0),
173 static struct gpio_keys_platform_data ard_android_button_data = {
174 .buttons = ard_buttons,
175 .nbuttons = ARRAY_SIZE(ard_buttons),
178 static struct platform_device ard_android_button_device = {
183 .platform_data = &ard_android_button_data,
187 static void __init imx6q_add_android_device_buttons(void)
189 platform_device_register(&ard_android_button_device);
192 static void __init imx6q_add_android_device_buttons(void) {}
195 static int plt_sd3_pad_change(int clock)
197 static enum sd_pad_mode pad_mode = SD_PAD_MODE_LOW_SPEED;
199 iomux_v3_cfg_t *sd3_pads_200mhz = NULL;
200 iomux_v3_cfg_t *sd3_pads_100mhz = NULL;
201 iomux_v3_cfg_t *sd3_pads_50mhz = NULL;
203 u32 sd3_pads_200mhz_cnt;
204 u32 sd3_pads_100mhz_cnt;
205 u32 sd3_pads_50mhz_cnt;
208 sd3_pads_200mhz = mx6q_sd3_200mhz;
209 sd3_pads_100mhz = mx6q_sd3_100mhz;
210 sd3_pads_50mhz = mx6q_sd3_50mhz;
212 sd3_pads_200mhz_cnt = ARRAY_SIZE(mx6q_sd3_200mhz);
213 sd3_pads_100mhz_cnt = ARRAY_SIZE(mx6q_sd3_100mhz);
214 sd3_pads_50mhz_cnt = ARRAY_SIZE(mx6q_sd3_50mhz);
215 } else if (cpu_is_mx6dl()) {
216 sd3_pads_200mhz = mx6dl_sd3_200mhz;
217 sd3_pads_100mhz = mx6dl_sd3_100mhz;
218 sd3_pads_50mhz = mx6dl_sd3_50mhz;
220 sd3_pads_200mhz_cnt = ARRAY_SIZE(mx6dl_sd3_200mhz);
221 sd3_pads_100mhz_cnt = ARRAY_SIZE(mx6dl_sd3_100mhz);
222 sd3_pads_50mhz_cnt = ARRAY_SIZE(mx6dl_sd3_50mhz);
225 if (clock > 100000000) {
226 if (pad_mode == SD_PAD_MODE_HIGH_SPEED)
228 BUG_ON(!sd3_pads_200mhz);
229 pad_mode = SD_PAD_MODE_HIGH_SPEED;
230 return mxc_iomux_v3_setup_multiple_pads(sd3_pads_200mhz,
231 sd3_pads_200mhz_cnt);
232 } else if (clock > 52000000) {
233 if (pad_mode == SD_PAD_MODE_MED_SPEED)
235 BUG_ON(!sd3_pads_100mhz);
236 pad_mode = SD_PAD_MODE_MED_SPEED;
237 return mxc_iomux_v3_setup_multiple_pads(sd3_pads_100mhz,
238 sd3_pads_100mhz_cnt);
240 if (pad_mode == SD_PAD_MODE_LOW_SPEED)
242 BUG_ON(!sd3_pads_50mhz);
243 pad_mode = SD_PAD_MODE_LOW_SPEED;
244 return mxc_iomux_v3_setup_multiple_pads(sd3_pads_50mhz,
249 static const struct esdhc_platform_data mx6q_sabreauto_sd3_data __initconst = {
250 .cd_gpio = SABREAUTO_SD3_CD,
251 .wp_gpio = SABREAUTO_SD3_WP,
255 .platform_pad_change = plt_sd3_pad_change,
258 static const struct esdhc_platform_data mx6q_sabreauto_sd1_data __initconst = {
259 .cd_gpio = SABREAUTO_SD1_CD,
260 .wp_gpio = SABREAUTO_SD1_WP,
264 static int __init gpmi_nand_platform_init(void)
266 iomux_v3_cfg_t *nand_pads = NULL;
270 nand_pads = mx6q_gpmi_nand;
271 nand_pads_cnt = ARRAY_SIZE(mx6q_gpmi_nand);
272 } else if (cpu_is_mx6dl()) {
273 nand_pads = mx6dl_gpmi_nand;
274 nand_pads_cnt = ARRAY_SIZE(mx6dl_gpmi_nand);
278 return mxc_iomux_v3_setup_multiple_pads(nand_pads, nand_pads_cnt);
281 static const struct gpmi_nand_platform_data
282 mx6q_gpmi_nand_platform_data __initconst = {
283 .platform_init = gpmi_nand_platform_init,
284 .min_prop_delay_in_ns = 5,
285 .max_prop_delay_in_ns = 9,
289 static const struct anatop_thermal_platform_data
290 mx6q_sabreauto_anatop_thermal_data __initconst = {
291 .name = "anatop_thermal",
294 static inline void mx6q_sabreauto_init_uart(void)
296 imx6q_add_imx_uart(0, NULL);
297 imx6q_add_imx_uart(1, NULL);
298 imx6q_add_imx_uart(3, NULL);
301 static int mx6q_sabreauto_fec_phy_init(struct phy_device *phydev)
305 if (!board_is_mx6_reva()) {
306 /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
307 phy_write(phydev, 0xd, 0x7);
308 phy_write(phydev, 0xe, 0x8016);
309 phy_write(phydev, 0xd, 0x4007);
310 val = phy_read(phydev, 0xe);
314 phy_write(phydev, 0xe, val);
316 /* Introduce tx clock delay */
317 phy_write(phydev, 0x1d, 0x5);
318 val = phy_read(phydev, 0x1e);
320 phy_write(phydev, 0x1e, val);
323 val = phy_read(phydev, 0x0);
325 if (val & BMCR_PDOWN)
326 phy_write(phydev, 0x0, (val & ~BMCR_PDOWN));
328 /* prefer master mode, 1000 Base-T capable */
329 phy_write(phydev, 0x9, 0x0f00);
331 /* min rx data delay */
332 phy_write(phydev, 0x0b, 0x8105);
333 phy_write(phydev, 0x0c, 0x0000);
335 /* max rx/tx clock delay, min rx/tx control delay */
336 phy_write(phydev, 0x0b, 0x8104);
337 phy_write(phydev, 0x0c, 0xf0f0);
338 phy_write(phydev, 0x0b, 0x104);
344 static int mx6q_sabreauto_fec_power_hibernate(struct phy_device *phydev)
349 static struct fec_platform_data fec_data __initdata = {
350 .init = mx6q_sabreauto_fec_phy_init,
351 .power_hibernate = mx6q_sabreauto_fec_power_hibernate,
352 .phy = PHY_INTERFACE_MODE_RGMII,
355 static int mx6q_sabreauto_spi_cs[] = {
356 SABREAUTO_ECSPI1_CS1,
359 static const struct spi_imx_master mx6q_sabreauto_spi_data __initconst = {
360 .chipselect = mx6q_sabreauto_spi_cs,
361 .num_chipselect = ARRAY_SIZE(mx6q_sabreauto_spi_cs),
364 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
365 static struct mtd_partition m25p32_partitions[] = {
367 .name = "bootloader",
372 .offset = MTDPART_OFS_APPEND,
373 .size = MTDPART_SIZ_FULL,
377 static struct flash_platform_data m25p32_spi_flash_data = {
379 .parts = m25p32_partitions,
380 .nr_parts = ARRAY_SIZE(m25p32_partitions),
384 static struct spi_board_info m25p32_spi0_board_info[] __initdata = {
385 #if defined(CONFIG_MTD_M25P80)
387 /* The modalias must be the same as spi device driver name */
388 .modalias = "m25p80",
389 .max_speed_hz = 20000000,
392 .platform_data = &m25p32_spi_flash_data,
396 static void spi_device_init(void)
398 spi_register_board_info(m25p32_spi0_board_info,
399 ARRAY_SIZE(m25p32_spi0_board_info));
402 static struct mtd_partition mxc_nor_partitions[] = {
404 .name = "Bootloader",
408 .name = "nor.Kernel",
409 .offset = MTDPART_OFS_APPEND,
410 .size = MTDPART_SIZ_FULL,
413 static struct resource nor_flash_resource = {
414 .start = CS0_BASE_ADDR,
415 .end = CS0_BASE_ADDR + 0x02000000 - 1,
416 .flags = IORESOURCE_MEM,
419 static struct physmap_flash_data nor_flash_data = {
420 .probe_type = "cfi_probe",
422 .parts = mxc_nor_partitions,
423 .nr_parts = ARRAY_SIZE(mxc_nor_partitions),
426 static struct platform_device physmap_flash_device = {
427 .name = "physmap-flash",
430 .platform_data = &nor_flash_data,
432 .resource = &nor_flash_resource,
436 static void mx6q_setup_weimcs(void)
439 void __iomem *nor_reg = MX6_IO_ADDRESS(WEIM_BASE_ADDR);
440 void __iomem *ccm_reg = MX6_IO_ADDRESS(CCM_BASE_ADDR);
442 /*CCM_BASE_ADDR + CLKCTL_CCGR6*/
443 reg = readl(ccm_reg + 0x80);
445 writel(reg, ccm_reg + 0x80);
447 __raw_writel(0x00620081, nor_reg);
448 __raw_writel(0x1C022000, nor_reg + 0x00000008);
449 __raw_writel(0x0804a240, nor_reg + 0x00000010);
453 static int max7310_1_setup(struct i2c_client *client,
454 unsigned gpio_base, unsigned ngpio,
459 /* 2 CPU_PER_RST_B */
460 /* 3 MAIN_PER_RST_B */
466 int max7310_gpio_value[] = {
467 0, 1, 1, 1, 0, 0, 0, 0,
472 for (n = 0; n < ARRAY_SIZE(max7310_gpio_value); ++n) {
473 gpio_request(gpio_base + n, "MAX7310 1 GPIO Expander");
474 if (max7310_gpio_value[n] < 0)
475 gpio_direction_input(gpio_base + n);
477 gpio_direction_output(gpio_base + n,
478 max7310_gpio_value[n]);
479 gpio_export(gpio_base + n, 0);
485 static struct pca953x_platform_data max7310_platdata = {
486 .gpio_base = SABREAUTO_MAX7310_1_BASE_ADDR,
488 .setup = max7310_1_setup,
491 static int max7310_u39_setup(struct i2c_client *client,
492 unsigned gpio_base, unsigned ngpio,
497 /* 2 VIDEO_ADC_PWRDN_B */
498 /* 3 ENET_CAN1_STEER */
499 /* 4 EIMD30_BTUART3_STEER */
504 int max7310_gpio_value[] = {
505 0, 1, 0, 0, 0, 1, 1, 1,
510 for (n = 0; n < ARRAY_SIZE(max7310_gpio_value); ++n) {
511 gpio_request(gpio_base + n, "MAX7310 U39 GPIO Expander");
512 if (max7310_gpio_value[n] < 0)
513 gpio_direction_input(gpio_base + n);
515 gpio_direction_output(gpio_base + n,
516 max7310_gpio_value[n]);
517 gpio_export(gpio_base + n, 0);
523 static int max7310_u43_setup(struct i2c_client *client,
524 unsigned gpio_base, unsigned ngpio,
528 /*1 USB_OTG_PWR_ON */
530 /*3 NAND_BT_WIFI_STEER*/
532 int max7310_gpio_value[] = {
533 0, 0, 0, 0, 0, 0, 0, 0,
538 for (n = 0; n < ARRAY_SIZE(max7310_gpio_value); ++n) {
539 gpio_request(gpio_base + n, "MAX7310 U43 GPIO Expander");
540 if (max7310_gpio_value[n] < 0)
541 gpio_direction_input(gpio_base + n);
543 gpio_direction_output(gpio_base + n,
544 max7310_gpio_value[n]);
545 gpio_export(gpio_base + n, 0);
551 static struct pca953x_platform_data max7310_u39_platdata = {
552 .gpio_base = SABREAUTO_MAX7310_2_BASE_ADDR,
554 .setup = max7310_u39_setup,
557 static struct pca953x_platform_data max7310_u43_platdata = {
558 .gpio_base = SABREAUTO_MAX7310_3_BASE_ADDR,
560 .setup = max7310_u43_setup,
563 static struct fsl_mxc_camera_platform_data camera_data = {
564 .analog_regulator = "DA9052_LDO7",
565 .core_regulator = "DA9052_LDO9",
570 static struct fsl_mxc_camera_platform_data ov5640_mipi_data = {
575 static void adv7180_pwdn(int pwdn)
579 status = gpio_request(SABREAUTO_VIDEOIN_PWR, "tvin-pwr");
582 gpio_direction_output(SABREAUTO_VIDEOIN_PWR, 0);
584 gpio_direction_output(SABREAUTO_VIDEOIN_PWR, 1);
586 gpio_free(SABREAUTO_VIDEOIN_PWR);
589 static struct fsl_mxc_tvin_platform_data adv7180_data = {
594 .pwdn = adv7180_pwdn,
599 static struct imxi2c_platform_data mx6q_sabreauto_i2c2_data = {
603 static struct imxi2c_platform_data mx6q_sabreauto_i2c1_data = {
607 static struct mxc_audio_codec_platform_data cs42888_data = {
609 SNDRV_PCM_RATE_48000 |
610 SNDRV_PCM_RATE_96000 |
611 SNDRV_PCM_RATE_192000),
614 static struct fsl_mxc_lightsensor_platform_data ls_data = {
618 static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
620 I2C_BOARD_INFO("max7310", 0x30),
621 .platform_data = &max7310_platdata,
623 I2C_BOARD_INFO("max7310", 0x32),
624 .platform_data = &max7310_u39_platdata,
626 I2C_BOARD_INFO("max7310", 0x34),
627 .platform_data = &max7310_u43_platdata,
629 I2C_BOARD_INFO("adv7180", 0x21),
630 .platform_data = (void *)&adv7180_data,
632 I2C_BOARD_INFO("ov3640", 0x3c),
633 .platform_data = (void *)&camera_data,
636 I2C_BOARD_INFO("isl29023", 0x44),
637 .irq = gpio_to_irq(SABREAUTO_ALS_INT),
638 .platform_data = &ls_data,
641 I2C_BOARD_INFO("mma8451", 0x1c),
642 .platform_data = (void *)&mma8451_position,
646 static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
648 I2C_BOARD_INFO("egalax_ts", 0x04),
649 .irq = gpio_to_irq(SABREAUTO_CAP_TCH_INT),
651 I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
653 I2C_BOARD_INFO("ov5640_mipi", 0x3c),
654 .platform_data = (void *)&ov5640_mipi_data,
656 I2C_BOARD_INFO("cs42888", 0x48),
657 .platform_data = (void *)&cs42888_data,
661 static void imx6q_sabreauto_usbotg_vbus(bool on)
664 gpio_set_value_cansleep(SABREAUTO_USB_OTG_PWR, 1);
666 gpio_set_value_cansleep(SABREAUTO_USB_OTG_PWR, 0);
669 static void imx6q_sabreauto_usbhost1_vbus(bool on)
672 gpio_set_value_cansleep(SABREAUTO_USB_HOST1_PWR, 1);
674 gpio_set_value_cansleep(SABREAUTO_USB_HOST1_PWR, 0);
677 static void __init imx6q_sabreauto_init_usb(void)
680 imx_otg_base = MX6_IO_ADDRESS(MX6Q_USB_OTG_BASE_ADDR);
682 ret = gpio_request(SABREAUTO_USB_OTG_OC, "otg-oc");
684 printk(KERN_ERR"failed to get GPIO SABREAUTO_USB_OTG_OC:"
688 gpio_direction_input(SABREAUTO_USB_OTG_OC);
690 ret = gpio_request(SABREAUTO_USB_HOST1_OC, "usbh1-oc");
692 printk(KERN_ERR"failed to get SABREAUTO_USB_HOST1_OC:"
696 gpio_direction_input(SABREAUTO_USB_HOST1_OC);
698 mxc_iomux_set_gpr_register(1, 13, 1, 0);
699 mx6_set_otghost_vbus_func(imx6q_sabreauto_usbotg_vbus);
701 mx6_set_host1_vbus_func(imx6q_sabreauto_usbhost1_vbus);
703 #ifdef CONFIG_USB_EHCI_ARC_HSIC
709 static struct viv_gpu_platform_data imx6q_gpu_pdata __initdata = {
710 .reserved_mem_size = SZ_128M,
713 /* HW Initialization, if return 0, initialization is successful. */
714 static int mx6q_sabreauto_sata_init(struct device *dev, void __iomem *addr)
720 sata_clk = clk_get(dev, "imx_sata_clk");
721 if (IS_ERR(sata_clk)) {
722 dev_err(dev, "no sata clock.\n");
723 return PTR_ERR(sata_clk);
725 ret = clk_enable(sata_clk);
727 dev_err(dev, "can't enable sata clock.\n");
731 /* Set PHY Paremeters, two steps to configure the GPR13,
732 * one write for rest of parameters, mask of first write is 0x07FFFFFD,
733 * and the other one write for setting the mpll_clk_off_b
734 *.rx_eq_val_0(iomuxc_gpr13[26:24]),
735 *.los_lvl(iomuxc_gpr13[23:19]),
736 *.rx_dpll_mode_0(iomuxc_gpr13[18:16]),
737 *.sata_speed(iomuxc_gpr13[15]),
738 *.mpll_ss_en(iomuxc_gpr13[14]),
739 *.tx_atten_0(iomuxc_gpr13[13:11]),
740 *.tx_boost_0(iomuxc_gpr13[10:7]),
741 *.tx_lvl(iomuxc_gpr13[6:2]),
742 *.mpll_ck_off(iomuxc_gpr13[1]),
743 *.tx_edgerate_0(iomuxc_gpr13[0]),
745 tmpdata = readl(IOMUXC_GPR13);
746 writel(((tmpdata & ~0x07FFFFFD) | 0x0593A044), IOMUXC_GPR13);
748 /* enable SATA_PHY PLL */
749 tmpdata = readl(IOMUXC_GPR13);
750 writel(((tmpdata & ~0x2) | 0x2), IOMUXC_GPR13);
752 /* Get the AHB clock rate, and configure the TIMER1MS reg later */
753 clk = clk_get(NULL, "ahb");
755 dev_err(dev, "no ahb clock.\n");
757 goto release_sata_clk;
759 tmpdata = clk_get_rate(clk) / 1000;
762 ret = sata_init(addr, tmpdata);
767 clk_disable(sata_clk);
774 static void mx6q_sabreauto_sata_exit(struct device *dev)
776 clk_disable(sata_clk);
781 static struct ahci_platform_data mx6q_sabreauto_sata_data = {
782 .init = mx6q_sabreauto_sata_init,
783 .exit = mx6q_sabreauto_sata_exit,
786 static struct imx_asrc_platform_data imx_asrc_data = {
791 static void mx6q_sabreauto_reset_mipi_dsi(void)
793 gpio_set_value(SABREAUTO_DISP0_PWR, 1);
794 gpio_set_value(SABREAUTO_DISP0_RESET, 1);
796 gpio_set_value(SABREAUTO_DISP0_RESET, 0);
798 gpio_set_value(SABREAUTO_DISP0_RESET, 1);
801 * it needs to delay 120ms minimum for reset complete
806 static struct mipi_dsi_platform_data mipi_dsi_pdata = {
809 .lcd_panel = "TRULY-WVGA",
810 .reset = mx6q_sabreauto_reset_mipi_dsi,
813 static struct ipuv3_fb_platform_data sabr_fb_data[] = {
816 .interface_pix_fmt = IPU_PIX_FMT_RGB666,
817 .mode_str = "LDB-XGA",
822 .interface_pix_fmt = IPU_PIX_FMT_RGB666,
823 .mode_str = "LDB-XGA",
828 .interface_pix_fmt = IPU_PIX_FMT_RGB565,
829 .mode_str = "CLAA-WVGA",
835 static void hdmi_init(int ipu_id, int disp_id)
837 int hdmi_mux_setting;
839 if ((ipu_id > 1) || (ipu_id < 0)) {
840 printk(KERN_ERR"Invalid IPU select for HDMI: %d. Set to 0\n",
845 if ((disp_id > 1) || (disp_id < 0)) {
846 printk(KERN_ERR"Invalid DI select for HDMI: %d. Set to 0\n",
851 /* Configure the connection between IPU1/2 and HDMI */
852 hdmi_mux_setting = 2*ipu_id + disp_id;
854 /* GPR3, bits 2-3 = HDMI_MUX_CTL */
855 mxc_iomux_set_gpr_register(3, 2, 2, hdmi_mux_setting);
858 static struct fsl_mxc_hdmi_platform_data hdmi_data = {
862 static struct fsl_mxc_hdmi_core_platform_data hdmi_core_data = {
867 static struct fsl_mxc_lcd_platform_data lcdif_data = {
870 .default_ifmt = IPU_PIX_FMT_RGB565,
873 static struct fsl_mxc_ldb_platform_data ldb_data = {
882 static struct imx_ipuv3_platform_data ipu_data[] = {
885 .csi_clk[0] = "ccm_clk0",
888 .csi_clk[0] = "ccm_clk0",
892 /* Backlight PWM for CPU board lvds*/
893 static struct platform_pwm_backlight_data mx6_arm2_pwm_backlight_data3 = {
895 .max_brightness = 255,
896 .dft_brightness = 128,
897 .pwm_period_ns = 50000,
900 /* Backlight PWM for Main board lvds*/
901 static struct platform_pwm_backlight_data mx6_arm2_pwm_backlight_data4 = {
903 .max_brightness = 255,
904 .dft_brightness = 128,
905 .pwm_period_ns = 50000,
907 static int flexcan0_en;
908 static int flexcan1_en;
910 static void mx6q_flexcan_switch(void)
912 if (flexcan0_en || flexcan1_en) {
913 gpio_set_value_cansleep(SABREAUTO_CAN_EN, 1);
914 gpio_set_value_cansleep(SABREAUTO_CAN_STBY, 1);
915 /* Enable STEER pin if CAN1 interface is required.
916 * STEER pin is used to switch between ENET_MDC
917 * and CAN1_TX functionality. By default ENET_MDC
918 * is active after reset.
921 gpio_set_value_cansleep(SABREAUTO_CAN1_STEER, 1);
924 /* avoid to disable CAN xcvr if any of the CAN interfaces
925 * are down. XCRV will be disabled only if both CAN2
926 * interfaces are DOWN.
928 if (!flexcan0_en && !flexcan1_en) {
929 gpio_set_value_cansleep(SABREAUTO_CAN_EN, 0);
930 gpio_set_value_cansleep(SABREAUTO_CAN_STBY, 0);
932 /* turn down STEER pin only if CAN1 is DOWN */
934 gpio_set_value_cansleep(SABREAUTO_CAN1_STEER, 0);
938 static void mx6q_flexcan0_switch(int enable)
940 flexcan0_en = enable;
941 mx6q_flexcan_switch();
944 static void mx6q_flexcan1_switch(int enable)
946 flexcan1_en = enable;
947 mx6q_flexcan_switch();
950 static const struct flexcan_platform_data
951 mx6q_sabreauto_flexcan_pdata[] __initconst = {
953 .transceiver_switch = mx6q_flexcan0_switch,
955 .transceiver_switch = mx6q_flexcan1_switch,
959 static struct mipi_csi2_platform_data mipi_csi2_pdata = {
964 .dphy_clk = "mipi_pllref_clk",
965 .pixel_clk = "emi_clk",
968 static void sabreauto_suspend_enter(void)
970 /* suspend preparation */
973 static void sabreauto_suspend_exit(void)
977 static const struct pm_platform_data mx6q_sabreauto_pm_data __initconst = {
979 .suspend_enter = sabreauto_suspend_enter,
980 .suspend_exit = sabreauto_suspend_exit,
983 static struct mxc_audio_platform_data sab_audio_data = {
985 .codec_name = "cs42888.1-0048",
988 static struct platform_device sab_audio_device = {
989 .name = "imx-cs42888",
992 static struct imx_esai_platform_data sab_esai_pdata = {
993 .flags = IMX_ESAI_NET,
996 static struct regulator_consumer_supply sabreauto_vmmc_consumers[] = {
997 REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx.1"),
998 REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx.2"),
999 REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx.3"),
1002 static struct regulator_init_data sabreauto_vmmc_init = {
1003 .num_consumer_supplies = ARRAY_SIZE(sabreauto_vmmc_consumers),
1004 .consumer_supplies = sabreauto_vmmc_consumers,
1007 static struct fixed_voltage_config sabreauto_vmmc_reg_config = {
1008 .supply_name = "vmmc",
1009 .microvolts = 3300000,
1011 .init_data = &sabreauto_vmmc_init,
1014 static struct platform_device sabreauto_vmmc_reg_devices = {
1015 .name = "reg-fixed-voltage",
1018 .platform_data = &sabreauto_vmmc_reg_config,
1022 static struct regulator_consumer_supply cs42888_sabreauto_consumer_va = {
1024 .dev_name = "1-0048",
1027 static struct regulator_consumer_supply cs42888_sabreauto_consumer_vd = {
1029 .dev_name = "1-0048",
1032 static struct regulator_consumer_supply cs42888_sabreauto_consumer_vls = {
1034 .dev_name = "1-0048",
1037 static struct regulator_consumer_supply cs42888_sabreauto_consumer_vlc = {
1039 .dev_name = "1-0048",
1042 static struct regulator_init_data cs42888_sabreauto_va_reg_initdata = {
1043 .num_consumer_supplies = 1,
1044 .consumer_supplies = &cs42888_sabreauto_consumer_va,
1047 static struct regulator_init_data cs42888_sabreauto_vd_reg_initdata = {
1048 .num_consumer_supplies = 1,
1049 .consumer_supplies = &cs42888_sabreauto_consumer_vd,
1052 static struct regulator_init_data cs42888_sabreauto_vls_reg_initdata = {
1053 .num_consumer_supplies = 1,
1054 .consumer_supplies = &cs42888_sabreauto_consumer_vls,
1057 static struct regulator_init_data cs42888_sabreauto_vlc_reg_initdata = {
1058 .num_consumer_supplies = 1,
1059 .consumer_supplies = &cs42888_sabreauto_consumer_vlc,
1062 static struct fixed_voltage_config cs42888_sabreauto_va_reg_config = {
1063 .supply_name = "VA",
1064 .microvolts = 2800000,
1066 .init_data = &cs42888_sabreauto_va_reg_initdata,
1069 static struct fixed_voltage_config cs42888_sabreauto_vd_reg_config = {
1070 .supply_name = "VD",
1071 .microvolts = 2800000,
1073 .init_data = &cs42888_sabreauto_vd_reg_initdata,
1076 static struct fixed_voltage_config cs42888_sabreauto_vls_reg_config = {
1077 .supply_name = "VLS",
1078 .microvolts = 2800000,
1080 .init_data = &cs42888_sabreauto_vls_reg_initdata,
1083 static struct fixed_voltage_config cs42888_sabreauto_vlc_reg_config = {
1084 .supply_name = "VLC",
1085 .microvolts = 2800000,
1087 .init_data = &cs42888_sabreauto_vlc_reg_initdata,
1090 static struct platform_device cs42888_sabreauto_va_reg_devices = {
1091 .name = "reg-fixed-voltage",
1094 .platform_data = &cs42888_sabreauto_va_reg_config,
1098 static struct platform_device cs42888_sabreauto_vd_reg_devices = {
1099 .name = "reg-fixed-voltage",
1102 .platform_data = &cs42888_sabreauto_vd_reg_config,
1106 static struct platform_device cs42888_sabreauto_vls_reg_devices = {
1107 .name = "reg-fixed-voltage",
1110 .platform_data = &cs42888_sabreauto_vls_reg_config,
1114 static struct platform_device cs42888_sabreauto_vlc_reg_devices = {
1115 .name = "reg-fixed-voltage",
1118 .platform_data = &cs42888_sabreauto_vlc_reg_config,
1122 static int __init imx6q_init_audio(void)
1124 struct clk *pll4_clk, *esai_clk, *anaclk_2;
1126 mxc_register_device(&sab_audio_device, &sab_audio_data);
1127 imx6q_add_imx_esai(0, &sab_esai_pdata);
1129 gpio_request(SABREAUTO_ESAI_INT, "esai-int");
1130 gpio_direction_input(SABREAUTO_ESAI_INT);
1132 anaclk_2 = clk_get(NULL, "anaclk_2");
1133 if (IS_ERR(anaclk_2))
1134 return PTR_ERR(anaclk_2);
1135 clk_set_rate(anaclk_2, 24576000);
1137 esai_clk = clk_get(NULL, "esai_clk");
1138 if (IS_ERR(esai_clk))
1139 return PTR_ERR(esai_clk);
1141 pll4_clk = clk_get(NULL, "pll4");
1142 if (IS_ERR(pll4_clk))
1143 return PTR_ERR(pll4_clk);
1145 clk_set_parent(pll4_clk, anaclk_2);
1146 clk_set_parent(esai_clk, pll4_clk);
1147 clk_set_rate(pll4_clk, 786432000);
1148 clk_set_rate(esai_clk, 24576000);
1150 platform_device_register(&cs42888_sabreauto_va_reg_devices);
1151 platform_device_register(&cs42888_sabreauto_vd_reg_devices);
1152 platform_device_register(&cs42888_sabreauto_vls_reg_devices);
1153 platform_device_register(&cs42888_sabreauto_vlc_reg_devices);
1157 static struct mxc_mlb_platform_data mx6_sabreauto_mlb150_data = {
1159 .mlb_clk = "mlb150_clk",
1160 .mlb_pll_clk = "pll6",
1163 static struct mxc_dvfs_platform_data sabreauto_dvfscore_data = {
1164 .reg_id = "cpu_vddgp",
1165 .clk1_id = "cpu_clk",
1166 .clk2_id = "gpc_dvfs_clk",
1167 .gpc_cntr_offset = MXC_GPC_CNTR_OFFSET,
1168 .ccm_cdcr_offset = MXC_CCM_CDCR_OFFSET,
1169 .ccm_cacrr_offset = MXC_CCM_CACRR_OFFSET,
1170 .ccm_cdhipr_offset = MXC_CCM_CDHIPR_OFFSET,
1171 .prediv_mask = 0x1F800,
1172 .prediv_offset = 11,
1174 .div3ck_mask = 0xE0000000,
1175 .div3ck_offset = 29,
1186 static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
1187 char **cmdline, struct meminfo *mi)
1191 static int __init early_enable_mipi_sensor(char *p)
1196 early_param("mipi_sensor", early_enable_mipi_sensor);
1198 static int __init early_enable_can0(char *p)
1203 early_param("can0", early_enable_can0);
1205 static inline void __init mx6q_csi0_io_init(void)
1208 gpio_request(SABREAUTO_CSI0_RST, "cam-reset");
1209 gpio_direction_output(SABREAUTO_CSI0_RST, 1);
1211 /* Camera power down */
1212 gpio_request(SABREAUTO_CSI0_PWN, "cam-pwdn");
1213 gpio_direction_output(SABREAUTO_CSI0_PWN, 1);
1215 gpio_set_value(SABREAUTO_CSI0_PWN, 0);
1216 mxc_iomux_set_gpr_register(1, 19, 1, 1);
1219 static struct mxc_spdif_platform_data mxc_spdif_data = {
1220 .spdif_tx = 0, /* disable tx */
1221 .spdif_rx = 1, /* enable rx */
1222 .spdif_rx_clk = 0, /* rx clk from spdif stream */
1223 .spdif_clk = NULL, /* spdif bus clk */
1227 * Board specific initialization.
1229 static void __init mx6_board_init(void)
1233 iomux_v3_cfg_t *common_pads = NULL;
1234 iomux_v3_cfg_t *can0_pads = NULL;
1235 iomux_v3_cfg_t *can1_pads = NULL;
1236 iomux_v3_cfg_t *mipi_sensor_pads = NULL;
1237 iomux_v3_cfg_t *i2c3_pads = NULL;
1239 int common_pads_cnt;
1242 int mipi_sensor_pads_cnt;
1245 if (cpu_is_mx6q()) {
1246 common_pads = mx6q_sabreauto_pads;
1247 can0_pads = mx6q_sabreauto_can0_pads;
1248 can1_pads = mx6q_sabreauto_can1_pads;
1249 mipi_sensor_pads = mx6q_sabreauto_mipi_sensor_pads;
1251 common_pads_cnt = ARRAY_SIZE(mx6q_sabreauto_pads);
1252 can0_pads_cnt = ARRAY_SIZE(mx6q_sabreauto_can0_pads);
1253 can1_pads_cnt = ARRAY_SIZE(mx6q_sabreauto_can1_pads);
1254 mipi_sensor_pads_cnt = ARRAY_SIZE(mx6q_sabreauto_mipi_sensor_pads);
1255 if (board_is_mx6_reva()) {
1256 i2c3_pads = mx6q_i2c3_pads_rev_a;
1257 i2c3_pads_cnt = ARRAY_SIZE(mx6q_i2c3_pads_rev_a);
1259 i2c3_pads = mx6q_i2c3_pads_rev_b;
1260 i2c3_pads_cnt = ARRAY_SIZE(mx6q_i2c3_pads_rev_b);
1262 } else if (cpu_is_mx6dl()) {
1263 common_pads = mx6dl_sabreauto_pads;
1264 can0_pads = mx6dl_sabreauto_can0_pads;
1265 can1_pads = mx6dl_sabreauto_can1_pads;
1266 mipi_sensor_pads = mx6dl_sabreauto_mipi_sensor_pads;
1268 common_pads_cnt = ARRAY_SIZE(mx6dl_sabreauto_pads);
1269 can0_pads_cnt = ARRAY_SIZE(mx6dl_sabreauto_can0_pads);
1270 can1_pads_cnt = ARRAY_SIZE(mx6dl_sabreauto_can1_pads);
1271 mipi_sensor_pads_cnt = ARRAY_SIZE(mx6dl_sabreauto_mipi_sensor_pads);
1272 if (board_is_mx6_reva()) {
1273 i2c3_pads = mx6dl_i2c3_pads_rev_a;
1274 i2c3_pads_cnt = ARRAY_SIZE(mx6dl_i2c3_pads_rev_a);
1276 i2c3_pads = mx6dl_i2c3_pads_rev_b;
1277 i2c3_pads_cnt = ARRAY_SIZE(mx6dl_i2c3_pads_rev_b);
1281 BUG_ON(!common_pads);
1282 mxc_iomux_v3_setup_multiple_pads(common_pads, common_pads_cnt);
1284 mxc_iomux_v3_setup_multiple_pads(i2c3_pads, i2c3_pads_cnt);
1289 mxc_iomux_v3_setup_multiple_pads(can0_pads,
1293 mxc_iomux_v3_setup_multiple_pads(can1_pads, can1_pads_cnt);
1296 /* assert i2c-rst */
1297 gpio_request(SABREAUTO_I2C_EXP_RST, "i2c-rst");
1298 gpio_direction_output(SABREAUTO_I2C_EXP_RST, 1);
1300 if (!board_is_mx6_reva()) {
1301 /* enable i2c3_sda route path */
1302 gpio_request(SABREAUTO_I2C3_STEER, "i2c3-steer");
1303 gpio_direction_output(SABREAUTO_I2C3_STEER, 1);
1304 /* Set GPIO_16 input for IEEE-1588 ts_clk and
1305 * RMII reference clk
1306 * For MX6 GPR1 bit21 meaning:
1307 * Bit21: 0 - GPIO_16 pad output
1308 * 1 - GPIO_16 pad input
1310 mxc_iomux_set_gpr_register(1, 21, 1, 1);
1314 BUG_ON(!mipi_sensor_pads);
1315 mxc_iomux_v3_setup_multiple_pads(mipi_sensor_pads,
1316 mipi_sensor_pads_cnt);
1319 gp_reg_id = sabreauto_dvfscore_data.reg_id;
1320 mx6q_sabreauto_init_uart();
1321 imx6q_add_mipi_csi2(&mipi_csi2_pdata);
1322 if (cpu_is_mx6dl()) {
1323 mipi_dsi_pdata.ipu_id = 0;
1324 mipi_dsi_pdata.disp_id = 1;
1325 ldb_data.ipu_id = 0;
1326 ldb_data.disp_id = 0;
1327 ldb_data.sec_ipu_id = 0;
1328 ldb_data.sec_disp_id = 1;
1329 hdmi_core_data.disp_id = 1;
1331 imx6q_add_mxc_hdmi_core(&hdmi_core_data);
1333 imx6q_add_ipuv3(0, &ipu_data[0]);
1334 if (cpu_is_mx6q()) {
1335 imx6q_add_ipuv3(1, &ipu_data[1]);
1336 for (i = 0; i < ARRAY_SIZE(sabr_fb_data); i++)
1337 imx6q_add_ipuv3fb(i, &sabr_fb_data[i]);
1338 } else if (cpu_is_mx6dl())
1339 for (i = 0; i < (ARRAY_SIZE(sabr_fb_data) + 1) / 2; i++)
1340 imx6q_add_ipuv3fb(i, &sabr_fb_data[i]);
1342 imx6q_add_mipi_dsi(&mipi_dsi_pdata);
1343 imx6q_add_lcdif(&lcdif_data);
1344 imx6q_add_ldb(&ldb_data);
1345 imx6q_add_v4l2_output(0);
1346 imx6q_add_v4l2_capture(0);
1347 imx6q_add_android_device_buttons();
1349 imx6q_add_imx_snvs_rtc();
1351 imx6q_add_imx_i2c(1, &mx6q_sabreauto_i2c1_data);
1352 i2c_register_board_info(1, mxc_i2c1_board_info,
1353 ARRAY_SIZE(mxc_i2c1_board_info));
1354 imx6q_add_imx_i2c(2, &mx6q_sabreauto_i2c2_data);
1355 i2c_register_board_info(2, mxc_i2c2_board_info,
1356 ARRAY_SIZE(mxc_i2c2_board_info));
1358 ret = gpio_request(SABREAUTO_PMIC_INT, "pFUZE-int");
1360 printk(KERN_ERR"request pFUZE-int error!!\n");
1363 gpio_direction_input(SABREAUTO_PMIC_INT);
1364 mx6q_sabreauto_init_pfuze100(SABREAUTO_PMIC_INT);
1367 imx6q_add_ecspi(0, &mx6q_sabreauto_spi_data);
1368 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
1371 mx6q_setup_weimcs();
1372 platform_device_register(&physmap_flash_device);
1374 imx6q_add_mxc_hdmi(&hdmi_data);
1376 imx6q_add_anatop_thermal_imx(1, &mx6q_sabreauto_anatop_thermal_data);
1379 imx6_init_fec(fec_data);
1381 imx6q_add_pm_imx(0, &mx6q_sabreauto_pm_data);
1383 imx6q_add_sdhci_usdhc_imx(2, &mx6q_sabreauto_sd3_data);
1384 imx6q_add_sdhci_usdhc_imx(0, &mx6q_sabreauto_sd1_data);
1386 imx_add_viv_gpu(&imx6_gpu_data, &imx6q_gpu_pdata);
1387 imx6q_sabreauto_init_usb();
1389 imx6q_add_ahci(0, &mx6q_sabreauto_sata_data);
1392 platform_device_register(&sabreauto_vmmc_reg_devices);
1393 mx6_cpu_regulator_init();
1394 imx_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
1395 imx_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
1396 imx6q_add_asrc(&imx_asrc_data);
1399 mx6q_csi0_io_init();
1402 gpio_request(SABREAUTO_DISP0_DET_INT, "disp0-detect");
1403 gpio_direction_input(SABREAUTO_DISP0_DET_INT);
1405 /* DISP0 Reset - Assert for i2c disabled mode */
1406 gpio_request(SABREAUTO_DISP0_RESET, "disp0-reset");
1407 gpio_direction_output(SABREAUTO_DISP0_RESET, 0);
1409 /* DISP0 I2C enable */
1410 gpio_request(SABREAUTO_DISP0_I2C_EN, "disp0-i2c");
1411 gpio_direction_output(SABREAUTO_DISP0_I2C_EN, 0);
1413 gpio_request(SABREAUTO_DISP0_PWR, "disp0-pwr");
1414 gpio_direction_output(SABREAUTO_DISP0_PWR, 1);
1416 gpio_request(SABREAUTO_LDB_BACKLIGHT3, "ldb-backlight3");
1417 gpio_direction_output(SABREAUTO_LDB_BACKLIGHT3, 1);
1418 gpio_request(SABREAUTO_LDB_BACKLIGHT4, "ldb-backlight4");
1419 gpio_direction_output(SABREAUTO_LDB_BACKLIGHT4, 1);
1422 imx6q_add_imx2_wdt(0, NULL);
1424 imx6q_add_gpmi(&mx6q_gpmi_nand_platform_data);
1426 imx6q_add_dvfs_core(&sabreauto_dvfscore_data);
1428 imx6q_add_mxc_pwm(2);
1429 imx6q_add_mxc_pwm(3);
1430 imx6q_add_mxc_pwm_backlight(2, &mx6_arm2_pwm_backlight_data3);
1431 imx6q_add_mxc_pwm_backlight(3, &mx6_arm2_pwm_backlight_data4);
1433 mxc_spdif_data.spdif_core_clk = clk_get_sys("mxc_spdif.0", NULL);
1434 clk_put(mxc_spdif_data.spdif_core_clk);
1435 imx6q_add_spdif(&mxc_spdif_data);
1436 imx6q_add_spdif_dai();
1437 imx6q_add_spdif_audio_device();
1440 imx6q_add_flexcan0(&mx6q_sabreauto_flexcan_pdata[0]);
1441 imx6q_add_flexcan1(&mx6q_sabreauto_flexcan_pdata[1]);
1442 imx6q_add_hdmi_soc();
1443 imx6q_add_hdmi_soc_dai();
1444 imx6q_add_mlb150(&mx6_sabreauto_mlb150_data);
1447 extern void __iomem *twd_base;
1448 static void __init mx6_timer_init(void)
1450 struct clk *uart_clk;
1451 #ifdef CONFIG_LOCAL_TIMERS
1452 twd_base = ioremap(LOCAL_TWD_ADDR, SZ_256);
1455 mx6_clocks_init(32768, 24000000, 0, 0);
1457 uart_clk = clk_get_sys("imx-uart.0", NULL);
1458 early_console_setup(UART4_BASE_ADDR, uart_clk);
1461 static struct sys_timer mxc_timer = {
1462 .init = mx6_timer_init,
1465 static void __init mx6q_reserve(void)
1469 if (imx6q_gpu_pdata.reserved_mem_size) {
1470 phys = memblock_alloc_base(imx6q_gpu_pdata.reserved_mem_size,
1472 memblock_free(phys, imx6q_gpu_pdata.reserved_mem_size);
1473 memblock_remove(phys, imx6q_gpu_pdata.reserved_mem_size);
1474 imx6q_gpu_pdata.reserved_mem_base = phys;
1478 MACHINE_START(MX6Q_SABREAUTO, "Freescale i.MX 6Quad/DualLite/Solo Sabre Auto Board")
1479 .boot_params = MX6_PHYS_OFFSET + 0x100,
1480 .fixup = fixup_mxc_board,
1481 .map_io = mx6_map_io,
1482 .init_irq = mx6_init_irq,
1483 .init_machine = mx6_board_init,
1484 .timer = &mxc_timer,
1485 .reserve = mx6q_reserve,