[i2c] [patch 2.6.21-rc3-git +i2c] switch at91 to new-style i2c drivers
David Brownell
david-b at pacbell.net
Mon Mar 12 17:49:42 CET 2007
Update AT91 platform support to support "new style" I2C drivers.
- Board-specific init functions take i2c_board_info describing ach
I2C device on that board, and register that after configuring the
adapter and its platform_device.
- Make i2c-at91 register as i2c adapter zero (none of these chips
seem to have more than one TWI controllers) to make it kick in
any board-specific device declarations..
- Update all the board specific init code to use that new signature,
adding chip declarations (often from schematics) for:
* csb337 (ds1307 rtc)
* eb9200 (at24c512 eeprom)
* rm9200-dk (at24c1024 eeprom, ics1523 clock chip, x9429 pot)
* rm9200-ek (ics1523 clock chip, dac3550a audio controller)
The ds1307 rtc driver is updated to "new style" in the next patch;
there's a new-style at24c eeprom driver I'll post sometime too.
So far as I know, the other chips have no Linux-I2C drivers, so
those declarations couldn't break old-style drivers.
Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
---
UPDATED simpler I2C_BOARD_INFO usage
--- at91.orig/drivers/i2c/busses/i2c-at91.c 2007-03-10 09:17:39.000000000 -0800
+++ at91/drivers/i2c/busses/i2c-at91.c 2007-03-10 09:17:40.000000000 -0800
@@ -230,13 +230,14 @@ static int __devinit at91_i2c_probe(stru
adapter->algo = &at91_algorithm;
adapter->class = I2C_CLASS_HWMON;
adapter->dev.parent = &pdev->dev;
+ /* adapter->id == 0 ... only one TWI controller for now */
platform_set_drvdata(pdev, adapter);
clk_enable(twi_clk); /* enable peripheral clock */
at91_twi_hwinit(); /* initialize TWI controller */
- rc = i2c_add_adapter(adapter);
+ rc = i2c_add_numbered_adapter(adapter);
if (rc) {
dev_err(&pdev->dev, "Adapter %s registration failed\n",
adapter->name);
@@ -299,6 +300,9 @@ static int at91_i2c_resume(struct platfo
#define at91_i2c_resume NULL
#endif
+/* work with "modprobe at91_i2c" from hotplugging or coldplugging */
+MODULE_ALIAS("at91_i2c");
+
static struct platform_driver at91_i2c_driver = {
.probe = at91_i2c_probe,
.remove = __devexit_p(at91_i2c_remove),
--- at91.orig/include/asm-arm/arch-at91/board.h 2007-03-10 09:16:29.000000000 -0800
+++ at91/include/asm-arm/arch-at91/board.h 2007-03-10 09:17:40.000000000 -0800
@@ -33,6 +33,7 @@
#include <linux/mtd/partitions.h>
#include <linux/device.h>
+#include <linux/i2c.h>
#include <linux/spi/spi.h>
/* USB Device */
@@ -93,7 +94,7 @@ struct at91_nand_data {
extern void __init at91_add_device_nand(struct at91_nand_data *data);
/* 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 */
extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices);
--- at91.orig/arch/arm/mach-at91/at91rm9200_devices.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/at91rm9200_devices.c 2007-03-10 09:17:40.000000000 -0800
@@ -460,7 +460,7 @@ static struct platform_device at91rm9200
.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 */
at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */
@@ -469,6 +469,7 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA26, 1);
+ i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91rm9200_twi_device);
}
#else
--- at91.orig/arch/arm/mach-at91/at91sam9260_devices.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/at91sam9260_devices.c 2007-03-10 09:17:40.000000000 -0800
@@ -377,7 +377,7 @@ static struct platform_device at91sam926
.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 */
at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */
@@ -386,6 +386,7 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA24, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA24, 1);
+ i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9260_twi_device);
}
#else
--- at91.orig/arch/arm/mach-at91/at91sam9261_devices.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/at91sam9261_devices.c 2007-03-10 09:17:40.000000000 -0800
@@ -298,7 +298,7 @@ static struct platform_device at91sam926
.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 */
at91_set_A_periph(AT91_PIN_PA7, 0); /* TWD */
@@ -307,6 +307,7 @@ void __init at91_add_device_i2c(void)
at91_set_A_periph(AT91_PIN_PA8, 0); /* TWCK */
at91_set_multi_drive(AT91_PIN_PA8, 1);
+ i2c_register_board_info(0, devices, nr_devices);
platform_device_register(&at91sam9261_twi_device);
}
#else
--- at91.orig/arch/arm/mach-at91/board-csb337.c 2007-03-10 09:17:38.000000000 -0800
+++ at91/arch/arm/mach-at91/board-csb337.c 2007-03-11 21:54:46.000000000 -0700
@@ -85,6 +85,13 @@ static struct at91_udc_data __initdata c
.pullup_pin = AT91_PIN_PA24,
};
+static struct i2c_board_info __initdata csb337_i2c_devices[] = {
+ { I2C_BOARD_INFO("rtc-ds1307", 0x68),
+ .type = "ds1307",
+ },
+};
+
+
static struct at91_cf_data __initdata csb337_cf_data = {
/*
* connector P4 on the CSB 337 mates to
@@ -198,7 +205,7 @@ static void __init csb337_board_init(voi
/* USB Device */
at91_add_device_udc(&csb337_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(csb337_i2c_devices, ARRAY_SIZE(csb337_i2c_devices));
/* Compact Flash */
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
at91_add_device_cf(&csb337_cf_data);
--- at91.orig/arch/arm/mach-at91/board-eb9200.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-eb9200.c 2007-03-11 21:55:33.000000000 -0700
@@ -79,6 +79,12 @@ static struct at91_udc_data __initdata e
.pullup_pin = AT91_PIN_PD5,
};
+static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
+ { I2C_BOARD_INFO("at24c", 0x50),
+ .type = "24c512",
+ },
+};
+
static struct at91_cf_data __initdata eb9200_cf_data = {
.det_pin = AT91_PIN_PB0,
.rst_pin = AT91_PIN_PC5,
@@ -102,7 +108,7 @@ static void __init eb9200_board_init(voi
/* USB Device */
at91_add_device_udc(&eb9200_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(eb9200_i2c_devices, ARRAY_SIZE(eb9200_i2c_devices));
/* Compact Flash */
at91_add_device_cf(&eb9200_cf_data);
/* SPI */
--- at91.orig/arch/arm/mach-at91/board-dk.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-dk.c 2007-03-11 21:55:11.000000000 -0700
@@ -99,6 +99,14 @@ static struct at91_mmc_data __initdata d
.wire4 = 1,
};
+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 spi_board_info dk_spi_devices[] = {
{ /* DataFlash chip */
.modalias = "mtd_dataflash",
@@ -185,7 +193,7 @@ static void __init dk_board_init(void)
/* Compact Flash */
at91_add_device_cf(&dk_cf_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(dk_i2c_devices, ARRAY_SIZE(dk_i2c_devices));
/* SPI */
at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices));
#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
--- at91.orig/arch/arm/mach-at91/board-ek.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-ek.c 2007-03-11 21:55:44.000000000 -0700
@@ -94,6 +94,11 @@ static struct at91_mmc_data __initdata e
.wp_pin = AT91_PIN_PA17,
};
+static struct i2c_board_info __initdata ek_i2c_devices[] = {
+ { I2C_BOARD_INFO("ics1523", 0x26), },
+ { I2C_BOARD_INFO("dac3550", 0x4d), }
+};
+
static struct spi_board_info ek_spi_devices[] = {
{ /* DataFlash chip */
.modalias = "mtd_dataflash",
@@ -145,7 +150,7 @@ static void __init ek_board_init(void)
at91_add_device_udc(&ek_udc_data);
at91_set_multi_drive(ek_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
/* SPI */
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
--- at91.orig/arch/arm/mach-at91/board-kb9202.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-kb9202.c 2007-03-10 09:17:40.000000000 -0800
@@ -124,7 +124,8 @@ static void __init kb9202_board_init(voi
/* MMC */
at91_add_device_mmc(0, &kb9202_mmc_data);
/* I2C */
- at91_add_device_i2c();
+ /* (nyet declared: i2c boot eeprom, temp sensor) */
+ at91_add_device_i2c(NULL, 0);
/* SPI */
at91_add_device_spi(NULL, 0);
/* NAND */
--- at91.orig/arch/arm/mach-at91/board-sam9261ek.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-sam9261ek.c 2007-03-10 09:17:40.000000000 -0800
@@ -231,7 +231,7 @@ static void __init ek_board_init(void)
/* USB Device */
at91_add_device_udc(&ek_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(NULL, 0);
/* NAND */
at91_add_device_nand(&ek_nand_data);
/* DM9000 ethernet */
--- at91.orig/arch/arm/mach-at91/board-csb637.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-csb637.c 2007-03-10 09:17:40.000000000 -0800
@@ -129,7 +129,7 @@ static void __init csb637_board_init(voi
/* USB Device */
at91_add_device_udc(&csb637_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(NULL, 0);
/* SPI */
at91_add_device_spi(NULL, 0);
/* NOR flash */
--- at91.orig/arch/arm/mach-at91/board-kafa.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-kafa.c 2007-03-10 09:17:40.000000000 -0800
@@ -92,7 +92,7 @@ static void __init kafa_board_init(void)
/* USB Device */
at91_add_device_udc(&kafa_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(NULL, 0);
/* SPI */
at91_add_device_spi(NULL, 0);
}
--- at91.orig/arch/arm/mach-at91/board-carmeva.c 2007-03-10 09:16:29.000000000 -0800
+++ at91/arch/arm/mach-at91/board-carmeva.c 2007-03-10 09:17:40.000000000 -0800
@@ -128,7 +128,7 @@ static void __init carmeva_board_init(vo
/* USB Device */
at91_add_device_udc(&carmeva_udc_data);
/* I2C */
- at91_add_device_i2c();
+ at91_add_device_i2c(NULL, 0);
/* SPI */
at91_add_device_spi(carmeva_spi_devices, ARRAY_SIZE(carmeva_spi_devices));
/* Compact Flash */
More information about the i2c
mailing list