[alsa-devel] [PATCH 0/2] i2c: rework last users of 2.4 style 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 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 modified the windtunnel driver to be runnable on my Renesas Lager board (ARM). This patch is not in this series but in the branch mentioned below.
I first verified that the attach_adapter method was in deed used for bus scanning. When scanning, the driver rightfully failed on detecting the actual i2c clients because there is no such hardware on my board. However, the actual scanning happened.
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. Top-of-tree kernel would be nice, but these patches can easily be backported to probably the beginning of deferred probing. I will also notify some ppc lists of distributions of this thread for further help.
If this works out, we can _finally_ get rid of this stone-age mechanism and clean up the i2c core.
Changes since RFC: return -ENODEV instead of 0 when exiting the while loop (= nothing found on all busses)
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 | 23 +++++++++++++++++++---- 2 files changed, 42 insertions(+), 6 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 835ca8be4c1632..57909a3ce67bf2 100644 --- a/drivers/macintosh/therm_windtunnel.c +++ b/drivers/macintosh/therm_windtunnel.c @@ -422,7 +422,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, @@ -435,7 +434,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) + return 0; + i2c_put_adapter(adap); + adap = i2c_get_adapter(++i); + } + + return -ENODEV; }
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 | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index 0d1c27e911b8dd..d7627bae08362e 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; } - return 0; + + /* We assume Macs have consecutive I2C bus numbers starting at 0 */ + while (adap) { + err = keywest_attach_adapter(adap); + if (!err) + return 0; + i2c_put_adapter(adap); + adap = i2c_get_adapter(++i); + } + + return -ENODEV; }
participants (1)
-
Wolfram Sang