| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * STMicroelectronics pressures driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 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_pressure.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>-press to maintain |
|---|
| .. | .. |
|---|
| 49 | 47 | .compatible = "st,lps35hw", |
|---|
| 50 | 48 | .data = LPS35HW_PRESS_DEV_NAME, |
|---|
| 51 | 49 | }, |
|---|
| 50 | + { |
|---|
| 51 | + .compatible = "st,lps22hh", |
|---|
| 52 | + .data = LPS22HH_PRESS_DEV_NAME, |
|---|
| 53 | + }, |
|---|
| 52 | 54 | {}, |
|---|
| 53 | 55 | }; |
|---|
| 54 | 56 | MODULE_DEVICE_TABLE(of, st_press_of_match); |
|---|
| 55 | | -#else |
|---|
| 56 | | -#define st_press_of_match NULL |
|---|
| 57 | | -#endif |
|---|
| 58 | 57 | |
|---|
| 59 | 58 | static int st_press_spi_probe(struct spi_device *spi) |
|---|
| 60 | 59 | { |
|---|
| 61 | | - struct iio_dev *indio_dev; |
|---|
| 60 | + const struct st_sensor_settings *settings; |
|---|
| 62 | 61 | struct st_sensor_data *press_data; |
|---|
| 62 | + struct iio_dev *indio_dev; |
|---|
| 63 | 63 | int err; |
|---|
| 64 | 64 | |
|---|
| 65 | + st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias)); |
|---|
| 66 | + |
|---|
| 67 | + settings = st_press_get_settings(spi->modalias); |
|---|
| 68 | + if (!settings) { |
|---|
| 69 | + dev_err(&spi->dev, "device name %s not recognized.\n", |
|---|
| 70 | + spi->modalias); |
|---|
| 71 | + return -ENODEV; |
|---|
| 72 | + } |
|---|
| 73 | + |
|---|
| 65 | 74 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*press_data)); |
|---|
| 66 | | - if (indio_dev == NULL) |
|---|
| 75 | + if (!indio_dev) |
|---|
| 67 | 76 | return -ENOMEM; |
|---|
| 68 | 77 | |
|---|
| 69 | 78 | press_data = iio_priv(indio_dev); |
|---|
| 79 | + press_data->sensor_settings = (struct st_sensor_settings *)settings; |
|---|
| 70 | 80 | |
|---|
| 71 | | - st_sensors_of_name_probe(&spi->dev, st_press_of_match, |
|---|
| 72 | | - spi->modalias, sizeof(spi->modalias)); |
|---|
| 73 | | - st_sensors_spi_configure(indio_dev, spi, press_data); |
|---|
| 74 | | - |
|---|
| 75 | | - err = st_press_common_probe(indio_dev); |
|---|
| 81 | + err = st_sensors_spi_configure(indio_dev, spi); |
|---|
| 76 | 82 | if (err < 0) |
|---|
| 77 | 83 | return err; |
|---|
| 78 | 84 | |
|---|
| 85 | + err = st_sensors_power_enable(indio_dev); |
|---|
| 86 | + if (err) |
|---|
| 87 | + return err; |
|---|
| 88 | + |
|---|
| 89 | + err = st_press_common_probe(indio_dev); |
|---|
| 90 | + if (err < 0) |
|---|
| 91 | + goto st_press_power_off; |
|---|
| 92 | + |
|---|
| 79 | 93 | return 0; |
|---|
| 94 | + |
|---|
| 95 | +st_press_power_off: |
|---|
| 96 | + st_sensors_power_disable(indio_dev); |
|---|
| 97 | + |
|---|
| 98 | + return err; |
|---|
| 80 | 99 | } |
|---|
| 81 | 100 | |
|---|
| 82 | 101 | static int st_press_spi_remove(struct spi_device *spi) |
|---|
| 83 | 102 | { |
|---|
| 84 | | - st_press_common_remove(spi_get_drvdata(spi)); |
|---|
| 103 | + struct iio_dev *indio_dev = spi_get_drvdata(spi); |
|---|
| 104 | + |
|---|
| 105 | + st_press_common_remove(indio_dev); |
|---|
| 106 | + |
|---|
| 107 | + st_sensors_power_disable(indio_dev); |
|---|
| 85 | 108 | |
|---|
| 86 | 109 | return 0; |
|---|
| 87 | 110 | } |
|---|
| .. | .. |
|---|
| 93 | 116 | { LPS22HB_PRESS_DEV_NAME }, |
|---|
| 94 | 117 | { LPS33HW_PRESS_DEV_NAME }, |
|---|
| 95 | 118 | { LPS35HW_PRESS_DEV_NAME }, |
|---|
| 119 | + { LPS22HH_PRESS_DEV_NAME }, |
|---|
| 96 | 120 | {}, |
|---|
| 97 | 121 | }; |
|---|
| 98 | 122 | MODULE_DEVICE_TABLE(spi, st_press_id_table); |
|---|
| .. | .. |
|---|
| 100 | 124 | static struct spi_driver st_press_driver = { |
|---|
| 101 | 125 | .driver = { |
|---|
| 102 | 126 | .name = "st-press-spi", |
|---|
| 103 | | - .of_match_table = of_match_ptr(st_press_of_match), |
|---|
| 127 | + .of_match_table = st_press_of_match, |
|---|
| 104 | 128 | }, |
|---|
| 105 | 129 | .probe = st_press_spi_probe, |
|---|
| 106 | 130 | .remove = st_press_spi_remove, |
|---|