@@ -40,6 +40,7 @@ struct da9121 {
4040 unsigned int passive_delay ;
4141 int chip_irq ;
4242 int variant_id ;
43+ int subvariant_id ;
4344};
4445
4546/* Define ranges for different variants, enabling translation to/from
@@ -812,7 +813,6 @@ static struct regmap_config da9121_2ch_regmap_config = {
812813static int da9121_check_device_type (struct i2c_client * i2c , struct da9121 * chip )
813814{
814815 u32 device_id ;
815- u8 chip_id = chip -> variant_id ;
816816 u32 variant_id ;
817817 u8 variant_mrc , variant_vrc ;
818818 char * type ;
@@ -839,22 +839,34 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
839839
840840 variant_vrc = variant_id & DA9121_MASK_OTP_VARIANT_ID_VRC ;
841841
842- switch (variant_vrc ) {
843- case DA9121_VARIANT_VRC :
844- type = "DA9121/DA9130 " ;
845- config_match = (chip_id == DA9121_TYPE_DA9121_DA9130 );
842+ switch (chip -> subvariant_id ) {
843+ case DA9121_SUBTYPE_DA9121 :
844+ type = "DA9121" ;
845+ config_match = (variant_vrc == DA9121_VARIANT_VRC );
846846 break ;
847- case DA9220_VARIANT_VRC :
848- type = "DA9220/DA9132 " ;
849- config_match = (chip_id == DA9121_TYPE_DA9220_DA9132 );
847+ case DA9121_SUBTYPE_DA9130 :
848+ type = "DA9130 " ;
849+ config_match = (variant_vrc == DA9130_VARIANT_VRC );
850850 break ;
851- case DA9122_VARIANT_VRC :
852- type = "DA9122/DA9131 " ;
853- config_match = (chip_id == DA9121_TYPE_DA9122_DA9131 );
851+ case DA9121_SUBTYPE_DA9220 :
852+ type = "DA9220 " ;
853+ config_match = (variant_vrc == DA9220_VARIANT_VRC );
854854 break ;
855- case DA9217_VARIANT_VRC :
855+ case DA9121_SUBTYPE_DA9132 :
856+ type = "DA9132" ;
857+ config_match = (variant_vrc == DA9132_VARIANT_VRC );
858+ break ;
859+ case DA9121_SUBTYPE_DA9122 :
860+ type = "DA9122" ;
861+ config_match = (variant_vrc == DA9122_VARIANT_VRC );
862+ break ;
863+ case DA9121_SUBTYPE_DA9131 :
864+ type = "DA9131" ;
865+ config_match = (variant_vrc == DA9131_VARIANT_VRC );
866+ break ;
867+ case DA9121_SUBTYPE_DA9217 :
856868 type = "DA9217" ;
857- config_match = (chip_id == DA9121_TYPE_DA9217 );
869+ config_match = (variant_vrc == DA9217_VARIANT_VRC );
858870 break ;
859871 default :
860872 type = "Unknown" ;
@@ -892,15 +904,27 @@ static int da9121_assign_chip_model(struct i2c_client *i2c,
892904
893905 chip -> dev = & i2c -> dev ;
894906
895- switch (chip -> variant_id ) {
896- case DA9121_TYPE_DA9121_DA9130 :
897- fallthrough ;
898- case DA9121_TYPE_DA9217 :
907+ /* Use configured subtype to select the regulator descriptor index and
908+ * register map, common to both consumer and automotive grade variants
909+ */
910+ switch (chip -> subvariant_id ) {
911+ case DA9121_SUBTYPE_DA9121 :
912+ case DA9121_SUBTYPE_DA9130 :
913+ chip -> variant_id = DA9121_TYPE_DA9121_DA9130 ;
899914 regmap = & da9121_1ch_regmap_config ;
900915 break ;
901- case DA9121_TYPE_DA9122_DA9131 :
902- fallthrough ;
903- case DA9121_TYPE_DA9220_DA9132 :
916+ case DA9121_SUBTYPE_DA9217 :
917+ chip -> variant_id = DA9121_TYPE_DA9217 ;
918+ regmap = & da9121_1ch_regmap_config ;
919+ break ;
920+ case DA9121_SUBTYPE_DA9122 :
921+ case DA9121_SUBTYPE_DA9131 :
922+ chip -> variant_id = DA9121_TYPE_DA9122_DA9131 ;
923+ regmap = & da9121_2ch_regmap_config ;
924+ break ;
925+ case DA9121_SUBTYPE_DA9220 :
926+ case DA9121_SUBTYPE_DA9132 :
927+ chip -> variant_id = DA9121_TYPE_DA9220_DA9132 ;
904928 regmap = & da9121_2ch_regmap_config ;
905929 break ;
906930 }
@@ -975,13 +999,13 @@ static int da9121_config_irq(struct i2c_client *i2c,
975999}
9761000
9771001static const struct of_device_id da9121_dt_ids [] = {
978- { .compatible = "dlg,da9121" , .data = (void * ) DA9121_TYPE_DA9121_DA9130 },
979- { .compatible = "dlg,da9130" , .data = (void * ) DA9121_TYPE_DA9121_DA9130 },
980- { .compatible = "dlg,da9217" , .data = (void * ) DA9121_TYPE_DA9217 },
981- { .compatible = "dlg,da9122" , .data = (void * ) DA9121_TYPE_DA9122_DA9131 },
982- { .compatible = "dlg,da9131" , .data = (void * ) DA9121_TYPE_DA9122_DA9131 },
983- { .compatible = "dlg,da9220" , .data = (void * ) DA9121_TYPE_DA9220_DA9132 },
984- { .compatible = "dlg,da9132" , .data = (void * ) DA9121_TYPE_DA9220_DA9132 },
1002+ { .compatible = "dlg,da9121" , .data = (void * ) DA9121_SUBTYPE_DA9121 },
1003+ { .compatible = "dlg,da9130" , .data = (void * ) DA9121_SUBTYPE_DA9130 },
1004+ { .compatible = "dlg,da9217" , .data = (void * ) DA9121_SUBTYPE_DA9217 },
1005+ { .compatible = "dlg,da9122" , .data = (void * ) DA9121_SUBTYPE_DA9122 },
1006+ { .compatible = "dlg,da9131" , .data = (void * ) DA9121_SUBTYPE_DA9131 },
1007+ { .compatible = "dlg,da9220" , .data = (void * ) DA9121_SUBTYPE_DA9220 },
1008+ { .compatible = "dlg,da9132" , .data = (void * ) DA9121_SUBTYPE_DA9132 },
9851009 { }
9861010};
9871011MODULE_DEVICE_TABLE (of , da9121_dt_ids );
@@ -1011,7 +1035,7 @@ static int da9121_i2c_probe(struct i2c_client *i2c,
10111035 }
10121036
10131037 chip -> pdata = i2c -> dev .platform_data ;
1014- chip -> variant_id = da9121_of_get_id (& i2c -> dev );
1038+ chip -> subvariant_id = da9121_of_get_id (& i2c -> dev );
10151039
10161040 ret = da9121_assign_chip_model (i2c , chip );
10171041 if (ret < 0 )
0 commit comments