11// SPDX-License-Identifier: GPL-2.0-only
22/*
3- * MFD core driver for Rockchip RK808/RK818
3+ * MFD core driver for Rockchip RK8XX
44 *
55 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
6+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
67 *
78 * Author: Chris Zhong <zyw@rock-chips.com>
89 * Author: Zhang Qing <zhangqing@rock-chips.com>
9- *
10- * Copyright (C) 2016 PHYTEC Messtechnik GmbH
11- *
1210 * Author: Wadim Egorov <w.egorov@phytec.de>
1311 */
1412
15- #include <linux/i2c.h>
1613#include <linux/interrupt.h>
1714#include <linux/mfd/rk808.h>
1815#include <linux/mfd/core.h>
@@ -27,92 +24,6 @@ struct rk808_reg_data {
2724 int value ;
2825};
2926
30- static bool rk808_is_volatile_reg (struct device * dev , unsigned int reg )
31- {
32- /*
33- * Notes:
34- * - Technically the ROUND_30s bit makes RTC_CTRL_REG volatile, but
35- * we don't use that feature. It's better to cache.
36- * - It's unlikely we care that RK808_DEVCTRL_REG is volatile since
37- * bits are cleared in case when we shutoff anyway, but better safe.
38- */
39-
40- switch (reg ) {
41- case RK808_SECONDS_REG ... RK808_WEEKS_REG :
42- case RK808_RTC_STATUS_REG :
43- case RK808_VB_MON_REG :
44- case RK808_THERMAL_REG :
45- case RK808_DCDC_UV_STS_REG :
46- case RK808_LDO_UV_STS_REG :
47- case RK808_DCDC_PG_REG :
48- case RK808_LDO_PG_REG :
49- case RK808_DEVCTRL_REG :
50- case RK808_INT_STS_REG1 :
51- case RK808_INT_STS_REG2 :
52- return true;
53- }
54-
55- return false;
56- }
57-
58- static bool rk817_is_volatile_reg (struct device * dev , unsigned int reg )
59- {
60- /*
61- * Notes:
62- * - Technically the ROUND_30s bit makes RTC_CTRL_REG volatile, but
63- * we don't use that feature. It's better to cache.
64- */
65-
66- switch (reg ) {
67- case RK817_SECONDS_REG ... RK817_WEEKS_REG :
68- case RK817_RTC_STATUS_REG :
69- case RK817_CODEC_DTOP_LPT_SRST :
70- case RK817_GAS_GAUGE_ADC_CONFIG0 ... RK817_GAS_GAUGE_CUR_ADC_K0 :
71- case RK817_PMIC_CHRG_STS :
72- case RK817_PMIC_CHRG_OUT :
73- case RK817_PMIC_CHRG_IN :
74- case RK817_INT_STS_REG0 :
75- case RK817_INT_STS_REG1 :
76- case RK817_INT_STS_REG2 :
77- case RK817_SYS_STS :
78- return true;
79- }
80-
81- return false;
82- }
83-
84- static const struct regmap_config rk818_regmap_config = {
85- .reg_bits = 8 ,
86- .val_bits = 8 ,
87- .max_register = RK818_USB_CTRL_REG ,
88- .cache_type = REGCACHE_RBTREE ,
89- .volatile_reg = rk808_is_volatile_reg ,
90- };
91-
92- static const struct regmap_config rk805_regmap_config = {
93- .reg_bits = 8 ,
94- .val_bits = 8 ,
95- .max_register = RK805_OFF_SOURCE_REG ,
96- .cache_type = REGCACHE_RBTREE ,
97- .volatile_reg = rk808_is_volatile_reg ,
98- };
99-
100- static const struct regmap_config rk808_regmap_config = {
101- .reg_bits = 8 ,
102- .val_bits = 8 ,
103- .max_register = RK808_IO_POL_REG ,
104- .cache_type = REGCACHE_RBTREE ,
105- .volatile_reg = rk808_is_volatile_reg ,
106- };
107-
108- static const struct regmap_config rk817_regmap_config = {
109- .reg_bits = 8 ,
110- .val_bits = 8 ,
111- .max_register = RK817_GPIO_INT_CFG ,
112- .cache_type = REGCACHE_NONE ,
113- .volatile_reg = rk817_is_volatile_reg ,
114- };
115-
11627static const struct resource rtc_resources [] = {
11728 DEFINE_RES_IRQ (RK808_IRQ_RTC_ALARM ),
11829};
@@ -605,9 +516,9 @@ static int rk808_restart(struct sys_off_data *data)
605516 return NOTIFY_DONE ;
606517}
607518
608- static void rk8xx_shutdown (struct i2c_client * client )
519+ void rk8xx_shutdown (struct device * dev )
609520{
610- struct rk808 * rk808 = i2c_get_clientdata ( client );
521+ struct rk808 * rk808 = dev_get_drvdata ( dev );
611522 int ret ;
612523
613524 switch (rk808 -> variant ) {
@@ -628,77 +539,45 @@ static void rk8xx_shutdown(struct i2c_client *client)
628539 return ;
629540 }
630541 if (ret )
631- dev_warn (& client -> dev ,
542+ dev_warn (dev ,
632543 "Cannot switch to power down function\n" );
633544}
545+ EXPORT_SYMBOL_GPL (rk8xx_shutdown );
634546
635- static const struct of_device_id rk808_of_match [] = {
636- { .compatible = "rockchip,rk805" },
637- { .compatible = "rockchip,rk808" },
638- { .compatible = "rockchip,rk809" },
639- { .compatible = "rockchip,rk817" },
640- { .compatible = "rockchip,rk818" },
641- { },
642- };
643- MODULE_DEVICE_TABLE (of , rk808_of_match );
644-
645- static int rk808_probe (struct i2c_client * client )
547+ int rk8xx_probe (struct device * dev , int variant , unsigned int irq , struct regmap * regmap )
646548{
647- struct device_node * np = client -> dev .of_node ;
648549 struct rk808 * rk808 ;
649550 const struct rk808_reg_data * pre_init_reg ;
650551 const struct mfd_cell * cells ;
651552 int nr_pre_init_regs ;
652553 int nr_cells ;
653- int msb , lsb ;
654- unsigned char pmic_id_msb , pmic_id_lsb ;
655554 int ret ;
656555 int i ;
657556
658- rk808 = devm_kzalloc (& client -> dev , sizeof (* rk808 ), GFP_KERNEL );
557+ rk808 = devm_kzalloc (dev , sizeof (* rk808 ), GFP_KERNEL );
659558 if (!rk808 )
660559 return - ENOMEM ;
661-
662- if (of_device_is_compatible (np , "rockchip,rk817" ) ||
663- of_device_is_compatible (np , "rockchip,rk809" )) {
664- pmic_id_msb = RK817_ID_MSB ;
665- pmic_id_lsb = RK817_ID_LSB ;
666- } else {
667- pmic_id_msb = RK808_ID_MSB ;
668- pmic_id_lsb = RK808_ID_LSB ;
669- }
670-
671- /* Read chip variant */
672- msb = i2c_smbus_read_byte_data (client , pmic_id_msb );
673- if (msb < 0 )
674- return dev_err_probe (& client -> dev , msb , "failed to read the chip id MSB\n" );
675-
676- lsb = i2c_smbus_read_byte_data (client , pmic_id_lsb );
677- if (lsb < 0 )
678- return dev_err_probe (& client -> dev , lsb , "failed to read the chip id LSB\n" );
679-
680- rk808 -> variant = ((msb << 8 ) | lsb ) & RK8XX_ID_MSK ;
681- dev_info (& client -> dev , "chip id: 0x%x\n" , (unsigned int )rk808 -> variant );
560+ rk808 -> dev = dev ;
561+ rk808 -> variant = variant ;
562+ rk808 -> regmap = regmap ;
563+ dev_set_drvdata (dev , rk808 );
682564
683565 switch (rk808 -> variant ) {
684566 case RK805_ID :
685- rk808 -> regmap_cfg = & rk805_regmap_config ;
686567 rk808 -> regmap_irq_chip = & rk805_irq_chip ;
687568 pre_init_reg = rk805_pre_init_reg ;
688569 nr_pre_init_regs = ARRAY_SIZE (rk805_pre_init_reg );
689570 cells = rk805s ;
690571 nr_cells = ARRAY_SIZE (rk805s );
691572 break ;
692573 case RK808_ID :
693- rk808 -> regmap_cfg = & rk808_regmap_config ;
694574 rk808 -> regmap_irq_chip = & rk808_irq_chip ;
695575 pre_init_reg = rk808_pre_init_reg ;
696576 nr_pre_init_regs = ARRAY_SIZE (rk808_pre_init_reg );
697577 cells = rk808s ;
698578 nr_cells = ARRAY_SIZE (rk808s );
699579 break ;
700580 case RK818_ID :
701- rk808 -> regmap_cfg = & rk818_regmap_config ;
702581 rk808 -> regmap_irq_chip = & rk818_irq_chip ;
703582 pre_init_reg = rk818_pre_init_reg ;
704583 nr_pre_init_regs = ARRAY_SIZE (rk818_pre_init_reg );
@@ -707,81 +586,74 @@ static int rk808_probe(struct i2c_client *client)
707586 break ;
708587 case RK809_ID :
709588 case RK817_ID :
710- rk808 -> regmap_cfg = & rk817_regmap_config ;
711589 rk808 -> regmap_irq_chip = & rk817_irq_chip ;
712590 pre_init_reg = rk817_pre_init_reg ;
713591 nr_pre_init_regs = ARRAY_SIZE (rk817_pre_init_reg );
714592 cells = rk817s ;
715593 nr_cells = ARRAY_SIZE (rk817s );
716594 break ;
717595 default :
718- dev_err (& client -> dev , "Unsupported RK8XX ID %lu\n" ,
719- rk808 -> variant );
596+ dev_err (dev , "Unsupported RK8XX ID %lu\n" , rk808 -> variant );
720597 return - EINVAL ;
721598 }
722599
723- rk808 -> dev = & client -> dev ;
724- i2c_set_clientdata (client , rk808 );
725-
726- rk808 -> regmap = devm_regmap_init_i2c (client , rk808 -> regmap_cfg );
727- if (IS_ERR (rk808 -> regmap ))
728- return dev_err_probe (& client -> dev , PTR_ERR (rk808 -> regmap ),
729- "regmap initialization failed\n" );
600+ dev_info (dev , "chip id: 0x%x\n" , (unsigned int )rk808 -> variant );
730601
731- if (!client -> irq )
732- return dev_err_probe (& client -> dev , - EINVAL , "No interrupt support, no core IRQ\n" );
602+ if (!irq )
603+ return dev_err_probe (dev , - EINVAL , "No interrupt support, no core IRQ\n" );
733604
734- ret = devm_regmap_add_irq_chip (& client -> dev , rk808 -> regmap , client -> irq ,
605+ ret = devm_regmap_add_irq_chip (dev , rk808 -> regmap , irq ,
735606 IRQF_ONESHOT , -1 ,
736607 rk808 -> regmap_irq_chip , & rk808 -> irq_data );
737608 if (ret )
738- return dev_err_probe (& client -> dev , ret , "Failed to add irq_chip\n" );
609+ return dev_err_probe (dev , ret , "Failed to add irq_chip\n" );
739610
740611 for (i = 0 ; i < nr_pre_init_regs ; i ++ ) {
741612 ret = regmap_update_bits (rk808 -> regmap ,
742613 pre_init_reg [i ].addr ,
743614 pre_init_reg [i ].mask ,
744615 pre_init_reg [i ].value );
745616 if (ret )
746- return dev_err_probe (& client -> dev , ret , "0x%x write err\n" ,
617+ return dev_err_probe (dev , ret , "0x%x write err\n" ,
747618 pre_init_reg [i ].addr );
748619 }
749620
750- ret = devm_mfd_add_devices (& client -> dev , PLATFORM_DEVID_NONE ,
621+ ret = devm_mfd_add_devices (dev , PLATFORM_DEVID_NONE ,
751622 cells , nr_cells , NULL , 0 ,
752623 regmap_irq_get_domain (rk808 -> irq_data ));
753624 if (ret )
754- return dev_err_probe (& client -> dev , ret , "failed to add MFD devices\n" );
625+ return dev_err_probe (dev , ret , "failed to add MFD devices\n" );
755626
756- if (of_property_read_bool ( np , "rockchip,system-power-controller" )) {
757- ret = devm_register_sys_off_handler (& client -> dev ,
627+ if (device_property_read_bool ( dev , "rockchip,system-power-controller" )) {
628+ ret = devm_register_sys_off_handler (dev ,
758629 SYS_OFF_MODE_POWER_OFF_PREPARE , SYS_OFF_PRIO_HIGH ,
759630 & rk808_power_off , rk808 );
760631 if (ret )
761- return dev_err_probe (& client -> dev , ret ,
632+ return dev_err_probe (dev , ret ,
762633 "failed to register poweroff handler\n" );
763634
764635 switch (rk808 -> variant ) {
765636 case RK809_ID :
766637 case RK817_ID :
767- ret = devm_register_sys_off_handler (& client -> dev ,
638+ ret = devm_register_sys_off_handler (dev ,
768639 SYS_OFF_MODE_RESTART , SYS_OFF_PRIO_HIGH ,
769640 & rk808_restart , rk808 );
770641 if (ret )
771- dev_warn (& client -> dev , "failed to register rst handler, %d\n" , ret );
642+ dev_warn (dev , "failed to register rst handler, %d\n" , ret );
772643 break ;
773644 default :
774- dev_dbg (& client -> dev , "pmic controlled board reset not supported\n" );
645+ dev_dbg (dev , "pmic controlled board reset not supported\n" );
775646 break ;
776647 }
777648 }
778649
779650 return 0 ;
780651}
652+ EXPORT_SYMBOL_GPL (rk8xx_probe );
781653
782- static int __maybe_unused rk8xx_suspend (struct device * dev )
654+ int rk8xx_suspend (struct device * dev )
783655{
784- struct rk808 * rk808 = i2c_get_clientdata ( to_i2c_client ( dev ) );
656+ struct rk808 * rk808 = dev_get_drvdata ( dev );
785657 int ret = 0 ;
786658
787659 switch (rk808 -> variant ) {
@@ -804,10 +676,11 @@ static int __maybe_unused rk8xx_suspend(struct device *dev)
804676
805677 return ret ;
806678}
679+ EXPORT_SYMBOL_GPL (rk8xx_suspend );
807680
808- static int __maybe_unused rk8xx_resume (struct device * dev )
681+ int rk8xx_resume (struct device * dev )
809682{
810- struct rk808 * rk808 = i2c_get_clientdata ( to_i2c_client ( dev ) );
683+ struct rk808 * rk808 = dev_get_drvdata ( dev );
811684 int ret = 0 ;
812685
813686 switch (rk808 -> variant ) {
@@ -824,22 +697,10 @@ static int __maybe_unused rk8xx_resume(struct device *dev)
824697
825698 return ret ;
826699}
827- static SIMPLE_DEV_PM_OPS (rk8xx_pm_ops , rk8xx_suspend , rk8xx_resume ) ;
828-
829- static struct i2c_driver rk808_i2c_driver = {
830- .driver = {
831- .name = "rk808" ,
832- .of_match_table = rk808_of_match ,
833- .pm = & rk8xx_pm_ops ,
834- },
835- .probe_new = rk808_probe ,
836- .shutdown = rk8xx_shutdown ,
837- };
838-
839- module_i2c_driver (rk808_i2c_driver );
700+ EXPORT_SYMBOL_GPL (rk8xx_resume );
840701
841702MODULE_LICENSE ("GPL" );
842703MODULE_AUTHOR ("Chris Zhong <zyw@rock-chips.com>" );
843704MODULE_AUTHOR ("Zhang Qing <zhangqing@rock-chips.com>" );
844705MODULE_AUTHOR ("Wadim Egorov <w.egorov@phytec.de>" );
845- MODULE_DESCRIPTION ("RK808/RK818 PMIC driver " );
706+ MODULE_DESCRIPTION ("RK8xx PMIC core " );
0 commit comments