FILE
inv_icm45600_i3c.c
File preview with syntax highlighting.
linux-6.19.14/drivers/iio/imu/inv_icm45600/inv_icm45600_i3c.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* Copyright (C) 2025 InvenSense, Inc. */ 3 4#include <linux/err.h> 5#include <linux/mod_devicetable.h> 6#include <linux/module.h> 7#include <linux/regmap.h> 8 9#include <linux/i3c/device.h> 10#include <linux/i3c/master.h> 11 12#include "inv_icm45600.h" 13 14static const struct regmap_config inv_icm45600_regmap_config = { 15 .reg_bits = 8, 16 .val_bits = 8, 17}; 18 19static const struct i3c_device_id inv_icm45600_i3c_ids[] = { 20 I3C_DEVICE_EXTRA_INFO(0x0235, 0x0000, 0x0011, (void *)NULL), 21 I3C_DEVICE_EXTRA_INFO(0x0235, 0x0000, 0x0084, (void *)NULL), 22 { /* sentinel */ } 23}; 24MODULE_DEVICE_TABLE(i3c, inv_icm45600_i3c_ids); 25 26static const struct inv_icm45600_chip_info *i3c_chip_info[] = { 27 &inv_icm45605_chip_info, 28 &inv_icm45606_chip_info, 29 &inv_icm45608_chip_info, 30 &inv_icm45634_chip_info, 31 &inv_icm45686_chip_info, 32 &inv_icm45687_chip_info, 33 &inv_icm45688p_chip_info, 34 &inv_icm45689_chip_info, 35}; 36 37static int inv_icm45600_i3c_probe(struct i3c_device *i3cdev) 38{ 39 int ret; 40 unsigned int whoami; 41 struct regmap *regmap; 42 const int nb_chip = ARRAY_SIZE(i3c_chip_info); 43 int chip; 44 45 regmap = devm_regmap_init_i3c(i3cdev, &inv_icm45600_regmap_config); 46 if (IS_ERR(regmap)) 47 return dev_err_probe(&i3cdev->dev, PTR_ERR(regmap), 48 "Failed to register i3c regmap %ld\n", PTR_ERR(regmap)); 49 50 ret = regmap_read(regmap, INV_ICM45600_REG_WHOAMI, &whoami); 51 if (ret) 52 return dev_err_probe(&i3cdev->dev, ret, "Failed to read part id %d\n", whoami); 53 54 for (chip = 0; chip < nb_chip; chip++) { 55 if (whoami == i3c_chip_info[chip]->whoami) 56 break; 57 } 58 59 if (chip == nb_chip) 60 return dev_err_probe(&i3cdev->dev, -ENODEV, 61 "Failed to match part id %d\n", whoami); 62 63 return inv_icm45600_core_probe(regmap, i3c_chip_info[chip], false, NULL); 64} 65 66static struct i3c_driver inv_icm45600_driver = { 67 .driver = { 68 .name = "inv_icm45600_i3c", 69 .pm = pm_sleep_ptr(&inv_icm45600_pm_ops), 70 }, 71 .probe = inv_icm45600_i3c_probe, 72 .id_table = inv_icm45600_i3c_ids, 73}; 74module_i3c_driver(inv_icm45600_driver); 75 76MODULE_AUTHOR("Remi Buisson <remi.buisson@tdk.com>"); 77MODULE_DESCRIPTION("InvenSense ICM-456xx i3c driver"); 78MODULE_LICENSE("GPL"); 79MODULE_IMPORT_NS("IIO_ICM45600");
~/
Read-only file preview.