162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Analog Devices, Inc.
462306a36Sopenharmony_ci * Author: Cosmin Tanislav <cosmin.tanislav@analog.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/i2c.h>
862306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/regmap.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "adxl367.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define ADXL367_I2C_FIFO_DATA	0x42
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct adxl367_i2c_state {
1762306a36Sopenharmony_ci	struct regmap *regmap;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic bool adxl367_readable_noinc_reg(struct device *dev, unsigned int reg)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	return reg == ADXL367_I2C_FIFO_DATA;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic int adxl367_i2c_read_fifo(void *context, __be16 *fifo_buf,
2662306a36Sopenharmony_ci				 unsigned int fifo_entries)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	struct adxl367_i2c_state *st = context;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	return regmap_noinc_read(st->regmap, ADXL367_I2C_FIFO_DATA, fifo_buf,
3162306a36Sopenharmony_ci				 fifo_entries * sizeof(*fifo_buf));
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic const struct regmap_config adxl367_i2c_regmap_config = {
3562306a36Sopenharmony_ci	.reg_bits = 8,
3662306a36Sopenharmony_ci	.val_bits = 8,
3762306a36Sopenharmony_ci	.readable_noinc_reg = adxl367_readable_noinc_reg,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic const struct adxl367_ops adxl367_i2c_ops = {
4162306a36Sopenharmony_ci	.read_fifo = adxl367_i2c_read_fifo,
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic int adxl367_i2c_probe(struct i2c_client *client)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	struct adxl367_i2c_state *st;
4762306a36Sopenharmony_ci	struct regmap *regmap;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL);
5062306a36Sopenharmony_ci	if (!st)
5162306a36Sopenharmony_ci		return -ENOMEM;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	regmap = devm_regmap_init_i2c(client, &adxl367_i2c_regmap_config);
5462306a36Sopenharmony_ci	if (IS_ERR(regmap))
5562306a36Sopenharmony_ci		return PTR_ERR(regmap);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	st->regmap = regmap;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return adxl367_probe(&client->dev, &adxl367_i2c_ops, st, regmap,
6062306a36Sopenharmony_ci			     client->irq);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic const struct i2c_device_id adxl367_i2c_id[] = {
6462306a36Sopenharmony_ci	{ "adxl367", 0 },
6562306a36Sopenharmony_ci	{ },
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, adxl367_i2c_id);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic const struct of_device_id adxl367_of_match[] = {
7062306a36Sopenharmony_ci	{ .compatible = "adi,adxl367" },
7162306a36Sopenharmony_ci	{ },
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, adxl367_of_match);
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic struct i2c_driver adxl367_i2c_driver = {
7662306a36Sopenharmony_ci	.driver = {
7762306a36Sopenharmony_ci		.name = "adxl367_i2c",
7862306a36Sopenharmony_ci		.of_match_table = adxl367_of_match,
7962306a36Sopenharmony_ci	},
8062306a36Sopenharmony_ci	.probe = adxl367_i2c_probe,
8162306a36Sopenharmony_ci	.id_table = adxl367_i2c_id,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cimodule_i2c_driver(adxl367_i2c_driver);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciMODULE_IMPORT_NS(IIO_ADXL367);
8762306a36Sopenharmony_ciMODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");
8862306a36Sopenharmony_ciMODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer I2C driver");
8962306a36Sopenharmony_ciMODULE_LICENSE("GPL");
90