xref: /linux/drivers/iio/magnetometer/hmc5843_i2c.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2fc35a91bSJosef Gajdusek /*
35a059bd2SJosef Gajdusek  * i2c driver for hmc5843/5843/5883/5883l/5983
4fc35a91bSJosef Gajdusek  *
5fc35a91bSJosef Gajdusek  * Split from hmc5843.c
6fc35a91bSJosef Gajdusek  * Copyright (C) Josef Gajdusek <atx@atx.name>
74630adb8SCristina Moraru  */
8fc35a91bSJosef Gajdusek 
9fc35a91bSJosef Gajdusek #include <linux/module.h>
10fc35a91bSJosef Gajdusek #include <linux/i2c.h>
11fc35a91bSJosef Gajdusek #include <linux/regmap.h>
12fc35a91bSJosef Gajdusek #include <linux/iio/iio.h>
13fc35a91bSJosef Gajdusek #include <linux/iio/triggered_buffer.h>
14fc35a91bSJosef Gajdusek 
15fc35a91bSJosef Gajdusek #include "hmc5843.h"
16fc35a91bSJosef Gajdusek 
17fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_readable_ranges[] = {
18fc35a91bSJosef Gajdusek 	regmap_reg_range(0, HMC5843_ID_END),
19fc35a91bSJosef Gajdusek };
20fc35a91bSJosef Gajdusek 
2115313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_readable_table = {
22fc35a91bSJosef Gajdusek 	.yes_ranges = hmc5843_readable_ranges,
23fc35a91bSJosef Gajdusek 	.n_yes_ranges = ARRAY_SIZE(hmc5843_readable_ranges),
24fc35a91bSJosef Gajdusek };
25fc35a91bSJosef Gajdusek 
26fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_writable_ranges[] = {
27fc35a91bSJosef Gajdusek 	regmap_reg_range(0, HMC5843_MODE_REG),
28fc35a91bSJosef Gajdusek };
29fc35a91bSJosef Gajdusek 
3015313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_writable_table = {
31fc35a91bSJosef Gajdusek 	.yes_ranges = hmc5843_writable_ranges,
32fc35a91bSJosef Gajdusek 	.n_yes_ranges = ARRAY_SIZE(hmc5843_writable_ranges),
33fc35a91bSJosef Gajdusek };
34fc35a91bSJosef Gajdusek 
35fc35a91bSJosef Gajdusek static const struct regmap_range hmc5843_volatile_ranges[] = {
36fc35a91bSJosef Gajdusek 	regmap_reg_range(HMC5843_DATA_OUT_MSB_REGS, HMC5843_STATUS_REG),
37fc35a91bSJosef Gajdusek };
38fc35a91bSJosef Gajdusek 
3915313309SKrzysztof Kozlowski static const struct regmap_access_table hmc5843_volatile_table = {
40fc35a91bSJosef Gajdusek 	.yes_ranges = hmc5843_volatile_ranges,
41fc35a91bSJosef Gajdusek 	.n_yes_ranges = ARRAY_SIZE(hmc5843_volatile_ranges),
42fc35a91bSJosef Gajdusek };
43fc35a91bSJosef Gajdusek 
4415313309SKrzysztof Kozlowski static const struct regmap_config hmc5843_i2c_regmap_config = {
45fc35a91bSJosef Gajdusek 	.reg_bits = 8,
46fc35a91bSJosef Gajdusek 	.val_bits = 8,
47fc35a91bSJosef Gajdusek 
48fc35a91bSJosef Gajdusek 	.rd_table = &hmc5843_readable_table,
49fc35a91bSJosef Gajdusek 	.wr_table = &hmc5843_writable_table,
50fc35a91bSJosef Gajdusek 	.volatile_table = &hmc5843_volatile_table,
51fc35a91bSJosef Gajdusek 
52fc35a91bSJosef Gajdusek 	.cache_type = REGCACHE_RBTREE,
53fc35a91bSJosef Gajdusek };
54fc35a91bSJosef Gajdusek 
55aa6432f1SCristina Opriceana static int hmc5843_i2c_probe(struct i2c_client *cli,
56fc35a91bSJosef Gajdusek 			     const struct i2c_device_id *id)
57fc35a91bSJosef Gajdusek {
58536cc27dSKangjie Lu 	struct regmap *regmap = devm_regmap_init_i2c(cli,
59536cc27dSKangjie Lu 			&hmc5843_i2c_regmap_config);
60536cc27dSKangjie Lu 	if (IS_ERR(regmap))
61536cc27dSKangjie Lu 		return PTR_ERR(regmap);
62536cc27dSKangjie Lu 
63aa6432f1SCristina Opriceana 	return hmc5843_common_probe(&cli->dev,
64536cc27dSKangjie Lu 			regmap,
6570b2737eSYong Li 			id->driver_data, id->name);
66fc35a91bSJosef Gajdusek }
67fc35a91bSJosef Gajdusek 
68fc35a91bSJosef Gajdusek static int hmc5843_i2c_remove(struct i2c_client *client)
69fc35a91bSJosef Gajdusek {
704b6fb9f3SUwe Kleine-König 	hmc5843_common_remove(&client->dev);
714b6fb9f3SUwe Kleine-König 
724b6fb9f3SUwe Kleine-König 	return 0;
73fc35a91bSJosef Gajdusek }
74fc35a91bSJosef Gajdusek 
75fc35a91bSJosef Gajdusek static const struct i2c_device_id hmc5843_id[] = {
76fc35a91bSJosef Gajdusek 	{ "hmc5843", HMC5843_ID },
77fc35a91bSJosef Gajdusek 	{ "hmc5883", HMC5883_ID },
78fc35a91bSJosef Gajdusek 	{ "hmc5883l", HMC5883L_ID },
795a059bd2SJosef Gajdusek 	{ "hmc5983", HMC5983_ID },
80fc35a91bSJosef Gajdusek 	{ }
81fc35a91bSJosef Gajdusek };
82fc35a91bSJosef Gajdusek MODULE_DEVICE_TABLE(i2c, hmc5843_id);
83fc35a91bSJosef Gajdusek 
84fc35a91bSJosef Gajdusek static const struct of_device_id hmc5843_of_match[] = {
85fc35a91bSJosef Gajdusek 	{ .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID },
86fc35a91bSJosef Gajdusek 	{ .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID },
87fc35a91bSJosef Gajdusek 	{ .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID },
885a059bd2SJosef Gajdusek 	{ .compatible = "honeywell,hmc5983", .data = (void *)HMC5983_ID },
89fc35a91bSJosef Gajdusek 	{}
90fc35a91bSJosef Gajdusek };
91fc35a91bSJosef Gajdusek MODULE_DEVICE_TABLE(of, hmc5843_of_match);
92fc35a91bSJosef Gajdusek 
93fc35a91bSJosef Gajdusek static struct i2c_driver hmc5843_driver = {
94fc35a91bSJosef Gajdusek 	.driver = {
95fc35a91bSJosef Gajdusek 		.name	= "hmc5843",
96fc35a91bSJosef Gajdusek 		.pm	= HMC5843_PM_OPS,
97fc35a91bSJosef Gajdusek 		.of_match_table = hmc5843_of_match,
98fc35a91bSJosef Gajdusek 	},
99fc35a91bSJosef Gajdusek 	.id_table	= hmc5843_id,
100fc35a91bSJosef Gajdusek 	.probe		= hmc5843_i2c_probe,
101fc35a91bSJosef Gajdusek 	.remove		= hmc5843_i2c_remove,
102fc35a91bSJosef Gajdusek };
103fc35a91bSJosef Gajdusek module_i2c_driver(hmc5843_driver);
104fc35a91bSJosef Gajdusek 
105fc35a91bSJosef Gajdusek MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");
1065a059bd2SJosef Gajdusek MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 i2c driver");
107fc35a91bSJosef Gajdusek MODULE_LICENSE("GPL");
1087e615cafSJonathan Cameron MODULE_IMPORT_NS(IIO_HMC5843);
109