1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * 3-axis magnetometer driver supporting following I2C Bosch-Sensortec chips: |
4 | * - BMC150 |
5 | * - BMC156 |
6 | * - BMM150 |
7 | * |
8 | * Copyright (c) 2016, Intel Corporation. |
9 | */ |
10 | #include <linux/device.h> |
11 | #include <linux/mod_devicetable.h> |
12 | #include <linux/i2c.h> |
13 | #include <linux/module.h> |
14 | #include <linux/acpi.h> |
15 | #include <linux/regmap.h> |
16 | |
17 | #include "bmc150_magn.h" |
18 | |
19 | static int bmc150_magn_i2c_probe(struct i2c_client *client) |
20 | { |
21 | const struct i2c_device_id *id = i2c_client_get_device_id(client); |
22 | struct regmap *regmap; |
23 | const char *name = NULL; |
24 | |
25 | regmap = devm_regmap_init_i2c(client, &bmc150_magn_regmap_config); |
26 | if (IS_ERR(ptr: regmap)) { |
27 | dev_err(&client->dev, "Failed to initialize i2c regmap\n" ); |
28 | return PTR_ERR(ptr: regmap); |
29 | } |
30 | |
31 | if (id) |
32 | name = id->name; |
33 | |
34 | return bmc150_magn_probe(dev: &client->dev, regmap, irq: client->irq, name); |
35 | } |
36 | |
37 | static void bmc150_magn_i2c_remove(struct i2c_client *client) |
38 | { |
39 | bmc150_magn_remove(dev: &client->dev); |
40 | } |
41 | |
42 | static const struct acpi_device_id bmc150_magn_acpi_match[] = { |
43 | {"BMC150B" , 0}, |
44 | {"BMC156B" , 0}, |
45 | {"BMM150B" , 0}, |
46 | {}, |
47 | }; |
48 | MODULE_DEVICE_TABLE(acpi, bmc150_magn_acpi_match); |
49 | |
50 | static const struct i2c_device_id bmc150_magn_i2c_id[] = { |
51 | {"bmc150_magn" , 0}, |
52 | {"bmc156_magn" , 0}, |
53 | {"bmm150_magn" , 0}, |
54 | {} |
55 | }; |
56 | MODULE_DEVICE_TABLE(i2c, bmc150_magn_i2c_id); |
57 | |
58 | static const struct of_device_id bmc150_magn_of_match[] = { |
59 | { .compatible = "bosch,bmc150_magn" }, |
60 | { .compatible = "bosch,bmc156_magn" }, |
61 | { .compatible = "bosch,bmm150_magn" }, /* deprecated compatible */ |
62 | { .compatible = "bosch,bmm150" }, |
63 | { } |
64 | }; |
65 | MODULE_DEVICE_TABLE(of, bmc150_magn_of_match); |
66 | |
67 | static struct i2c_driver bmc150_magn_driver = { |
68 | .driver = { |
69 | .name = "bmc150_magn_i2c" , |
70 | .of_match_table = bmc150_magn_of_match, |
71 | .acpi_match_table = ACPI_PTR(bmc150_magn_acpi_match), |
72 | .pm = &bmc150_magn_pm_ops, |
73 | }, |
74 | .probe = bmc150_magn_i2c_probe, |
75 | .remove = bmc150_magn_i2c_remove, |
76 | .id_table = bmc150_magn_i2c_id, |
77 | }; |
78 | module_i2c_driver(bmc150_magn_driver); |
79 | |
80 | MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com" ); |
81 | MODULE_LICENSE("GPL v2" ); |
82 | MODULE_DESCRIPTION("BMC150 I2C magnetometer driver" ); |
83 | MODULE_IMPORT_NS(IIO_BMC150_MAGN); |
84 | |