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 <linux/spinlock.h> 31 struct parport_i2c_bus
34 struct parport_i2c_bus
*next
; 37 static struct parport_i2c_bus
*bus_list
; 39 static spinlock_t bus_list_lock
= SPIN_LOCK_UNLOCKED
; 41 /* software I2C functions */ 43 static voidi2c_setlines(struct i2c_bus
*bus
,int clk
,int data
) 45 struct parport
*p
= bus
->data
; 46 parport_write_data(p
, (clk
?1:0) | (data
?2:0)); 50 static inti2c_getdataline(struct i2c_bus
*bus
) 52 struct parport
*p
= bus
->data
; 53 return(parport_read_status(p
) & PARPORT_STATUS_BUSY
) ?0:1; 56 static struct i2c_bus parport_i2c_bus_template
= 73 static voidi2c_parport_attach(struct parport
*port
) 75 struct parport_i2c_bus
*b
=kmalloc(sizeof(struct parport_i2c_bus
), 77 b
->i2c
= parport_i2c_bus_template
; 79 strncpy(b
->i2c
.name
, port
->name
,32); 80 spin_lock(&bus_list_lock
); 83 spin_unlock(&bus_list_lock
); 84 i2c_register_bus(&b
->i2c
); 86 printk(KERN_DEBUG
"i2c: attached to %s\n", port
->name
); 89 static voidi2c_parport_detach(struct parport
*port
) 91 struct parport_i2c_bus
*b
, *old_b
= NULL
; 92 spin_lock(&bus_list_lock
); 96 if(b
->i2c
.data
== port
) 99 old_b
->next
= b
->next
; 102 i2c_unregister_bus(&b
->i2c
); 109 spin_unlock(&bus_list_lock
); 111 printk(KERN_DEBUG
"i2c: detached from %s\n", port
->name
); 114 static struct parport_driver parport_i2c_driver
= 124 int __init
i2c_parport_init(void) 127 printk("I2C: driver for parallel port v0.1 philb@gnu.org\n"); 128 parport_register_driver(&parport_i2c_driver
); 133 MODULE_PARM(debug
,"i"); 135 voidcleanup_module(void) 137 struct parport_i2c_bus
*b
= bus_list
; 140 struct parport_i2c_bus
*next
= b
->next
; 141 i2c_unregister_bus(&b
->i2c
); 145 parport_unregister_driver(&parport_i2c_driver
);