Bug 208547 - ELAN1205 touchpad is not working on ASUS G15
Summary: ELAN1205 touchpad is not working on ASUS G15
Status: NEW
Alias: None
Product: Drivers
Classification: Unclassified
Component: I2C (show other bugs)
Hardware: x86-64 Linux
: P1 normal
Assignee: drivers_input-devices
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-07-14 14:08 UTC by Alexei
Modified: 2021-01-05 09:30 UTC (History)
5 users (show)

See Also:
Kernel Version: 5.8.0-rc6
Subsystem:
Regression: No
Bisected commit-id:


Attachments
dmesg (108.48 KB, text/plain)
2020-07-14 14:08 UTC, Alexei
Details
dmidecode (10.22 KB, text/plain)
2020-07-14 14:08 UTC, Alexei
Details
input devices (6.50 KB, text/plain)
2020-07-14 14:09 UTC, Alexei
Details
5.8.0-rc6-1-mainline dmesg (90.60 KB, text/plain)
2020-07-21 05:15 UTC, Alexei
Details

Description Alexei 2020-07-14 14:08:16 UTC
Created attachment 290265 [details]
dmesg

Hello, I have a new Laptop since kernel 5.7.2-arch1-1. Now I'm using 5.8.0-rc5-mainline and the touchpad is still not working.
Laptop manufacturer: Asus
Model: ROG-Zephyrus-G15 GA502IV

BIOS fastboot is disabled.
No hardware issue with the touchpad. It works in Windows (have dual-boot)

It looks like kernel recognizes the touchpad but doesn't enable it.

# dmesg | grep -i elan
[ 4.830134] i2c_hid i2c-ELAN1205:00: supply vdd not found, using dummy regulator
[ 4.830150] i2c_hid i2c-ELAN1205:00: supply vddl not found, using dummy regulator 

No input device is added in /proc/bus/input/devices => no xinput device is present.
Comment 1 Alexei 2020-07-14 14:08:59 UTC
Created attachment 290267 [details]
dmidecode
Comment 2 Alexei 2020-07-14 14:09:18 UTC
Created attachment 290269 [details]
input devices
Comment 3 Alexei 2020-07-19 12:31:38 UTC
For some reason, I can't make "modprobe i2c_hid debug=1" debug messages to show. But adding 'i2c-hid.dyndbg=+p' kernel option added new message:

[    4.838769] i2c_hid i2c-ELAN1205:00: supply vdd not found, using dummy regulator
[    4.838783] i2c_hid i2c-ELAN1205:00: supply vddl not found, using dummy regulator
*[    4.838887] i2c_hid i2c-ELAN1205:00: nothing at this address: -121*

And want to add observation about udevadm monitor output while removing+adding i2c_hid module: 

KERNEL[398.302991] remove   /bus/i2c/drivers/i2c_hid (drivers)
KERNEL[398.303037] remove   /module/i2c_hid (module)
UDEV  [398.304991] remove   /bus/i2c/drivers/i2c_hid (drivers)
UDEV  [398.305579] remove   /module/i2c_hid (module)
KERNEL[398.369281] add      /module/i2c_hid (module)
KERNEL[398.369473] add      /devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00/wakeup/wakeup50 (wakeup)
UDEV  [398.370121] add      /module/i2c_hid (module)
UDEV  [398.370769] add      /devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00/wakeup/wakeup50 (wakeup)
KERNEL[398.370954] remove   /devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00/wakeup/wakeup50 (wakeup)
KERNEL[398.371066] add      /bus/i2c/drivers/i2c_hid (drivers)
UDEV  [398.371942] remove   /devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00/wakeup/wakeup50 (wakeup)
UDEV  [398.372218] add      /bus/i2c/drivers/i2c_hid (drivers)
Comment 4 Alexei 2020-07-21 05:15:04 UTC
Created attachment 290385 [details]
5.8.0-rc6-1-mainline dmesg

Upgraded to the 5.8.0-rc6-1-mainline. Still the same massage in dmesg.
Comment 5 Casey 2020-07-30 09:51:27 UTC
Same problem, upgrade to kernel 5.7.11, still not working.
Comment 6 Alexei 2020-08-31 08:08:38 UTC
Having the same error on the latest 5.9rc3 kernel.

How can I debug it? I did read some kernel documentation on i2c but it didn't came a long way for me. 

# hwinfo shows this data for ELAN:
  P: /devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00
  L: 0
  E: DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/AMDI0010:03/ELAN1205:00
  E: SUBSYSTEM=acpi
  E: MODALIAS=acpi:ELAN1205:PNP0C50:
  E: USEC_INITIALIZED=5509997
  E: ID_VENDOR_FROM_DATABASE=ELAD srl

But i2c_hid module still reports 
[    5.611799] i2c_hid i2c-ELAN1205:00: nothing at this address: -121

So, I did try i2c-tools
# i2cdetect -l
i2c-3	i2c       	AMDGPU DM aux hw bus 0          	I2C adapter
i2c-1	i2c       	AMDGPU DM i2c hw bus 0          	I2C adapter
i2c-8	i2c       	NVIDIA i2c adapter 1 at 1:00.0  	I2C adapter
i2c-6	smbus     	SMBus PIIX4 adapter port 2 at 0b00	SMBus adapter
i2c-4	i2c       	NVIDIA GPU I2C adapter          	I2C adapter
i2c-2	i2c       	AMDGPU DM i2c hw bus 1          	I2C adapter
i2c-0	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-9	i2c       	NVIDIA i2c adapter 7 at 1:00.0  	I2C adapter
i2c-7	smbus     	SMBus PIIX4 adapter port 1 at 0b20	SMBus adapter
i2c-5	smbus     	SMBus PIIX4 adapter port 0 at 0b00	SMBus adapter


# i2cdetect -r -a 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0 using receive byte commands.
I will probe address range 0x00-0x7f.
Continue? [Y/n] 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

but i2cdump reports some strange data
# i2cdump -a 0 0x00
No size specified (using byte-data access)
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0, address 0x0, mode byte
Continue? [Y/n] 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
10: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
20: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
30: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
40: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
50: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
60: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
70: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
80: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
90: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
a0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
b0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
c0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
d0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
e0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
f0: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b    ????????????????
Comment 7 Alexei 2020-10-13 14:03:35 UTC
Currently on kernel 5.8.14, I've noticed that i2cdump -a 0 0x00 actually works and shows data from the touchpad.

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 10 04 c8 84 a4 01 37 00 10 04 c8 7b 5c 01 37 00    ??????7.???{\?7.
10: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
20: ff 10 04 c8 7b a2 01 37 00 00 ff ff ff ff ff ff    .???{??7........
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff 10 04 c8 78 f2 01    ..........???x??
50: 37 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff    7...............
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff 10 04 c8 76 38 01 37 00 00 ff ff    .....???v8?7....
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff 10 04 c8 76 88 01 37 00 00 ff ff ff    ....???v??7.....
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff 10 04 c8 73 ce 01 37 00    ........???s??7.
d0: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff 10 04 c8 72 32 01 37    .........???r2?7

data changes each time I move finger on the touchpad, but the error is the same.
i2c_hid i2c-ELAN1205:00: nothing at this address: -121
I found this code:

/* Make sure there is something at this address */
	ret = i2c_smbus_read_byte(client);
	if (ret < 0) {
		dev_dbg(&client->dev, "nothing at this address: %d\n", ret);
		ret = -ENXIO;
		goto err_regulator;
	}

and as I don't have any experience in C debugging, I added some additional debug messages:

        /* Make sure there is something at this address */
        ret = i2c_smbus_read_byte(client);
        if (ret < 0) {
                dev_dbg(&client->dev, "nothing at this address: %d\n", ret);
                dev_dbg(&client->dev, "Client adapter name: %s\n", client->adapter->name);
                dev_dbg(&client->dev, "Client address: %d\n", client->addr);
                dev_dbg(&client->dev, "Client name: %s\n", client->name);
                ret = -ENXIO;
                goto err_regulator;
        }

and noticed that i2c tries to work with different address:
[    6.187446] drivers/hid/i2c-hid//i2c-hid-core.c: HID probe called for i2c 0x15
[    6.187618] i2c_hid i2c-ELAN1205:00: supply vdd not found, using dummy regulator
[    6.187631] i2c_hid i2c-ELAN1205:00: supply vddl not found, using dummy regulator
[    6.188877] i2c_hid i2c-ELAN1205:00: nothing at this address: -121
[    6.188880] i2c_hid i2c-ELAN1205:00: Client adapter name: Synopsys DesignWare I2C adapter
[    6.188881] i2c_hid i2c-ELAN1205:00: Client address: 21
[    6.188882] i2c_hid i2c-ELAN1205:00: Client name: ELAN1205:00

When I use and test i2cdump, I use adapter 0 and address 0x00, but somehow i2c-hid wants to work with a different address but with a correct bus.
Comment 8 James 2020-11-24 11:09:46 UTC
I am facing the same issues. Any help would be appreciated. Also, is there way we can debug this issue?
Comment 9 Dmitry Torokhov 2020-12-02 04:35:45 UTC
What if you comment out call to i2c_smbus_read_byte()?
Comment 10 Alexei 2020-12-09 13:42:52 UTC
(In reply to Dmitry Torokhov from comment #9)
> What if you comment out call to i2c_smbus_read_byte()?

Hello, sorry for a late reply. 
That was also the first idea of mine. But it doesn't work. 

	ret = i2c_hid_init_irq(client);
	if (ret < 0)
		goto err_regulator;

next- this function produces the error. 
	hid = hid_allocate_device();
	if (IS_ERR(hid)) {
		ret = PTR_ERR(hid);
		goto err_irq;
	}
than this one if previous is commented. And than without hid allocation the rest is just not working.
Also I was trying to go through client structure to set the address manually before calling and checking it. With no success in compiling the code and making it run. I suppose because of lack in C programming skills.
Comment 11 Alexei 2021-01-05 09:30:13 UTC
While reading i2c documentation I found out that 0x00 address is a broadcast i2c address. From what I understand - no device can be registered on 0x00 address. Is it possible to get i2c address from Windows? I walked through Asus Precision driver and HID device in device manager with no success. Also it is not possible to add or remove this address:

# echo ELAN1205 0x15 > /sys/bus/i2c/devices/i2c-0/new_device
echo: write error: Device or resource busy
dmesg: i2c i2c-0: Failed to register i2c client ELAN1205 at 0x15 (-16)

# echo 0x15 > /sys/bus/i2c/devices/i2c-0/delete_device
echo: write error: No such file or directory
dmesg: i2c i2c-0: delete_device: Can't find device in list

Note You need to log in before you can comment on or make changes to this bug.