0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/regmap.h>
0011 #include <linux/slab.h>
0012 #include <linux/spi/spi.h>
0013
0014 #include "bmi088-accel.h"
0015
0016 static int bmi088_regmap_spi_write(void *context, const void *data, size_t count)
0017 {
0018 struct spi_device *spi = context;
0019
0020
0021 return spi_write(spi, data, count);
0022 }
0023
0024 static int bmi088_regmap_spi_read(void *context, const void *reg,
0025 size_t reg_size, void *val, size_t val_size)
0026 {
0027 struct spi_device *spi = context;
0028 u8 addr[2];
0029
0030 addr[0] = *(u8 *)reg;
0031 addr[0] |= BIT(7);
0032 addr[1] = 0;
0033
0034 return spi_write_then_read(spi, addr, sizeof(addr), val, val_size);
0035 }
0036
0037 static struct regmap_bus bmi088_regmap_bus = {
0038 .write = bmi088_regmap_spi_write,
0039 .read = bmi088_regmap_spi_read,
0040 };
0041
0042 static int bmi088_accel_probe(struct spi_device *spi)
0043 {
0044 struct regmap *regmap;
0045 const struct spi_device_id *id = spi_get_device_id(spi);
0046
0047 regmap = devm_regmap_init(&spi->dev, &bmi088_regmap_bus,
0048 spi, &bmi088_regmap_conf);
0049
0050 if (IS_ERR(regmap)) {
0051 dev_err(&spi->dev, "Failed to initialize spi regmap\n");
0052 return PTR_ERR(regmap);
0053 }
0054
0055 return bmi088_accel_core_probe(&spi->dev, regmap, spi->irq,
0056 id->driver_data);
0057 }
0058
0059 static void bmi088_accel_remove(struct spi_device *spi)
0060 {
0061 bmi088_accel_core_remove(&spi->dev);
0062 }
0063
0064 static const struct of_device_id bmi088_of_match[] = {
0065 { .compatible = "bosch,bmi085-accel" },
0066 { .compatible = "bosch,bmi088-accel" },
0067 { .compatible = "bosch,bmi090l-accel" },
0068 {}
0069 };
0070 MODULE_DEVICE_TABLE(of, bmi088_of_match);
0071
0072 static const struct spi_device_id bmi088_accel_id[] = {
0073 {"bmi085-accel", BOSCH_BMI085},
0074 {"bmi088-accel", BOSCH_BMI088},
0075 {"bmi090l-accel", BOSCH_BMI090L},
0076 {}
0077 };
0078 MODULE_DEVICE_TABLE(spi, bmi088_accel_id);
0079
0080 static struct spi_driver bmi088_accel_driver = {
0081 .driver = {
0082 .name = "bmi088_accel_spi",
0083 .pm = &bmi088_accel_pm_ops,
0084 .of_match_table = bmi088_of_match,
0085 },
0086 .probe = bmi088_accel_probe,
0087 .remove = bmi088_accel_remove,
0088 .id_table = bmi088_accel_id,
0089 };
0090 module_spi_driver(bmi088_accel_driver);
0091
0092 MODULE_AUTHOR("Niek van Agt <niek.van.agt@topicproducts.com>");
0093 MODULE_LICENSE("GPL v2");
0094 MODULE_DESCRIPTION("BMI088 accelerometer driver (SPI)");
0095 MODULE_IMPORT_NS(IIO_BMI088);