Commit 9acacb13 authored by Nicolas Ferre's avatar Nicolas Ferre

Merge remote-tracking branch 'armsoc/at91/device-board' into at91-3.4-base2

parents 018b5e16 92b0b639
...@@ -891,7 +891,8 @@ static struct platform_device at91sam9263_isi_device = { ...@@ -891,7 +891,8 @@ static struct platform_device at91sam9263_isi_device = {
.num_resources = ARRAY_SIZE(isi_resources), .num_resources = ARRAY_SIZE(isi_resources),
}; };
void __init at91_add_device_isi(void) void __init at91_add_device_isi(struct isi_platform_data *data,
bool use_pck_as_mck)
{ {
at91_set_A_periph(AT91_PIN_PE0, 0); /* ISI_D0 */ at91_set_A_periph(AT91_PIN_PE0, 0); /* ISI_D0 */
at91_set_A_periph(AT91_PIN_PE1, 0); /* ISI_D1 */ at91_set_A_periph(AT91_PIN_PE1, 0); /* ISI_D1 */
...@@ -904,14 +905,20 @@ void __init at91_add_device_isi(void) ...@@ -904,14 +905,20 @@ void __init at91_add_device_isi(void)
at91_set_A_periph(AT91_PIN_PE8, 0); /* ISI_PCK */ at91_set_A_periph(AT91_PIN_PE8, 0); /* ISI_PCK */
at91_set_A_periph(AT91_PIN_PE9, 0); /* ISI_HSYNC */ at91_set_A_periph(AT91_PIN_PE9, 0); /* ISI_HSYNC */
at91_set_A_periph(AT91_PIN_PE10, 0); /* ISI_VSYNC */ at91_set_A_periph(AT91_PIN_PE10, 0); /* ISI_VSYNC */
at91_set_B_periph(AT91_PIN_PE11, 0); /* ISI_MCK (PCK3) */
at91_set_B_periph(AT91_PIN_PE12, 0); /* ISI_PD8 */ at91_set_B_periph(AT91_PIN_PE12, 0); /* ISI_PD8 */
at91_set_B_periph(AT91_PIN_PE13, 0); /* ISI_PD9 */ at91_set_B_periph(AT91_PIN_PE13, 0); /* ISI_PD9 */
at91_set_B_periph(AT91_PIN_PE14, 0); /* ISI_PD10 */ at91_set_B_periph(AT91_PIN_PE14, 0); /* ISI_PD10 */
at91_set_B_periph(AT91_PIN_PE15, 0); /* ISI_PD11 */ at91_set_B_periph(AT91_PIN_PE15, 0); /* ISI_PD11 */
if (use_pck_as_mck) {
at91_set_B_periph(AT91_PIN_PE11, 0); /* ISI_MCK (PCK3) */
/* TODO: register the PCK for ISI_MCK and set its parent */
}
} }
#else #else
void __init at91_add_device_isi(void) {} void __init at91_add_device_isi(struct isi_platform_data *data,
bool use_pck_as_mck) {}
#endif #endif
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-gpio.h> #include <linux/i2c-gpio.h>
#include <linux/atmel-mci.h> #include <linux/atmel-mci.h>
...@@ -28,7 +29,10 @@ ...@@ -28,7 +29,10 @@
#include <mach/at_hdmac.h> #include <mach/at_hdmac.h>
#include <mach/atmel-mci.h> #include <mach/atmel-mci.h>
#include <media/atmel-isi.h>
#include "generic.h" #include "generic.h"
#include "clock.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
...@@ -38,10 +42,6 @@ ...@@ -38,10 +42,6 @@
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE) #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
static u64 hdmac_dmamask = DMA_BIT_MASK(32); static u64 hdmac_dmamask = DMA_BIT_MASK(32);
static struct at_dma_platform_data atdma_pdata = {
.nr_channels = 8,
};
static struct resource hdmac_resources[] = { static struct resource hdmac_resources[] = {
[0] = { [0] = {
.start = AT91SAM9G45_BASE_DMA, .start = AT91SAM9G45_BASE_DMA,
...@@ -56,12 +56,11 @@ static struct resource hdmac_resources[] = { ...@@ -56,12 +56,11 @@ static struct resource hdmac_resources[] = {
}; };
static struct platform_device at_hdmac_device = { static struct platform_device at_hdmac_device = {
.name = "at_hdmac", .name = "at91sam9g45_dma",
.id = -1, .id = -1,
.dev = { .dev = {
.dma_mask = &hdmac_dmamask, .dma_mask = &hdmac_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &atdma_pdata,
}, },
.resource = hdmac_resources, .resource = hdmac_resources,
.num_resources = ARRAY_SIZE(hdmac_resources), .num_resources = ARRAY_SIZE(hdmac_resources),
...@@ -69,9 +68,15 @@ static struct platform_device at_hdmac_device = { ...@@ -69,9 +68,15 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void) void __init at91_add_device_hdmac(void)
{ {
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask); #if defined(CONFIG_OF)
dma_cap_set(DMA_SLAVE, atdma_pdata.cap_mask); struct device_node *of_node =
platform_device_register(&at_hdmac_device); of_find_node_by_name(NULL, "dma-controller");
if (of_node)
of_node_put(of_node);
else
#endif
platform_device_register(&at_hdmac_device);
} }
#else #else
void __init at91_add_device_hdmac(void) {} void __init at91_add_device_hdmac(void) {}
...@@ -869,6 +874,96 @@ void __init at91_add_device_ac97(struct ac97c_platform_data *data) ...@@ -869,6 +874,96 @@ void __init at91_add_device_ac97(struct ac97c_platform_data *data)
void __init at91_add_device_ac97(struct ac97c_platform_data *data) {} void __init at91_add_device_ac97(struct ac97c_platform_data *data) {}
#endif #endif
/* --------------------------------------------------------------------
* Image Sensor Interface
* -------------------------------------------------------------------- */
#if defined(CONFIG_VIDEO_ATMEL_ISI) || defined(CONFIG_VIDEO_ATMEL_ISI_MODULE)
static u64 isi_dmamask = DMA_BIT_MASK(32);
static struct isi_platform_data isi_data;
struct resource isi_resources[] = {
[0] = {
.start = AT91SAM9G45_BASE_ISI,
.end = AT91SAM9G45_BASE_ISI + SZ_16K - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = AT91SAM9G45_ID_ISI,
.end = AT91SAM9G45_ID_ISI,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device at91sam9g45_isi_device = {
.name = "atmel_isi",
.id = 0,
.dev = {
.dma_mask = &isi_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &isi_data,
},
.resource = isi_resources,
.num_resources = ARRAY_SIZE(isi_resources),
};
static struct clk_lookup isi_mck_lookups[] = {
CLKDEV_CON_DEV_ID("isi_mck", "atmel_isi.0", NULL),
};
void __init at91_add_device_isi(struct isi_platform_data *data,
bool use_pck_as_mck)
{
struct clk *pck;
struct clk *parent;
if (!data)
return;
isi_data = *data;
at91_set_A_periph(AT91_PIN_PB20, 0); /* ISI_D0 */
at91_set_A_periph(AT91_PIN_PB21, 0); /* ISI_D1 */
at91_set_A_periph(AT91_PIN_PB22, 0); /* ISI_D2 */
at91_set_A_periph(AT91_PIN_PB23, 0); /* ISI_D3 */
at91_set_A_periph(AT91_PIN_PB24, 0); /* ISI_D4 */
at91_set_A_periph(AT91_PIN_PB25, 0); /* ISI_D5 */
at91_set_A_periph(AT91_PIN_PB26, 0); /* ISI_D6 */
at91_set_A_periph(AT91_PIN_PB27, 0); /* ISI_D7 */
at91_set_A_periph(AT91_PIN_PB28, 0); /* ISI_PCK */
at91_set_A_periph(AT91_PIN_PB30, 0); /* ISI_HSYNC */
at91_set_A_periph(AT91_PIN_PB29, 0); /* ISI_VSYNC */
at91_set_B_periph(AT91_PIN_PB8, 0); /* ISI_PD8 */
at91_set_B_periph(AT91_PIN_PB9, 0); /* ISI_PD9 */
at91_set_B_periph(AT91_PIN_PB10, 0); /* ISI_PD10 */
at91_set_B_periph(AT91_PIN_PB11, 0); /* ISI_PD11 */
platform_device_register(&at91sam9g45_isi_device);
if (use_pck_as_mck) {
at91_set_B_periph(AT91_PIN_PB31, 0); /* ISI_MCK (PCK1) */
pck = clk_get(NULL, "pck1");
parent = clk_get(NULL, "plla");
BUG_ON(IS_ERR(pck) || IS_ERR(parent));
if (clk_set_parent(pck, parent)) {
pr_err("Failed to set PCK's parent\n");
} else {
/* Register PCK as ISI_MCK */
isi_mck_lookups[0].clk = pck;
clkdev_add_table(isi_mck_lookups,
ARRAY_SIZE(isi_mck_lookups));
}
clk_put(pck);
clk_put(parent);
}
}
#else
void __init at91_add_device_isi(struct isi_platform_data *data,
bool use_pck_as_mck) {}
#endif
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* LCD Controller * LCD Controller
......
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE) #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE)
static u64 hdmac_dmamask = DMA_BIT_MASK(32); static u64 hdmac_dmamask = DMA_BIT_MASK(32);
static struct at_dma_platform_data atdma_pdata = {
.nr_channels = 2,
};
static struct resource hdmac_resources[] = { static struct resource hdmac_resources[] = {
[0] = { [0] = {
.start = AT91SAM9RL_BASE_DMA, .start = AT91SAM9RL_BASE_DMA,
...@@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = { ...@@ -51,12 +47,11 @@ static struct resource hdmac_resources[] = {
}; };
static struct platform_device at_hdmac_device = { static struct platform_device at_hdmac_device = {
.name = "at_hdmac", .name = "at91sam9rl_dma",
.id = -1, .id = -1,
.dev = { .dev = {
.dma_mask = &hdmac_dmamask, .dma_mask = &hdmac_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &atdma_pdata,
}, },
.resource = hdmac_resources, .resource = hdmac_resources,
.num_resources = ARRAY_SIZE(hdmac_resources), .num_resources = ARRAY_SIZE(hdmac_resources),
...@@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = { ...@@ -64,7 +59,6 @@ static struct platform_device at_hdmac_device = {
void __init at91_add_device_hdmac(void) void __init at91_add_device_hdmac(void)
{ {
dma_cap_set(DMA_MEMCPY, atdma_pdata.cap_mask);
platform_device_register(&at_hdmac_device); platform_device_register(&at_hdmac_device);
} }
#else #else
......
/* /*
* linux/arch/arm/mach-at91/board-flexibity.c * linux/arch/arm/mach-at91/board-flexibity.c
* *
* Copyright (C) 2010 Flexibity * Copyright (C) 2010-2011 Flexibity
* Copyright (C) 2005 SAN People * Copyright (C) 2005 SAN People
* Copyright (C) 2006 Atmel * Copyright (C) 2006 Atmel
* *
...@@ -62,6 +62,13 @@ static struct at91_udc_data __initdata flexibity_udc_data = { ...@@ -62,6 +62,13 @@ static struct at91_udc_data __initdata flexibity_udc_data = {
.pullup_pin = -EINVAL, /* pull-up driven by UDC */ .pullup_pin = -EINVAL, /* pull-up driven by UDC */
}; };
/* I2C devices */
static struct i2c_board_info __initdata flexibity_i2c_devices[] = {
{
I2C_BOARD_INFO("ds1307", 0x68),
},
};
/* SPI devices */ /* SPI devices */
static struct spi_board_info flexibity_spi_devices[] = { static struct spi_board_info flexibity_spi_devices[] = {
{ /* DataFlash chip */ { /* DataFlash chip */
...@@ -141,6 +148,9 @@ static void __init flexibity_board_init(void) ...@@ -141,6 +148,9 @@ static void __init flexibity_board_init(void)
at91_add_device_usbh(&flexibity_usbh_data); at91_add_device_usbh(&flexibity_usbh_data);
/* USB Device */ /* USB Device */
at91_add_device_udc(&flexibity_udc_data); at91_add_device_udc(&flexibity_udc_data);
/* I2C */
at91_add_device_i2c(flexibity_i2c_devices,
ARRAY_SIZE(flexibity_i2c_devices));
/* SPI */ /* SPI */
at91_add_device_spi(flexibity_spi_devices, at91_add_device_spi(flexibity_spi_devices,
ARRAY_SIZE(flexibity_spi_devices)); ARRAY_SIZE(flexibity_spi_devices));
......
...@@ -24,11 +24,13 @@ ...@@ -24,11 +24,13 @@
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/clk.h>
#include <linux/atmel-mci.h> #include <linux/atmel-mci.h>
#include <linux/delay.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <media/soc_camera.h>
#include <media/atmel-isi.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -184,6 +186,71 @@ static void __init ek_add_device_nand(void) ...@@ -184,6 +186,71 @@ static void __init ek_add_device_nand(void)
} }
/*
* ISI
*/
static struct isi_platform_data __initdata isi_data = {
.frate = ISI_CFG1_FRATE_CAPTURE_ALL,
/* to use codec and preview path simultaneously */
.full_mode = 1,
.data_width_flags = ISI_DATAWIDTH_8 | ISI_DATAWIDTH_10,
/* ISI_MCK is provided by programmable clock or external clock */
.mck_hz = 25000000,
};
/*
* soc-camera OV2640
*/
#if defined(CONFIG_SOC_CAMERA_OV2640) || \
defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
static unsigned long isi_camera_query_bus_param(struct soc_camera_link *link)
{
/* ISI board for ek using default 8-bits connection */
return SOCAM_DATAWIDTH_8;
}
static int i2c_camera_power(struct device *dev, int on)
{
/* enable or disable the camera */
pr_debug("%s: %s the camera\n", __func__, on ? "ENABLE" : "DISABLE");
at91_set_gpio_output(AT91_PIN_PD13, !on);
if (!on)
goto out;
/* If enabled, give a reset impulse */
at91_set_gpio_output(AT91_PIN_PD12, 0);
msleep(20);
at91_set_gpio_output(AT91_PIN_PD12, 1);
msleep(100);
out:
return 0;
}
static struct i2c_board_info i2c_camera = {
I2C_BOARD_INFO("ov2640", 0x30),
};
static struct soc_camera_link iclink_ov2640 = {
.bus_id = 0,
.board_info = &i2c_camera,
.i2c_adapter_id = 0,
.power = i2c_camera_power,
.query_bus_param = isi_camera_query_bus_param,
};
static struct platform_device isi_ov2640 = {
.name = "soc-camera-pdrv",
.id = 0,
.dev = {
.platform_data = &iclink_ov2640,
},
};
#endif
/* /*
* LCD Controller * LCD Controller
*/ */
...@@ -377,7 +444,12 @@ static struct gpio_led ek_pwm_led[] = { ...@@ -377,7 +444,12 @@ static struct gpio_led ek_pwm_led[] = {
#endif #endif
}; };
static struct platform_device *devices[] __initdata = {
#if defined(CONFIG_SOC_CAMERA_OV2640) || \
defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
&isi_ov2640,
#endif
};
static void __init ek_board_init(void) static void __init ek_board_init(void)
{ {
...@@ -399,6 +471,8 @@ static void __init ek_board_init(void) ...@@ -399,6 +471,8 @@ static void __init ek_board_init(void)
ek_add_device_nand(); ek_add_device_nand();
/* I2C */ /* I2C */
at91_add_device_i2c(0, NULL, 0); at91_add_device_i2c(0, NULL, 0);
/* ISI, using programmable clock as ISI_MCK */
at91_add_device_isi(&isi_data, true);
/* LCD Controller */ /* LCD Controller */
at91_add_device_lcdc(&ek_lcdc_data); at91_add_device_lcdc(&ek_lcdc_data);
/* Touch Screen */ /* Touch Screen */
...@@ -410,6 +484,8 @@ static void __init ek_board_init(void) ...@@ -410,6 +484,8 @@ static void __init ek_board_init(void)
/* LEDs */ /* LEDs */
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led)); at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
/* Other platform devices */
platform_add_devices(devices, ARRAY_SIZE(devices));
} }
MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK") MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
......
...@@ -107,6 +107,8 @@ struct atmel_nand_data { ...@@ -107,6 +107,8 @@ struct atmel_nand_data {
u8 ale; /* address line number connected to ALE */ u8 ale; /* address line number connected to ALE */
u8 cle; /* address line number connected to CLE */ u8 cle; /* address line number connected to CLE */
u8 bus_width_16; /* buswidth is 16 bit */ u8 bus_width_16; /* buswidth is 16 bit */
u8 correction_cap; /* PMECC correction capability */
u16 sector_size; /* Sector size for PMECC */
struct mtd_partition *parts; struct mtd_partition *parts;
unsigned int num_parts; unsigned int num_parts;
}; };
...@@ -179,7 +181,9 @@ extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data); ...@@ -179,7 +181,9 @@ extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data);
extern void __init at91_add_device_ac97(struct ac97c_platform_data *data); extern void __init at91_add_device_ac97(struct ac97c_platform_data *data);
/* ISI */ /* ISI */
extern void __init at91_add_device_isi(void); struct isi_platform_data;
extern void __init at91_add_device_isi(struct isi_platform_data *data,
bool use_pck_as_mck);
/* Touchscreen Controller */ /* Touchscreen Controller */
struct at91_tsadcc_data { struct at91_tsadcc_data {
......
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