Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: rk808: Reduce shutdown duplication

Rather than having 3 almost-identical functions plus the machinery to
keep track of them, it's far simpler to just dynamically select the
appropriate register field per variant.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Robin Murphy and committed by
Lee Jones
7a52cbcc 90df3a82

+20 -42
+20 -41
drivers/mfd/rk808.c
··· 448 448 449 449 static struct i2c_client *rk808_i2c_client; 450 450 451 - static void rk805_device_shutdown(void) 452 - { 453 - int ret; 454 - struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client); 455 - 456 - if (!rk808) 457 - return; 458 - 459 - ret = regmap_update_bits(rk808->regmap, 460 - RK805_DEV_CTRL_REG, 461 - DEV_OFF, DEV_OFF); 462 - if (ret) 463 - dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n"); 464 - } 465 - 466 451 static void rk805_device_shutdown_prepare(void) 467 452 { 468 453 int ret; ··· 463 478 dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n"); 464 479 } 465 480 466 - static void rk808_device_shutdown(void) 481 + static void rk808_pm_power_off(void) 467 482 { 468 483 int ret; 484 + unsigned int reg, bit; 469 485 struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client); 470 486 471 - if (!rk808) 487 + switch (rk808->variant) { 488 + case RK805_ID: 489 + reg = RK805_DEV_CTRL_REG; 490 + bit = DEV_OFF; 491 + break; 492 + case RK808_ID: 493 + reg = RK808_DEVCTRL_REG, 494 + bit = DEV_OFF_RST; 495 + break; 496 + case RK818_ID: 497 + reg = RK818_DEVCTRL_REG; 498 + bit = DEV_OFF; 499 + break; 500 + default: 472 501 return; 473 - 474 - ret = regmap_update_bits(rk808->regmap, 475 - RK808_DEVCTRL_REG, 476 - DEV_OFF_RST, DEV_OFF_RST); 477 - if (ret) 478 - dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n"); 479 - } 480 - 481 - static void rk818_device_shutdown(void) 482 - { 483 - int ret; 484 - struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client); 485 - 486 - if (!rk808) 487 - return; 488 - 489 - ret = regmap_update_bits(rk808->regmap, 490 - RK818_DEVCTRL_REG, 491 - DEV_OFF, DEV_OFF); 502 + } 503 + ret = regmap_update_bits(rk808->regmap, reg, bit, bit); 492 504 if (ret) 493 505 dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n"); 494 506 } ··· 574 592 nr_pre_init_regs = ARRAY_SIZE(rk805_pre_init_reg); 575 593 cells = rk805s; 576 594 nr_cells = ARRAY_SIZE(rk805s); 577 - rk808->pm_pwroff_fn = rk805_device_shutdown; 578 595 rk808->pm_pwroff_prep_fn = rk805_device_shutdown_prepare; 579 596 break; 580 597 case RK808_ID: ··· 583 602 nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg); 584 603 cells = rk808s; 585 604 nr_cells = ARRAY_SIZE(rk808s); 586 - rk808->pm_pwroff_fn = rk808_device_shutdown; 587 605 break; 588 606 case RK818_ID: 589 607 rk808->regmap_cfg = &rk818_regmap_config; ··· 591 611 nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg); 592 612 cells = rk818s; 593 613 nr_cells = ARRAY_SIZE(rk818s); 594 - rk808->pm_pwroff_fn = rk818_device_shutdown; 595 614 break; 596 615 case RK809_ID: 597 616 case RK817_ID: ··· 652 673 653 674 if (of_property_read_bool(np, "rockchip,system-power-controller")) { 654 675 rk808_i2c_client = client; 655 - pm_power_off = rk808->pm_pwroff_fn; 676 + pm_power_off = rk808_pm_power_off; 656 677 pm_power_off_prepare = rk808->pm_pwroff_prep_fn; 657 678 } 658 679 ··· 673 694 * pm_power_off may points to a function from another module. 674 695 * Check if the pointer is set by us and only then overwrite it. 675 696 */ 676 - if (rk808->pm_pwroff_fn && pm_power_off == rk808->pm_pwroff_fn) 697 + if (pm_power_off == rk808_pm_power_off) 677 698 pm_power_off = NULL; 678 699 679 700 /**
-1
include/linux/mfd/rk808.h
··· 620 620 long variant; 621 621 const struct regmap_config *regmap_cfg; 622 622 const struct regmap_irq_chip *regmap_irq_chip; 623 - void (*pm_pwroff_fn)(void); 624 623 void (*pm_pwroff_prep_fn)(void); 625 624 }; 626 625 #endif /* __LINUX_REGULATOR_RK808_H */