cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

inv_mpu_spi.c (3738B)


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