Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
- * Copyright (C) 2009 Sascha Hauer (kernel@pengutronix.de)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- */
- #include <linux/platform_device.h>
- #include <linux/mtd/physmap.h>
- #include <linux/mtd/plat-ram.h>
- #include <linux/io.h>
- #include <linux/i2c.h>
- #include <linux/i2c/at24.h>
- #include <linux/i2c/pca953x.h>
- #include <linux/i2c/tsc2007.h>
- #include <linux/dma-mapping.h>
- #include <linux/spi/spi.h>
- #include <linux/spi/eeprom.h>
- #include <linux/irq.h>
- #include <linux/can/mcp251x.h>
- #include <linux/gpio.h>
- #include <linux/delay.h>
- #include <linux/fsl_devices.h>
- #include <media/soc_camera.h>
- #include <asm/mach/arch.h>
- #include <asm/mach-types.h>
- #include <mach/common.h>
- #include <mach/hardware.h>
- #include <mach/iomux.h>
- #include <mach/i2c.h>
- #include <mach/imx_cam.h>
- #include <asm/mach/time.h>
- #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
- #include <mach/spi.h>
- #endif
- #include <mach/imx-uart.h>
- #include <mach/mxc_nand.h>
- #include <mach/irqs.h>
- #include <mach/imxfb.h>
- #include <mach/mxc_ehci.h>
- #include <mach/ulpi.h>
- #include <mach/mmc.h>
- #include <mach/audmux.h>
- #include <mach/ssi.h>
- #include "devices.h"
- static int pca100_pins[] = {
- /* UART1 */
- PE12_PF_UART1_TXD,
- PE13_PF_UART1_RXD,
- PE14_PF_UART1_CTS,
- PE15_PF_UART1_RTS,
- /* SDHC */
- PB4_PF_SD2_D0,
- PB5_PF_SD2_D1,
- PB6_PF_SD2_D2,
- PB7_PF_SD2_D3,
- PB8_PF_SD2_CMD,
- PB9_PF_SD2_CLK,
- /* FEC */
- PD0_AIN_FEC_TXD0,
- PD1_AIN_FEC_TXD1,
- PD2_AIN_FEC_TXD2,
- PD3_AIN_FEC_TXD3,
- PD4_AOUT_FEC_RX_ER,
- PD5_AOUT_FEC_RXD1,
- PD6_AOUT_FEC_RXD2,
- PD7_AOUT_FEC_RXD3,
- PD8_AF_FEC_MDIO,
- PD9_AIN_FEC_MDC,
- PD10_AOUT_FEC_CRS,
- PD11_AOUT_FEC_TX_CLK,
- PD12_AOUT_FEC_RXD0,
- PD13_AOUT_FEC_RX_DV,
- PD14_AOUT_FEC_RX_CLK,
- PD15_AOUT_FEC_COL,
- PD16_AIN_FEC_TX_ER,
- PF23_AIN_FEC_TX_EN,
- /* SSI1 */
- PC20_PF_SSI1_FS,
- PC21_PF_SSI1_RXD,
- PC22_PF_SSI1_TXD,
- PC23_PF_SSI1_CLK,
- /* onboard I2C */
- PC5_PF_I2C2_SDA,
- PC6_PF_I2C2_SCL,
- /* external I2C */
- PD17_PF_I2C_DATA,
- PD18_PF_I2C_CLK,
- /* display */
- PA5_PF_LSCLK,
- PA6_PF_LD0,
- PA7_PF_LD1,
- PA8_PF_LD2,
- PA9_PF_LD3,
- PA10_PF_LD4,
- PA11_PF_LD5,
- PA12_PF_LD6,
- PA13_PF_LD7,
- PA14_PF_LD8,
- PA15_PF_LD9,
- PA16_PF_LD10,
- PA17_PF_LD11,
- PA18_PF_LD12,
- PA19_PF_LD13,
- PA20_PF_LD14,
- PA21_PF_LD15,
- PA22_PF_LD16,
- PA23_PF_LD17,
- #if 0
- /* not used? */
- PA24_PF_REV,
- PA25_PF_CLS,
- PA26_PF_PS,
- PA27_PF_SPL_SPR,
- #endif
- PA28_PF_HSYNC,
- PA29_PF_VSYNC,
- PA30_PF_CONTRAST,
- PA31_PF_OE_ACD,
- /* SPI1 */
- PD25_PF_CSPI1_RDY,
- // PD28_PF_CSPI1_SS0,
- PD29_PF_CSPI1_SCLK,
- PD30_PF_CSPI1_MISO,
- PD31_PF_CSPI1_MOSI,
- /* OTG */
- PC7_PF_USBOTG_DATA5,
- PC8_PF_USBOTG_DATA6,
- PC9_PF_USBOTG_DATA0,
- PC10_PF_USBOTG_DATA2,
- PC11_PF_USBOTG_DATA1,
- PC12_PF_USBOTG_DATA4,
- PC13_PF_USBOTG_DATA3,
- PE0_PF_USBOTG_NXT,
- PE1_PF_USBOTG_STP,
- PE2_PF_USBOTG_DIR,
- PE24_PF_USBOTG_CLK,
- PE25_PF_USBOTG_DATA7,
- /* USBH2 */
- PA0_PF_USBH2_CLK,
- PA1_PF_USBH2_DIR,
- PA2_PF_USBH2_DATA7,
- PA3_PF_USBH2_NXT,
- PA4_PF_USBH2_STP,
- PD19_AF_USBH2_DATA4,
- PD20_AF_USBH2_DATA3,
- PD21_AF_USBH2_DATA6,
- PD22_AF_USBH2_DATA0,
- PD23_AF_USBH2_DATA2,
- PD24_AF_USBH2_DATA1,
- PD26_AF_USBH2_DATA5,
- };
- static struct imxuart_platform_data uart_pdata = {
- .flags = IMXUART_HAVE_RTSCTS,
- };
- static struct mxc_nand_platform_data pca100_nand_board_info = {
- .width = 1,
- .hw_ecc = 1,
- };
- /* count of GPIOs that are occupied by the CPU itself */
- #define MAX_INTERNAL_GPIO 192
- static struct pca953x_platform_data pca9536_data = {
- .gpio_base = MAX_INTERNAL_GPIO,
- };
- static struct i2c_board_info pca100_camera_i2c_devices[] = {
- {
- I2C_BOARD_INFO("mt9v022", 0x48),
- // I2C_BOARD_INFO("mt9v022", 0x49),
- },{
- I2C_BOARD_INFO("mt9m001", 0x5d),
- },
- };
- #if 1
- static unsigned long pca100_camera_query_bus_param(struct soc_camera_link *link)
- {
- /* MX27 can apply 8 bit bus width only */
- return SOCAM_DATAWIDTH_8;
- }
- static int pca100_camera_set_bus_param(struct soc_camera_link *link,
- unsigned long flags)
- {
- /* unlike mx31, gpio is set with use_camera_gpio on MX27, hence
- * set_bus_param is a dummy only to make the camera drivers statisfied,
- * since they will otherwise go for 10bit bus width */
- return 0;
- }
- #endif
- static struct soc_camera_link iclink[] = {
- {
- .bus_id = 0, /* Must match with the camera ID */
- .board_info = &pca100_camera_i2c_devices[0],
- .i2c_adapter_id = 0,
- #if 1
- .query_bus_param = pca100_camera_query_bus_param,
- .set_bus_param = pca100_camera_set_bus_param,
- //.flags = SOCAM_SENSOR_INVERT_PCLK, //FIXME
- #endif
- .module_name = "mt9v022",
- }, {
- .bus_id = 0, /* Must match with the camera ID */
- .board_info = &pca100_camera_i2c_devices[1],
- .i2c_adapter_id = 0,
- #if 1
- .query_bus_param = pca100_camera_query_bus_param,
- .set_bus_param = pca100_camera_set_bus_param,
- //.flags = SOCAM_SENSOR_INVERT_PCLK, //FIXME
- #endif
- .module_name = "mt9m001",
- },
- };
- static struct platform_device pca100_camera[] = {
- {
- .name = "soc-camera-pdrv",
- .id = 0,
- .dev = {
- .platform_data = &iclink[0],
- },
- }, {
- .name = "soc-camera-pdrv",
- .id = 1,
- .dev = {
- .platform_data = &iclink[1],
- },
- },
- };
- static struct platform_device *platform_devices[] __initdata = {
- &mxc_w1_master_device,
- &mxc_fec_device,
- &mxc_vpu_device,
- &pca100_camera[0],
- &pca100_camera[1],
- };
- static struct imxi2c_platform_data pca100_i2c_0_data = {
- .bitrate = 100000,
- };
- static struct imxi2c_platform_data pca100_i2c_1_data = {
- .bitrate = 100000,
- };
- static struct at24_platform_data board_eeprom = {
- .byte_len = 4096,
- .page_size = 32,
- .flags = AT24_FLAG_ADDR16,
- };
- //Touch
- static int tsc2007_get_pendown_state(void)
- {
- int val = 0;
- gpio_free(GPIO_PORTE + 5);
- gpio_request(GPIO_PORTE + 5, NULL);
- gpio_direction_input(GPIO_PORTE + 5);
- val = gpio_get_value(GPIO_PORTE + 5);
- gpio_free(GPIO_PORTE + 5);
- gpio_request(GPIO_PORTE + 5,NULL);
- return val ? 0 : 1;
- }
- static int tsc2007_init(void)
- {
- #if 0
- int ret = 0;
- printk("tsc2007_init()");
- ret = gpio_request(GPIO_PORTE + 5, NULL);
- gpio_direction_input(GPIO_PORTE + 5);
- if (ret)
- printk(KERN_ERR
- "tsc2007: Failed to reuest Port\n");
- return ret;
- #endif
- gpio_request(GPIO_PORTE + 5, NULL);
- return 0;
- }
- void tsc2007_exit(void)
- {
- }
- static struct tsc2007_platform_data tsc2007_data = {
- .model = 2007, /* 2007. */
- .x_plate_ohms = 700,
- .get_pendown_state = tsc2007_get_pendown_state,
- //.clear_penirq = , /* If needed, clear 2nd level interrupt source */
- .init_platform_hw = tsc2007_init,
- .exit_platform_hw = tsc2007_exit,
- };
- static struct i2c_board_info pca100_i2c_devices[] = {
- {
- I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
- .platform_data = &board_eeprom,
- }, {
- I2C_BOARD_INFO("rtc-pcf8563", 0x51),
- .type = "pcf8563"
- }, {
- I2C_BOARD_INFO("lm75", 0x4a),
- .type = "lm75"
- },
- #if 1
- {
- I2C_BOARD_INFO("tsc2007", 0x49),
- .type = "tsc2007",
- .platform_data = &tsc2007_data,
- .irq = gpio_to_irq(GPIO_PORTE + 5) //IRQ_GPIOE(5)
- },
- #endif
- };
- /* Board I2C devices. */
- static struct i2c_board_info __initdata pca100_base_i2c_devices[] = {
- {
- /* Must initialize before the camera(s) */
- I2C_BOARD_INFO("pca953x", 0x41),
- .type = "pca9536",
- .platform_data = &pca9536_data,
- }
- };
- static int mxc_csi_pins[] = {
- PB10_PF_CSI_D0,
- PB11_PF_CSI_D1,
- PB12_PF_CSI_D2,
- PB13_PF_CSI_D3,
- PB14_PF_CSI_D4,
- PB15_PF_CSI_MCLK,
- PB16_PF_CSI_PIXCLK,
- PB17_PF_CSI_D5,
- PB18_PF_CSI_D6,
- PB19_PF_CSI_D7,
- PB20_PF_CSI_VSYNC,
- PB21_PF_CSI_HSYNC
- };
- //FIXME
- static int pca100_camera_init(struct platform_device *pdev)
- {
- #if 0
- struct regulator *regulator;
- regulator = regulator_get(&pdev->dev, "imx_cam_vcc");
- if (IS_ERR(regulator))
- dev_err(&pdev->dev, "unable to get regulator: %ld\n",
- PTR_ERR(regulator));
- else
- regulator_enable(regulator);
- #endif
- return mxc_gpio_setup_multiple_pins(mxc_csi_pins,
- ARRAY_SIZE(mxc_csi_pins), "CSI");
- }
- static int pca100_camera_exit(struct platform_device *pdev)
- {
- mxc_gpio_release_multiple_pins(mxc_csi_pins, ARRAY_SIZE(mxc_csi_pins));
- return 0;
- }
- struct mx27_camera_platform_data camera_pdata = {
- .init = pca100_camera_init,
- .exit = pca100_camera_exit,
- .clk = 26600000,
- .flags = MX27_CAMERA_HSYNC_HIGH | MX27_CAMERA_GATED_CLOCK |
- MX27_CAMERA_PACK_DIR_MSB,
- };
- static struct imx_fb_videomode pca100_modes[] = {
- {
- .mode = {
- .name = "Primeview-PD050VL1",
- .refresh = 60,
- .xres = 640,
- .yres = 480,
- .pixclock = 45045, /* in ps (22,2 MHz) */
- .hsync_len = 32,
- .left_margin = 112,
- .right_margin = 36,
- .vsync_len = 2,
- .upper_margin = 33,
- .lower_margin = 33,
- },
- /* phytec */
- .pcr = 0xFAC88080,
- .bpp = 16, //32,
- },
- {
- .mode = {
- .name = "CASIO-COM57H5137XSC",
- .refresh = 60,
- .xres = 640,
- .yres = 480,
- .pixclock = 54000, /* in ps (18,52 MHz) */
- .hsync_len = 30,
- .left_margin = 114,
- .right_margin = 1, //46
- .vsync_len = 3,
- .upper_margin = 33,
- .lower_margin = 1, //33
- },
- /* phytec */
- .pcr = 0xFAE80080,
- .bpp = 16,
- },
- {
- .mode = {
- .name = "EDT-QVGA-C",
- .refresh = 70,
- .xres = 320,
- .yres = 240,
- .pixclock = 133333, /* in ps (18,52 MHz) */
- .hsync_len = 40,
- .left_margin = 29, /* h - front porch*/
- .right_margin = 55, /* h - back porch*/
- .vsync_len = 3,
- .upper_margin = 16, /* v - front porch*/
- .lower_margin = 7, //33 /* h - back porch*/
- },
- /* phytec */
- .pcr = 0xFCE88080,
- .bpp = 16,
- },
- {
- .mode = {
- .name = "EDT-QVGA-A",
- .refresh = 70,
- .xres = 320,
- .yres = 240,
- .pixclock = 133333, /* in ps (18,52 MHz) */
- .hsync_len = 40,
- .left_margin = 29, /* h - front porch*/
- .right_margin = 55, /* h - back porch*/
- .vsync_len = 3,
- .upper_margin = 16, /* v - front porch*/
- .lower_margin = 7, //33 /* h - back porch*/
- },
- /* phytec */
- .pcr = 0xFAE88080,
- .bpp = 16,
- },
- };
- static struct imx_fb_platform_data pca100_fb_data = {
- .mode = pca100_modes,
- .num_modes = ARRAY_SIZE(pca100_modes),
- .pwmr = 0x00A903FF,
- .lscr1 = 0x00120300,
- .dmacr = 0x00020010,
- };
- static int isp1504_set_vbus_power(void __iomem *view, int on)
- {
- int vid, pid, ret = 0;
- vid = (ulpi_read(ISP1504_VID_HIGH, view) << 8) |
- ulpi_read(ISP1504_VID_LOW, view);
- /* the phy returns sometimes erroneous value in the firstread after
- * resetting. The behaviour is not defined clearly in the datasheet.
- * We do a double read here to make sure to work around this */
- if (vid != 0x4cc)
- vid = (ulpi_read(ISP1504_VID_HIGH, view) << 8) |
- ulpi_read(ISP1504_VID_LOW, view);
- pid = (ulpi_read(ISP1504_PID_HIGH, view) << 8) |
- ulpi_read(ISP1504_PID_LOW, view);
- pr_info("ULPI Vendor ID 0x%x Product ID 0x%x\n", vid, pid);
- if (vid != 0x4cc || pid != 0x1504) {
- pr_err("No ISP1504 found\n");
- return -1;
- }
- if (on) {
- ret = ulpi_set(DRV_VBUS_EXT | /* enable external Vbus */
- DRV_VBUS | /* enable internal Vbus */
- USE_EXT_VBUS_IND | /* use external indicator */
- CHRG_VBUS, /* charge Vbus */
- ISP1504_OTGCTL, view);
- } else {
- ret = ulpi_clear(DRV_VBUS_EXT | /* disable external Vbus */
- DRV_VBUS, /* disable internal Vbus */
- ISP1504_OTGCTL, view);
- ret |= ulpi_set(USE_EXT_VBUS_IND | /* use external indicator */
- DISCHRG_VBUS, /* discharge Vbus */
- ISP1504_OTGCTL, view);
- }
- return ret;
- }
- static int pca100_usbh2_init(struct platform_device *pdev)
- {
- int ret;
- uint32_t temp;
- ret = gpio_request(GPIO_PORTB + 24, "usb-host-cs");
- if (ret)
- return ret;
- /* disable phy chip select */
- gpio_direction_output(GPIO_PORTB + 24, 1);
- temp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
- temp &= ~((3 << 21) | 1);
- temp |= (1 << 5) | (1 << 16) | (1 << 19) | (1 << 11) | (1 << 20);
- writel(temp, IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
- temp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x584);
- temp &= ~(3 << 30);
- temp |= 2 << 30;
- writel(temp, IO_ADDRESS(OTG_BASE_ADDR) + 0x584);
- mdelay(10);
- /* enable phy */
- gpio_set_value(GPIO_PORTB + 24, 0);
- udelay(10);
- ret = isp1504_set_vbus_power(IO_ADDRESS(OTG_BASE_ADDR + 0x570), 1);
- if (ret)
- printk(KERN_ERR "pca100: Failed to enable usbh2 phy (%d)\n", ret);
- return ret;
- }
- static struct mxc_usbh_platform_data ehci2_pdata = {
- .init = pca100_usbh2_init,
- };
- static int pca100_otg_phy_cs_req_setval(int cs_value)
- {
- int ret;
- ret = gpio_request(GPIO_PORTB + 23, "usb-otg-cs");
- if (ret)
- return ret;
- gpio_direction_output(GPIO_PORTB + 23, cs_value);
- return 0;
- }
- static int pca100_otg_init(struct platform_device *pdev)
- {
- int ret;
- unsigned int tmp;
- /* request phy /cs line and disable it */
- ret = pca100_otg_phy_cs_req_setval(1);
- if (ret)
- return ret;
- tmp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
- tmp &= ~((3 << 29) | 1);
- tmp |= (1 << 28) | (1 << 27) | (1 << 24);
- writel(tmp, IO_ADDRESS(OTG_BASE_ADDR) + 0x600);
- tmp = readl(IO_ADDRESS(OTG_BASE_ADDR) + 0x184);
- tmp &= ~(3 << 30);
- tmp |= 2 << 30;
- writel(tmp, IO_ADDRESS(OTG_BASE_ADDR) + 0x184);
- mdelay(10);
- /* enable phy */
- gpio_set_value(GPIO_PORTB + 23, 0);
- udelay(10);
- ret = isp1504_set_vbus_power(IO_ADDRESS(OTG_BASE_ADDR + 0x170), 1);
- if (ret)
- printk(KERN_ERR "pca100: Failed to enable otg phy (%d)\n", ret);
- return ret;
- }
- static struct mxc_usbh_platform_data otg_host_pdata = {
- .init = pca100_otg_init,
- };
- static struct fsl_usb2_platform_data otg_device_pdata = {
- .operating_mode = FSL_USB2_DR_DEVICE,
- .phy_mode = FSL_USB2_PHY_ULPI,
- };
- #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
- static struct spi_eeprom at25320 = {
- .name = "at25320an",
- .byte_len = 4096,
- .page_size = 32,
- .flags = EE_ADDR2,
- };
- #if defined(CONFIG_CAN_MCP251X) || defined(CONFIG_CAN_MCP251X_MODULE)
- static struct mcp251x_platform_data mcp251x_info = {
- .oscillator_frequency = 16000000,
- .model = CAN_MCP251X_MCP2510,
- .power_enable = NULL,
- .transceiver_enable = NULL,
- };
- #endif
- static struct spi_board_info pca100_spi_board_info[] __initdata = {
- #if defined(CONFIG_CAN_MCP251X) || defined(CONFIG_CAN_MCP251X_MODULE)
- {
- .modalias = "mcp251x",
- .max_speed_hz = 2*1000*1000,
- .bus_num = 0,
- .chip_select = 0,
- .platform_data = &mcp251x_info,
- .irq = IRQ_GPIOC(29),
- },
- #else
- {
- .modalias = "at25",
- .max_speed_hz = 30000,
- .bus_num = 0,
- .chip_select = 1,
- .platform_data = &at25320,
- },
- #endif
- {
- .modalias = "at25",
- .max_speed_hz = 30000,
- .bus_num = 0,
- .chip_select = 1,
- .platform_data = &at25320,
- },
- };
- static int pca100_spi_cs[] = {GPIO_PORTD + 28, GPIO_PORTD + 27};
- static struct spi_imx_master pca100_spi_0_data = {
- .chipselect = pca100_spi_cs,
- .num_chipselect = ARRAY_SIZE(pca100_spi_cs),
- };
- #endif
- static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
- void *data)
- {
- int ret;
- ret = request_irq(IRQ_GPIOC(29), detect_irq,
- IRQF_DISABLED | IRQF_TRIGGER_FALLING,
- "imx-mmc-detect", data);
- if (ret)
- printk(KERN_ERR
- "pca100: Failed to reuest irq for sd/mmc detection\n");
- return ret;
- }
- static void pca100_sdhc2_exit(struct device *dev, void *data)
- {
- free_irq(IRQ_GPIOC(29), data);
- }
- static struct imxmmc_platform_data sdhc_pdata = {
- .init = pca100_sdhc2_init,
- .exit = pca100_sdhc2_exit,
- };
- static void pca100_ac97_warm_reset(struct snd_ac97 *ac97)
- {
- printk("%s\n", __func__);
- mxc_gpio_mode(GPIO_PORTC | 20 | GPIO_GPIO | GPIO_OUT);
- gpio_set_value(GPIO_PORTC + 20, 1);
- udelay(2);
- gpio_set_value(GPIO_PORTC + 20, 0);
- mxc_gpio_mode(PC20_PF_SSI1_FS);
- msleep(2);
- }
- static void pca100_ac97_cold_reset(struct snd_ac97 *ac97)
- {
- printk("%s\n", __func__);
- mxc_gpio_mode(GPIO_PORTC | 20 | GPIO_GPIO | GPIO_OUT); /* FS */
- gpio_set_value(GPIO_PORTC + 20, 0);
- mxc_gpio_mode(GPIO_PORTC | 22 | GPIO_GPIO | GPIO_OUT); /* TX */
- gpio_set_value(GPIO_PORTC + 22, 0);
- mxc_gpio_mode(GPIO_PORTC | 28 | GPIO_GPIO | GPIO_OUT); /* reset */
- gpio_set_value(GPIO_PORTC + 28, 0);
- udelay(10);
- gpio_set_value(GPIO_PORTC + 28, 1);
- mxc_gpio_mode(PC20_PF_SSI1_FS);
- mxc_gpio_mode(PC22_PF_SSI1_TXD);
- msleep(2);
- }
- static struct imx_ssi_platform_data pca100_ssi_pdata = {
- .ac97_reset = pca100_ac97_cold_reset,
- .ac97_warm_reset = pca100_ac97_warm_reset,
- .flags = IMX_SSI_USE_AC97,
- };
- static int otg_mode_host;
- static int __init pca100_otg_mode(char *options)
- {
- if (!strcmp(options, "host"))
- otg_mode_host = 1;
- else if (!strcmp(options, "device"))
- otg_mode_host = 0;
- else
- pr_info("pca100_otg_mode neither \"host\" nor \"device\". "
- "Defaulting to device\n");
- return 0;
- }
- __setup("pca100_otg_mode=", pca100_otg_mode);
- static void __init pca100_init(void)
- {
- int ret;
- /* SSI unit */
- mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0,
- MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
- MXC_AUDMUX_V1_PCR_TFCSEL(3) |
- MXC_AUDMUX_V1_PCR_TCLKDIR | /* clock is output */
- MXC_AUDMUX_V1_PCR_RXDSEL(3));
- mxc_audmux_v1_configure_port(4,
- MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
- MXC_AUDMUX_V1_PCR_TFCSEL(0) |
- MXC_AUDMUX_V1_PCR_TFSDIR |
- MXC_AUDMUX_V1_PCR_RXDSEL(0));
- ret = mxc_gpio_setup_multiple_pins(pca100_pins,
- ARRAY_SIZE(pca100_pins), "PCA100");
- if (ret)
- printk(KERN_ERR "pca100: Failed to setup pins (%d)\n", ret);
- mxc_register_device(&imx_ssi_device0, &pca100_ssi_pdata);
- mxc_register_device(&mxc_fb_device, &pca100_fb_data);
- mxc_register_device(&mxc_uart_device0, &uart_pdata);
- mxc_gpio_mode(GPIO_PORTC | 29 | GPIO_GPIO | GPIO_IN);
- mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata);
- mxc_register_device(&mxc_nand_device, &pca100_nand_board_info);
- /* only the i2c master 1 is used on this CPU card */
- i2c_register_board_info(0, pca100_i2c_devices,
- ARRAY_SIZE(pca100_i2c_devices));
- mxc_register_device(&mxc_i2c_device1, &pca100_i2c_1_data);
- /* the first i2c master is used for devices on the baseboard */
- i2c_register_board_info(0, pca100_base_i2c_devices,
- ARRAY_SIZE(pca100_base_i2c_devices));
- mxc_register_device(&mxc_i2c_device0, &pca100_i2c_0_data);
- /* cs on usbh2 phy */
- mxc_gpio_mode((GPIO_PORTB | 24) | GPIO_GPIO | GPIO_OUT);
- mxc_register_device(&mxc_ehci2, &ehci2_pdata);
- /* cs on otg phy */
- mxc_gpio_mode((GPIO_PORTB | 23) | GPIO_GPIO | GPIO_OUT);
- if (otg_mode_host)
- mxc_register_device(&mxc_otg, &otg_host_pdata);
- else {
- /* enable phy by pulling down /cs line */
- ret = pca100_otg_phy_cs_req_setval(0);
- if (ret)
- printk(KERN_ERR "pca100: Failed to enable otg phy\n");
- mxc_register_device(&otg_udc_device, &otg_device_pdata);
- }
- mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
- mxc_gpio_mode(GPIO_PORTD | 27 | GPIO_GPIO | GPIO_OUT);
- /* GPIO0_IRQ */
- //mxc_gpio_mode(GPIO_PORTC | 31 | GPIO_GPIO | GPIO_IN);
- /* GPIO1_IRQ */
- mxc_gpio_mode(GPIO_PORTC | 25 | GPIO_GPIO | GPIO_IN);
- /* Backlight */
- //mxc_gpio_mode(GPIO_PORTE | 5 | GPIO_GPIO | GPIO_OUT);
- //gpio_request (GPIO_PORTE + 5, "backlight");
- //gpio_direction_output (GPIO_PORTE + 5, 1);
- #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE)
- spi_register_board_info(pca100_spi_board_info,
- ARRAY_SIZE(pca100_spi_board_info));
- mxc_register_device(&mxc_spi_device0, &pca100_spi_0_data);
- #endif
- platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
- }
- static void __init pca100_timer_init(void)
- {
- mx27_clocks_init(26000000);
- }
- static struct sys_timer pca100_timer = {
- .init = pca100_timer_init,
- };
- MACHINE_START(PCA100, "phyCARD-i.MX27")
- .phys_io = AIPI_BASE_ADDR,
- .io_pg_offst = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
- .boot_params = PHYS_OFFSET + 0x100,
- .map_io = mx27_map_io,
- .init_irq = mxc_init_irq,
- .init_machine = pca100_init,
- .timer = &pca100_timer,
- MACHINE_END
- /*
- * Ok, we have to deal with several situations here. We connect
- * 10bit image sensors to a 8bit interface and we must make sure
- * that the upper 8bit from the sensor are connected to the image
- * interface. Some sensors have a i2c GPIO expander which controls
- * a bus switch to fixup the routing. Mapper boards >= 1285.2 do
- * the fixup without the need of a gpio switch.
- * Set this parameter to '1' to use a camera with gpio switch on a
- * newer mapper board to prevent the fixup being done twice.
- */
- static int use_camera_gpio;
- core_param(use_camera_gpio, use_camera_gpio, int, 0444);
- static int __init pca100_baseboard_init_late(void)
- {
- int ret;
- if (!machine_is_pca100())
- return 0;
- ret = gpio_request(MAX_INTERNAL_GPIO, "camera");
- if (!ret) {
- printk(KERN_INFO "pca100 camera: Found GPIO expander on camera, %s using it\n",
- use_camera_gpio ? "" : "not");
- gpio_direction_output(MAX_INTERNAL_GPIO, !!use_camera_gpio);
- } else
- printk(KERN_INFO "pca100 camera: No GPIO expander on camera found\n");
- /* Be sure this registers after the regulators */
- mxc_register_device(&mx27_camera_device, &camera_pdata);
- /*Switch Backligth on*/
- gpio_set_value (GPIO_PORTE + 5, 0);
- return 0;
- }
- late_initcall(pca100_baseboard_init_late);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement