iio: magn: bmc150: Introduce SPI support
authorDaniel Baluta <daniel.baluta@intel.com>
Fri, 15 Apr 2016 14:13:10 +0000 (17:13 +0300)
committerJonathan Cameron <jic23@kernel.org>
Mon, 18 Apr 2016 19:44:47 +0000 (20:44 +0100)
Signed-off-by: Daniel Baluta <daniel.baluta@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/magnetometer/Kconfig
drivers/iio/magnetometer/Makefile
drivers/iio/magnetometer/bmc150_magn_spi.c [new file with mode: 0644]

index 4972f9d17023a9e74c3dc1f3b181e3d9eddd6394..84e6559ccc65d3df05c6e9c96c5fb7a2419cc711 100644 (file)
@@ -47,6 +47,22 @@ config BMC150_MAGN_I2C
          To compile this driver as a module, choose M here: the module will be
          called bmc150_magn_i2c.
 
+config BMC150_MAGN_SPI
+       tristate "Bosch BMC150 SPI Magnetometer Driver"
+       depends on SPI
+       select BMC150_MAGN
+       select REGMAP_SPI
+       help
+         Say yes here to build support for the BMC150 magnetometer with
+         SPI interface.
+
+         This is a combo module with both accelerometer and magnetometer.
+         This driver is only implementing magnetometer part, which has
+         its own address and register map.
+
+         To compile this driver as a module, choose M here: the module will be
+         called bmc150_magn_spi.
+
 config MAG3110
        tristate "Freescale MAG3110 3-Axis Magnetometer"
        depends on I2C
index 56477737e08304333d52ca85b32a2a008db2917c..92a745c9a6e8d5ee483e7f53e602de4dbfcb6c4b 100644 (file)
@@ -6,6 +6,7 @@
 obj-$(CONFIG_AK8975)   += ak8975.o
 obj-$(CONFIG_BMC150_MAGN) += bmc150_magn.o
 obj-$(CONFIG_BMC150_MAGN_I2C) += bmc150_magn_i2c.o
+obj-$(CONFIG_BMC150_MAGN_SPI) += bmc150_magn_spi.o
 
 obj-$(CONFIG_MAG3110)  += mag3110.o
 obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o
diff --git a/drivers/iio/magnetometer/bmc150_magn_spi.c b/drivers/iio/magnetometer/bmc150_magn_spi.c
new file mode 100644 (file)
index 0000000..c4c738a
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 3-axis magnetometer driver support following SPI Bosch-Sensortec chips:
+ *  - BMC150
+ *  - BMC156
+ *
+ * Copyright (c) 2016, Intel Corporation.
+ *
+ * This file is subject to the terms and conditions of version 2 of
+ * the GNU General Public License.  See the file COPYING in the main
+ * directory of this archive for more details.
+ */
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/spi/spi.h>
+#include <linux/acpi.h>
+#include <linux/regmap.h>
+
+#include "bmc150_magn.h"
+
+static int bmc150_magn_spi_probe(struct spi_device *spi)
+{
+       struct regmap *regmap;
+       const struct spi_device_id *id = spi_get_device_id(spi);
+
+       regmap = devm_regmap_init_spi(spi, &bmc150_magn_regmap_config);
+       if (IS_ERR(regmap)) {
+               dev_err(&spi->dev, "Failed to register spi regmap %d\n",
+                       (int)PTR_ERR(regmap));
+               return PTR_ERR(regmap);
+       }
+       return bmc150_magn_probe(&spi->dev, regmap, spi->irq, id->name);
+}
+
+static int bmc150_magn_spi_remove(struct spi_device *spi)
+{
+       bmc150_magn_remove(&spi->dev);
+
+       return 0;
+}
+
+static const struct spi_device_id bmc150_magn_spi_id[] = {
+       {"bmc150_magn", 0},
+       {"bmc156_magn", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(spi, bmc150_magn_spi_id);
+
+static const struct acpi_device_id bmc150_magn_acpi_match[] = {
+       {"BMC150B", 0},
+       {"BMC156B", 0},
+       {},
+};
+MODULE_DEVICE_TABLE(acpi, bmc150_magn_acpi_match);
+
+static struct spi_driver bmc150_magn_spi_driver = {
+       .probe          = bmc150_magn_spi_probe,
+       .remove         = bmc150_magn_spi_remove,
+       .id_table       = bmc150_magn_spi_id,
+       .driver = {
+               .acpi_match_table = ACPI_PTR(bmc150_magn_acpi_match),
+               .name   = "bmc150_magn_spi",
+       },
+};
+module_spi_driver(bmc150_magn_spi_driver);
+
+MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");
+MODULE_DESCRIPTION("BMC150 magnetometer SPI driver");
+MODULE_LICENSE("GPL v2");