• Mathis MARION's avatar
    Kernel 4.4: use fwnode for irq domain · 49dfe034
    Mathis MARION authored
    When creating an IRQ domain, the code used to store a device struct
    pointer in the `of_node` field of the irq_domain struct returned by
    `irq_domain_add_linear`. This was done by casting to a void pointer and
    passing as the first argument of the function.
    
    In the SPEC repository (and supposedly other depending repositories),
    we would then get back the irq_domain struct by calling `irq_find_host`
    with again a device struct pointer casted to a void pointer as the
    argument. The function would compare the addresses of the 2 device
    structs and return the right irq_domain.
    
    This trick was most likely due to the fact that the IRQ domain API was
    conceived around OpenFirmware before version 4.4, and that the project
    should work for ACPI.
    A workaround for kernel 4.7 was written, which involved using a `select`
    function, and passing the address of the device struct as a parameter.
    It was particularly ugly as it would require getting around the
    `irq_find_host` to call immediately `irq_find_matching_fwspec` and pass
    in the address of the wanted device struct as a parameter in a hacky way
    to fit it inside two 32 bit integers.
    
    Kernel version 4.4 introduced fwnodes, which would make easier working
    with ACPI. Instead of repeating the hacky workaround (which would result
    in a kernel error on later kernels when calling irq_domain_add_linear),
    I allocated a fwnode_handle struct before creating a new IRQ domain.
    Then I used the new irq_domain_create_* API to get an irq_domain using
    this fwnode. I also took care of disallocating the fwnode_handle.
    
    On the other end, we can just call `irq_find_matching_fwnode` and pass
    dev.fwnode as a parameter.
    Signed-off-by: 's avatarGwenhael GOAVEC <gwenhael.goavec@femto-st.fr>
    Signed-off-by: 's avatarMathis MARION <mathis.marion@grenoble-inp.org>
    49dfe034
Name
Last commit
Last update
LICENSES Loading commit data...
distribution Loading commit data...
doc Loading commit data...
modules Loading commit data...
platform Loading commit data...
sim Loading commit data...
software Loading commit data...
syn/gsi_pexaria2a/wishbone_demo Loading commit data...
testbench Loading commit data...
tools Loading commit data...
top/gsi_pexaria2a/wishbone_demo Loading commit data...
.gitignore Loading commit data...
.gitlab-ci.yml Loading commit data...
.koji Loading commit data...
CHANGELOG.rst Loading commit data...
Manifest.py Loading commit data...
README.md Loading commit data...
common.mk Loading commit data...