linux/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3* Copyright (C) 2015 Intel Corporation Inc.
   4*/
   5#include <linux/module.h>
   6#include <linux/acpi.h>
   7#include <linux/of.h>
   8#include <linux/property.h>
   9#include <linux/spi/spi.h>
  10#include <linux/regmap.h>
  11#include <linux/iio/iio.h>
  12#include "inv_mpu_iio.h"
  13
  14static const struct regmap_config inv_mpu_regmap_config = {
  15        .reg_bits = 8,
  16        .val_bits = 8,
  17};
  18
  19static int inv_mpu_i2c_disable(struct iio_dev *indio_dev)
  20{
  21        struct inv_mpu6050_state *st = iio_priv(indio_dev);
  22        int ret = 0;
  23
  24        if (st->reg->i2c_if) {
  25                ret = regmap_write(st->map, st->reg->i2c_if,
  26                                   INV_ICM20602_BIT_I2C_IF_DIS);
  27        } else {
  28                st->chip_config.user_ctrl |= INV_MPU6050_BIT_I2C_IF_DIS;
  29                ret = regmap_write(st->map, st->reg->user_ctrl,
  30                                   st->chip_config.user_ctrl);
  31        }
  32
  33        return ret;
  34}
  35
  36static int inv_mpu_probe(struct spi_device *spi)
  37{
  38        const void *match;
  39        struct regmap *regmap;
  40        const struct spi_device_id *spi_id;
  41        const char *name = NULL;
  42        enum inv_devices chip_type;
  43
  44        if ((spi_id = spi_get_device_id(spi))) {
  45                chip_type = (enum inv_devices)spi_id->driver_data;
  46                name = spi_id->name;
  47        } else if ((match = device_get_match_data(&spi->dev))) {
  48                chip_type = (enum inv_devices)match;
  49                name = dev_name(&spi->dev);
  50        } else {
  51                return -ENODEV;
  52        }
  53
  54        regmap = devm_regmap_init_spi(spi, &inv_mpu_regmap_config);
  55        if (IS_ERR(regmap)) {
  56                dev_err(&spi->dev, "Failed to register spi regmap: %pe\n",
  57                        regmap);
  58                return PTR_ERR(regmap);
  59        }
  60
  61        return inv_mpu_core_probe(regmap, spi->irq, name,
  62                                  inv_mpu_i2c_disable, chip_type);
  63}
  64
  65/*
  66 * device id table is used to identify what device can be
  67 * supported by this driver
  68 */
  69static const struct spi_device_id inv_mpu_id[] = {
  70        {"mpu6000", INV_MPU6000},
  71        {"mpu6500", INV_MPU6500},
  72        {"mpu6515", INV_MPU6515},
  73        {"mpu6880", INV_MPU6880},
  74        {"mpu9250", INV_MPU9250},
  75        {"mpu9255", INV_MPU9255},
  76        {"icm20608", INV_ICM20608},
  77        {"icm20609", INV_ICM20609},
  78        {"icm20689", INV_ICM20689},
  79        {"icm20602", INV_ICM20602},
  80        {"icm20690", INV_ICM20690},
  81        {"iam20680", INV_IAM20680},
  82        {}
  83};
  84
  85MODULE_DEVICE_TABLE(spi, inv_mpu_id);
  86
  87static const struct of_device_id inv_of_match[] = {
  88        {
  89                .compatible = "invensense,mpu6000",
  90                .data = (void *)INV_MPU6000
  91        },
  92        {
  93                .compatible = "invensense,mpu6500",
  94                .data = (void *)INV_MPU6500
  95        },
  96        {
  97                .compatible = "invensense,mpu6515",
  98                .data = (void *)INV_MPU6515
  99        },
 100        {
 101                .compatible = "invensense,mpu6880",
 102                .data = (void *)INV_MPU6880
 103        },
 104        {
 105                .compatible = "invensense,mpu9250",
 106                .data = (void *)INV_MPU9250
 107        },
 108        {
 109                .compatible = "invensense,mpu9255",
 110                .data = (void *)INV_MPU9255
 111        },
 112        {
 113                .compatible = "invensense,icm20608",
 114                .data = (void *)INV_ICM20608
 115        },
 116        {
 117                .compatible = "invensense,icm20609",
 118                .data = (void *)INV_ICM20609
 119        },
 120        {
 121                .compatible = "invensense,icm20689",
 122                .data = (void *)INV_ICM20689
 123        },
 124        {
 125                .compatible = "invensense,icm20602",
 126                .data = (void *)INV_ICM20602
 127        },
 128        {
 129                .compatible = "invensense,icm20690",
 130                .data = (void *)INV_ICM20690
 131        },
 132        {
 133                .compatible = "invensense,iam20680",
 134                .data = (void *)INV_IAM20680
 135        },
 136        { }
 137};
 138MODULE_DEVICE_TABLE(of, inv_of_match);
 139
 140static const struct acpi_device_id inv_acpi_match[] = {
 141        {"INVN6000", INV_MPU6000},
 142        { },
 143};
 144MODULE_DEVICE_TABLE(acpi, inv_acpi_match);
 145
 146static struct spi_driver inv_mpu_driver = {
 147        .probe          =       inv_mpu_probe,
 148        .id_table       =       inv_mpu_id,
 149        .driver = {
 150                .of_match_table = inv_of_match,
 151                .acpi_match_table = ACPI_PTR(inv_acpi_match),
 152                .name   =       "inv-mpu6000-spi",
 153                .pm     =       &inv_mpu_pmops,
 154        },
 155};
 156
 157module_spi_driver(inv_mpu_driver);
 158
 159MODULE_AUTHOR("Adriana Reus <adriana.reus@intel.com>");
 160MODULE_DESCRIPTION("Invensense device MPU6000 driver");
 161MODULE_LICENSE("GPL");
 162