File Index
Files and directories
Sign in
FILE

inv_icm45600_spi.c

File preview with syntax highlighting.

linux-6.19.14/drivers/iio/imu/inv_icm45600/inv_icm45600_spi.c C
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/* Copyright (C) 2025 InvenSense, Inc. */
  3
  4#include <linux/bitfield.h>
  5#include <linux/device.h>
  6#include <linux/err.h>
  7#include <linux/module.h>
  8#include <linux/mod_devicetable.h>
  9#include <linux/regmap.h>
 10
 11#include <linux/spi/spi.h>
 12
 13#include "inv_icm45600.h"
 14
 15static const struct regmap_config inv_icm45600_regmap_config = {
 16	.reg_bits = 8,
 17	.val_bits = 8,
 18};
 19
 20static int inv_icm45600_spi_bus_setup(struct inv_icm45600_state *st)
 21{
 22	/* Set slew rates for SPI. */
 23	return regmap_update_bits(st->map, INV_ICM45600_REG_DRIVE_CONFIG0,
 24				INV_ICM45600_DRIVE_CONFIG0_SPI_MASK,
 25				FIELD_PREP(INV_ICM45600_DRIVE_CONFIG0_SPI_MASK,
 26					INV_ICM45600_SPI_SLEW_RATE_5NS));
 27}
 28
 29static int inv_icm45600_probe(struct spi_device *spi)
 30{
 31	const struct inv_icm45600_chip_info *chip_info;
 32	struct regmap *regmap;
 33
 34	chip_info = spi_get_device_match_data(spi);
 35	if (!chip_info)
 36		return -ENODEV;
 37
 38	/* Use SPI specific regmap. */
 39	regmap = devm_regmap_init_spi(spi, &inv_icm45600_regmap_config);
 40	if (IS_ERR(regmap))
 41		return PTR_ERR(regmap);
 42
 43	return inv_icm45600_core_probe(regmap, chip_info, true,
 44				       inv_icm45600_spi_bus_setup);
 45}
 46
 47/*
 48 * The device id table is used to identify which device is
 49 * supported by this driver.
 50 */
 51static const struct spi_device_id inv_icm45600_id[] = {
 52	{ "icm45605", (kernel_ulong_t)&inv_icm45605_chip_info },
 53	{ "icm45606", (kernel_ulong_t)&inv_icm45606_chip_info },
 54	{ "icm45608", (kernel_ulong_t)&inv_icm45608_chip_info },
 55	{ "icm45634", (kernel_ulong_t)&inv_icm45634_chip_info },
 56	{ "icm45686", (kernel_ulong_t)&inv_icm45686_chip_info },
 57	{ "icm45687", (kernel_ulong_t)&inv_icm45687_chip_info },
 58	{ "icm45688p", (kernel_ulong_t)&inv_icm45688p_chip_info },
 59	{ "icm45689", (kernel_ulong_t)&inv_icm45689_chip_info },
 60	{ }
 61};
 62MODULE_DEVICE_TABLE(spi, inv_icm45600_id);
 63
 64static const struct of_device_id inv_icm45600_of_matches[] = {
 65	{
 66		.compatible = "invensense,icm45605",
 67		.data = &inv_icm45605_chip_info,
 68	}, {
 69		.compatible = "invensense,icm45606",
 70		.data = &inv_icm45606_chip_info,
 71	}, {
 72		.compatible = "invensense,icm45608",
 73		.data = &inv_icm45608_chip_info,
 74	}, {
 75		.compatible = "invensense,icm45634",
 76		.data = &inv_icm45634_chip_info,
 77	}, {
 78		.compatible = "invensense,icm45686",
 79		.data = &inv_icm45686_chip_info,
 80	}, {
 81		.compatible = "invensense,icm45687",
 82		.data = &inv_icm45687_chip_info,
 83	}, {
 84		.compatible = "invensense,icm45688p",
 85		.data = &inv_icm45688p_chip_info,
 86	}, {
 87		.compatible = "invensense,icm45689",
 88		.data = &inv_icm45689_chip_info,
 89	},
 90	{ }
 91};
 92MODULE_DEVICE_TABLE(of, inv_icm45600_of_matches);
 93
 94static struct spi_driver inv_icm45600_driver = {
 95	.driver = {
 96		.name = "inv-icm45600-spi",
 97		.of_match_table = inv_icm45600_of_matches,
 98		.pm = pm_ptr(&inv_icm45600_pm_ops),
 99	},
100	.id_table = inv_icm45600_id,
101	.probe = inv_icm45600_probe,
102};
103module_spi_driver(inv_icm45600_driver);
104
105MODULE_AUTHOR("InvenSense, Inc.");
106MODULE_DESCRIPTION("InvenSense ICM-456xx SPI driver");
107MODULE_LICENSE("GPL");
108MODULE_IMPORT_NS("IIO_ICM45600");
~/ Read-only file preview.