.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * STMicroelectronics accelerometers driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright 2012-2013 STMicroelectronics Inc. |
---|
5 | 6 | * |
---|
6 | 7 | * Denis Ciocca <denis.ciocca@st.com> |
---|
7 | | - * |
---|
8 | | - * Licensed under the GPL-2. |
---|
9 | 8 | */ |
---|
10 | 9 | |
---|
11 | 10 | #include <linux/kernel.h> |
---|
.. | .. |
---|
18 | 17 | #include <linux/iio/common/st_sensors_spi.h> |
---|
19 | 18 | #include "st_accel.h" |
---|
20 | 19 | |
---|
21 | | -#ifdef CONFIG_OF |
---|
22 | 20 | /* |
---|
23 | 21 | * For new single-chip sensors use <device_name> as compatible string. |
---|
24 | 22 | * For old single-chip devices keep <device_name>-accel to maintain |
---|
.. | .. |
---|
90 | 88 | .compatible = "st,lis3dhh", |
---|
91 | 89 | .data = LIS3DHH_ACCEL_DEV_NAME, |
---|
92 | 90 | }, |
---|
| 91 | + { |
---|
| 92 | + .compatible = "st,lis3de", |
---|
| 93 | + .data = LIS3DE_ACCEL_DEV_NAME, |
---|
| 94 | + }, |
---|
93 | 95 | {} |
---|
94 | 96 | }; |
---|
95 | 97 | MODULE_DEVICE_TABLE(of, st_accel_of_match); |
---|
96 | | -#else |
---|
97 | | -#define st_accel_of_match NULL |
---|
98 | | -#endif |
---|
99 | 98 | |
---|
100 | 99 | static int st_accel_spi_probe(struct spi_device *spi) |
---|
101 | 100 | { |
---|
102 | | - struct iio_dev *indio_dev; |
---|
| 101 | + const struct st_sensor_settings *settings; |
---|
103 | 102 | struct st_sensor_data *adata; |
---|
| 103 | + struct iio_dev *indio_dev; |
---|
104 | 104 | int err; |
---|
| 105 | + |
---|
| 106 | + st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias)); |
---|
| 107 | + |
---|
| 108 | + settings = st_accel_get_settings(spi->modalias); |
---|
| 109 | + if (!settings) { |
---|
| 110 | + dev_err(&spi->dev, "device name %s not recognized.\n", |
---|
| 111 | + spi->modalias); |
---|
| 112 | + return -ENODEV; |
---|
| 113 | + } |
---|
105 | 114 | |
---|
106 | 115 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adata)); |
---|
107 | 116 | if (!indio_dev) |
---|
108 | 117 | return -ENOMEM; |
---|
109 | 118 | |
---|
110 | 119 | adata = iio_priv(indio_dev); |
---|
| 120 | + adata->sensor_settings = (struct st_sensor_settings *)settings; |
---|
111 | 121 | |
---|
112 | | - st_sensors_of_name_probe(&spi->dev, st_accel_of_match, |
---|
113 | | - spi->modalias, sizeof(spi->modalias)); |
---|
114 | | - st_sensors_spi_configure(indio_dev, spi, adata); |
---|
115 | | - |
---|
116 | | - err = st_accel_common_probe(indio_dev); |
---|
| 122 | + err = st_sensors_spi_configure(indio_dev, spi); |
---|
117 | 123 | if (err < 0) |
---|
118 | 124 | return err; |
---|
119 | 125 | |
---|
| 126 | + err = st_sensors_power_enable(indio_dev); |
---|
| 127 | + if (err) |
---|
| 128 | + return err; |
---|
| 129 | + |
---|
| 130 | + err = st_accel_common_probe(indio_dev); |
---|
| 131 | + if (err < 0) |
---|
| 132 | + goto st_accel_power_off; |
---|
| 133 | + |
---|
120 | 134 | return 0; |
---|
| 135 | + |
---|
| 136 | +st_accel_power_off: |
---|
| 137 | + st_sensors_power_disable(indio_dev); |
---|
| 138 | + |
---|
| 139 | + return err; |
---|
121 | 140 | } |
---|
122 | 141 | |
---|
123 | 142 | static int st_accel_spi_remove(struct spi_device *spi) |
---|
124 | 143 | { |
---|
125 | | - st_accel_common_remove(spi_get_drvdata(spi)); |
---|
| 144 | + struct iio_dev *indio_dev = spi_get_drvdata(spi); |
---|
| 145 | + |
---|
| 146 | + st_accel_common_remove(indio_dev); |
---|
| 147 | + |
---|
| 148 | + st_sensors_power_disable(indio_dev); |
---|
126 | 149 | |
---|
127 | 150 | return 0; |
---|
128 | 151 | } |
---|
.. | .. |
---|
143 | 166 | { LIS3LV02DL_ACCEL_DEV_NAME }, |
---|
144 | 167 | { LIS2DW12_ACCEL_DEV_NAME }, |
---|
145 | 168 | { LIS3DHH_ACCEL_DEV_NAME }, |
---|
| 169 | + { LIS3DE_ACCEL_DEV_NAME }, |
---|
146 | 170 | {}, |
---|
147 | 171 | }; |
---|
148 | 172 | MODULE_DEVICE_TABLE(spi, st_accel_id_table); |
---|
.. | .. |
---|
150 | 174 | static struct spi_driver st_accel_driver = { |
---|
151 | 175 | .driver = { |
---|
152 | 176 | .name = "st-accel-spi", |
---|
153 | | - .of_match_table = of_match_ptr(st_accel_of_match), |
---|
| 177 | + .of_match_table = st_accel_of_match, |
---|
154 | 178 | }, |
---|
155 | 179 | .probe = st_accel_spi_probe, |
---|
156 | 180 | .remove = st_accel_spi_remove, |
---|