On 09.01.24 10:15, Sascha Hauer wrote:
> Create separate functions from code that can be re-used by upcoming
> LS1028a support.
> 
> Signed-off-by: Sascha Hauer <s.ha...@pengutronix.de>
> ---
>  arch/arm/mach-layerscape/icid.c | 98 +++++++++++++++++++--------------
>  1 file changed, 57 insertions(+), 41 deletions(-)
> 
> diff --git a/arch/arm/mach-layerscape/icid.c b/arch/arm/mach-layerscape/icid.c
> index f0a9dc8063..dd0e160bde 100644
> --- a/arch/arm/mach-layerscape/icid.c
> +++ b/arch/arm/mach-layerscape/icid.c
> @@ -68,6 +68,58 @@ struct icid_id_table {
>       phys_addr_t reg_addr;
>  };
>  
> +static void of_set_iommu_prop(struct device_node *np, phandle iommu_handle,
> +                            int stream_id)
> +{
> +     u32 prop[2];
> +
> +     prop[0] = cpu_to_fdt32(iommu_handle);
> +     prop[1] = cpu_to_fdt32(stream_id);
> +
> +     of_set_property(np, "iommus", prop, sizeof(prop), 1);

I know the code is only moved around, but changing this to
of_property_write_u32_array() would make the intent clearer.

> +}
> +
> +static phandle of_get_iommu_handle(struct device_node *root)
> +{
> +     struct device_node *iommu;
> +
> +     iommu = of_find_compatible_node(root, NULL, "arm,mmu-500");
> +     if (!iommu) {
> +             pr_info("No \"arm,mmu-500\" node found, won't fixup\n");
> +             return 0;
> +     }
> +
> +     return of_node_create_phandle(iommu);
> +}
> +
> +static int of_fixup_icid(struct device_node *root, phandle iommu_handle,
> +                      const struct icid_id_table *icid_table, int num_icid)
> +{
> +     int i;
> +
> +     for (i = 0; i < num_icid; i++) {
> +             const struct icid_id_table *icid = &icid_table[i];
> +             struct device_node *np;
> +
> +             if (!icid->compat)
> +                     continue;
> +
> +             for_each_compatible_node_from(np, root, NULL, icid->compat) {
> +                     struct resource res;
> +
> +                     if (of_address_to_resource(np, 0, &res))
> +                             continue;
> +
> +                     if (res.start == icid->compat_addr) {
> +                             of_set_iommu_prop(np, iommu_handle, icid->id);
> +                             break;
> +                     }
> +             }
> +     }
> +
> +     return 0;
> +}
> +
>  struct fman_icid_id_table {
>       u32 port_id;
>       u32 icid;
> @@ -292,17 +344,6 @@ static int get_fman_port_icid(int port_id, const struct 
> fman_icid_id_table *tbl,
>       return -ENODEV;
>  }
>  
> -static void of_set_iommu_prop(struct device_node *np, phandle iommu_handle,
> -                            int stream_id)
> -{
> -     u32 prop[2];
> -
> -     prop[0] = cpu_to_fdt32(iommu_handle);
> -     prop[1] = cpu_to_fdt32(stream_id);
> -
> -     of_set_property(np, "iommus", prop, sizeof(prop), 1);
> -}
> -
>  static void of_fixup_fman_port_icid_by_compat(struct device_node *root,
>                                              phandle iommu_handle,
>                                              const char *compat)
> @@ -491,40 +532,15 @@ static void of_fixup_qportals(struct device_node *root, 
> phandle iommu_handle)
>       }
>  }
>  
> -static int icid_of_fixup(struct device_node *root, void *context)
> +static int of_fixup_ls1046a(struct device_node *root, void *context)
>  {
> -     int i;
> -     struct device_node *iommu;
>       phandle iommu_handle;
>  
> -     iommu = of_find_compatible_node(root, NULL, "arm,mmu-500");
> -     if (!iommu) {
> -             pr_info("No \"arm,mmu-500\" node found, won't fixup\n");
> +     iommu_handle = of_get_iommu_handle(root);
> +     if (!iommu_handle)
>               return 0;
> -     }
> -
> -     iommu_handle = of_node_create_phandle(iommu);
> -
> -     for (i = 0; i < ARRAY_SIZE(icid_tbl_ls1046a); i++) {
> -             const struct icid_id_table *icid = &icid_tbl_ls1046a[i];
> -             struct device_node *np;
> -
> -             if (!icid->compat)
> -                     continue;
> -
> -             for_each_compatible_node_from(np, root, NULL, icid->compat) {
> -                     struct resource res;
> -
> -                     if (of_address_to_resource(np, 0, &res))
> -                             continue;
> -
> -                     if (res.start == icid->compat_addr) {
> -                             of_set_iommu_prop(np, iommu_handle, icid->id);
> -                             break;
> -                     }
> -             }
> -     }
>  
> +     of_fixup_icid(root, iommu_handle, icid_tbl_ls1046a, 
> ARRAY_SIZE(icid_tbl_ls1046a));
>       of_fixup_fman_icids(root, iommu_handle);
>       of_fixup_qportals(root, iommu_handle);
>  
> @@ -553,5 +569,5 @@ void ls1046a_setup_icids(void)
>  
>       setup_qbman_portals();
>  
> -     of_register_fixup(icid_of_fixup, NULL);
> +     of_register_fixup(of_fixup_ls1046a, NULL);
>  }

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


Reply via email to