@@ -4248,51 +4248,62 @@ static struct rtpcs_serdes *rtpcs_find_serdes(struct rtpcs_ctrl *ctrl,
42484248static int rtpcs_map_links (struct device * dev , struct rtpcs_ctrl * ctrl )
42494249{
42504250 struct fwnode_handle * fw_dev = dev_fwnode (dev );
4251- struct fwnode_handle * fw_switch __free (fwnode_handle ) = fwnode_get_parent (fw_dev );
4251+ struct fwnode_handle * fw_switch , * fw_ports ;
4252+ int ret = 0 ;
4253+
4254+ fw_switch = fwnode_get_parent (fw_dev );
42524255 if (!fw_switch )
42534256 return - ENODEV ;
42544257
4255- struct fwnode_handle * fw_ports __free (fwnode_handle ) =
4256- fwnode_get_named_child_node (fw_switch , "ethernet-ports" );
4257- if (!fw_ports )
4258- return dev_err_probe (dev , - ENODEV , "%pfwP missing ethernet-ports\n" , fw_switch );
4258+ fw_ports = fwnode_get_named_child_node (fw_switch , "ethernet-ports" );
4259+ if (!fw_ports ) {
4260+ ret = dev_err_probe (dev , - ENODEV , "%pfwP missing ethernet-ports\n" ,
4261+ fw_switch );
4262+ goto put_switch ;
4263+ }
42594264
42604265 fwnode_for_each_child_node_scoped (fw_ports , fw_port ) {
42614266 struct fwnode_reference_args args ;
42624267 struct rtpcs_serdes * sds ;
4263- int link_idx , ret ;
4268+ int link_idx ;
42644269 u32 pn ;
42654270
42664271 if (fwnode_property_read_u32 (fw_port , "reg" , & pn ))
42674272 continue ;
42684273
4269- ret = fwnode_property_get_reference_args (fw_port , "pcs-handle" , "#pcs-cells" ,
4270- -1 , 0 , & args );
4271- if (ret )
4274+ if (fwnode_property_get_reference_args (fw_port , "pcs-handle" , "#pcs-cells" ,
4275+ -1 , 0 , & args ))
42724276 continue ;
42734277
4274- struct fwnode_handle * fw_pcs __free (fwnode_handle ) = args .fwnode ;
42754278 link_idx = args .args [0 ];
4276-
4277- if (link_idx >= RTPCS_MAX_LINKS_PER_SDS )
4278- return dev_err_probe (dev , - ERANGE ,
4279- "%pfwP: pcs-handle link %d exceeds max %u\n" ,
4280- fw_port , link_idx , RTPCS_MAX_LINKS_PER_SDS );
4281-
4282- sds = rtpcs_find_serdes (ctrl , fw_pcs );
4279+ sds = rtpcs_find_serdes (ctrl , args .fwnode );
4280+ fwnode_handle_put (args .fwnode );
42834281 if (!sds )
42844282 continue ;
42854283
4286- if (sds -> link_port [link_idx ] >= 0 )
4287- return dev_err_probe (dev , - EEXIST ,
4288- "%pfwP: sds%u link %d already assigned to port %d\n" ,
4289- fw_port , sds -> id , link_idx , sds -> link_port [link_idx ]);
4284+ if (link_idx >= RTPCS_MAX_LINKS_PER_SDS ) {
4285+ ret = dev_err_probe (dev , - ERANGE ,
4286+ "%pfwP: pcs-handle link %d exceeds max %u\n" ,
4287+ fw_port , link_idx , RTPCS_MAX_LINKS_PER_SDS );
4288+ break ;
4289+ }
4290+
4291+ if (sds -> link_port [link_idx ] >= 0 ) {
4292+ ret = dev_err_probe (dev , - EEXIST ,
4293+ "%pfwP: sds%u link %d already assigned to port %d\n" ,
4294+ fw_port , sds -> id , link_idx ,
4295+ sds -> link_port [link_idx ]);
4296+ break ;
4297+ }
42904298
42914299 sds -> link_port [link_idx ] = pn ;
42924300 sds -> num_of_links ++ ;
42934301 }
42944302
4295- return 0 ;
4303+ fwnode_handle_put (fw_ports );
4304+ put_switch :
4305+ fwnode_handle_put (fw_switch );
4306+ return ret ;
42964307}
42974308
42984309static struct phylink_pcs * rtpcs_pcs_get (struct fwnode_reference_args * pcsspec , void * data )
0 commit comments