1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020 InvenSense, Inc.
6 #include <linux/kernel.h>
7 #include <linux/device.h>
8 #include <linux/module.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/i2c.h>
11 #include <linux/regmap.h>
12 #include <linux/property.h>
14 #include "inv_icm42600.h"
16 static int inv_icm42600_i2c_bus_setup(struct inv_icm42600_state
*st
)
18 unsigned int mask
, val
;
22 * setup interface registers
23 * This register write to REG_INTF_CONFIG6 enables a spike filter that
24 * is impacting the line and can prevent the I2C ACK to be seen by the
25 * controller. So we don't test the return value.
27 regmap_update_bits(st
->map
, INV_ICM42600_REG_INTF_CONFIG6
,
28 INV_ICM42600_INTF_CONFIG6_MASK
,
29 INV_ICM42600_INTF_CONFIG6_I3C_EN
);
31 ret
= regmap_clear_bits(st
->map
, INV_ICM42600_REG_INTF_CONFIG4
,
32 INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY
);
36 /* set slew rates for I2C and SPI */
37 mask
= INV_ICM42600_DRIVE_CONFIG_I2C_MASK
|
38 INV_ICM42600_DRIVE_CONFIG_SPI_MASK
;
39 val
= INV_ICM42600_DRIVE_CONFIG_I2C(INV_ICM42600_SLEW_RATE_12_36NS
) |
40 INV_ICM42600_DRIVE_CONFIG_SPI(INV_ICM42600_SLEW_RATE_12_36NS
);
41 ret
= regmap_update_bits(st
->map
, INV_ICM42600_REG_DRIVE_CONFIG
,
47 return regmap_update_bits(st
->map
, INV_ICM42600_REG_INTF_CONFIG0
,
48 INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK
,
49 INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_SPI_DIS
);
52 static int inv_icm42600_probe(struct i2c_client
*client
)
55 enum inv_icm42600_chip chip
;
56 struct regmap
*regmap
;
58 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_I2C_BLOCK
))
61 match
= device_get_match_data(&client
->dev
);
64 chip
= (uintptr_t)match
;
66 regmap
= devm_regmap_init_i2c(client
, &inv_icm42600_regmap_config
);
68 return PTR_ERR(regmap
);
70 return inv_icm42600_core_probe(regmap
, chip
, client
->irq
,
71 inv_icm42600_i2c_bus_setup
);
75 * device id table is used to identify what device can be
76 * supported by this driver
78 static const struct i2c_device_id inv_icm42600_id
[] = {
79 { "icm42600", INV_CHIP_ICM42600
},
80 { "icm42602", INV_CHIP_ICM42602
},
81 { "icm42605", INV_CHIP_ICM42605
},
82 { "icm42686", INV_CHIP_ICM42686
},
83 { "icm42622", INV_CHIP_ICM42622
},
84 { "icm42688", INV_CHIP_ICM42688
},
85 { "icm42631", INV_CHIP_ICM42631
},
88 MODULE_DEVICE_TABLE(i2c
, inv_icm42600_id
);
90 static const struct of_device_id inv_icm42600_of_matches
[] = {
92 .compatible
= "invensense,icm42600",
93 .data
= (void *)INV_CHIP_ICM42600
,
95 .compatible
= "invensense,icm42602",
96 .data
= (void *)INV_CHIP_ICM42602
,
98 .compatible
= "invensense,icm42605",
99 .data
= (void *)INV_CHIP_ICM42605
,
101 .compatible
= "invensense,icm42686",
102 .data
= (void *)INV_CHIP_ICM42686
,
104 .compatible
= "invensense,icm42622",
105 .data
= (void *)INV_CHIP_ICM42622
,
107 .compatible
= "invensense,icm42688",
108 .data
= (void *)INV_CHIP_ICM42688
,
110 .compatible
= "invensense,icm42631",
111 .data
= (void *)INV_CHIP_ICM42631
,
115 MODULE_DEVICE_TABLE(of
, inv_icm42600_of_matches
);
117 static struct i2c_driver inv_icm42600_driver
= {
119 .name
= "inv-icm42600-i2c",
120 .of_match_table
= inv_icm42600_of_matches
,
121 .pm
= pm_ptr(&inv_icm42600_pm_ops
),
123 .id_table
= inv_icm42600_id
,
124 .probe
= inv_icm42600_probe
,
126 module_i2c_driver(inv_icm42600_driver
);
128 MODULE_AUTHOR("InvenSense, Inc.");
129 MODULE_DESCRIPTION("InvenSense ICM-426xx I2C driver");
130 MODULE_LICENSE("GPL");
131 MODULE_IMPORT_NS("IIO_ICM42600");