Commit 7a23e6d9 authored by Petre Rodan's avatar Petre Rodan Committed by Jonathan Cameron
Browse files

iio: accel: bma220: add i2c module



Add the bma220_i2c module.

Note that this kernel module transparently shifts all register addresses
1 bit to the left, so all functions will operate based on the SPI memory
map.

Signed-off-by: default avatarPetre Rodan <petre.rodan@subdimension.ro>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 0e3c7fd4
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -218,10 +218,11 @@ config BMA180

config BMA220
	tristate "Bosch BMA220 3-Axis Accelerometer Driver"
	depends on SPI
	depends on I2C || SPI
	select REGMAP
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	select BMA220_I2C if I2C
	select BMA220_SPI if SPI
	help
	  Say yes here to add support for the Bosch BMA220 triaxial
@@ -229,7 +230,13 @@ config BMA220

	  To compile this driver as a module, choose M here: the
	  module will be called bma220_core and you will also get
	  bma220_spi if SPI is enabled.
	  bma220_i2c if I2C is enabled and bma220_spi if SPI is
	  enabled.

config BMA220_I2C
	tristate
	select REGMAP_I2C
	depends on BMA220

config BMA220_SPI
	tristate
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ obj-$(CONFIG_ADXL380_I2C) += adxl380_i2c.o
obj-$(CONFIG_ADXL380_SPI) += adxl380_spi.o
obj-$(CONFIG_BMA180) += bma180.o
obj-$(CONFIG_BMA220) += bma220_core.o
obj-$(CONFIG_BMA220_I2C) += bma220_i2c.o
obj-$(CONFIG_BMA220_SPI) += bma220_spi.o
obj-$(CONFIG_BMA400) += bma400_core.o
obj-$(CONFIG_BMA400_I2C) += bma400_i2c.o
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@

struct device;

extern const struct regmap_config bma220_i2c_regmap_config;
extern const struct regmap_config bma220_spi_regmap_config;
extern const struct dev_pm_ops bma220_pm_ops;

+18 −0
Original line number Diff line number Diff line
@@ -173,6 +173,24 @@ const struct regmap_config bma220_spi_regmap_config = {
};
EXPORT_SYMBOL_NS_GPL(bma220_spi_regmap_config, "IIO_BOSCH_BMA220");

/*
 * Based on the datasheet the memory map differs between the SPI and the I2C
 * implementations. I2C register addresses are simply shifted to the left
 * by 1 bit yet the register size remains unchanged.
 * This driver employs the SPI memory map to correlate register names to
 * addresses regardless of the bus type.
 */

const struct regmap_config bma220_i2c_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
	.reg_shift = -1,
	.max_register = BMA220_REG_SOFTRESET,
	.cache_type = REGCACHE_NONE,
	.writeable_reg = bma220_is_writable_reg,
};
EXPORT_SYMBOL_NS_GPL(bma220_i2c_regmap_config, "IIO_BOSCH_BMA220");

static irqreturn_t bma220_trigger_handler(int irq, void *p)
{
	int ret;
+58 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Bosch triaxial acceleration sensor
 *
 * Copyright (c) 2025 Petre Rodan <petre.rodan@subdimension.ro>
 *
 * Datasheet: https://media.digikey.com/pdf/Data%20Sheets/Bosch/BMA220.pdf
 * I2C address is either 0x0b or 0x0a depending on CSB (pin 10)
 */

#include <linux/errno.h>
#include <linux/i2c.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/types.h>

#include "bma220.h"

static int bma220_i2c_probe(struct i2c_client *client)
{
	struct regmap *regmap;

	regmap = devm_regmap_init_i2c(client, &bma220_i2c_regmap_config);
	if (IS_ERR(regmap))
		return dev_err_probe(&client->dev, PTR_ERR(regmap),
				     "failed to create regmap\n");

	return bma220_common_probe(&client->dev, regmap, client->irq);
}

static const struct of_device_id bma220_i2c_match[] = {
	{ .compatible = "bosch,bma220" },
	{ }
};
MODULE_DEVICE_TABLE(of, bma220_i2c_match);

static const struct i2c_device_id bma220_i2c_id[] = {
	{ "bma220" },
	{ }
};
MODULE_DEVICE_TABLE(i2c, bma220_i2c_id);

static struct i2c_driver bma220_i2c_driver = {
	.driver = {
		.name = "bma220_i2c",
		.pm = pm_sleep_ptr(&bma220_pm_ops),
		.of_match_table = bma220_i2c_match,
	},
	.probe = bma220_i2c_probe,
	.id_table = bma220_i2c_id,
};
module_i2c_driver(bma220_i2c_driver);

MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");
MODULE_DESCRIPTION("Bosch triaxial acceleration sensor i2c driver");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("IIO_BOSCH_BMA220");