diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-parport.c | 12 |
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; |