LINUX.ORG.RU

Использование legacy-драйверов на FDT-платформе

 , , ,


0

2

По ряду причин поддался современным веяниям и начал перевод своей железки на использование 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 модулю?


Я, конечно, понимаю, что рассово-правильно - переписать драйвер

Ученик Поттеринга ? зачем переписывать, у этого драйвера есть биндинг для gpiolib

http://lxr.free-electrons.com/source/drivers/input/keyboard/adp5589-keys.c#L388

есть универсальный драйвер gpio-matrix-keypad c биндингами device tree

http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/input/...

anonymous
()
Ответ на: комментарий от anonymous

Не, поттеренгизмом не страдаю, но количество Поттеренгов в мейнстриме вынуждает адаптироваться - под нужный мне SoC в новых ядрах доки и примеры исключительно FDT-ориентированные. Хотя желание вернуться к классическому описанию всё растёт.

По поводу биндигов 1) Может я сильно заблуждаюсь, но там сначала надо экспортировать в gpiolib пины, для чего передать драйверу platform_data, для чего инициализировать драйвер и железку, для чего получить доступ к шине I2C... Или есть вариант из device tree секции gpiolib сделать эту инициализацию? 2) Я правильно понял, что Вы предлагаете перенести логику обработки матрицы из специализированной микросхемы в ядро? У меня не так много свободных ресурсов...

Спасибо

Alatar
() автор топика
Ответ на: комментарий от Alatar

Не совсем, у тебя gpiolib будет выступать в качестве обёртки над микрухой и суть форвардить с/на неё всё что валится в обе стороны. Да, появляется некоторый оверхэд на gpiolib, но он не настолько уж и большой.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

UPD: не совсем точно выразился. В FDT ты пишешь то, что у тебя есть gpio клавиатура которая обрабатывается драйвером gpio-matrix-keys, после чего указываешь, что у тебя ещё есть gpio-expander которым притворяется твоя микруха, которая висит на i2c шине и экспортит gpiochip. Обобщили интерфейс таксказать. platform data ты будешь указывать в gpio-matrix-keys объявлении.

Примерно где-то так. На мой взгляд, с FDT стало значительно проще, ибо котлеты отдельно, мухи отдельно.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Посмотрел в исходники matrix-keymap - он не делает поллинг, а работает по прерываниям, так что действительно должно быть более менее прилично. Впрочем, на мои вопросы это не отвечает - решение для частного случая, хотелось бы понять, есть ли более общие методы.

Я правильно понял, что для подвешивания чипа на I2C мне надо написать что-то вроде

	i2c@0 {
		adp8859: gpio-controller@34 {
			compatible = «ad,adp8859-keys»;
			reg = <0x34>;
			gpio-controller;
			gpio-ranges = xxx
		};
	};
и драйвер сам проинициализируется а потом его можно будет использовать для экспорта GPIO, даже несмотря на то, что он не имеет биндингов? Завтра попробую, но что-то сомневаюсь и не понимаю, как оно должно работать с учётом того, что adp8859-keys для инициализации нужна специфическая platform-data.

Alatar
() автор топика
Ответ на: комментарий от Alatar

По поводу биндигов

В общем зря я тут поттерингом назвал - драйверы тухлые и так просто там не сделать.

anonymous
()

как вариант - засунуть в late_initcall (или другой initcall) - буквально в любом месте в си-файле пишешь late_initcall(имя_функции) - функция добавляется в таблицу функций (линкером), потом на одной из стадий вызывается (после драйверо, фс, инита итд, там около 9 уровней). ну тут какое дело - или ты юзаешь апстрим и переписываешь драйвера, или тратишь время на эмуляцию того, что апстрим выкинул

alexst
()
Ответ на: комментарий от alexst

как вариант - засунуть в late_initcall

О, вот за эту наводку большое спасибо!
late_initcall вызывается сразу после machine_desc.init_late, то есть всё ещё раньше, чем обработается DeviceTree, а вот late_initcall_sync помог - так работает.

Alatar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.