@@ -313,12 +313,14 @@ static int i2c_smbus_host_notify_to_irq(const struct i2c_client *client)
313
313
static int i2c_device_probe (struct device * dev )
314
314
{
315
315
struct i2c_client * client = i2c_verify_client (dev );
316
+ struct i2c_adapter * adap ;
316
317
struct i2c_driver * driver ;
317
318
int status ;
318
319
319
320
if (!client )
320
321
return 0 ;
321
322
323
+ adap = client -> adapter ;
322
324
driver = to_i2c_driver (dev -> driver );
323
325
324
326
client -> irq = client -> init_irq ;
@@ -378,6 +380,12 @@ static int i2c_device_probe(struct device *dev)
378
380
379
381
dev_dbg (dev , "probe\n" );
380
382
383
+ status = regulator_enable (adap -> bus_regulator );
384
+ if (status < 0 ) {
385
+ dev_err (& adap -> dev , "Failed to enable power regulator\n" );
386
+ goto err_clear_wakeup_irq ;
387
+ }
388
+
381
389
status = of_clk_set_defaults (dev -> of_node , false);
382
390
if (status < 0 )
383
391
goto err_clear_wakeup_irq ;
@@ -414,19 +422,23 @@ static int i2c_device_probe(struct device *dev)
414
422
static int i2c_device_remove (struct device * dev )
415
423
{
416
424
struct i2c_client * client = i2c_verify_client (dev );
425
+ struct i2c_adapter * adap ;
417
426
struct i2c_driver * driver ;
418
427
int status = 0 ;
419
428
420
429
if (!client || !dev -> driver )
421
430
return 0 ;
422
431
432
+ adap = client -> adapter ;
423
433
driver = to_i2c_driver (dev -> driver );
424
434
if (driver -> remove ) {
425
435
dev_dbg (dev , "remove\n" );
426
436
status = driver -> remove (client );
427
437
}
428
438
429
439
dev_pm_domain_detach (& client -> dev , true);
440
+ if (!pm_runtime_status_suspended (& client -> dev ))
441
+ regulator_disable (adap -> bus_regulator );
430
442
431
443
dev_pm_clear_wake_irq (& client -> dev );
432
444
device_init_wakeup (& client -> dev , false);
@@ -438,6 +450,72 @@ static int i2c_device_remove(struct device *dev)
438
450
return status ;
439
451
}
440
452
453
+ #ifdef CONFIG_PM_SLEEP
454
+ static int i2c_resume_early (struct device * dev )
455
+ {
456
+ struct i2c_client * client = i2c_verify_client (dev );
457
+ struct i2c_adapter * adap = client -> adapter ;
458
+ int err ;
459
+
460
+ if (!pm_runtime_status_suspended (& client -> dev )) {
461
+ err = regulator_enable (adap -> bus_regulator );
462
+ if (err )
463
+ return err ;
464
+ }
465
+
466
+ return pm_generic_resume_early (& client -> dev );
467
+ }
468
+
469
+ static int i2c_suspend_late (struct device * dev )
470
+ {
471
+ struct i2c_client * client = i2c_verify_client (dev );
472
+ struct i2c_adapter * adap = client -> adapter ;
473
+ int err ;
474
+
475
+ err = pm_generic_suspend_late (& client -> dev );
476
+ if (err )
477
+ return err ;
478
+
479
+ if (!pm_runtime_status_suspended (& client -> dev ))
480
+ return regulator_disable (adap -> bus_regulator );
481
+
482
+ return 0 ;
483
+ }
484
+ #endif
485
+
486
+ #ifdef CONFIG_PM
487
+ static int i2c_runtime_resume (struct device * dev )
488
+ {
489
+ struct i2c_client * client = i2c_verify_client (dev );
490
+ struct i2c_adapter * adap = client -> adapter ;
491
+ int err ;
492
+
493
+ err = regulator_enable (adap -> bus_regulator );
494
+ if (err )
495
+ return err ;
496
+
497
+ return pm_generic_runtime_resume (& client -> dev );
498
+ }
499
+
500
+ static int i2c_runtime_suspend (struct device * dev )
501
+ {
502
+ struct i2c_client * client = i2c_verify_client (dev );
503
+ struct i2c_adapter * adap = client -> adapter ;
504
+ int err ;
505
+
506
+ err = pm_generic_runtime_suspend (& client -> dev );
507
+ if (err )
508
+ return err ;
509
+
510
+ return regulator_disable (adap -> bus_regulator );
511
+ }
512
+ #endif
513
+
514
+ static const struct dev_pm_ops i2c_device_pm = {
515
+ SET_LATE_SYSTEM_SLEEP_PM_OPS (i2c_suspend_late , i2c_resume_early )
516
+ SET_RUNTIME_PM_OPS (i2c_runtime_suspend , i2c_runtime_resume , NULL )
517
+ };
518
+
441
519
static void i2c_device_shutdown (struct device * dev )
442
520
{
443
521
struct i2c_client * client = i2c_verify_client (dev );
@@ -495,6 +573,7 @@ struct bus_type i2c_bus_type = {
495
573
.probe = i2c_device_probe ,
496
574
.remove = i2c_device_remove ,
497
575
.shutdown = i2c_device_shutdown ,
576
+ .pm = & i2c_device_pm ,
498
577
};
499
578
EXPORT_SYMBOL_GPL (i2c_bus_type );
500
579
@@ -1333,6 +1412,11 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
1333
1412
if (res )
1334
1413
goto out_reg ;
1335
1414
1415
+ adap -> bus_regulator = devm_regulator_get (& adap -> dev , "bus" );
1416
+ if (IS_ERR (adap -> bus_regulator )) {
1417
+ res = PTR_ERR (adap -> bus_regulator );
1418
+ goto out_reg ;
1419
+ }
1336
1420
dev_dbg (& adap -> dev , "adapter [%s] registered\n" , adap -> name );
1337
1421
1338
1422
pm_runtime_no_callbacks (& adap -> dev );
0 commit comments