Skip to content

Commit b44e6bf

Browse files
feat(kernel/pca963x): implement power management
This implements power management in upstream driver for pca9633 which enables device sleep and resume on system-wide sleep/hibernation
1 parent 05292f1 commit b44e6bf

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

drivers/leds/leds-pca963x.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#define PCA963X_LED_PWM 0x2 /* Controlled through PWM */
4040
#define PCA963X_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */
4141

42+
#define PCA963X_MODE1_SLEEP 0x04 /* Normal mode or Low Power mode, oscillator off */
4243
#define PCA963X_MODE2_OUTDRV 0x04 /* Open-drain or totem pole */
4344
#define PCA963X_MODE2_INVRT 0x10 /* Normal or inverted direction */
4445
#define PCA963X_MODE2_DMBLNK 0x20 /* Enable blinking */
@@ -362,6 +363,45 @@ static int pca963x_register_leds(struct i2c_client *client,
362363
return ret;
363364
}
364365

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+
365405
static const struct of_device_id of_pca963x_match[] = {
366406
{ .compatible = "nxp,pca9632", },
367407
{ .compatible = "nxp,pca9633", },
@@ -412,6 +452,7 @@ static struct i2c_driver pca963x_driver = {
412452
.driver = {
413453
.name = "leds-pca963x",
414454
.of_match_table = of_pca963x_match,
455+
.pm = PCA963X_SMBUS_PMOPS
415456
},
416457
.probe = pca963x_probe,
417458
.id_table = pca963x_id,

0 commit comments

Comments
 (0)