@@ -15,6 +15,8 @@ KUNIT_DEFINE_ACTION_WRAPPER(regmap_exit_action, regmap_exit, struct regmap *);
1515
1616struct regmap_test_priv {
1717 struct device * dev ;
18+ bool * reg_default_called ;
19+ unsigned int reg_default_max ;
1820};
1921
2022struct regmap_test_param {
@@ -118,6 +120,14 @@ static const struct regmap_test_param real_cache_types_only_list[] = {
118120
119121KUNIT_ARRAY_PARAM (real_cache_types_only , real_cache_types_only_list , param_to_desc );
120122
123+ static const struct regmap_test_param flat_cache_types_list [] = {
124+ { .cache = REGCACHE_FLAT , .from_reg = 0 },
125+ { .cache = REGCACHE_FLAT , .from_reg = 0 , .fast_io = true },
126+ { .cache = REGCACHE_FLAT , .from_reg = 0x2001 },
127+ };
128+
129+ KUNIT_ARRAY_PARAM (flat_cache_types , flat_cache_types_list , param_to_desc );
130+
121131static const struct regmap_test_param real_cache_types_list [] = {
122132 { .cache = REGCACHE_FLAT , .from_reg = 0 },
123133 { .cache = REGCACHE_FLAT , .from_reg = 0 , .fast_io = true },
@@ -248,6 +258,37 @@ static bool reg_5_false(struct device *dev, unsigned int reg)
248258 return reg != (param -> from_reg + 5 );
249259}
250260
261+ static unsigned int reg_default_expected (unsigned int reg )
262+ {
263+ return 0x5a5a0000 | (reg & 0xffff );
264+ }
265+
266+ static int reg_default_test_cb (struct device * dev , unsigned int reg ,
267+ unsigned int * def )
268+ {
269+ struct kunit * test = dev_get_drvdata (dev );
270+ struct regmap_test_priv * priv = test -> priv ;
271+
272+ if (priv && priv -> reg_default_called && reg <= priv -> reg_default_max )
273+ priv -> reg_default_called [reg ] = true;
274+
275+ * def = reg_default_expected (reg );
276+ return 0 ;
277+ }
278+
279+ static void expect_reg_default_value (struct kunit * test , struct regmap * map ,
280+ struct regmap_ram_data * data ,
281+ struct regmap_test_priv * priv ,
282+ unsigned int reg )
283+ {
284+ unsigned int val ;
285+
286+ KUNIT_EXPECT_TRUE (test , priv -> reg_default_called [reg ]);
287+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map , reg , & val ));
288+ KUNIT_EXPECT_EQ (test , reg_default_expected (reg ), val );
289+ KUNIT_EXPECT_FALSE (test , data -> read [reg ]);
290+ }
291+
251292static void basic_read_write (struct kunit * test )
252293{
253294 struct regmap * map ;
@@ -628,6 +669,54 @@ static void reg_defaults(struct kunit *test)
628669 KUNIT_EXPECT_EQ (test , config .cache_type == REGCACHE_NONE , data -> read [i ]);
629670}
630671
672+ static void reg_default_callback_populates_flat_cache (struct kunit * test )
673+ {
674+ const struct regmap_test_param * param = test -> param_value ;
675+ struct regmap_test_priv * priv = test -> priv ;
676+ struct regmap * map ;
677+ struct regmap_config config ;
678+ struct regmap_ram_data * data ;
679+ unsigned int reg , val ;
680+ unsigned int defaults_end ;
681+
682+ config = test_regmap_config ;
683+ config .num_reg_defaults = 3 ;
684+ config .max_register = param -> from_reg + BLOCK_TEST_SIZE - 1 ;
685+ config .reg_default_cb = reg_default_test_cb ;
686+
687+ priv -> reg_default_max = config .max_register ;
688+ priv -> reg_default_called = kunit_kcalloc (test , config .max_register + 1 ,
689+ sizeof (* priv -> reg_default_called ),
690+ GFP_KERNEL );
691+ KUNIT_ASSERT_NOT_NULL (test , priv -> reg_default_called );
692+
693+ map = gen_regmap (test , & config , & data );
694+ KUNIT_ASSERT_FALSE (test , IS_ERR (map ));
695+ if (IS_ERR (map ))
696+ return ;
697+
698+ for (reg = 0 ; reg <= config .max_register ; reg ++ )
699+ data -> read [reg ] = false;
700+
701+ defaults_end = param -> from_reg + config .num_reg_defaults - 1 ;
702+
703+ for (reg = param -> from_reg ; reg <= defaults_end ; reg ++ ) {
704+ KUNIT_EXPECT_FALSE (test , priv -> reg_default_called [reg ]);
705+ KUNIT_EXPECT_EQ (test , 0 , regmap_read (map , reg , & val ));
706+ KUNIT_EXPECT_EQ (test , data -> vals [reg ], val );
707+ KUNIT_EXPECT_FALSE (test , data -> read [reg ]);
708+ }
709+
710+ if (param -> from_reg > 0 )
711+ expect_reg_default_value (test , map , data , priv , 0 );
712+
713+ if (defaults_end + 1 <= config .max_register )
714+ expect_reg_default_value (test , map , data , priv , defaults_end + 1 );
715+
716+ if (config .max_register > defaults_end + 1 )
717+ expect_reg_default_value (test , map , data , priv , config .max_register );
718+ }
719+
631720static void reg_defaults_read_dev (struct kunit * test )
632721{
633722 struct regmap * map ;
@@ -2058,6 +2147,8 @@ static struct kunit_case regmap_test_cases[] = {
20582147 KUNIT_CASE_PARAM (write_readonly , regcache_types_gen_params ),
20592148 KUNIT_CASE_PARAM (read_writeonly , regcache_types_gen_params ),
20602149 KUNIT_CASE_PARAM (reg_defaults , regcache_types_gen_params ),
2150+ KUNIT_CASE_PARAM (reg_default_callback_populates_flat_cache ,
2151+ flat_cache_types_gen_params ),
20612152 KUNIT_CASE_PARAM (reg_defaults_read_dev , regcache_types_gen_params ),
20622153 KUNIT_CASE_PARAM (register_patch , regcache_types_gen_params ),
20632154 KUNIT_CASE_PARAM (stride , regcache_types_gen_params ),
0 commit comments