|
@@ -30,57 +30,93 @@
|
|
|
|
|
|
#include "devices.h"
|
|
#include "devices.h"
|
|
|
|
|
|
-static int pcm970_sdhc2_get_ro(struct device *dev)
|
|
|
|
-{
|
|
|
|
- return gpio_get_value(GPIO_PORTC + 28);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int pcm970_sdhc2_pins[] = {
|
|
|
|
|
|
+static int pcm970_pins[] = {
|
|
|
|
+ /* SDHC */
|
|
PB4_PF_SD2_D0,
|
|
PB4_PF_SD2_D0,
|
|
PB5_PF_SD2_D1,
|
|
PB5_PF_SD2_D1,
|
|
PB6_PF_SD2_D2,
|
|
PB6_PF_SD2_D2,
|
|
PB7_PF_SD2_D3,
|
|
PB7_PF_SD2_D3,
|
|
PB8_PF_SD2_CMD,
|
|
PB8_PF_SD2_CMD,
|
|
PB9_PF_SD2_CLK,
|
|
PB9_PF_SD2_CLK,
|
|
|
|
+ GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN, /* card detect */
|
|
|
|
+ /* 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,
|
|
|
|
+ PA24_PF_REV,
|
|
|
|
+ PA25_PF_CLS,
|
|
|
|
+ PA26_PF_PS,
|
|
|
|
+ PA27_PF_SPL_SPR,
|
|
|
|
+ PA28_PF_HSYNC,
|
|
|
|
+ PA29_PF_VSYNC,
|
|
|
|
+ PA30_PF_CONTRAST,
|
|
|
|
+ PA31_PF_OE_ACD,
|
|
|
|
+ /*
|
|
|
|
+ * it seems the data line misses a pullup, so we must enable
|
|
|
|
+ * the internal pullup as a local workaround
|
|
|
|
+ */
|
|
|
|
+ PD17_PF_I2C_DATA | GPIO_PUEN,
|
|
|
|
+ PD18_PF_I2C_CLK,
|
|
|
|
+ /* Camera */
|
|
|
|
+ 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,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static int pcm970_sdhc2_get_ro(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ return gpio_get_value(GPIO_PORTC + 28);
|
|
|
|
+}
|
|
|
|
+
|
|
static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void *data)
|
|
static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void *data)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- ret = mxc_gpio_setup_multiple_pins(pcm970_sdhc2_pins,
|
|
|
|
- ARRAY_SIZE(pcm970_sdhc2_pins), "sdhc2");
|
|
|
|
- if(ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- ret = request_irq(IRQ_GPIOC(29), detect_irq, 0,
|
|
|
|
|
|
+ ret = request_irq(IRQ_GPIOC(29), detect_irq, IRQF_TRIGGER_FALLING,
|
|
"imx-mmc-detect", data);
|
|
"imx-mmc-detect", data);
|
|
if (ret)
|
|
if (ret)
|
|
- goto out_release_gpio;
|
|
|
|
-
|
|
|
|
- set_irq_type(IRQ_GPIOC(29), IRQF_TRIGGER_FALLING);
|
|
|
|
|
|
+ return ret;
|
|
|
|
|
|
ret = gpio_request(GPIO_PORTC + 28, "imx-mmc-ro");
|
|
ret = gpio_request(GPIO_PORTC + 28, "imx-mmc-ro");
|
|
- if (ret)
|
|
|
|
- goto out_release_gpio;
|
|
|
|
|
|
+ if (ret) {
|
|
|
|
+ free_irq(IRQ_GPIOC(29), data);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
|
|
- mxc_gpio_mode((GPIO_PORTC | 28) | GPIO_GPIO | GPIO_IN);
|
|
|
|
gpio_direction_input(GPIO_PORTC + 28);
|
|
gpio_direction_input(GPIO_PORTC + 28);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
-
|
|
|
|
-out_release_gpio:
|
|
|
|
- mxc_gpio_release_multiple_pins(pcm970_sdhc2_pins,
|
|
|
|
- ARRAY_SIZE(pcm970_sdhc2_pins));
|
|
|
|
- return ret;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void pcm970_sdhc2_exit(struct device *dev, void *data)
|
|
static void pcm970_sdhc2_exit(struct device *dev, void *data)
|
|
{
|
|
{
|
|
free_irq(IRQ_GPIOC(29), data);
|
|
free_irq(IRQ_GPIOC(29), data);
|
|
gpio_free(GPIO_PORTC + 28);
|
|
gpio_free(GPIO_PORTC + 28);
|
|
- mxc_gpio_release_multiple_pins(pcm970_sdhc2_pins,
|
|
|
|
- ARRAY_SIZE(pcm970_sdhc2_pins));
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static struct imxmmc_platform_data sdhc_pdata = {
|
|
static struct imxmmc_platform_data sdhc_pdata = {
|
|
@@ -89,27 +125,6 @@ static struct imxmmc_platform_data sdhc_pdata = {
|
|
.exit = pcm970_sdhc2_exit,
|
|
.exit = pcm970_sdhc2_exit,
|
|
};
|
|
};
|
|
|
|
|
|
-static int mxc_fb_pins[] = {
|
|
|
|
- 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, PA24_PF_REV,
|
|
|
|
- PA25_PF_CLS, PA26_PF_PS, PA27_PF_SPL_SPR, PA28_PF_HSYNC,
|
|
|
|
- PA29_PF_VSYNC, PA30_PF_CONTRAST, PA31_PF_OE_ACD
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-static int pcm038_fb_init(struct platform_device *pdev)
|
|
|
|
-{
|
|
|
|
- return mxc_gpio_setup_multiple_pins(mxc_fb_pins,
|
|
|
|
- ARRAY_SIZE(mxc_fb_pins), "FB");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void pcm038_fb_exit(struct platform_device *pdev)
|
|
|
|
-{
|
|
|
|
- mxc_gpio_release_multiple_pins(mxc_fb_pins, ARRAY_SIZE(mxc_fb_pins));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Connected is a portrait Sharp-QVGA display
|
|
* Connected is a portrait Sharp-QVGA display
|
|
* of type: LQ035Q7DH06
|
|
* of type: LQ035Q7DH06
|
|
@@ -142,9 +157,6 @@ static struct imx_fb_platform_data pcm038_fb_data = {
|
|
.pwmr = 0x00A903FF,
|
|
.pwmr = 0x00A903FF,
|
|
.lscr1 = 0x00120300,
|
|
.lscr1 = 0x00120300,
|
|
.dmacr = 0x00020010,
|
|
.dmacr = 0x00020010,
|
|
-
|
|
|
|
- .init = pcm038_fb_init,
|
|
|
|
- .exit = pcm038_fb_exit,
|
|
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -155,6 +167,9 @@ static struct imx_fb_platform_data pcm038_fb_data = {
|
|
*/
|
|
*/
|
|
void __init pcm970_baseboard_init(void)
|
|
void __init pcm970_baseboard_init(void)
|
|
{
|
|
{
|
|
|
|
+ mxc_gpio_setup_multiple_pins(pcm970_pins, ARRAY_SIZE(pcm970_pins),
|
|
|
|
+ "PCM970");
|
|
|
|
+
|
|
mxc_register_device(&mxc_fb_device, &pcm038_fb_data);
|
|
mxc_register_device(&mxc_fb_device, &pcm038_fb_data);
|
|
mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata);
|
|
mxc_register_device(&mxc_sdhc_device1, &sdhc_pdata);
|
|
}
|
|
}
|