xref: /openbmc/linux/drivers/iio/magnetometer/rm3100-spi.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1121354b2SSong Qiang // SPDX-License-Identifier: GPL-2.0
2121354b2SSong Qiang /*
3121354b2SSong Qiang  * Support for PNI RM3100 3-axis geomagnetic sensor on a spi bus.
4121354b2SSong Qiang  *
5121354b2SSong Qiang  * Copyright (C) 2018 Song Qiang <songqiang1304521@gmail.com>
6121354b2SSong Qiang  */
7121354b2SSong Qiang 
8121354b2SSong Qiang #include <linux/module.h>
9121354b2SSong Qiang #include <linux/spi/spi.h>
10121354b2SSong Qiang 
11121354b2SSong Qiang #include "rm3100.h"
12121354b2SSong Qiang 
13121354b2SSong Qiang static const struct regmap_config rm3100_regmap_config = {
14121354b2SSong Qiang 	.reg_bits = 8,
15121354b2SSong Qiang 	.val_bits = 8,
16121354b2SSong Qiang 
17121354b2SSong Qiang 	.rd_table = &rm3100_readable_table,
18121354b2SSong Qiang 	.wr_table = &rm3100_writable_table,
19121354b2SSong Qiang 	.volatile_table = &rm3100_volatile_table,
20121354b2SSong Qiang 
21121354b2SSong Qiang 	.read_flag_mask = 0x80,
22121354b2SSong Qiang 
23121354b2SSong Qiang 	.cache_type = REGCACHE_RBTREE,
24121354b2SSong Qiang };
25121354b2SSong Qiang 
rm3100_probe(struct spi_device * spi)26121354b2SSong Qiang static int rm3100_probe(struct spi_device *spi)
27121354b2SSong Qiang {
28121354b2SSong Qiang 	struct regmap *regmap;
29121354b2SSong Qiang 	int ret;
30121354b2SSong Qiang 
31121354b2SSong Qiang 	/* Actually this device supports both mode 0 and mode 3. */
32121354b2SSong Qiang 	spi->mode = SPI_MODE_0;
33121354b2SSong Qiang 	/* Data rates cannot exceed 1Mbits. */
34121354b2SSong Qiang 	spi->max_speed_hz = 1000000;
35121354b2SSong Qiang 	spi->bits_per_word = 8;
36121354b2SSong Qiang 	ret = spi_setup(spi);
37121354b2SSong Qiang 	if (ret)
38121354b2SSong Qiang 		return ret;
39121354b2SSong Qiang 
40121354b2SSong Qiang 	regmap = devm_regmap_init_spi(spi, &rm3100_regmap_config);
41121354b2SSong Qiang 	if (IS_ERR(regmap))
42121354b2SSong Qiang 		return PTR_ERR(regmap);
43121354b2SSong Qiang 
44121354b2SSong Qiang 	return rm3100_common_probe(&spi->dev, regmap, spi->irq);
45121354b2SSong Qiang }
46121354b2SSong Qiang 
47121354b2SSong Qiang static const struct of_device_id rm3100_dt_match[] = {
48121354b2SSong Qiang 	{ .compatible = "pni,rm3100", },
49121354b2SSong Qiang 	{ }
50121354b2SSong Qiang };
51121354b2SSong Qiang MODULE_DEVICE_TABLE(of, rm3100_dt_match);
52121354b2SSong Qiang 
53121354b2SSong Qiang static struct spi_driver rm3100_driver = {
54121354b2SSong Qiang 	.driver = {
55121354b2SSong Qiang 		.name = "rm3100-spi",
56121354b2SSong Qiang 		.of_match_table = rm3100_dt_match,
57121354b2SSong Qiang 	},
58121354b2SSong Qiang 	.probe = rm3100_probe,
59121354b2SSong Qiang };
60121354b2SSong Qiang module_spi_driver(rm3100_driver);
61121354b2SSong Qiang 
62121354b2SSong Qiang MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>");
63121354b2SSong Qiang MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer spi driver");
64121354b2SSong Qiang MODULE_LICENSE("GPL v2");
65*230ee6c6SJonathan Cameron MODULE_IMPORT_NS(IIO_RM3100);
66