[ARM] 5585/1: nomadik: add gpio-i2c devices
authorAlessandro Rubini <rubini@gnudd.com>
Thu, 2 Jul 2009 14:29:22 +0000 (15:29 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 2 Jul 2009 20:20:46 +0000 (21:20 +0100)
Signed-off-by: Alessandro Rubini <rubini@unipv.it>
Acked-by: Andrea Gallo <andrea.gallo@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-nomadik/Kconfig
arch/arm/mach-nomadik/Makefile
arch/arm/mach-nomadik/i2c-8815nhk.c [new file with mode: 0644]

index abce234..2a02b49 100644 (file)
@@ -11,4 +11,11 @@ endmenu
 config NOMADIK_8815
        bool
 
+
+config I2C_BITBANG_8815NHK
+       tristate "Driver for bit-bang busses found on the 8815 NHK"
+       depends on I2C && MACH_NOMADIK_8815NHK
+       select I2C_ALGOBIT
+       default y
+
 endif
index 3fc4354..4120409 100644 (file)
@@ -14,3 +14,6 @@ obj-$(CONFIG_NOMADIK_8815) += cpu-8815.o
 
 # Specific board support
 obj-$(CONFIG_MACH_NOMADIK_8815NHK) += board-nhk8815.o
+
+# Nomadik extra devices
+obj-$(CONFIG_I2C_BITBANG_8815NHK) += i2c-8815nhk.o
diff --git a/arch/arm/mach-nomadik/i2c-8815nhk.c b/arch/arm/mach-nomadik/i2c-8815nhk.c
new file mode 100644 (file)
index 0000000..abfe25a
--- /dev/null
@@ -0,0 +1,65 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+#include <linux/i2c-gpio.h>
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+
+/*
+ * There are two busses in the 8815NHK.
+ * They could, in theory, be driven by the hardware component, but we
+ * use bit-bang through GPIO by now, to keep things simple
+ */
+
+static struct i2c_gpio_platform_data nhk8815_i2c_data0 = {
+       /* keep defaults for timeouts; pins are push-pull bidirectional */
+       .scl_pin = 62,
+       .sda_pin = 63,
+};
+
+static struct i2c_gpio_platform_data nhk8815_i2c_data1 = {
+       /* keep defaults for timeouts; pins are push-pull bidirectional */
+       .scl_pin = 53,
+       .sda_pin = 54,
+};
+
+/* first bus: GPIO XX and YY */
+static struct platform_device nhk8815_i2c_dev0 = {
+       .name   = "i2c-gpio",
+       .id     = 0,
+       .dev    = {
+               .platform_data = &nhk8815_i2c_data0,
+       },
+};
+/* second bus: GPIO XX and YY */
+static struct platform_device nhk8815_i2c_dev1 = {
+       .name   = "i2c-gpio",
+       .id     = 1,
+       .dev    = {
+               .platform_data = &nhk8815_i2c_data1,
+       },
+};
+
+static int __init nhk8815_i2c_init(void)
+{
+       nmk_gpio_set_mode(nhk8815_i2c_data0.scl_pin, NMK_GPIO_ALT_GPIO);
+       nmk_gpio_set_mode(nhk8815_i2c_data0.sda_pin, NMK_GPIO_ALT_GPIO);
+       platform_device_register(&nhk8815_i2c_dev0);
+
+       nmk_gpio_set_mode(nhk8815_i2c_data1.scl_pin, NMK_GPIO_ALT_GPIO);
+       nmk_gpio_set_mode(nhk8815_i2c_data1.sda_pin, NMK_GPIO_ALT_GPIO);
+       platform_device_register(&nhk8815_i2c_dev1);
+
+       return 0;
+}
+
+static void __exit nhk8815_i2c_exit(void)
+{
+       platform_device_unregister(&nhk8815_i2c_dev0);
+       platform_device_unregister(&nhk8815_i2c_dev1);
+       return;
+}
+
+module_init(nhk8815_i2c_init);
+module_exit(nhk8815_i2c_exit);