1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (c) 2018 Synopsys, Inc. and/or its affiliates. |
4 | * |
5 | * Author: Vitor Soares <vitor.soares@synopsys.com> |
6 | */ |
7 | |
8 | #include <linux/kernel.h> |
9 | #include <linux/mod_devicetable.h> |
10 | #include <linux/module.h> |
11 | #include <linux/i3c/device.h> |
12 | #include <linux/i3c/master.h> |
13 | #include <linux/slab.h> |
14 | #include <linux/regmap.h> |
15 | |
16 | #include "st_lsm6dsx.h" |
17 | |
18 | static const struct i3c_device_id st_lsm6dsx_i3c_ids[] = { |
19 | I3C_DEVICE(0x0104, 0x006C, (void *)ST_LSM6DSO_ID), |
20 | I3C_DEVICE(0x0104, 0x006B, (void *)ST_LSM6DSR_ID), |
21 | { /* sentinel */ }, |
22 | }; |
23 | MODULE_DEVICE_TABLE(i3c, st_lsm6dsx_i3c_ids); |
24 | |
25 | static int st_lsm6dsx_i3c_probe(struct i3c_device *i3cdev) |
26 | { |
27 | struct regmap_config st_lsm6dsx_i3c_regmap_config = { |
28 | .reg_bits = 8, |
29 | .val_bits = 8, |
30 | }; |
31 | const struct i3c_device_id *id = i3c_device_match_id(i3cdev, |
32 | id_table: st_lsm6dsx_i3c_ids); |
33 | struct regmap *regmap; |
34 | |
35 | regmap = devm_regmap_init_i3c(i3cdev, &st_lsm6dsx_i3c_regmap_config); |
36 | if (IS_ERR(ptr: regmap)) { |
37 | dev_err(&i3cdev->dev, "Failed to register i3c regmap %ld\n" , PTR_ERR(regmap)); |
38 | return PTR_ERR(ptr: regmap); |
39 | } |
40 | |
41 | return st_lsm6dsx_probe(dev: &i3cdev->dev, irq: 0, hw_id: (uintptr_t)id->data, regmap); |
42 | } |
43 | |
44 | static struct i3c_driver st_lsm6dsx_driver = { |
45 | .driver = { |
46 | .name = "st_lsm6dsx_i3c" , |
47 | .pm = pm_sleep_ptr(&st_lsm6dsx_pm_ops), |
48 | }, |
49 | .probe = st_lsm6dsx_i3c_probe, |
50 | .id_table = st_lsm6dsx_i3c_ids, |
51 | }; |
52 | module_i3c_driver(st_lsm6dsx_driver); |
53 | |
54 | MODULE_AUTHOR("Vitor Soares <vitor.soares@synopsys.com>" ); |
55 | MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx i3c driver" ); |
56 | MODULE_LICENSE("GPL v2" ); |
57 | MODULE_IMPORT_NS(IIO_LSM6DSX); |
58 | |