@@ -291,33 +291,25 @@ static int pse_pi_get_voltage(struct regulator_dev *rdev)
291291 return ret ;
292292}
293293
294- static int _pse_ethtool_get_status (struct pse_controller_dev * pcdev ,
295- int id ,
296- struct netlink_ext_ack * extack ,
297- struct pse_control_status * status );
298-
299294static int pse_pi_get_current_limit (struct regulator_dev * rdev )
300295{
301296 struct pse_controller_dev * pcdev = rdev_get_drvdata (rdev );
302297 const struct pse_controller_ops * ops ;
303- struct netlink_ext_ack extack = {};
304- struct pse_control_status st = {};
305- int id , uV , ret ;
298+ int id , uV , mW , ret ;
306299 s64 tmp_64 ;
307300
308301 ops = pcdev -> ops ;
309302 id = rdev_get_id (rdev );
303+ if (!ops -> pi_get_pw_limit || !ops -> pi_get_voltage )
304+ return - EOPNOTSUPP ;
305+
310306 mutex_lock (& pcdev -> lock );
311- if ( ops -> pi_get_current_limit ) {
312- ret = ops -> pi_get_current_limit ( pcdev , id );
307+ ret = ops -> pi_get_pw_limit ( pcdev , id );
308+ if ( ret < 0 )
313309 goto out ;
314- }
310+ mW = ret ;
315311
316- /* If pi_get_current_limit() callback not populated get voltage
317- * from pi_get_voltage() and power limit from ethtool_get_status()
318- * to calculate current limit.
319- */
320- ret = _pse_pi_get_voltage (rdev );
312+ ret = pse_pi_get_voltage (rdev );
321313 if (!ret ) {
322314 dev_err (pcdev -> dev , "Voltage null\n" );
323315 ret = - ERANGE ;
@@ -327,16 +319,7 @@ static int pse_pi_get_current_limit(struct regulator_dev *rdev)
327319 goto out ;
328320 uV = ret ;
329321
330- ret = _pse_ethtool_get_status (pcdev , id , & extack , & st );
331- if (ret )
332- goto out ;
333-
334- if (!st .c33_avail_pw_limit ) {
335- ret = - ENODATA ;
336- goto out ;
337- }
338-
339- tmp_64 = st .c33_avail_pw_limit ;
322+ tmp_64 = mW ;
340323 tmp_64 *= 1000000000ull ;
341324 /* uA = mW * 1000000000 / uV */
342325 ret = DIV_ROUND_CLOSEST_ULL (tmp_64 , uV );
@@ -351,18 +334,33 @@ static int pse_pi_set_current_limit(struct regulator_dev *rdev, int min_uA,
351334{
352335 struct pse_controller_dev * pcdev = rdev_get_drvdata (rdev );
353336 const struct pse_controller_ops * ops ;
354- int id , ret ;
337+ int id , mW , ret ;
338+ s64 tmp_64 ;
355339
356340 ops = pcdev -> ops ;
357- if (!ops -> pi_set_current_limit )
341+ if (!ops -> pi_set_pw_limit || ! ops -> pi_get_voltage )
358342 return - EOPNOTSUPP ;
359343
360344 if (max_uA > MAX_PI_CURRENT )
361345 return - ERANGE ;
362346
363347 id = rdev_get_id (rdev );
364348 mutex_lock (& pcdev -> lock );
365- ret = ops -> pi_set_current_limit (pcdev , id , max_uA );
349+ ret = pse_pi_get_voltage (rdev );
350+ if (!ret ) {
351+ dev_err (pcdev -> dev , "Voltage null\n" );
352+ ret = - ERANGE ;
353+ goto out ;
354+ }
355+ if (ret < 0 )
356+ goto out ;
357+
358+ tmp_64 = ret ;
359+ tmp_64 *= max_uA ;
360+ /* mW = uA * uV / 1000000000 */
361+ mW = DIV_ROUND_CLOSEST_ULL (tmp_64 , 1000000000 );
362+ ret = ops -> pi_set_pw_limit (pcdev , id , mW );
363+ out :
366364 mutex_unlock (& pcdev -> lock );
367365
368366 return ret ;
@@ -406,7 +404,7 @@ devm_pse_pi_regulator_register(struct pse_controller_dev *pcdev,
406404
407405 rinit_data -> constraints .valid_ops_mask = REGULATOR_CHANGE_STATUS ;
408406
409- if (pcdev -> ops -> pi_set_current_limit )
407+ if (pcdev -> ops -> pi_set_pw_limit )
410408 rinit_data -> constraints .valid_ops_mask |=
411409 REGULATOR_CHANGE_CURRENT ;
412410
@@ -737,23 +735,6 @@ struct pse_control *of_pse_control_get(struct device_node *node)
737735}
738736EXPORT_SYMBOL_GPL (of_pse_control_get );
739737
740- static int _pse_ethtool_get_status (struct pse_controller_dev * pcdev ,
741- int id ,
742- struct netlink_ext_ack * extack ,
743- struct pse_control_status * status )
744- {
745- const struct pse_controller_ops * ops ;
746-
747- ops = pcdev -> ops ;
748- if (!ops -> ethtool_get_status ) {
749- NL_SET_ERR_MSG (extack ,
750- "PSE driver does not support status report" );
751- return - EOPNOTSUPP ;
752- }
753-
754- return ops -> ethtool_get_status (pcdev , id , extack , status );
755- }
756-
757738/**
758739 * pse_ethtool_get_status - get status of PSE control
759740 * @psec: PSE control pointer
@@ -766,11 +747,21 @@ int pse_ethtool_get_status(struct pse_control *psec,
766747 struct netlink_ext_ack * extack ,
767748 struct pse_control_status * status )
768749{
750+ const struct pse_controller_ops * ops ;
751+ struct pse_controller_dev * pcdev ;
769752 int err ;
770753
771- mutex_lock (& psec -> pcdev -> lock );
772- err = _pse_ethtool_get_status (psec -> pcdev , psec -> id , extack , status );
773- mutex_unlock (& psec -> pcdev -> lock );
754+ pcdev = psec -> pcdev ;
755+ ops = pcdev -> ops ;
756+ if (!ops -> ethtool_get_status ) {
757+ NL_SET_ERR_MSG (extack ,
758+ "PSE driver does not support status report" );
759+ return - EOPNOTSUPP ;
760+ }
761+
762+ mutex_lock (& pcdev -> lock );
763+ err = ops -> ethtool_get_status (pcdev , psec -> id , extack , status );
764+ mutex_unlock (& pcdev -> lock );
774765
775766 return err ;
776767}
0 commit comments