@@ -291,33 +291,25 @@ static int pse_pi_get_voltage(struct regulator_dev *rdev)
291
291
return ret ;
292
292
}
293
293
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
-
299
294
static int pse_pi_get_current_limit (struct regulator_dev * rdev )
300
295
{
301
296
struct pse_controller_dev * pcdev = rdev_get_drvdata (rdev );
302
297
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 ;
306
299
s64 tmp_64 ;
307
300
308
301
ops = pcdev -> ops ;
309
302
id = rdev_get_id (rdev );
303
+ if (!ops -> pi_get_pw_limit || !ops -> pi_get_voltage )
304
+ return - EOPNOTSUPP ;
305
+
310
306
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 )
313
309
goto out ;
314
- }
310
+ mW = ret ;
315
311
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 );
321
313
if (!ret ) {
322
314
dev_err (pcdev -> dev , "Voltage null\n" );
323
315
ret = - ERANGE ;
@@ -327,16 +319,7 @@ static int pse_pi_get_current_limit(struct regulator_dev *rdev)
327
319
goto out ;
328
320
uV = ret ;
329
321
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 ;
340
323
tmp_64 *= 1000000000ull ;
341
324
/* uA = mW * 1000000000 / uV */
342
325
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,
351
334
{
352
335
struct pse_controller_dev * pcdev = rdev_get_drvdata (rdev );
353
336
const struct pse_controller_ops * ops ;
354
- int id , ret ;
337
+ int id , mW , ret ;
338
+ s64 tmp_64 ;
355
339
356
340
ops = pcdev -> ops ;
357
- if (!ops -> pi_set_current_limit )
341
+ if (!ops -> pi_set_pw_limit || ! ops -> pi_get_voltage )
358
342
return - EOPNOTSUPP ;
359
343
360
344
if (max_uA > MAX_PI_CURRENT )
361
345
return - ERANGE ;
362
346
363
347
id = rdev_get_id (rdev );
364
348
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 :
366
364
mutex_unlock (& pcdev -> lock );
367
365
368
366
return ret ;
@@ -406,7 +404,7 @@ devm_pse_pi_regulator_register(struct pse_controller_dev *pcdev,
406
404
407
405
rinit_data -> constraints .valid_ops_mask = REGULATOR_CHANGE_STATUS ;
408
406
409
- if (pcdev -> ops -> pi_set_current_limit )
407
+ if (pcdev -> ops -> pi_set_pw_limit )
410
408
rinit_data -> constraints .valid_ops_mask |=
411
409
REGULATOR_CHANGE_CURRENT ;
412
410
@@ -737,23 +735,6 @@ struct pse_control *of_pse_control_get(struct device_node *node)
737
735
}
738
736
EXPORT_SYMBOL_GPL (of_pse_control_get );
739
737
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
-
757
738
/**
758
739
* pse_ethtool_get_status - get status of PSE control
759
740
* @psec: PSE control pointer
@@ -766,11 +747,21 @@ int pse_ethtool_get_status(struct pse_control *psec,
766
747
struct netlink_ext_ack * extack ,
767
748
struct pse_control_status * status )
768
749
{
750
+ const struct pse_controller_ops * ops ;
751
+ struct pse_controller_dev * pcdev ;
769
752
int err ;
770
753
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 );
774
765
775
766
return err ;
776
767
}
0 commit comments