From d7c0b4c111b3a75bad3bdcf3400d10cda3e6ffa3 Mon Sep 17 00:00:00 2001 From: Marek Czerski Date: Thu, 4 Mar 2021 00:58:29 +0100 Subject: [PATCH] dts: gpio: interrupt controller definition for switches This commit adds support for enabling interupts in switches module. Declaring switches as GPIOIn module with with_irq=True will make dts generation add correct interrupt controller definition. Also, if SWITCHES_NGPIO constant is defined it will be used to specify correct number of gpios in dts. example: self.submodules.switches = GPIOIn(pads=switches_pads, with_irq=True) self.add_csr("switches") self.irq.add("switches", use_loc_if_exists=True) self.add_constant("SWITCHES_NGPIO", len(switches_pads)) --- litex/tools/litex_json2dts.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/litex/tools/litex_json2dts.py b/litex/tools/litex_json2dts.py index 4b944c757..d4a8ef00a 100755 --- a/litex/tools/litex_json2dts.py +++ b/litex/tools/litex_json2dts.py @@ -28,7 +28,6 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): / { #address-cells = <1>; #size-cells = <1>; - interrupt-parent = <&intc0>; """ @@ -185,6 +184,7 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): device_type = "serial"; compatible = "litex,liteuart"; reg = <0x{uart_csr_base:x} 0x100>; + interrupt-parent = <&intc0>; {uart_interrupt} status = "okay"; }}; @@ -203,6 +203,7 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): <0x{ethmac_mem_base:x} 0x2000>; tx-fifo-depth = <{ethmac_tx_slots}>; rx-fifo-depth = <{ethmac_rx_slots}>; + interrupt-parent = <&intc0>; {ethmac_interrupt} status = "okay"; }}; @@ -309,14 +310,25 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): # Switches ------------------------------------------------------------------------------------- if "switches" in d["csr_bases"]: + interrupt_specification = "" + if "switches_interrupt" in d["constants"]: + switches_interrupt = d["constants"]["switches_interrupt"] + interrupt_specification = """ + interrupt-controller; + #interrupt-cells = <2>; + interrupt-parent = <&intc0>; + interrupts = <{switches_interrupt}>;""".format(switches_interrupt=switches_interrupt) + dts += """ switches: gpio@{switches_csr_base:x} {{ compatible = "litex,gpio"; reg = <0x{switches_csr_base:x} 0x4>; litex,direction = "in"; + gpio-controller; + #gpio-cells = <2>;{interrupt_specification} status = "disabled"; }}; -""".format(switches_csr_base=d["csr_bases"]["switches"]) +""".format(switches_csr_base=d["csr_bases"]["switches"], interrupt_specification=interrupt_specification) # SPI ------------------------------------------------------------------------------------------ @@ -534,19 +546,19 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): if "leds" in d["csr_bases"]: dts += """ -&leds { - litex,ngpio = <4>; +&leds {{ + litex,ngpio = <{ngpio}>; status = "okay"; -}; -""" +}}; +""".format(ngpio=d["constants"].get('leds_ngpio', 4)) if "switches" in d["csr_bases"]: dts += """ -&switches { - litex,ngpio = <4>; +&switches {{ + litex,ngpio = <{ngpio}>; status = "okay"; -}; -""" +}}; +""".format(ngpio=d["constants"].get('switches_ngpio', 4)) return dts