Использование legacy-драйверов на FDT-платформе
По ряду причин поддался современным веяниям и начал перевод своей железки на использование FDT. Обновил ядро до 3.12.5, скопипастил близкий dts и начал править под себя. И всё было бы хорошо, но в системе используются девайсы, драйвера которых не имеют биндингов к device tree, в частности I2C драйвер клавиатуры ADP5589, требующий весьма развесистый platform_data. Я, конечно, понимаю, что рассово-правильно - переписать драйвер, но пока не хочется...
Попытка подгрузить девайс по старинке из _init-функции ни к чему не приводит (я так понимаю, потому что чуть позже приходит злобный of и переинициализирует шину).
Попытка загрузить драйвер из юзер-спейса (echo «adp5589-keys» 0x36 > /sys/bus/i2c/devices/i2c-0/new_device), ожидаемо сталкивается с отсутствием device_data.
На ум приходят две мысли:
1) Подвешивать девайс на шину после того, как отработал FDT. Проблема в том, что не могу найти никаких хуков и колбеков, позволяющих это сделать (кстати, на старом ядре тоже столкнулся с похожей проблемой: после инициализации другого I2C девайса надо было кинуть в него пару команд вручную; так и не понял, как это красиво сделать, в итоге повесил на шину «виртуальную» EEPROM, в драйвере которой есть колбек и из этого колбека сделал инициализацию). Кто знает, как правильно реализуется «пост-инициализация»?
2) Подгрузить устройство уже из юзер-спейса, возможно даже модулем. Тут другой вопрос - как передать platform_data модулю?