1 diff -urN linux-2.6.19/drivers/i2c/busses/Kconfig linux-2.6.19.new/drivers/i2c/busses/Kconfig
2 --- linux-2.6.19/drivers/i2c/busses/Kconfig 2006-11-29 22:57:37.000000000 +0100
3 +++ linux-2.6.19.new/drivers/i2c/busses/Kconfig 2006-12-28 17:04:34.000000000 +0100
5 This driver can also be built as a module. If so, the module
6 will be called i2c-au1550.
9 + tristate "Au1x00 i2c using GPIO pins"
10 + depends on I2C && MTX1
12 + If you say yest to this option, support will be included for the
13 + Au1x00 GPIO interface.
15 + This driver can also be built as a module. If so, the module
16 + will be called i2c-au1x00gpio.
19 tristate "Elektor ISA card"
20 depends on I2C && ISA && BROKEN_ON_SMP
21 diff -urN linux-2.6.19/drivers/i2c/busses/Makefile linux-2.6.19.new/drivers/i2c/busses/Makefile
22 --- linux-2.6.19/drivers/i2c/busses/Makefile 2006-11-29 22:57:37.000000000 +0100
23 +++ linux-2.6.19.new/drivers/i2c/busses/Makefile 2006-12-28 03:07:37.000000000 +0100
25 obj-$(CONFIG_I2C_AMD756_S4882) += i2c-amd756-s4882.o
26 obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o
27 obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
28 +obj-$(CONFIG_I2C_AU1X00GPIO) += i2c-au1x00gpio.o
29 obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o
30 obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o
31 obj-$(CONFIG_I2C_I801) += i2c-i801.o
32 diff -urN linux-2.6.19/drivers/i2c/busses/i2c-au1x00gpio.c linux-2.6.19.new/drivers/i2c/busses/i2c-au1x00gpio.c
33 --- linux-2.6.19/drivers/i2c/busses/i2c-au1x00gpio.c 1970-01-01 01:00:00.000000000 +0100
34 +++ linux-2.6.19.new/drivers/i2c/busses/i2c-au1x00gpio.c 2006-12-28 17:02:10.000000000 +0100
36 +/* ------------------------------------------------------------------------- */
37 +/* i2c-au1x00gpio.c i2c-hw access for Au1x00 GPIO pins. */
38 +/* ------------------------------------------------------------------------- */
39 +/* Copyright (C) 1995-2000 Michael Stickel
41 + This program is free software; you can redistribute it and/or modify
42 + it under the terms of the GNU General Public License as published by
43 + the Free Software Foundation; either version 2 of the License, or
44 + (at your option) any later version.
46 + This program is distributed in the hope that it will be useful,
47 + but WITHOUT ANY WARRANTY; without even the implied warranty of
48 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
49 + GNU General Public License for more details.
51 + You should have received a copy of the GNU General Public License
52 + along with this program; if not, write to the Free Software
53 + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
54 +/* ------------------------------------------------------------------------- */
56 +/* With some changes from Ky�stialkki <kmalkki@cc.hut.fi> and even
57 + Frodo Looijaard <frodol@dds.nl>
61 +/* $Id: i2c-au1x00gpio.c,v 1.1.1.2 2004/01/22 15:35:47 br1 Exp $ */
63 +#include <linux/module.h>
64 +#include <linux/types.h>
65 +#include <linux/kernel.h>
66 +#include <linux/init.h>
67 +#include <linux/stddef.h>
68 +#include <linux/ioport.h>
69 +#include <asm/uaccess.h>
71 +#include <asm-mips/mach-au1x00/au1000.h>
72 +#include <asm-mips/mach-au1x00/au1000_gpio.h>
74 +#include <linux/slab.h>
75 +#include <linux/mm.h>
77 +#include <linux/i2c.h>
78 +#include <linux/i2c-algo-bit.h>
81 +#define __exit __init
85 +struct i2c_au1x00gpio
87 + struct i2c_au1x00gpio *next;
92 + unsigned long scl_mask;
93 + unsigned long sda_mask;
95 + struct i2c_adapter adapter;
96 + struct i2c_algo_bit_data bit_au1x00gpio_data;
99 +static struct i2c_au1x00gpio *adapter_list;
103 +/* ----- global defines ----------------------------------------------- */
104 +#define DEB(x) /* should be reasonable open, close &c. */
105 +#define DEB2(x) /* low level debugging - very slow */
106 +#define DEBE(x) x /* error messages */
108 +/* ----- printer port defines ------------------------------------------*/
110 +/* ----- local functions ---------------------------------------------- */
114 +static void bit_au1x00gpio_setscl(void *data, int state)
116 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
118 + au_writel(adapter->scl_mask, SYS_TRIOUTCLR); // Disable Driver: Switch off Transistor => 1
120 + au_writel(adapter->scl_mask, SYS_OUTPUTCLR); // Clear Output and switch on Transistor => 0
124 +static void bit_au1x00gpio_setsda(void *data, int state)
126 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
128 + au_writel(adapter->sda_mask, SYS_TRIOUTCLR);
130 + au_writel(adapter->sda_mask, SYS_OUTPUTCLR);
134 +static int bit_au1x00gpio_getscl(void *data)
136 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
137 + return (au_readl(SYS_PINSTATERD) & adapter->scl_mask) ? 1 : 0;
141 +static int bit_au1x00gpio_getsda(void *data)
143 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
144 + return (au_readl(SYS_PINSTATERD) & adapter->sda_mask) ? 1 : 0;
151 + *-- Functions for accessing GPIO-2
154 +static void bit_au1x00gpio2_setscl(void *data, int state)
156 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
159 + au_writel(au_readl(GPIO2_DIR) & ~adapter->scl_mask, GPIO2_DIR);
163 + au_writel(au_readl(GPIO2_OUTPUT) & ~adapter->scl_mask, GPIO2_OUTPUT);
164 + au_writel(au_readl(GPIO2_DIR) | adapter->scl_mask, GPIO2_DIR);
168 +static void bit_au1x00gpio2_setsda(void *data, int state)
170 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
173 + au_writel(au_readl(GPIO2_DIR) & ~adapter->sda_mask, GPIO2_DIR);
177 + au_writel(au_readl(GPIO2_OUTPUT) & ~adapter->sda_mask, GPIO2_OUTPUT);
178 + au_writel(au_readl(GPIO2_DIR) | adapter->sda_mask, GPIO2_DIR);
182 +static int bit_au1x00gpio2_getscl(void *data)
184 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
185 + return (au_readl(GPIO2_PINSTATE) & adapter->scl_mask) ? 1 : 0;
188 +static int bit_au1x00gpio2_getsda(void *data)
190 + struct i2c_au1x00gpio * adapter = (struct i2c_au1x00gpio *)data;
191 + return (au_readl(GPIO2_PINSTATE) & adapter->sda_mask) ? 1 : 0;
196 +static int check_i2c_au1x00gpio_adapter(struct i2c_au1x00gpio *adapter)
200 + adapter->bit_au1x00gpio_data.setsda (adapter, 1);
201 + adapter->bit_au1x00gpio_data.setscl (adapter, 1);
203 + if (adapter->bit_au1x00gpio_data.getsda(adapter)==0)
205 + printk ("i2c-au1x00gpio: sda line should read 1 but reads 0\n");
208 + if (adapter->bit_au1x00gpio_data.getscl(adapter)==0)
210 + printk ("i2c-au1x00gpio: scl line should read 1 but reads 0\n");
215 + adapter->bit_au1x00gpio_data.setsda (adapter, 0);
216 + adapter->bit_au1x00gpio_data.setscl (adapter, 0);
218 + if (adapter->bit_au1x00gpio_data.getsda(adapter)==1)
220 + printk ("i2c-au1x00gpio: sda line should read 0 but reads 1\n");
223 + if (adapter->bit_au1x00gpio_data.getscl(adapter)==1)
225 + printk ("i2c-au1x00gpio: scl line should read 0 but reads 1\n");
230 + printk ("i2c-au1x00gpio: adapter with scl=GPIO%d,sda=GPIO%d is working\n",
231 + adapter->scl_gpio, adapter->sda_gpio
239 +static int bit_au1x00gpio_reg(struct i2c_client *client)
244 +static int bit_au1x00gpio_unreg(struct i2c_client *client)
249 +static void bit_au1x00gpio_inc_use(struct i2c_adapter *adap)
254 +static void bit_au1x00gpio_dec_use(struct i2c_adapter *adap)
262 +static struct i2c_algo_bit_data bit_au1x00gpio_data = {
264 + .setsda = bit_au1x00gpio_setsda,
265 + .setscl = bit_au1x00gpio_setscl,
266 + .getsda = bit_au1x00gpio_getsda,
267 + .getscl = bit_au1x00gpio_getscl,
273 +static struct i2c_adapter bit_au1x00gpio_ops = {
274 + .owner = THIS_MODULE,
275 + .name = "Au1x00 GPIO I2C adapter",
276 + .id = I2C_HW_B_AU1x00GPIO,
283 + * 0..31 for primary GPIO's
284 + * 200..215 for secondary GPIO's
287 + * 0..31 for primary GPIO's
288 + * 200..215 for secondary GPIO's
290 + * You can even mix primary and secondary GPIO's.
291 + * E.g.: i2c_au1x00gpio_create(4,206);
294 +static int i2c_au1x00gpio_create (int scl_gpio, int sda_gpio)
296 + if ((scl_gpio < 32 || (scl_gpio >= 200 && scl_gpio <= 215)) &&
297 + (scl_gpio < 32 || (scl_gpio >= 200 && scl_gpio <= 215)))
299 + struct i2c_au1x00gpio *adapter = kmalloc(sizeof(struct i2c_au1x00gpio),
302 + printk(KERN_ERR "i2c-au1x00-gpio: Unable to malloc.\n");
306 + printk(KERN_DEBUG "i2c-au1x00-gpio.o: attaching to SCL=GPIO%d, SDA=GPIO%d\n",
307 + scl_gpio, sda_gpio);
309 + memset (adapter, 0, sizeof(struct i2c_au1x00gpio));
311 + adapter->adapter = bit_au1x00gpio_ops;
313 + adapter->adapter.algo_data = &adapter->bit_au1x00gpio_data;
314 + adapter->bit_au1x00gpio_data = bit_au1x00gpio_data;
315 + adapter->bit_au1x00gpio_data.data = adapter;
317 + adapter->bit_au1x00gpio_data.data = adapter;
319 + adapter->scl_gpio = scl_gpio;
320 + adapter->sda_gpio = sda_gpio;
324 + adapter->bit_au1x00gpio_data.setsda = bit_au1x00gpio_setsda;
325 + adapter->bit_au1x00gpio_data.getsda = bit_au1x00gpio_getsda;
326 + adapter->sda_mask = 1<<sda_gpio;
328 + else if (sda_gpio >= 200 && sda_gpio <= 215)
330 + adapter->bit_au1x00gpio_data.setsda = bit_au1x00gpio2_setsda;
331 + adapter->bit_au1x00gpio_data.getsda = bit_au1x00gpio2_getsda;
332 + adapter->sda_mask = 1<<(sda_gpio-200);
338 + adapter->bit_au1x00gpio_data.setscl = bit_au1x00gpio_setscl;
339 + adapter->bit_au1x00gpio_data.getscl = bit_au1x00gpio_getscl;
340 + adapter->scl_mask = 1<<scl_gpio;
342 + else if (scl_gpio >= 200 && scl_gpio <= 215)
344 + adapter->bit_au1x00gpio_data.setscl = bit_au1x00gpio2_setscl;
345 + adapter->bit_au1x00gpio_data.getscl = bit_au1x00gpio2_getscl;
346 + adapter->scl_mask = 1<<(scl_gpio-200);
349 + au_writel(0L, SYS_PININPUTEN);
350 + if (check_i2c_au1x00gpio_adapter(adapter)==0)
352 + adapter->bit_au1x00gpio_data.setsda (adapter, 1);
353 + adapter->bit_au1x00gpio_data.setscl (adapter, 1);
355 + if (i2c_bit_add_bus(&adapter->adapter) < 0)
357 + printk(KERN_ERR "i2c-au1x00-gpio: Unable to register with I2C.\n");
359 + return -1; /* No good */
362 + adapter->next = adapter_list;
363 + adapter_list = adapter;
368 + printk(KERN_ERR "i2c-au1x00-gpio: Invalid argument scl_gpio=%d, sda_gpio=%d.\n", scl_gpio, sda_gpio);
374 +static void i2c_au1x00gpio_delete (int scl_gpio, int sda_gpio)
376 + struct i2c_au1x00gpio *adapter, *prev = NULL;
378 + for (adapter = adapter_list; adapter; adapter = adapter->next)
380 + if (adapter->scl_gpio == scl_gpio &&
381 + adapter->sda_gpio == sda_gpio)
383 + i2c_bit_del_bus(&adapter->adapter);
385 + prev->next = adapter->next;
387 + adapter_list = adapter->next;
399 +#ifndef CONFIG_I2C_AU1X00GPIO_SCL
400 +#define CONFIG_I2C_AU1X00GPIO_SCL (216)
403 +#ifndef CONFIG_I2C_AU1X00GPIO_SDA
404 +#define CONFIG_I2C_AU1X00GPIO_SDA (217)
407 +static int au1x00gpiopin_scl = CONFIG_I2C_AU1X00GPIO_SCL;
408 +static int au1x00gpiopin_sda = CONFIG_I2C_AU1X00GPIO_SDA;
412 +int __init i2c_bit_au1x00gpio_init(void)
414 + printk(KERN_INFO "i2c-au1x00gpio.o: i2c Au1x00 GPIO adapter module version\n");
416 + if (i2c_au1x00gpio_create (au1x00gpiopin_scl, au1x00gpiopin_sda) == 0)
418 + printk(KERN_INFO "i2c-au1x00gpio.o: registered I2C-Bus for GPIO%d,GPIO%d\n",
419 + au1x00gpiopin_scl, au1x00gpiopin_sda
423 + printk(KERN_INFO "i2c-au1x00gpio.o: failed to register I2C-Bus for GPIO%d,GPIO%d\n",
424 + au1x00gpiopin_scl, au1x00gpiopin_sda
430 +void __exit i2c_bit_au1x00gpio_exit(void)
432 + i2c_au1x00gpio_delete (au1x00gpiopin_scl, au1x00gpiopin_sda);
435 +module_param(au1x00gpiopin_scl, int, 0644);
436 +MODULE_PARM_DESC(au1x00gpiopin_scl, "GPIO pin number used for SCL pin.");
438 +module_param(au1x00gpiopin_sda, int, 0644);
439 +MODULE_PARM_DESC(au1x00gpiopin_sda, "GPIO pin number used for SDA pin.");
441 +MODULE_AUTHOR("Michael Stickel <michael@cubic.org>");
442 +MODULE_DESCRIPTION("I2C-Bus adapter routines for Au1x00 GPIO adapter.");
443 +MODULE_LICENSE("GPL");
447 +int init_module(void)
449 + return i2c_bit_au1x00gpio_init();
452 +void cleanup_module(void)
454 + i2c_bit_au1x00gpio_exit();