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