提交 f230d3f5 编写于 作者: A Andrew Victor 提交者: Russell King

[ARM] 4650/1: AT91: New-style init of I2C, support for i2c-gpio

The AT91 I2C driver is currently marked as "broken" due to hardware
issues.  This patch enables AT91-based platforms to also use the
bitbanged GPIO for I2C.

This updates platform setup logic (setting up an i2c-gpio device
using the same pins as the i2c-at91 device, unless only the BROKEN
driver is enabled).

Also make use of the new-style initialization of I2C devices using
i2c_register_board_info().
Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: NAndrew Victor <andrew@sanpeople.com>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 a95c729b
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-gpio.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
...@@ -435,7 +436,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {} ...@@ -435,7 +436,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {}
* TWI (i2c) * TWI (i2c)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) /*
* Prefer the GPIO code since the TWI controller isn't robust
* (gets overruns and underruns under load) and can only issue
* repeated STARTs in one scenario (the driver doesn't yet handle them).
*/
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
static struct i2c_gpio_platform_data pdata = {
.sda_pin = AT91_PIN_PA25,
.sda_is_open_drain = 1,
.scl_pin = AT91_PIN_PA26,
.scl_is_open_drain = 1,
.udelay = 2, /* ~100 kHz */
};
static struct platform_device at91rm9200_twi_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{
at91_set_GPIO_periph(AT91_PIN_PA25, 1); /* TWD (SDA) */
at91_set_multi_drive(AT91_PIN_PA25, 1);
at91_set_GPIO_periph(AT91_PIN_PA26, 1); /* TWCK (SCL) */
at91_set_multi_drive(AT91_PIN_PA26, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91rm9200_twi_device);
}
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
static struct resource twi_resources[] = { static struct resource twi_resources[] = {
[0] = { [0] = {
...@@ -457,7 +491,7 @@ static struct platform_device at91rm9200_twi_device = { ...@@ -457,7 +491,7 @@ static struct platform_device at91rm9200_twi_device = {
.num_resources = ARRAY_SIZE(twi_resources), .num_resources = ARRAY_SIZE(twi_resources),
}; };
void __init at91_add_device_i2c(void) void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{ {
/* pins used for TWI interface */ /* pins used for TWI interface */
at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */ at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */
...@@ -466,10 +500,11 @@ void __init at91_add_device_i2c(void) ...@@ -466,10 +500,11 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */ at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA26, 1); at91_set_multi_drive(AT91_PIN_PA26, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91rm9200_twi_device); platform_device_register(&at91rm9200_twi_device);
} }
#else #else
void __init at91_add_device_i2c(void) {} void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
#endif #endif
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-gpio.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
...@@ -352,7 +353,41 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {} ...@@ -352,7 +353,41 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {}
* TWI (i2c) * TWI (i2c)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) /*
* Prefer the GPIO code since the TWI controller isn't robust
* (gets overruns and underruns under load) and can only issue
* repeated STARTs in one scenario (the driver doesn't yet handle them).
*/
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
static struct i2c_gpio_platform_data pdata = {
.sda_pin = AT91_PIN_PA23,
.sda_is_open_drain = 1,
.scl_pin = AT91_PIN_PA24,
.scl_is_open_drain = 1,
.udelay = 2, /* ~100 kHz */
};
static struct platform_device at91sam9260_twi_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{
at91_set_GPIO_periph(AT91_PIN_PA23, 1); /* TWD (SDA) */
at91_set_multi_drive(AT91_PIN_PA23, 1);
at91_set_GPIO_periph(AT91_PIN_PA24, 1); /* TWCK (SCL) */
at91_set_multi_drive(AT91_PIN_PA24, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9260_twi_device);
}
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
static struct resource twi_resources[] = { static struct resource twi_resources[] = {
[0] = { [0] = {
...@@ -374,7 +409,7 @@ static struct platform_device at91sam9260_twi_device = { ...@@ -374,7 +409,7 @@ static struct platform_device at91sam9260_twi_device = {
.num_resources = ARRAY_SIZE(twi_resources), .num_resources = ARRAY_SIZE(twi_resources),
}; };
void __init at91_add_device_i2c(void) void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{ {
/* pins used for TWI interface */ /* pins used for TWI interface */
at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */ at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */
...@@ -383,10 +418,11 @@ void __init at91_add_device_i2c(void) ...@@ -383,10 +418,11 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */ at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA24, 1); at91_set_multi_drive(AT91_PIN_PA24, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9260_twi_device); platform_device_register(&at91sam9260_twi_device);
} }
#else #else
void __init at91_add_device_i2c(void) {} void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
#endif #endif
......
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-gpio.h>
#include <linux/fb.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
...@@ -275,7 +277,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {} ...@@ -275,7 +277,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {}
* TWI (i2c) * TWI (i2c)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) /*
* Prefer the GPIO code since the TWI controller isn't robust
* (gets overruns and underruns under load) and can only issue
* repeated STARTs in one scenario (the driver doesn't yet handle them).
*/
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
static struct i2c_gpio_platform_data pdata = {
.sda_pin = AT91_PIN_PA7,
.sda_is_open_drain = 1,
.scl_pin = AT91_PIN_PA8,
.scl_is_open_drain = 1,
.udelay = 2, /* ~100 kHz */
};
static struct platform_device at91sam9261_twi_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{
at91_set_GPIO_periph(AT91_PIN_PA7, 1); /* TWD (SDA) */
at91_set_multi_drive(AT91_PIN_PA7, 1);
at91_set_GPIO_periph(AT91_PIN_PA8, 1); /* TWCK (SCL) */
at91_set_multi_drive(AT91_PIN_PA8, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9261_twi_device);
}
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
static struct resource twi_resources[] = { static struct resource twi_resources[] = {
[0] = { [0] = {
...@@ -297,7 +332,7 @@ static struct platform_device at91sam9261_twi_device = { ...@@ -297,7 +332,7 @@ static struct platform_device at91sam9261_twi_device = {
.num_resources = ARRAY_SIZE(twi_resources), .num_resources = ARRAY_SIZE(twi_resources),
}; };
void __init at91_add_device_i2c(void) void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{ {
/* pins used for TWI interface */ /* pins used for TWI interface */
at91_set_A_periph(AT91_PIN_PA7, 0); /* TWD */ at91_set_A_periph(AT91_PIN_PA7, 0); /* TWD */
...@@ -306,10 +341,11 @@ void __init at91_add_device_i2c(void) ...@@ -306,10 +341,11 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA8, 0); /* TWCK */ at91_set_A_periph(AT91_PIN_PA8, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA8, 1); at91_set_multi_drive(AT91_PIN_PA8, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9261_twi_device); platform_device_register(&at91sam9261_twi_device);
} }
#else #else
void __init at91_add_device_i2c(void) {} void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
#endif #endif
......
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-gpio.h>
#include <linux/fb.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
...@@ -421,7 +423,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {} ...@@ -421,7 +423,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {}
* TWI (i2c) * TWI (i2c)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) /*
* Prefer the GPIO code since the TWI controller isn't robust
* (gets overruns and underruns under load) and can only issue
* repeated STARTs in one scenario (the driver doesn't yet handle them).
*/
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
static struct i2c_gpio_platform_data pdata = {
.sda_pin = AT91_PIN_PB4,
.sda_is_open_drain = 1,
.scl_pin = AT91_PIN_PB5,
.scl_is_open_drain = 1,
.udelay = 2, /* ~100 kHz */
};
static struct platform_device at91sam9263_twi_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{
at91_set_GPIO_periph(AT91_PIN_PB4, 1); /* TWD (SDA) */
at91_set_multi_drive(AT91_PIN_PB4, 1);
at91_set_GPIO_periph(AT91_PIN_PB5, 1); /* TWCK (SCL) */
at91_set_multi_drive(AT91_PIN_PB5, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9263_twi_device);
}
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
static struct resource twi_resources[] = { static struct resource twi_resources[] = {
[0] = { [0] = {
...@@ -443,7 +478,7 @@ static struct platform_device at91sam9263_twi_device = { ...@@ -443,7 +478,7 @@ static struct platform_device at91sam9263_twi_device = {
.num_resources = ARRAY_SIZE(twi_resources), .num_resources = ARRAY_SIZE(twi_resources),
}; };
void __init at91_add_device_i2c(void) void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{ {
/* pins used for TWI interface */ /* pins used for TWI interface */
at91_set_A_periph(AT91_PIN_PB4, 0); /* TWD */ at91_set_A_periph(AT91_PIN_PB4, 0); /* TWD */
...@@ -452,10 +487,11 @@ void __init at91_add_device_i2c(void) ...@@ -452,10 +487,11 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PB5, 0); /* TWCK */ at91_set_A_periph(AT91_PIN_PB5, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PB5, 1); at91_set_multi_drive(AT91_PIN_PB5, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9263_twi_device); platform_device_register(&at91sam9263_twi_device);
} }
#else #else
void __init at91_add_device_i2c(void) {} void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
#endif #endif
......
...@@ -10,8 +10,9 @@ ...@@ -10,8 +10,9 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/fb.h> #include <linux/i2c-gpio.h>
#include <linux/fb.h>
#include <video/atmel_lcdc.h> #include <video/atmel_lcdc.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
...@@ -169,7 +170,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {} ...@@ -169,7 +170,40 @@ void __init at91_add_device_nand(struct at91_nand_data *data) {}
* TWI (i2c) * TWI (i2c)
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) /*
* Prefer the GPIO code since the TWI controller isn't robust
* (gets overruns and underruns under load) and can only issue
* repeated STARTs in one scenario (the driver doesn't yet handle them).
*/
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
static struct i2c_gpio_platform_data pdata = {
.sda_pin = AT91_PIN_PA23,
.sda_is_open_drain = 1,
.scl_pin = AT91_PIN_PA24,
.scl_is_open_drain = 1,
.udelay = 2, /* ~100 kHz */
};
static struct platform_device at91sam9rl_twi_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{
at91_set_GPIO_periph(AT91_PIN_PA23, 1); /* TWD (SDA) */
at91_set_multi_drive(AT91_PIN_PA23, 1);
at91_set_GPIO_periph(AT91_PIN_PA24, 1); /* TWCK (SCL) */
at91_set_multi_drive(AT91_PIN_PA24, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9rl_twi_device);
}
#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
static struct resource twi_resources[] = { static struct resource twi_resources[] = {
[0] = { [0] = {
...@@ -191,7 +225,7 @@ static struct platform_device at91sam9rl_twi_device = { ...@@ -191,7 +225,7 @@ static struct platform_device at91sam9rl_twi_device = {
.num_resources = ARRAY_SIZE(twi_resources), .num_resources = ARRAY_SIZE(twi_resources),
}; };
void __init at91_add_device_i2c(void) void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
{ {
/* pins used for TWI interface */ /* pins used for TWI interface */
at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */ at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */
...@@ -200,10 +234,11 @@ void __init at91_add_device_i2c(void) ...@@ -200,10 +234,11 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */ at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA24, 1); at91_set_multi_drive(AT91_PIN_PA24, 1);
i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9rl_twi_device); platform_device_register(&at91sam9rl_twi_device);
} }
#else #else
void __init at91_add_device_i2c(void) {} void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
#endif #endif
......
...@@ -128,7 +128,7 @@ static void __init carmeva_board_init(void) ...@@ -128,7 +128,7 @@ static void __init carmeva_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&carmeva_udc_data); at91_add_device_udc(&carmeva_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* SPI */ /* SPI */
at91_add_device_spi(carmeva_spi_devices, ARRAY_SIZE(carmeva_spi_devices)); at91_add_device_spi(carmeva_spi_devices, ARRAY_SIZE(carmeva_spi_devices));
/* Compact Flash */ /* Compact Flash */
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
...@@ -85,12 +84,12 @@ static struct at91_udc_data __initdata csb337_udc_data = { ...@@ -85,12 +84,12 @@ static struct at91_udc_data __initdata csb337_udc_data = {
}; };
static struct i2c_board_info __initdata csb337_i2c_devices[] = { static struct i2c_board_info __initdata csb337_i2c_devices[] = {
{ I2C_BOARD_INFO("rtc-ds1307", 0x68), {
.type = "ds1307", I2C_BOARD_INFO("rtc-ds1307", 0x68),
.type = "ds1307",
}, },
}; };
static struct at91_cf_data __initdata csb337_cf_data = { static struct at91_cf_data __initdata csb337_cf_data = {
/* /*
* connector P4 on the CSB 337 mates to * connector P4 on the CSB 337 mates to
...@@ -168,9 +167,7 @@ static void __init csb337_board_init(void) ...@@ -168,9 +167,7 @@ static void __init csb337_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&csb337_udc_data); at91_add_device_udc(&csb337_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(csb337_i2c_devices, ARRAY_SIZE(csb337_i2c_devices));
i2c_register_board_info(0, csb337_i2c_devices,
ARRAY_SIZE(csb337_i2c_devices));
/* Compact Flash */ /* Compact Flash */
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */ at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
at91_add_device_cf(&csb337_cf_data); at91_add_device_cf(&csb337_cf_data);
......
...@@ -129,7 +129,7 @@ static void __init csb637_board_init(void) ...@@ -129,7 +129,7 @@ static void __init csb637_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&csb637_udc_data); at91_add_device_udc(&csb637_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* SPI */ /* SPI */
at91_add_device_spi(NULL, 0); at91_add_device_spi(NULL, 0);
/* NOR flash */ /* NOR flash */
......
...@@ -124,6 +124,19 @@ static struct spi_board_info dk_spi_devices[] = { ...@@ -124,6 +124,19 @@ static struct spi_board_info dk_spi_devices[] = {
#endif #endif
}; };
static struct i2c_board_info __initdata dk_i2c_devices[] = {
{
I2C_BOARD_INFO("ics1523", 0x26),
},
{
I2C_BOARD_INFO("x9429", 0x28),
},
{
I2C_BOARD_INFO("at24c", 0x50),
.type = "24c1024",
}
};
static struct mtd_partition __initdata dk_nand_partition[] = { static struct mtd_partition __initdata dk_nand_partition[] = {
{ {
.name = "NAND Partition 1", .name = "NAND Partition 1",
...@@ -185,7 +198,7 @@ static void __init dk_board_init(void) ...@@ -185,7 +198,7 @@ static void __init dk_board_init(void)
/* Compact Flash */ /* Compact Flash */
at91_add_device_cf(&dk_cf_data); at91_add_device_cf(&dk_cf_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(dk_i2c_devices, ARRAY_SIZE(dk_i2c_devices));
/* SPI */ /* SPI */
at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices)); at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices));
#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
......
...@@ -91,6 +91,14 @@ static struct at91_mmc_data __initdata eb9200_mmc_data = { ...@@ -91,6 +91,14 @@ static struct at91_mmc_data __initdata eb9200_mmc_data = {
.wire4 = 1, .wire4 = 1,
}; };
static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
{
I2C_BOARD_INFO("at24c", 0x50),
.type = "24c512",
},
};
static void __init eb9200_board_init(void) static void __init eb9200_board_init(void)
{ {
/* Serial */ /* Serial */
...@@ -102,7 +110,7 @@ static void __init eb9200_board_init(void) ...@@ -102,7 +110,7 @@ static void __init eb9200_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&eb9200_udc_data); at91_add_device_udc(&eb9200_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(eb9200_i2c_devices, ARRAY_SIZE(eb9200_i2c_devices));
/* Compact Flash */ /* Compact Flash */
at91_add_device_cf(&eb9200_cf_data); at91_add_device_cf(&eb9200_cf_data);
/* SPI */ /* SPI */
......
...@@ -145,7 +145,7 @@ static void __init ek_board_init(void) ...@@ -145,7 +145,7 @@ static void __init ek_board_init(void)
at91_add_device_udc(&ek_udc_data); at91_add_device_udc(&ek_udc_data);
at91_set_multi_drive(ek_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ at91_set_multi_drive(ek_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
/* SPI */ /* SPI */
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
......
...@@ -92,7 +92,7 @@ static void __init kafa_board_init(void) ...@@ -92,7 +92,7 @@ static void __init kafa_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&kafa_udc_data); at91_add_device_udc(&kafa_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* SPI */ /* SPI */
at91_add_device_spi(NULL, 0); at91_add_device_spi(NULL, 0);
} }
......
...@@ -124,7 +124,7 @@ static void __init kb9202_board_init(void) ...@@ -124,7 +124,7 @@ static void __init kb9202_board_init(void)
/* MMC */ /* MMC */
at91_add_device_mmc(0, &kb9202_mmc_data); at91_add_device_mmc(0, &kb9202_mmc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* SPI */ /* SPI */
at91_add_device_spi(NULL, 0); at91_add_device_spi(NULL, 0);
/* NAND */ /* NAND */
......
...@@ -139,7 +139,7 @@ static void __init picotux200_board_init(void) ...@@ -139,7 +139,7 @@ static void __init picotux200_board_init(void)
// at91_add_device_udc(&picotux200_udc_data); // at91_add_device_udc(&picotux200_udc_data);
// at91_set_multi_drive(picotux200_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ // at91_set_multi_drive(picotux200_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* SPI */ /* SPI */
// at91_add_device_spi(picotux200_spi_devices, ARRAY_SIZE(picotux200_spi_devices)); // at91_add_device_spi(picotux200_spi_devices, ARRAY_SIZE(picotux200_spi_devices));
#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
......
...@@ -189,7 +189,7 @@ static void __init ek_board_init(void) ...@@ -189,7 +189,7 @@ static void __init ek_board_init(void)
/* MMC */ /* MMC */
at91_add_device_mmc(0, &ek_mmc_data); at91_add_device_mmc(0, &ek_mmc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
} }
MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK") MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
......
...@@ -406,7 +406,7 @@ static void __init ek_board_init(void) ...@@ -406,7 +406,7 @@ static void __init ek_board_init(void)
/* USB Device */ /* USB Device */
at91_add_device_udc(&ek_udc_data); at91_add_device_udc(&ek_udc_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* NAND */ /* NAND */
at91_add_device_nand(&ek_nand_data); at91_add_device_nand(&ek_nand_data);
/* DM9000 ethernet */ /* DM9000 ethernet */
......
...@@ -291,7 +291,7 @@ static void __init ek_board_init(void) ...@@ -291,7 +291,7 @@ static void __init ek_board_init(void)
/* NAND */ /* NAND */
at91_add_device_nand(&ek_nand_data); at91_add_device_nand(&ek_nand_data);
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* LCD Controller */ /* LCD Controller */
at91_add_device_lcdc(&ek_lcdc_data); at91_add_device_lcdc(&ek_lcdc_data);
/* AC97 */ /* AC97 */
......
...@@ -181,7 +181,7 @@ static void __init ek_board_init(void) ...@@ -181,7 +181,7 @@ static void __init ek_board_init(void)
/* Serial */ /* Serial */
at91_add_device_serial(); at91_add_device_serial();
/* I2C */ /* I2C */
at91_add_device_i2c(); at91_add_device_i2c(NULL, 0);
/* NAND */ /* NAND */
at91_add_device_nand(&ek_nand_data); at91_add_device_nand(&ek_nand_data);
/* SPI */ /* SPI */
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
/* USB Device */ /* USB Device */
...@@ -94,7 +95,7 @@ struct at91_nand_data { ...@@ -94,7 +95,7 @@ struct at91_nand_data {
extern void __init at91_add_device_nand(struct at91_nand_data *data); extern void __init at91_add_device_nand(struct at91_nand_data *data);
/* I2C*/ /* I2C*/
extern void __init at91_add_device_i2c(void); extern void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices);
/* SPI */ /* SPI */
extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices); extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册