diff options
Diffstat (limited to 'of-i2c-fix-module-aliases.patch')
-rw-r--r-- | of-i2c-fix-module-aliases.patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/of-i2c-fix-module-aliases.patch b/of-i2c-fix-module-aliases.patch new file mode 100644 index 000000000..3c737f6e8 --- /dev/null +++ b/of-i2c-fix-module-aliases.patch @@ -0,0 +1,69 @@ +From af503716ac1444db61d80cb6d17cfe62929c21df Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas <javierm@redhat.com> +Date: Sun, 3 Dec 2017 22:40:50 +0100 +Subject: i2c: core: report OF style module alias for devices registered via OF + +The buses should honor the firmware interface used to register the device, +but the I2C core reports a MODALIAS of the form i2c:<device> even for I2C +devices registered via OF. + +This means that user-space will never get an OF stype uevent MODALIAS even +when the drivers modules contain aliases exported from both the I2C and OF +device ID tables. For example, an Atmel maXTouch Touchscreen registered by +a DT node with compatible "atmel,maxtouch" has the following module alias: + +$ cat /sys/class/i2c-adapter/i2c-8/8-004b/modalias +i2c:maxtouch + +So udev won't be able to auto-load a module for an OF-only device driver. +Many OF-only drivers duplicate the OF device ID table entries in an I2C ID +table only has a workaround for how the I2C core reports the module alias. + +This patch changes the I2C core to report an OF related MODALIAS uevent if +the device was registered via OF. So for the previous example, after this +patch, the reported MODALIAS for the Atmel maXTouch will be the following: + +$ cat /sys/class/i2c-adapter/i2c-8/8-004b/modalias +of:NtrackpadT<NULL>Catmel,maxtouch + +NOTE: This patch may break out-of-tree drivers that were relying on this + behavior, and only had an I2C device ID table even when the device + was registered via OF. There are no remaining drivers in mainline + that do this, but out-of-tree drivers have to be fixed and define + a proper OF device ID table to have module auto-loading working. + +Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> +Tested-by: Dmitry Mastykin <mastichi@gmail.com> +Signed-off-by: Wolfram Sang <wsa@the-dreams.de> +--- + drivers/i2c/i2c-core-base.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c +index 5a00bf4..edfc23e4 100644 +--- a/drivers/i2c/i2c-core-base.c ++++ b/drivers/i2c/i2c-core-base.c +@@ -124,6 +124,10 @@ static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env) + struct i2c_client *client = to_i2c_client(dev); + int rc; + ++ rc = of_device_uevent_modalias(dev, env); ++ if (rc != -ENODEV) ++ return rc; ++ + rc = acpi_device_uevent_modalias(dev, env); + if (rc != -ENODEV) + return rc; +@@ -439,6 +443,10 @@ show_modalias(struct device *dev, struct device_attribute *attr, char *buf) + struct i2c_client *client = to_i2c_client(dev); + int len; + ++ len = of_device_modalias(dev, buf, PAGE_SIZE); ++ if (len != -ENODEV) ++ return len; ++ + len = acpi_device_modalias(dev, buf, PAGE_SIZE -1); + if (len != -ENODEV) + return len; +-- +cgit v1.1 |