はじめに
Ultra96-V2 は 2018年にリリースされた Ultra96 を更新&再構成したものです。Ultra96 の WiFi/Bluetooth モジュールは TI 社製の WL1831MOD が使われていましたが、Ultra96-V2 からは Microchip 社製の ATWILC3000 に変わりました。
この記事では、Linux Kernel 6.12 に ATWILC3000 の Linux Driver を組み込んだときの話をします。
デバイスドライバのリポジトリ
Ultra96-V2 で Linux Kernel 6.12 を動かす場合、ATWILC3000 の Linux Driver は Microchip 社が提供しているものを使います。
このリポジトリのブランチ linux-6.12-mchp にある drivers/net/wireless/microchip/wilc1000/ にあるソースコードを使います。
- https://github.com/linux4microchip/linux/tree/linux-6.6-mchp/drivers/net/wireless/microchip/wilc1000
なお、上記のソースコードをそのまま導入しても動作しませんでした。この記事で説明するような修正が必要でした。修正済のソースコードは以下の URL にあります。修正に使用したパッチファイルも用意しているので参考にしてください。
Linux Kernel 6.12 への組み込み
Linux Kernel の本家(linux-6.12-stable) にはすでに drivers/net/wireless/microchip/wilc1000/ が存在します。
linux-stable の drivers/net/wireless/microchip/Makefile は次のようになっています。
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_WILC1000) += wilc1000/
一方、linux-6.12-mchp の drivers/net/wireless/microchip/Makefile は次のようになっています。
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_WILC) += wilc1000/
defconfig に指定する名前が、linux-6.12-stable では CONFIG_WILC1000 なのに対して linux-6.12-mchp では CONFIG_WILC になっているようです。
このまま linux-6.12-stable の drivers/net/wireless/microchip/wilc1000 に linux-6.12-mchp の drivers/net/wireless/microchip/wilc1000 の内容を上書きすることも考えましたが、後々、linux-6.12-stable にもともとあったドライバも設定によって使えるようにしたかったので、あらたに drivers/net/wireless/microchip/wilc というディレクトリを作って そこに linux-6.12-mchp の drivers/net/wireless/microchip/wilc1000 の中身をコピーしました。
そして drivers/net/wireless/microchip/Kconfig と drivers/net/wireless/microchip/Makefile に以下のように修正を加えます。
diff --git a/drivers/net/wireless/microchip/Kconfig b/drivers/net/wireless/microchip/Kconfig
index a6b46fb6b..ca5d4cc8b 100644
--- a/drivers/net/wireless/microchip/Kconfig
+++ b/drivers/net/wireless/microchip/Kconfig
@@ -12,4 +12,5 @@ config WLAN_VENDOR_MICROCHIP
if WLAN_VENDOR_MICROCHIP
source "drivers/net/wireless/microchip/wilc1000/Kconfig"
+source "drivers/net/wireless/microchip/wilc/Kconfig"
endif # WLAN_VENDOR_MICROCHIP
diff --git a/drivers/net/wireless/microchip/Makefile b/drivers/net/wireless/microchip/Makefile
index 73b763c73..8fdb47e2b 100644
--- a/drivers/net/wireless/microchip/Makefile
+++ b/drivers/net/wireless/microchip/Makefile
@@ -1,2 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_WILC1000) += wilc1000/
+obj-$(CONFIG_WILC) += wilc/
修正用のパッチファイル linux-6.12.10-zynqmp-fpga-wilc.diff は以下の URL にあります。
ATWILC3000 パワー制御用の Linux Driver
Ultra96-V2 で WiFi を使用する際に問題になるのが ATWILC3000 のパワー制御です。
どうやら Ultra96-V2 ではパワー制御が特殊らしく linux-6.12-mchp が提供するドライバだけでは上手くいきません。
そこで、パワー制御用のデバイスドライバを別途用意します。これは『Ultra96-V2 の WiFi で超苦労した話(v2021.1編)』 で紹介したものを linux kernel 6.12 用に修正して使います。修正したものは以下の URL に用意しています。
そして drivers/mmc/core/Kconfig と drivers/mmc/core/Makefile に以下のように修正を加えます。
diff --git a/drivers/mmc/core/Kconfig b/drivers/mmc/core/Kconfig
index 14d2ecbb0..c7b446394 100644
--- a/drivers/mmc/core/Kconfig
+++ b/drivers/mmc/core/Kconfig
@@ -34,6 +34,16 @@ config PWRSEQ_SIMPLE
This driver can also be built as a module. If so, the module
will be called pwrseq_simple.
+config PWRSEQ_WILC
+ tristate "HW reset support for Microchip WILC BT + WiFi devices"
+ depends on OF
+ help
+ This selects hardware reset support for Microchip WILC BT + WiFi
+ devices. By default this option is set to n.
+
+ This driver can also be built as a module. If so, the module
+ will be called pwrseq_wilc.
+
config MMC_BLOCK
tristate "MMC block device driver"
depends on BLOCK
diff --git a/drivers/mmc/core/Makefile b/drivers/mmc/core/Makefile
index 6a907736c..b02117617 100644
--- a/drivers/mmc/core/Makefile
+++ b/drivers/mmc/core/Makefile
@@ -13,6 +13,7 @@ mmc_core-$(CONFIG_OF) += pwrseq.o
obj-$(CONFIG_PWRSEQ_SIMPLE) += pwrseq_simple.o
obj-$(CONFIG_PWRSEQ_SD8787) += pwrseq_sd8787.o
obj-$(CONFIG_PWRSEQ_EMMC) += pwrseq_emmc.o
+obj-$(CONFIG_PWRSEQ_WILC) += pwrseq_wilc.o
mmc_core-$(CONFIG_DEBUG_FS) += debugfs.o
obj-$(CONFIG_MMC_BLOCK) += mmc_block.o
mmc_block-objs := block.o queue.o
そして mmc のホストコントローラーのデバイスツリーに mmc-pwrseq プロパティを使ってパワー制御用のデバイスドライバを指定します。
修正用のパッチファイル linux-6.12.10-zynqmp-fpga-pwrseq-wilc.diff は以下の URL にあります。
wilc_wlan_power() の修正
問題点
パワー制御は前節の Linux Driver によって解決しますが、もう少しソースコードに修正が必要です。
linux-6.12-mhcp の drivers/net/wireless/microchip/wilc1000/power.c にある wilc_wlan_power() は次のようになっています。
void wilc_wlan_power(struct wilc *wilc, bool on)
{
if (!gpio_is_valid(wilc->power.gpios.chip_en) ||
!gpio_is_valid(wilc->power.gpios.reset)) {
/* In case SDIO power sequence driver is used to power this
* device then the powering sequence is handled by the bus
* via pm_runtime_* functions. */
return;
}
if (on) {
gpio_direction_output(wilc->power.gpios.chip_en, 1);
mdelay(5);
gpio_direction_output(wilc->power.gpios.reset, 1);
} else {
gpio_direction_output(wilc->power.gpios.chip_en, 0);
gpio_direction_output(wilc->power.gpios.reset, 0);
}
}
wilc_wlan_power() は wilc->power.gpios.chip_en と wilc->power.gpios.reset が gpio として有効な場合のみパワー制御をするようになっています。
wilc->power.gpios.chip_en と wilc->power.gpios.reset の初期化は wilc_of_parse_power_pins() で行います。
int wilc_of_parse_power_pins(struct wilc *wilc)
{
static const struct wilc_power_gpios default_gpios[] = {
{ .reset = GPIO_NUM_RESET, .chip_en = GPIO_NUM_CHIP_EN, },
};
struct device_node *of = wilc->dt_dev->of_node;
struct wilc_power *power = &wilc->power;
const struct wilc_power_gpios *gpios = &default_gpios[0];
int ret;
power->gpios.reset = of_get_named_gpio(of, "reset-gpios", 0);
if (!gpio_is_valid(power->gpios.reset))
power->gpios.reset = gpios->reset;
power->gpios.chip_en = of_get_named_gpio(of, "chip_en-gpios", 0);
if (!gpio_is_valid(power->gpios.chip_en))
power->gpios.chip_en = gpios->chip_en;
if (!gpio_is_valid(power->gpios.chip_en) ||
!gpio_is_valid(power->gpios.reset))
return -EINVAL;
ret = devm_gpio_request(wilc->dev, power->gpios.chip_en, "CHIP_EN");
if (ret)
return ret;
ret = devm_gpio_request(wilc->dev, power->gpios.reset, "RESET");
return ret;
}
wilc_of_parse_power_pins() は drivers/net/wireless/microchip/wilc1000/sdio.c の wilc_sdio_probe() 次のように呼ばれています。
static int wilc_sdio_probe(struct sdio_func *func,
const struct sdio_device_id *id)
{
:
(中略)
:
np = of_parse_phandle(func->card->host->parent->of_node, "mmc-pwrseq",
0);
if ((np && of_device_is_available(np)) || sdio_priv->is_mmc_spi) {
init_power = 1;
of_node_put(np);
} else {
ret = wilc_of_parse_power_pins(wilc);
if (ret)
goto disable_rtc_clk;
}
:
(中略)
:
}
ホストコントローラーのデバイスツリーのノードに mmc-pwrseq プロパティが設定されていない場合のみ、wilc_of_parse_power_pins() が呼ばれることに注意してください。つまり、mmc-pwrseq プロパティが設定された場合、wilc->power.gpios.chip_en と wilc->power.gpios.reset の初期化は行われません。初期化が行われないので、wilc->power.gpios.chip_en と wilc->power.gpios.reset の値は 0 になっています。
ところが、gpio のポートが有効か否かを判定する gpio_is_valid() は次のようになっていて、「0以上の値」では有効と判定されます。
static inline bool gpio_is_valid(int number)
{
/* only non-negative numbers are valid */
return number >= 0;
}
したがって、このままだと、wilc_wlan_power() が呼ばれる度に gpio の 0 ポートに値を出力してしまいます。
修正案
この問題を防ぐために、wilc_power_gpios 構造体に enbaled フィールドを新に設けます。
diff --git a/netdev.h b/netdev.h
index 72e4b79..8c3c18e 100644
--- a/netdev.h
+++ b/netdev.h
@@ -242,6 +242,7 @@ struct wilc_vif {
struct wilc_power_gpios {
int reset;
int chip_en;
+ bool enabled;
};
struct wilc_power {
enbaled フィールドを設定する関数 wilc_enable_power_pins() と wilc_disable_power_pins() を power.c に作ります。そして wilc_wlan_power() は enable フィールドが true の場合のみポートに値を出力するようにします。
diff --git a/hif.h b/hif.h
index 28725ba..e02c28d 100644
--- a/hif.h
+++ b/hif.h
@@ -235,6 +235,8 @@ wilc_parse_join_bss_param(struct cfg80211_bss *bss,
int wilc_set_default_mgmt_key_index(struct wilc_vif *vif, u8 index);
void wilc_handle_disconnect(struct wilc_vif *vif);
+void wilc_enable_power_pins(struct wilc *wilc);
+void wilc_disable_power_pins(struct wilc *wilc);
int wilc_of_parse_power_pins(struct wilc *wilc);
void wilc_wlan_power(struct wilc *wilc, bool on);
int wilc_init_coex_config(struct wilc_vif *vif);
diff --git a/power.c b/power.c
index aaa99b1..30e2196 100644
--- a/power.c
+++ b/power.c
@@ -12,6 +12,16 @@
#include "netdev.h"
+void wilc_disable_power_pins(struct wilc *wilc)
+{
+ struct wilc_power *power = &wilc->power;
+ power->gpios.enabled = false;
+}
+void wilc_enable_power_pins(struct wilc *wilc)
+{
+ struct wilc_power *power = &wilc->power;
+ power->gpios.enabled = true;
+}
/**
* wilc_of_parse_power_pins() - parse power sequence pins; to keep backward
* compatibility with old device trees that doesn't provide
@@ -31,6 +41,8 @@ int wilc_of_parse_power_pins(struct wilc *wilc)
const struct wilc_power_gpios *gpios = &default_gpios[0];
int ret;
+ wilc_disable_power_pins(wilc);
+
power->gpios.reset = of_get_named_gpio(of, "reset-gpios", 0);
if (!gpio_is_valid(power->gpios.reset))
power->gpios.reset = gpios->reset;
@@ -48,7 +60,11 @@ int wilc_of_parse_power_pins(struct wilc *wilc)
return ret;
ret = devm_gpio_request(wilc->dev, power->gpios.reset, "RESET");
- return ret;
+ if (ret)
+ return ret;
+
+ wilc_enable_power_pins(wilc);
+ return 0;
}
/**
@@ -61,7 +77,8 @@ int wilc_of_parse_power_pins(struct wilc *wilc)
*/
void wilc_wlan_power(struct wilc *wilc, bool on)
{
- if (!gpio_is_valid(wilc->power.gpios.chip_en) ||
+ if ((wilc->power.gpios.enabled == false) ||
+ !gpio_is_valid(wilc->power.gpios.chip_en) ||
!gpio_is_valid(wilc->power.gpios.reset)) {
/* In case SDIO power sequence driver is used to power this
* device then the powering sequence is handled by the bus
念の為、wilc_sdio_probe() でも、mmc-pwrseq プロパティが設定された場合は enable フィールドが false になるようにしておきます。
diff --git a/sdio.c b/sdio.c
index 3caf996..dacd8cb 100644
--- a/sdio.c
+++ b/sdio.c
@@ -241,6 +241,7 @@ static int wilc_sdio_probe(struct sdio_func *func,
np = of_parse_phandle(func->card->host->parent->of_node, "mmc-pwrseq",
0);
if ((np && of_device_is_available(np)) || sdio_priv->is_mmc_spi) {
+ wilc_disable_power_pins(wilc);
init_power = 1;
of_node_put(np);
} else {
修正用のパッチファイル wilc1000-1-power-pins.patch は以下の URL にあります。
wilc_sdio_init() の修正
問題点
前節までのパワー制御信号の問題を修正しても、今度は次のようなエラーが出て、デバイスドライバの組み込みに失敗しました。
[ 2.719144] mmc1: SDHCI controller on ff170000.mmc [ff170000.mmc] using ADMA 64-bit
[ 2.743526] mmc1: new high speed SDIO card at address 0001
[ 2.746619] mmc0: SDHCI controller on ff160000.mmc [ff160000.mmc] using ADMA 64-bit
[ 2.756890] wilc_sdio mmc1:0001:1: SDIO driver speed: 50000000
[ 2.762946] wilc_sdio mmc1:0001:1: probe with driver wilc_sdio failed with error -5
原因を追求したところ、 drivers/net/wireless/microchip/wilc1000/sdio.c の wilc_sdio_init() で pm_runtime_get_sync() がエラーを返していることがわかりました。
static int wilc_sdio_init(struct wilc *wilc, bool resume)
{
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct wilc_sdio *sdio_priv = wilc->bus_data;
struct sdio_cmd52 cmd;
int loop, ret;
u32 chipid;
bool test_mode = false;
#ifdef WILC_S02_TEST_BUS_INTERFACE
test_mode = is_test_mode;
#endif
dev_info(&func->dev, "SDIO driver speed: %d %s\n",
func->card->host->ios.clock, test_mode ? "loopback mode" : "");
if (!sdio_priv->is_mmc_spi) {
/* Patch for sdio interrupt latency issue */
ret = pm_runtime_get_sync(mmc_dev(func->card->host));
if (ret < 0) {
pm_runtime_put_noidle(mmc_dev(func->card->host));
return ret;
}
}
:
(中略)
:
}
これは mmc のホストコントローラーの pm_runtime が有効になっていないのが原因のようです。
ためしに /sys/class/mmc_host/mmc1/power/runtime_status を見てみると unsupported になっていました。
shell# cat /sys/class/mmc_host/mmc1/power/runtime_status
unsupported
修正案
mmc のホストコントローラーの pm_runtime が有効になっていない場合でも失敗しないようにします。
具体的には drivers/net/wireless/microchip/wilc1000/sdio.c の wilc_sdio 構造体に is_pm_enabled フィールドを設け
、ホストコントローラーが pm_runtime_enabled() に true を返した場合のみ true になるようにし、is_pm_enabled フィールドが true の場合のみ pm_runtime 関連の API を実行するようにします。
diff --git a/sdio.c b/sdio.c
index dacd8cb..77a324e 100644
--- a/sdio.c
+++ b/sdio.c
@@ -41,6 +41,7 @@ struct wilc_sdio {
struct wilc *wl;
u8 *cmd53_buf;
bool is_mmc_spi;
+ bool is_pm_enabled;
};
struct sdio_cmd52 {
@@ -895,7 +896,9 @@ static int wilc_sdio_deinit(struct wilc *wilc)
sdio_priv->isinit = false;
- pm_runtime_put_sync_autosuspend(mmc_dev(func->card->host));
+ if (sdio_priv->is_pm_enabled) {
+ pm_runtime_put_sync_autosuspend(mmc_dev(func->card->host));
+ }
wilc_wlan_power(wilc, false);
return 0;
@@ -917,6 +920,15 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
func->card->host->ios.clock, test_mode ? "loopback mode" : "");
if (!sdio_priv->is_mmc_spi) {
+ sdio_priv->is_pm_enabled = pm_runtime_enabled(mmc_dev(func->card->host));
+ if (sdio_priv->is_pm_enabled == false) {
+ dev_info(&func->dev, "host is not enabled for pm_runtime\n");
+ }
+ } else {
+ sdio_priv->is_pm_enabled = false;
+ }
+
+ if (sdio_priv->is_pm_enabled) {
/* Patch for sdio interrupt latency issue */
ret = pm_runtime_get_sync(mmc_dev(func->card->host));
if (ret < 0) {
@@ -1075,7 +1087,7 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
return 0;
pm_runtime_put:
- if (!sdio_priv->is_mmc_spi)
+ if (sdio_priv->is_pm_enabled)
pm_runtime_put_sync_autosuspend(mmc_dev(func->card->host));
return ret;
}
この修正により、wilc_sdio_init() は成功して無事にデバイスドライバの組み込みが行われました。
[ 2.723422] mmc1: new high speed SDIO card at address 0001
[ 2.729402] wilc_sdio mmc1:0001:1: SDIO driver speed: 50000000
[ 2.735336] wilc_sdio mmc1:0001:1: host is not enabled for pm_runtime
[ 2.742171] wilc_sdio mmc1:0001:1: chipid 003000d0
[ 2.748013] wilc_sdio mmc1:0001:1: Driver Initializing success
修正用のパッチファイル wilc1000-2-pm-runtime.patch は以下の URL にあります。
想定外の割り込みが発生する問題の修正
問題点
前節までの修正によって、とりあえず WiFi は動作するようになりました。
しかし、ログを確認したところ、次のようなメッセージがみつかりました。
[ 9.431776] wilc_sdio mmc1:0001:1: Unexpected interrupt (1) int=1
[ 9.437959] wilc_handle_isr,>> UNKNOWN_INTERRUPT - 0x00020000
どうやら想定外の割り込みが発生しているようです。なお、このメッセージは Linux 起動後に1〜2回出るだけです。おそらく動作中にこの割り込みはクリアされてしまうのでしょう。このまま放っておいても実害はなさそうな気がします。
それでも気になったので調査したのですが、結局、原因は判りませんでした。どうやら ATWILC3000 内部のファームウェアが割り込みを通知しているようなのですが、ファームウェアの資料が見つからなかったため、この割り込みの原因がなんなのかわかりませんでした。
修正案
この割り込みが発生しないようにいろいろと試している過程で、drivers/net/wireless/microchip/wilc1000/Kconfig に次のような記述を見付けました。
config WILC_HW_OOB_INTR
bool "WILC out of band interrupt"
depends on WILC_SDIO
default n
help
This option enables out-of-band interrupt support for the WILC1000 &
WILC3000 chipset. This OOB interrupt is intended to provide a faster
interrupt mechanism for SDIO host controllers that don't support SDIO
interrupt. Select this option If the SDIO host controller in your
platform doesn't support SDIO time division interrupt.
mmc のホストコントローラーが sdio に接続された chip からの割り込みを認識する場合、専用の割り込み線を使う場合(out of band interrupt) と、定期的に chip 内のレジスタを読みにいく場合(polling)があるようです。この Kconfig の設定は専用の割り込み線を使う場合に指定するようです。
従来までの Ultra96-V2 の Linux Kernel ドライバでは polling を使っていました。しかし Ultra96-V2 の基板の回路図を確認したところ、ATWILC3000 の割り込み出力信号が gpio の MIO76 に接続されていることがわかりました。そこで、out of band interupt を使うようにしたところ、想定外の割り込みも発生しないようになりました。
ただ、今のままだと、CONFIG_WILC_HW_OOB_INTR=y にして Linux Kernel をビルドしないとこの機能は有効になりません。それは少し不便なので、デバイスツリーからも設定できるように out-of-band-interrupt プロパティを追加しました。具体的には drivers/net/wireless/microchip/wilc1000/sdio.c の wilc_sdio_probe() に以下のような修正を加えます。
diff --git a/sdio.c b/sdio.c
index 77a324e..dcde783 100644
--- a/sdio.c
+++ b/sdio.c
@@ -170,6 +170,7 @@ static int wilc_sdio_probe(struct sdio_func *func,
struct device_node *np;
int irq_num;
struct wilc_vif *vif;
+ u32 oob_intr = 0;
sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
if (!sdio_priv)
@@ -183,8 +184,12 @@ static int wilc_sdio_probe(struct sdio_func *func,
sdio_priv->is_mmc_spi = func->card->host->caps & MMC_CAP_SPI;
- if (IS_ENABLED(CONFIG_WILC_HW_OOB_INTR) || func->card->host->caps &
- MMC_CAP_SPI)
+ if (of_property_read_u32(func->card->dev.of_node, "out-of-band-interrupt", &oob_intr) != 0) {
+ if (IS_ENABLED(CONFIG_WILC_HW_OOB_INTR))
+ oob_intr = 1;
+ }
+
+ if ((oob_intr != 0) || (func->card->host->caps & MMC_CAP_SPI))
io_type = WILC_HIF_SDIO_GPIO_IRQ;
else
io_type = WILC_HIF_SDIO;
@@ -285,6 +290,7 @@ static int wilc_sdio_probe(struct sdio_func *func,
wilc_bt_init(wilc);
+ dev_info(&func->dev, "out-of-band-interrupt %d\n", oob_intr);
dev_info(&func->dev, "Driver Initializing success\n");
return 0;
修正用のパッチファイル wilc1000-3-oob-intr.patch は以下の URL にあります。
Ultra96-V2 用 Linux Kernel 6.12 への組み込み
defconfig
defconfig に以下の設定を追加して、デバイスドライバを組み込みます。
CONFIG_WILC_SDIO=y
CONFIG_PWRSEQ_WILC=y
device tree
Ultra96-V2 用のデバイスツリーは次のようにします。
/ {
:
(中略)
:
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-wilc";
reset-gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
powerdown-gpios = <&gpio 8 GPIO_ACTIVE_HIGH>;
status = "okay";
};
};
:
(中略)
:
&sdhci1 {
status = "okay";
bus-width = <0x4>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdhci1_default>;
xlnx,mio-bank = <0>;
non-removable;
disable-wp;
// cap-power-off-card; /* This is not compatible with the WILC3000 and means the WILC will always be powered on */
non-removeable;
mmc-pwrseq = <&sdio_pwrseq>;
vqmmc-supply = <&wmmcsdio_fixed>;
#address-cells = <1>;
#size-cells = <0>;
wlcore: wilc_sdio@0 {
compatible = "microchip,wilc3000", "microchip,wilc3000";
status = "okay";
reg = <0>;
bus-width = <4>;
interrupt-parent = <&gpio>;
interrupts = <76 IRQ_TYPE_EDGE_RISING>; /* MIO76 WLAN_IRQ 1V8 */
out-of-band-interrupt = <1>;
};
};
sdio_pwrseq ノードには、Ultra96-V2 で ATWILC3000 のパワー制御用に使っている gpio ポートを指定します。
sdhci1 ノードの mmc-pwrseq プロパティには sdio_pwrseq ノードを指定します。
sdhci1 ノードの下に ATWILC3000 用のノードを wlcore という名前で追加します。
Ultra96-V2 では ATWILC3000 からの割り込み信号が GPIO の MIO76 に接続されているので、out-of-band-interrupt プロパティ、interrupt-parent プロパティ、interrupts プロパティを上記のように設定します。
参考
過去の Qiita の記事
Microchip 社が提供する Linux Kernel
-
https://github.com/linux4microchip/linux
- tree/linux-6.6-mchp/
ZynqMP-FPGA-Linux-Kernel-6.12
-
https://github.com/ikwzm/ZynqMP-FPGA-Linux-Kernel-6.12
- tree/develop-6.12.10-zynqmp-fpga-generic/