[alsa-devel] [RFC 0/2] get rid of remaining users of attach_adapter
The attach_adapter mechanism of the I2C framework is deprecated for years. There are two users left, drivers for old Macintosh computers. I recently got the idea of replacing this mechanism with a custom one with the help of deferred probing. Because I don't have the hardware, I worked on a seperate branch where I modified the windtunnel driver to be runnable on my Renesas Lager board (ARM). I first verified that the attach_adapter method was used, then the driver rightfully failed on detecting the i2c clients. Using my custom mechanism, the same happens: all busses get scanned, then the clients cannot be detected. Since I didn't change the actual detection code, I assume that it should be working on those Macintosh devices as well. The keywest driver is only compile-tested. That being said, I'd be more than happy, if we could find someone willing to test these patches. If they could be applied, we can _finally_ get rid of this legacy mechanism and clean up the i2c core.
The branch I used for ARM compilation is here:
git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/attach_adapter_removal_with_arm_compile-experimental
Thanks,
Wolfram
Wolfram Sang (2): macintosh: therm_windtunnel: drop using attach adapter sound: ppc: keywest: drop using attach adapter
drivers/macintosh/therm_windtunnel.c | 25 +++++++++++++++++++++++-- sound/ppc/keywest.c | 21 ++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-)
As we now have deferred probing, we can use a custom mechanism and finally get rid of the legacy interface from the i2c core.
Signed-off-by: Wolfram Sang wsa@the-dreams.de --- drivers/macintosh/therm_windtunnel.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c index 3b4a157714b1..9de83cdd0bca 100644 --- a/drivers/macintosh/therm_windtunnel.c +++ b/drivers/macintosh/therm_windtunnel.c @@ -431,7 +431,6 @@ static struct i2c_driver g4fan_driver = { .driver = { .name = "therm_windtunnel", }, - .attach_adapter = do_attach, .probe = do_probe, .remove = do_remove, .id_table = therm_windtunnel_id, @@ -444,7 +443,29 @@ static struct i2c_driver g4fan_driver = {
static int therm_of_probe(struct platform_device *dev) { - return i2c_add_driver( &g4fan_driver ); + struct i2c_adapter *adap; + int ret, i = 0; + + adap = i2c_get_adapter(0); + if (!adap) + return -EPROBE_DEFER; + + ret = i2c_add_driver(&g4fan_driver); + if (ret) { + i2c_put_adapter(adap); + return ret; + } + + /* We assume Macs have consecutive I2C bus numbers starting at 0 */ + while (adap) { + do_attach(adap); + if (x.running) + break; + i2c_put_adapter(adap); + adap = i2c_get_adapter(++i); + } + + return 0; }
static int
As we now have deferred probing, we can use a custom mechanism and finally get rid of the legacy interface from the i2c core.
Signed-off-by: Wolfram Sang wsa@the-dreams.de --- sound/ppc/keywest.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 0d1c27e911b8..a957f32368fa 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -52,7 +52,7 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) return -EINVAL;
if (strncmp(adapter->name, "mac-io", 6)) - return 0; /* ignored */ + return -EINVAL; /* ignored */
memset(&info, 0, sizeof(struct i2c_board_info)); strlcpy(info.type, "keywest", I2C_NAME_SIZE); @@ -100,7 +100,6 @@ static struct i2c_driver keywest_driver = { .driver = { .name = "PMac Keywest Audio", }, - .attach_adapter = keywest_attach_adapter, .probe = keywest_probe, .remove = keywest_remove, .id_table = keywest_i2c_id, @@ -132,16 +131,32 @@ int snd_pmac_tumbler_post_init(void) /* exported */ int snd_pmac_keywest_init(struct pmac_keywest *i2c) { - int err; + struct i2c_adapter *adap; + int err, i = 0;
if (keywest_ctx) return -EBUSY;
+ adap = i2c_get_adapter(0); + if (!adap) + return -EPROBE_DEFER; + keywest_ctx = i2c;
if ((err = i2c_add_driver(&keywest_driver))) { snd_printk(KERN_ERR "cannot register keywest i2c driver\n"); + i2c_put_adapter(adap); return err; } + + /* We assume Macs have consecutive I2C bus numbers starting at 0 */ + while (adap) { + err = keywest_attach_adapter(adap); + if (!err) + break; + i2c_put_adapter(adap); + adap = i2c_get_adapter(++i); + } + return 0; }
At Thu, 4 Dec 2014 17:41:53 +0100, Wolfram Sang wrote:
As we now have deferred probing, we can use a custom mechanism and finally get rid of the legacy interface from the i2c core.
Signed-off-by: Wolfram Sang wsa@the-dreams.de
sound/ppc/keywest.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 0d1c27e911b8..a957f32368fa 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -52,7 +52,7 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) return -EINVAL;
if (strncmp(adapter->name, "mac-io", 6))
return 0; /* ignored */
return -EINVAL; /* ignored */
memset(&info, 0, sizeof(struct i2c_board_info)); strlcpy(info.type, "keywest", I2C_NAME_SIZE);
@@ -100,7 +100,6 @@ static struct i2c_driver keywest_driver = { .driver = { .name = "PMac Keywest Audio", },
- .attach_adapter = keywest_attach_adapter, .probe = keywest_probe, .remove = keywest_remove, .id_table = keywest_i2c_id,
@@ -132,16 +131,32 @@ int snd_pmac_tumbler_post_init(void) /* exported */ int snd_pmac_keywest_init(struct pmac_keywest *i2c) {
- int err;
struct i2c_adapter *adap;
int err, i = 0;
if (keywest_ctx) return -EBUSY;
adap = i2c_get_adapter(0);
if (!adap)
return -EPROBE_DEFER;
keywest_ctx = i2c;
if ((err = i2c_add_driver(&keywest_driver))) { snd_printk(KERN_ERR "cannot register keywest i2c driver\n");
i2c_put_adapter(adap);
return err; }
/* We assume Macs have consecutive I2C bus numbers starting at 0 */
while (adap) {
err = keywest_attach_adapter(adap);
if (!err)
break;
i2c_put_adapter(adap);
adap = i2c_get_adapter(++i);
}
return 0;
What if adap is NULL in the last while loop? Isn't it supposed to return an error?
thanks,
Takashi
- /* We assume Macs have consecutive I2C bus numbers starting at 0 */
- while (adap) {
err = keywest_attach_adapter(adap);
if (!err)
break;
i2c_put_adapter(adap);
adap = i2c_get_adapter(++i);
- }
- return 0;
What if adap is NULL in the last while loop? Isn't it supposed to return an error?
True, we probably should have something like
return adap ? 0 : -ENODEV;
Thanks!
participants (2)
-
Takashi Iwai
-
Wolfram Sang