2 * I2C driver for parallel port
4 * Author: Phil Blundell <philb@gnu.org>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
11 * This driver implements a simple I2C protocol by bit-twiddling some
12 * signals on the parallel port. Since the outputs on the parallel port
13 * aren't open collector, three lines rather than two are used:
20 #include <linux/parport.h>
21 #include <linux/module.h>
22 #include <linux/delay.h>
23 #include <linux/i2c.h>
24 #include <linux/init.h>
25 #include <asm/spinlock.h>
31 struct parport_i2c_bus
34 struct parport_i2c_bus
*next
;
37 static struct parport_i2c_bus
*bus_list
;
40 static spinlock_t bus_list_lock
= SPIN_LOCK_UNLOCKED
;
43 /* software I2C functions */
45 static void i2c_setlines(struct i2c_bus
*bus
, int clk
, int data
)
47 struct parport
*p
= bus
->data
;
48 parport_write_data(p
, (clk
?1:0) | (data
?2:0));
52 static int i2c_getdataline(struct i2c_bus
*bus
)
54 struct parport
*p
= bus
->data
;
55 return (parport_read_status(p
) & PARPORT_STATUS_BUSY
) ? 0 : 1;
58 static struct i2c_bus parport_i2c_bus_template
=
75 static void i2c_parport_attach(struct parport
*port
)
77 struct parport_i2c_bus
*b
= kmalloc(sizeof(struct parport_i2c_bus
),
79 b
->i2c
= parport_i2c_bus_template
;
81 strncpy(b
->i2c
.name
, port
->name
, 32);
82 spin_lock(&bus_list_lock
);
85 spin_unlock(&bus_list_lock
);
86 i2c_register_bus(&b
->i2c
);
88 printk(KERN_DEBUG
"i2c: attached to %s\n", port
->name
);
91 static void i2c_parport_detach(struct parport
*port
)
93 struct parport_i2c_bus
*b
, *old_b
= NULL
;
94 spin_lock(&bus_list_lock
);
98 if (b
->i2c
.data
== port
)
101 old_b
->next
= b
->next
;
104 i2c_unregister_bus(&b
->i2c
);
111 spin_unlock(&bus_list_lock
);
113 printk(KERN_DEBUG
"i2c: detached from %s\n", port
->name
);
116 static struct parport_driver parport_i2c_driver
=
124 int init_module(void)
126 int __init
i2c_parport_init(void)
129 printk("I2C: driver for parallel port v0.1 philb@gnu.org\n");
130 parport_register_driver(&parport_i2c_driver
);
135 MODULE_PARM(debug
, "i");
137 void cleanup_module(void)
139 struct parport_i2c_bus
*b
= bus_list
;
142 struct parport_i2c_bus
*next
= b
->next
;
143 i2c_unregister_bus(&b
->i2c
);
147 parport_unregister_driver(&parport_i2c_driver
);