Я работаю с Freescale MX6 и модифицированным ядром Freescale 3.10.31. У меня есть Maxim MAX7325, используемый в качестве расширителя ввода-вывода, кнопки которого подключены к P0-P2. Линия прерывания от 7325 подключена к контактной площадке GPIO_3 (я считаю, что это GPIO1_3 ...)
Я настроил ключи 7325 и gpio в дереве устройств следующим образом:
max7325_reset: max7325-reset {
compatible = "gpio-reset";
reset-gpios = <&gpio5 16 GPIO_ACTIVE_LOW>;
reset-delay-us = <1>;
#reset-cells = <0>;
};
gpio-keys {
compatible = "gpio-keys";
sw2 {
gpios = <&max7325 2 GPIO_ACTIVE_LOW>;
linux,code = <30>; //a
gpio-key,wakeup;
};
};
а также
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1_2>;
status = "okay";
max7325: gpio@68 {
compatible = "maxim,max7325";
reg = <0x68>;
gpio-controller;
#gpio-cells = <2>;
resets = <&max7325_reset>;
gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
interrupt-parent = <&gpio1>;
interrupts = <3 2>;
};
};
Похоже, что когда вызывается зонд для драйвера MAX7325, client-> dev.platform_data имеет значение NULL. Из-за этого, когда max732x_irq_setup вызывается позже, он не устанавливает указатель chip-> gpio_chip.to_irq так, чтобы он указывал на функцию max732x_gpio_to_irq (предположительно потому, что у него нет нужной информации для того, чтобы это работало). Позже, когда gpio_keys пытается настроить первый вход, он терпит неудачу, когда пытается настроить прерывание, и ни один из других ключей не настраивается.
gpio-keys gpio-keys.20: Unable to get irq number for GPIO 242, error -6
С помощью интерфейса / sys я определил, что P0 сопоставляется с GPIO 240, так что да, GPIO 242 - это ключ GPIO sw2, который я пытался настроить.
Мне интересно, а этот драйвер не работает с деревом устройств? Я не вижу, чтобы он пытался получить какие-либо свойства дерева устройств, но другие драйверы расширителей ввода-вывода, на которые я смотрел, тоже не смотрели, поэтому я подумал, что, возможно, ядро I2C читает дерево устройств и должно как-то раньше заполнять оттуда platform_data он вызывает функцию зонда драйвера (?)
Я новичок в этом, поэтому любая помощь будет принята с благодарностью. =) Я прочитал несколько онлайн-документов по дереву устройств, но я думаю, что это что-то довольно конкретное, что я делаю неправильно, и они не охватывают ... (?)
У меня есть CONFIG_GPIO_MAX732X_IRQ, настроенный в ядре ... и я однажды попытался установить свойство контроллера прерывания для узла max7325 I2c1, но я не был уверен, что это было необходимо (?)