[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