summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-at91/at91sam9x5_devices.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2012-11-01 16:07:21 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-11-15 20:20:29 +0100
commit28caf418499dc137f5c946ce23b7a1ba7630151d (patch)
tree3a37bb1f0e0e0f3e678c4f266168f3dec710b893 /arch/arm/mach-at91/at91sam9x5_devices.c
parent6c7aebadf2dbdbe8a410a2d8f04986cfa8d8845c (diff)
downloadbarebox-28caf418499dc137f5c946ce23b7a1ba7630151d.tar.gz
barebox-28caf418499dc137f5c946ce23b7a1ba7630151d.tar.xz
at91sam9x5: add i2c support
use i2c-gpio until we add the hw drivers Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-at91/at91sam9x5_devices.c')
-rw-r--r--arch/arm/mach-at91/at91sam9x5_devices.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/at91sam9x5_devices.c b/arch/arm/mach-at91/at91sam9x5_devices.c
index 26a380d2ce..5a24325ca1 100644
--- a/arch/arm/mach-at91/at91sam9x5_devices.c
+++ b/arch/arm/mach-at91/at91sam9x5_devices.c
@@ -19,6 +19,7 @@
#include <mach/gpio.h>
#include <mach/io.h>
#include <mach/cpu.h>
+#include <i2c/i2c-gpio.h>
#include "generic.h"
@@ -169,6 +170,63 @@ void __init at91_add_device_nand(struct atmel_nand_data *data)
void __init at91_add_device_nand(struct atmel_nand_data *data) {}
#endif
+#if defined(CONFIG_I2C_GPIO)
+static struct i2c_gpio_platform_data pdata_i2c0 = {
+ .sda_pin = AT91_PIN_PA30,
+ .sda_is_open_drain = 1,
+ .scl_pin = AT91_PIN_PA31,
+ .scl_is_open_drain = 1,
+ .udelay = 5, /* ~100 kHz */
+};
+
+static struct i2c_gpio_platform_data pdata_i2c1 = {
+ .sda_pin = AT91_PIN_PC0,
+ .sda_is_open_drain = 1,
+ .scl_pin = AT91_PIN_PC1,
+ .scl_is_open_drain = 1,
+ .udelay = 5, /* ~100 kHz */
+};
+
+static struct i2c_gpio_platform_data pdata_i2c2 = {
+ .sda_pin = AT91_PIN_PB4,
+ .sda_is_open_drain = 1,
+ .scl_pin = AT91_PIN_PB5,
+ .scl_is_open_drain = 1,
+ .udelay = 5, /* ~100 kHz */
+};
+
+void at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices)
+{
+ struct i2c_gpio_platform_data *pdata;
+
+ i2c_register_board_info(i2c_id, devices, nr_devices);
+
+ switch (i2c_id) {
+ case 0:
+ pdata = &pdata_i2c0;
+ break;
+ case 1:
+ pdata = &pdata_i2c1;
+ break;
+ case 2:
+ pdata = &pdata_i2c2;
+ break;
+ default:
+ return;
+ }
+
+ at91_set_GPIO_periph(pdata->sda_pin, 1); /* TWD (SDA) */
+ at91_set_multi_drive(pdata->sda_pin, 1);
+
+ at91_set_GPIO_periph(pdata->scl_pin, 1); /* TWCK (SCL) */
+ at91_set_multi_drive(pdata->scl_pin, 1);
+
+ add_generic_device_res("i2c-gpio", i2c_id, NULL, 0, pdata);
+}
+#else
+void at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices) {}
+#endif
+
/* --------------------------------------------------------------------
* UART
* -------------------------------------------------------------------- */