aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-parport.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2007-05-01 17:26:30 -0400
committerJean Delvare <khali@hyperion.delvare>2007-05-01 17:26:30 -0400
commit3af07bd297b6ba3d77474fdb3b2656dd3f0404d5 (patch)
tree33536cb27d8dd6299b731d52cf0b51ebecd3ce4a /drivers/i2c/busses/i2c-parport.c
parent4b4686e7a6fe8347938beef518e9b309127945f1 (diff)
i2c-parport: Fix a minor race on driver unload
When unloading the driver, we really want to unregister the i2c adapter before we power it off, rather than the other way around. Also speed up the bus a bit when we can sense SCL. The slaves will stretch the line as needed. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c/busses/i2c-parport.c')
-rw-r--r--drivers/i2c/busses/i2c-parport.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c
index b9f1c5c7b572..8c953707253f 100644
--- a/drivers/i2c/busses/i2c-parport.c
+++ b/drivers/i2c/busses/i2c-parport.c
@@ -1,7 +1,7 @@
1/* ------------------------------------------------------------------------ * 1/* ------------------------------------------------------------------------ *
2 * i2c-parport.c I2C bus over parallel port * 2 * i2c-parport.c I2C bus over parallel port *
3 * ------------------------------------------------------------------------ * 3 * ------------------------------------------------------------------------ *
4 Copyright (C) 2003-2004 Jean Delvare <khali@linux-fr.org> 4 Copyright (C) 2003-2007 Jean Delvare <khali@linux-fr.org>
5 5
6 Based on older i2c-philips-par.c driver 6 Based on older i2c-philips-par.c driver
7 Copyright (C) 1995-2000 Simon G. Vogl 7 Copyright (C) 1995-2000 Simon G. Vogl
@@ -137,7 +137,7 @@ static struct i2c_algo_bit_data parport_algo_data = {
137 .setscl = parport_setscl, 137 .setscl = parport_setscl,
138 .getsda = parport_getsda, 138 .getsda = parport_getsda,
139 .getscl = parport_getscl, 139 .getscl = parport_getscl,
140 .udelay = 60, 140 .udelay = 10, /* ~50 kbps */
141 .timeout = HZ, 141 .timeout = HZ,
142}; 142};
143 143
@@ -168,8 +168,11 @@ static void i2c_parport_attach (struct parport *port)
168 strlcpy(adapter->adapter.name, "Parallel port adapter", 168 strlcpy(adapter->adapter.name, "Parallel port adapter",
169 sizeof(adapter->adapter.name)); 169 sizeof(adapter->adapter.name));
170 adapter->algo_data = parport_algo_data; 170 adapter->algo_data = parport_algo_data;
171 if (!adapter_parm[type].getscl.val) 171 /* Slow down if we can't sense SCL */
172 if (!adapter_parm[type].getscl.val) {
172 adapter->algo_data.getscl = NULL; 173 adapter->algo_data.getscl = NULL;
174 adapter->algo_data.udelay = 50; /* ~10 kbps */
175 }
173 adapter->algo_data.data = port; 176 adapter->algo_data.data = port;
174 adapter->adapter.algo_data = &adapter->algo_data; 177 adapter->adapter.algo_data = &adapter->algo_data;
175 178
@@ -211,11 +214,12 @@ static void i2c_parport_detach (struct parport *port)
211 for (prev = NULL, adapter = adapter_list; adapter; 214 for (prev = NULL, adapter = adapter_list; adapter;
212 prev = adapter, adapter = adapter->next) { 215 prev = adapter, adapter = adapter->next) {
213 if (adapter->pdev->port == port) { 216 if (adapter->pdev->port == port) {
217 i2c_del_adapter(&adapter->adapter);
218
214 /* Un-init if needed (power off...) */ 219 /* Un-init if needed (power off...) */
215 if (adapter_parm[type].init.val) 220 if (adapter_parm[type].init.val)
216 line_set(port, 0, &adapter_parm[type].init); 221 line_set(port, 0, &adapter_parm[type].init);
217 222
218 i2c_del_adapter(&adapter->adapter);
219 parport_unregister_device(adapter->pdev); 223 parport_unregister_device(adapter->pdev);
220 if (prev) 224 if (prev)
221 prev->next = adapter->next; 225 prev->next = adapter->next;