|
39 | 39 | #define PCA963X_LED_PWM 0x2 /* Controlled through PWM */
|
40 | 40 | #define PCA963X_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */
|
41 | 41 |
|
| 42 | +#define PCA963X_MODE1_SLEEP 0x04 /* Normal mode or Low Power mode, oscillator off */ |
42 | 43 | #define PCA963X_MODE2_OUTDRV 0x04 /* Open-drain or totem pole */
|
43 | 44 | #define PCA963X_MODE2_INVRT 0x10 /* Normal or inverted direction */
|
44 | 45 | #define PCA963X_MODE2_DMBLNK 0x20 /* Enable blinking */
|
@@ -362,6 +363,45 @@ static int pca963x_register_leds(struct i2c_client *client,
|
362 | 363 | return ret;
|
363 | 364 | }
|
364 | 365 |
|
| 366 | +#ifdef CONFIG_PM |
| 367 | +static int pca963x_suspend(struct device *dev) |
| 368 | +{ |
| 369 | + struct pca963x *chip; |
| 370 | + u8 reg; |
| 371 | + |
| 372 | + chip = dev_get_drvdata(dev); |
| 373 | + |
| 374 | + reg = i2c_smbus_read_byte_data(chip->client, PCA963X_MODE1); |
| 375 | + reg = reg | (1 << PCA963X_MODE1_SLEEP); |
| 376 | + i2c_smbus_write_byte_data(chip->client, PCA963X_MODE1, reg); |
| 377 | + |
| 378 | + return 0; |
| 379 | +} |
| 380 | + |
| 381 | +static int pca963x_resume(struct device *dev) |
| 382 | +{ |
| 383 | + struct pca963x *chip; |
| 384 | + u8 reg; |
| 385 | + |
| 386 | + chip = dev_get_drvdata(dev); |
| 387 | + |
| 388 | + reg = i2c_smbus_read_byte_data(chip->client, PCA963X_MODE1); |
| 389 | + reg = reg & ~(1 << PCA963X_MODE1_SLEEP); |
| 390 | + i2c_smbus_write_byte_data(chip->client, PCA963X_MODE1, reg); |
| 391 | + |
| 392 | + return 0; |
| 393 | +} |
| 394 | + |
| 395 | +static const struct dev_pm_ops pca963x_pmops = { |
| 396 | + SET_SYSTEM_SLEEP_PM_OPS(pca963x_suspend, pca963x_resume) |
| 397 | +}; |
| 398 | + |
| 399 | +#define PCA963X_SMBUS_PMOPS (&pca963x_pmops) |
| 400 | + |
| 401 | +#else |
| 402 | +#define PCA963X_SMBUS_PMOPS NULL |
| 403 | +#endif |
| 404 | + |
365 | 405 | static const struct of_device_id of_pca963x_match[] = {
|
366 | 406 | { .compatible = "nxp,pca9632", },
|
367 | 407 | { .compatible = "nxp,pca9633", },
|
@@ -412,6 +452,7 @@ static struct i2c_driver pca963x_driver = {
|
412 | 452 | .driver = {
|
413 | 453 | .name = "leds-pca963x",
|
414 | 454 | .of_match_table = of_pca963x_match,
|
| 455 | + .pm = PCA963X_SMBUS_PMOPS |
415 | 456 | },
|
416 | 457 | .probe = pca963x_probe,
|
417 | 458 | .id_table = pca963x_id,
|
|
0 commit comments