Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd64df16 authored by Adriana Reus's avatar Adriana Reus Committed by Jonathan Cameron
Browse files

iio: imu: inv_mpu6050: Add SPI support for MPU6000



The only difference between the MPU6000 and the
MPU6050 is that the first also supports SPI.
Add SPI driver for this chip.

Signed-off-by: default avatarAdriana Reus <adriana.reus@intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent b3eea8da
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -20,3 +20,14 @@ config INV_MPU6050_I2C
	  It is a gyroscope/accelerometer combo device.
	  This driver can be built as a module. The module will be called
	  inv-mpu6050-i2c.

config INV_MPU6050_SPI
	tristate "Invensense MPU6050 devices (SPI)"
	depends on SPI_MASTER
	select INV_MPU6050_IIO
	select REGMAP_SPI
	help
	  This driver supports the Invensense MPU6050 devices.
	  It is a gyroscope/accelerometer combo device.
	  This driver can be built as a module. The module will be called
	  inv-mpu6050-spi.
+3 −0
Original line number Diff line number Diff line
@@ -7,3 +7,6 @@ inv-mpu6050-objs := inv_mpu_core.o inv_mpu_ring.o inv_mpu_trigger.o

obj-$(CONFIG_INV_MPU6050_I2C) += inv-mpu6050-i2c.o
inv-mpu6050-i2c-objs := inv_mpu_i2c.o inv_mpu_acpi.o

obj-$(CONFIG_INV_MPU6050_SPI) += inv-mpu6050-spi.o
inv-mpu6050-spi-objs := inv_mpu_spi.o
+6 −1
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@ int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on)

	return 0;
}
EXPORT_SYMBOL_GPL(inv_mpu6050_set_power_itg);

/**
 *  inv_mpu6050_init_config() - Initialize hardware, disable FIFO.
@@ -676,7 +677,8 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st)
	return 0;
}

int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name)
int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
		       int (*inv_mpu_bus_setup)(struct iio_dev *))
{
	struct inv_mpu6050_state *st;
	struct iio_dev *indio_dev;
@@ -700,6 +702,9 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name)
	if (result)
		return result;

	if (inv_mpu_bus_setup)
		inv_mpu_bus_setup(indio_dev);

	result = inv_mpu6050_init_config(indio_dev);
	if (result) {
		dev_err(dev, "Could not initialize device.\n");
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ static int inv_mpu_probe(struct i2c_client *client,
		return PTR_ERR(regmap);
	}

	result = inv_mpu_core_probe(regmap, client->irq, name);
	result = inv_mpu_core_probe(regmap, client->irq, name, NULL);
	if (result < 0)
		return result;

+5 −1
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ struct inv_mpu6050_reg_map {
enum inv_devices {
	INV_MPU6050,
	INV_MPU6500,
	INV_MPU6000,
	INV_NUM_PARTS
};

@@ -154,6 +155,7 @@ struct inv_mpu6050_state {
#define INV_MPU6050_BIT_I2C_MST_EN          0x20
#define INV_MPU6050_BIT_FIFO_EN             0x40
#define INV_MPU6050_BIT_DMP_EN              0x80
#define INV_MPU6050_BIT_I2C_IF_DIS          0x10

#define INV_MPU6050_REG_PWR_MGMT_1          0x6B
#define INV_MPU6050_BIT_H_RESET             0x80
@@ -258,6 +260,8 @@ int inv_mpu6050_write_reg(struct inv_mpu6050_state *st, int reg, u8 val);
int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on);
int inv_mpu_acpi_create_mux_client(struct i2c_client *client);
void inv_mpu_acpi_delete_mux_client(struct i2c_client *client);
int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name);
int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
		      int (*inv_mpu_bus_setup)(struct iio_dev *));
int inv_mpu_core_remove(struct device *dev);
int inv_mpu6050_set_power_itg(struct inv_mpu6050_state *st, bool power_on);
extern const struct dev_pm_ops inv_mpu_pmops;
Loading