Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * 3-axis accelerometer driver supporting following Bosch-Sensortec chips:
0004  *  - BMI088
0005  *
0006  * Copyright (c) 2018-2020, Topic Embedded Products
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     /* Write register is same as generic SPI */
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); /* Set RW = '1' */
0032     addr[1] = 0; /* Read requires a dummy byte transfer */
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);