Hello,
I kindly ask for an advice about interrupt working with USB-OTG usb0 on Allwinner A40i.
I need to make work usb0 as USB-OTG.
Looks like it's possible somehow:
https://lore.kernel.org/linux-arm-kernel/daf5c543-a1d1-04d2...@sholland.org/T/#md5e9ce01feb201041467c136f09e80628f414557I've used usb-phy driver with support of muxing ohci0(host) and usb0(client) on usb0 pins, mentioned in the link above:
https://github.com/wirenboard/linux/blob/dev/v5.10.y/drivers/phy/allwinner/phy-sun4i-usb.cIn my case I have pin ID USB OTG = PI11.
Some excerpts from my dts file:
[quote]
/ {
...
/* ohci0 and ehci0 need to be included to work with USB OTG */
ohci0: usb@1c14400 {
compatible = "allwinner,sun8i-r40-ohci", "generic-ohci";
reg = <0x01c14400 0x100>;
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>,
<&ccu CLK_USB_OHCI0>;
resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
status = "okay";
};
ehci0: usb@1c14000 {
compatible = "allwinner,sun8i-r40-ehci", "generic-ehci";
reg = <0x01c14000 0x100>;
interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>;
resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
status = "okay";
};
...
}
...
&usb_otg {
/* в dtsi defines of usb_otg as dr_mode = "peripheral"; */
status = "okay";
};
&usbphy {
dr_mode = "otg";
usb0_id_det-gpios = <PIN_PI 11 GPIO_ACTIVE_HIGH>;
usb0_vbus-supply = <®_vcc5v0>;
status = "okay";
};
[/quote]
USB-OTG works, but the problem is USB-OTG reads pin ID and choose client or host only on OS startup once.
After adding many printk and -DDEBUG for several subsystems it seems to me that the problem is PI11 GPIO irq just doesn't run it's handler requested here:
https://github.com/wirenboard/linux/blob/dev/v5.10.y/drivers/phy/allwinner/phy-sun4i-usb.c#L951I observed EINT23 registration in pinctrl sunxi driver:
[quote]
[ 11.578919] sun4i-pinctrl 1c20800.pinctrl: 1c20800.pinctrl: request IRQ for GPIO 267, return 23
[ 11.587657] devm_request_irq data->id_det_irq: 74, ret: 0
74: 0 0 0 0 sunxi_pio_edge 23 Edge usb0-id-det
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
26: 0 0 0 0 GICv2 54 Level timer@1c20c00
27: 0 0 0 0 GICv2 29 Level arch_timer
28: 198416 45783 21540 10341 GICv2 30 Level arch_timer
31: 0 0 0 0 GICv2 152 Level arm-pmu
32: 0 0 0 0 GICv2 153 Level arm-pmu
33: 0 0 0 0 GICv2 154 Level arm-pmu
34: 0 0 0 0 GICv2 155 Level arm-pmu
35: 0 0 0 0 GICv2 59 Level 1c02000.dma-controller
37: 0 0 0 0 GICv2 102 Level gpmmu
38: 0 0 0 0 GICv2 104 Level ppmmu0
39: 0 0 0 0 GICv2 107 Level ppmmu1
40: 175 0 0 0 GICv2 101 Level gp
41: 128 0 0 0 GICv2 103 Level pp0
42: 128 0 0 0 GICv2 106 Level pp1
43: 0 0 0 0 GICv2 71 Level ehci_hcd:usb1
44: 0 0 0 0 GICv2 72 Level ohci_hcd:usb2
45: 1289 0 0 0 GICv2 61 Level sun4i-ts
46: 0 0 0 0 GICv2 56 Level 1c20400.rtc
47: 0 0 0 0 GICv2 125 Level 1400000.deinterlace
48: 0 0 0 0 GICv2 126 Level sun8i-ce-ns
49: 0 0 0 0 GICv2 85 Level 1c0e000.video-codec
74: 0 0 0 0 sunxi_pio_edge 23 Edge usb0-id-det
83: 28 0 0 0 GICv2 33 Level ttyS0
84: 0 0 0 0 GICv2 44 Level sun6i-spi
85: 80306 0 0 0 GICv2 39 Level mv64xxx_i2c
86: 0 0 0 0 sunxi-nmi 0 Level axp22x_irq_chip
109: 0 0 0 0 axp22x_irq_chip 22 Edge axp20x-pek-dbr
110: 0 0 0 0 axp22x_irq_chip 23 Edge axp20x-pek-dbf
113: 0 0 0 0 GICv2 40 Level mv64xxx_i2c
114: 0 0 0 0 GICv2 41 Level mv64xxx_i2c
115: 0 0 0 0 GICv2 120 Level mv64xxx_i2c
116: 0 0 0 0 GICv2 121 Level mv64xxx_i2c
117: 0 0 0 0 GICv2 129 Level tvd0
118: 0 0 0 0 GICv2 130 Level tvd1
119: 0 0 0 0 GICv2 131 Level tvd2
120: 0 0 0 0 GICv2 132 Level tvd3
121: 10281 0 0 0 GICv2 68 Level ths
122: 245 0 0 0 GICv2 66 Level sunxi-mmc
123: 5690 0 0 0 GICv2 64 Level sunxi-mmc
129: 0 0 0 0 GICv2 88 Level ahci-sunxi[1c18000.sata]
130: 168336 0 0 0 GICv2 87 Level eth0
131: 81204 0 0 0 GICv2 117 Level eth1
132: 401 0 0 0 GICv2 70 Level musb-hdrc.2.auto
133: 0 0 0 0 GICv2 96 Level ohci_hcd:usb3
134: 0 0 0 0 GICv2 97 Level ohci_hcd:usb4
135: 9114 0 0 0 GICv2 76 Level 1c71000.lcd-controller
136: 13939 0 0 0 GICv2 83 Level 1c73000.lcd-controller
137: 515 0 0 0 GICv2 90 Level 1ee0000.hdmi
138: 0 0 0 0 GICv2 110 Level ehci_hcd:usb5
139: 0 0 0 0 GICv2 108 Level ehci_hcd:usb6
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 71 81 134 106 Rescheduling interrupts
IPI3: 5850 17893 6323 6836 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 16353 2205 1054 417 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Err: 0
[/quote]
I've reconfigured PI11 as GPIO and I've observed change of input state on USB-OTG cable.
External interrupt is possible on PI11 - PI11/SPI0_CLK/UART5_RX/EINT23 - everything else is turned of like spi0 or routed to different pins as uart5.
Link to syslog excerpts and dts with dtsi:
https://disk.yandex.ru/d/0H5tnCl1qQIE2gI really appreciate an advice with links to how debug that.
Please, notify my if I can provide some additional info.