78
78
*/
79
79
#define AK09912_REG_WIA1 0x00
80
80
#define AK09912_REG_WIA2 0x01
81
+ #define AK09918_DEVICE_ID 0x0C
81
82
#define AK09916_DEVICE_ID 0x09
82
83
#define AK09912_DEVICE_ID 0x04
83
84
#define AK09911_DEVICE_ID 0x05
@@ -209,6 +210,7 @@ enum asahi_compass_chipset {
209
210
AK09911 ,
210
211
AK09912 ,
211
212
AK09916 ,
213
+ AK09918 ,
212
214
};
213
215
214
216
enum ak_ctrl_reg_addr {
@@ -371,6 +373,34 @@ static const struct ak_def ak_def_array[] = {
371
373
AK09912_REG_HXL ,
372
374
AK09912_REG_HYL ,
373
375
AK09912_REG_HZL },
376
+ },
377
+ [AK09918 ] = {
378
+ /* ak09918 is register compatible with ak09912 this is for avoid
379
+ * unknown id messages.
380
+ */
381
+ .type = AK09918 ,
382
+ .raw_to_gauss = ak09912_raw_to_gauss ,
383
+ .range = 32752 ,
384
+ .ctrl_regs = {
385
+ AK09912_REG_ST1 ,
386
+ AK09912_REG_ST2 ,
387
+ AK09912_REG_CNTL2 ,
388
+ AK09912_REG_ASAX ,
389
+ AK09912_MAX_REGS },
390
+ .ctrl_masks = {
391
+ AK09912_REG_ST1_DRDY_MASK ,
392
+ AK09912_REG_ST2_HOFL_MASK ,
393
+ 0 ,
394
+ AK09912_REG_CNTL2_MODE_MASK },
395
+ .ctrl_modes = {
396
+ AK09912_REG_CNTL_MODE_POWER_DOWN ,
397
+ AK09912_REG_CNTL_MODE_ONCE ,
398
+ AK09912_REG_CNTL_MODE_SELF_TEST ,
399
+ AK09912_REG_CNTL_MODE_FUSE_ROM },
400
+ .data_regs = {
401
+ AK09912_REG_HXL ,
402
+ AK09912_REG_HYL ,
403
+ AK09912_REG_HZL },
374
404
}
375
405
};
376
406
@@ -452,6 +482,7 @@ static int ak8975_who_i_am(struct i2c_client *client,
452
482
/*
453
483
* Signature for each device:
454
484
* Device | WIA1 | WIA2
485
+ * AK09918 | DEVICE_ID_| AK09918_DEVICE_ID
455
486
* AK09916 | DEVICE_ID_| AK09916_DEVICE_ID
456
487
* AK09912 | DEVICE_ID | AK09912_DEVICE_ID
457
488
* AK09911 | DEVICE_ID | AK09911_DEVICE_ID
@@ -484,6 +515,10 @@ static int ak8975_who_i_am(struct i2c_client *client,
484
515
if (wia_val [1 ] == AK09916_DEVICE_ID )
485
516
return 0 ;
486
517
break ;
518
+ case AK09918 :
519
+ if (wia_val [1 ] == AK09918_DEVICE_ID )
520
+ return 0 ;
521
+ break ;
487
522
}
488
523
489
524
dev_info (& client -> dev , "Device ID %x is unknown.\n" , wia_val [1 ]);
@@ -1071,6 +1106,7 @@ static const struct i2c_device_id ak8975_id[] = {
1071
1106
{"ak09911" , (kernel_ulong_t )& ak_def_array [AK09911 ] },
1072
1107
{"ak09912" , (kernel_ulong_t )& ak_def_array [AK09912 ] },
1073
1108
{"ak09916" , (kernel_ulong_t )& ak_def_array [AK09916 ] },
1109
+ {"ak09918" , (kernel_ulong_t )& ak_def_array [AK09918 ] },
1074
1110
{}
1075
1111
};
1076
1112
MODULE_DEVICE_TABLE (i2c , ak8975_id );
@@ -1085,6 +1121,7 @@ static const struct of_device_id ak8975_of_match[] = {
1085
1121
{ .compatible = "asahi-kasei,ak09912" , .data = & ak_def_array [AK09912 ] },
1086
1122
{ .compatible = "ak09912" , .data = & ak_def_array [AK09912 ] },
1087
1123
{ .compatible = "asahi-kasei,ak09916" , .data = & ak_def_array [AK09916 ] },
1124
+ { .compatible = "asahi-kasei,ak09918" , .data = & ak_def_array [AK09918 ] },
1088
1125
{}
1089
1126
};
1090
1127
MODULE_DEVICE_TABLE (of , ak8975_of_match );
0 commit comments