iio: move 3-wire spi initialization to st_sensors_spi
authorDenis Ciocca <denis.ciocca@st.com>
Thu, 18 Jul 2019 22:53:52 +0000 (15:53 -0700)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 27 Jul 2019 21:52:06 +0000 (22:52 +0100)
Some devices need to be configured with special bit in order to
use spi 3-wire. This was done during device identification phase.
Instead, let's move this part as spi specific.
Doing this the check_device_support function becomes a simple
device id check, so let's rename it.

Signed-off-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
12 files changed:
drivers/iio/accel/st_accel_core.c
drivers/iio/accel/st_accel_spi.c
drivers/iio/common/st_sensors/st_sensors_core.c
drivers/iio/common/st_sensors/st_sensors_spi.c
drivers/iio/gyro/st_gyro_core.c
drivers/iio/gyro/st_gyro_spi.c
drivers/iio/magnetometer/st_magn_core.c
drivers/iio/magnetometer/st_magn_spi.c
drivers/iio/pressure/st_pressure_core.c
drivers/iio/pressure/st_pressure_spi.c
include/linux/iio/common/st_sensors.h
include/linux/iio/common/st_sensors_spi.h

index 6fc490f..6309097 100644 (file)
@@ -1183,9 +1183,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
        if (err)
                return err;
 
-       err = st_sensors_check_device_support(indio_dev,
-                                       ARRAY_SIZE(st_accel_sensors_settings),
-                                       st_accel_sensors_settings);
+       err = st_sensors_verify_id(indio_dev);
        if (err < 0)
                goto st_accel_power_off;
 
index c0556db..8af7027 100644 (file)
@@ -124,7 +124,9 @@ static int st_accel_spi_probe(struct spi_device *spi)
        adata = iio_priv(indio_dev);
        adata->sensor_settings = (struct st_sensor_settings *)settings;
 
-       st_sensors_spi_configure(indio_dev, spi, adata);
+       err = st_sensors_spi_configure(indio_dev, spi);
+       if (err < 0)
+               return err;
 
        err = st_accel_common_probe(indio_dev);
        if (err < 0)
index 3610ca9..f05bf7c 100644 (file)
@@ -608,31 +608,6 @@ out:
 }
 EXPORT_SYMBOL(st_sensors_read_info_raw);
 
-static int st_sensors_init_interface_mode(struct iio_dev *indio_dev,
-                       const struct st_sensor_settings *sensor_settings)
-{
-       struct st_sensor_data *sdata = iio_priv(indio_dev);
-       struct device_node *np = sdata->dev->of_node;
-       struct st_sensors_platform_data *pdata;
-
-       pdata = (struct st_sensors_platform_data *)sdata->dev->platform_data;
-       if (((np && of_property_read_bool(np, "spi-3wire")) ||
-            (pdata && pdata->spi_3wire)) && sensor_settings->sim.addr) {
-               int err;
-
-               err = sdata->tf->write_byte(&sdata->tb, sdata->dev,
-                                           sensor_settings->sim.addr,
-                                           sensor_settings->sim.value);
-               if (err < 0) {
-                       dev_err(&indio_dev->dev,
-                               "failed to init interface mode\n");
-                       return err;
-               }
-       }
-
-       return 0;
-}
-
 /*
  * st_sensors_get_settings_index() - get index of the sensor settings for a
  *                                  specific device from list of settings
@@ -660,36 +635,30 @@ int st_sensors_get_settings_index(const char *name,
 }
 EXPORT_SYMBOL(st_sensors_get_settings_index);
 
-int st_sensors_check_device_support(struct iio_dev *indio_dev,
-                       int num_sensors_list,
-                       const struct st_sensor_settings *sensor_settings)
+/*
+ * st_sensors_verify_id() - verify sensor ID (WhoAmI) is matching with the
+ *                         expected value
+ * @indio_dev: IIO device reference.
+ *
+ * Return: 0 on success (valid sensor ID), else a negative error code.
+ */
+int st_sensors_verify_id(struct iio_dev *indio_dev)
 {
        struct st_sensor_data *sdata = iio_priv(indio_dev);
-       int i, err;
+       int err;
        u8 wai;
 
-       i = st_sensors_get_settings_index(indio_dev->name,
-                                         sensor_settings, num_sensors_list);
-       if (i < 0) {
-               dev_err(&indio_dev->dev, "device name %s not recognized.\n",
-                       indio_dev->name);
-               return i;
-       }
-
-       err = st_sensors_init_interface_mode(indio_dev, &sensor_settings[i]);
-       if (err < 0)
-               return err;
-
-       if (sensor_settings[i].wai_addr) {
+       if (sdata->sensor_settings->wai_addr) {
                err = sdata->tf->read_byte(&sdata->tb, sdata->dev,
-                                          sensor_settings[i].wai_addr, &wai);
+                                          sdata->sensor_settings->wai_addr,
+                                          &wai);
                if (err < 0) {
                        dev_err(&indio_dev->dev,
                                "failed to read Who-Am-I register.\n");
                        return err;
                }
 
-               if (sensor_settings[i].wai != wai) {
+               if (sdata->sensor_settings->wai != wai) {
                        dev_err(&indio_dev->dev,
                                "%s: WhoAmI mismatch (0x%x).\n",
                                indio_dev->name, wai);
@@ -697,12 +666,9 @@ int st_sensors_check_device_support(struct iio_dev *indio_dev,
                }
        }
 
-       sdata->sensor_settings =
-                       (struct st_sensor_settings *)&sensor_settings[i];
-
-       return i;
+       return 0;
 }
-EXPORT_SYMBOL(st_sensors_check_device_support);
+EXPORT_SYMBOL(st_sensors_verify_id);
 
 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
                                struct device_attribute *attr, char *buf)
index 2213843..a57cd64 100644 (file)
@@ -102,9 +102,68 @@ static const struct st_sensor_transfer_function st_sensors_tf_spi = {
        .read_multiple_byte = st_sensors_spi_read_multiple_byte,
 };
 
-void st_sensors_spi_configure(struct iio_dev *indio_dev,
-                       struct spi_device *spi, struct st_sensor_data *sdata)
+/*
+ * st_sensors_is_spi_3_wire() - check if SPI 3-wire mode has been selected
+ * @spi: spi device reference.
+ *
+ * Return: true if SPI 3-wire mode is selected, false otherwise.
+ */
+static bool st_sensors_is_spi_3_wire(struct spi_device *spi)
+{
+       struct device_node *np = spi->dev.of_node;
+       struct st_sensors_platform_data *pdata;
+
+       pdata = (struct st_sensors_platform_data *)spi->dev.platform_data;
+       if ((np && of_property_read_bool(np, "spi-3wire")) ||
+           (pdata && pdata->spi_3wire)) {
+               return true;
+       }
+
+       return false;
+}
+
+/*
+ * st_sensors_configure_spi_3_wire() - configure SPI 3-wire if needed
+ * @spi: spi device reference.
+ * @settings: sensor specific settings reference.
+ *
+ * Return: 0 on success, else a negative error code.
+ */
+static int st_sensors_configure_spi_3_wire(struct spi_device *spi,
+                                          struct st_sensor_settings *settings)
+{
+       if (settings->sim.addr) {
+               u8 buffer[] = {
+                       settings->sim.addr,
+                       settings->sim.value
+               };
+
+               return spi_write(spi, buffer, 2);
+       }
+
+       return 0;
+}
+
+/*
+ * st_sensors_spi_configure() - configure SPI interface
+ * @indio_dev: IIO device reference.
+ * @spi: spi device reference.
+ *
+ * Return: 0 on success, else a negative error code.
+ */
+int st_sensors_spi_configure(struct iio_dev *indio_dev,
+                            struct spi_device *spi)
 {
+       struct st_sensor_data *sdata = iio_priv(indio_dev);
+       int err;
+
+       if (st_sensors_is_spi_3_wire(spi)) {
+               err = st_sensors_configure_spi_3_wire(spi,
+                                                     sdata->sensor_settings);
+               if (err < 0)
+                       return err;
+       }
+
        spi_set_drvdata(spi, indio_dev);
 
        indio_dev->dev.parent = &spi->dev;
@@ -113,6 +172,8 @@ void st_sensors_spi_configure(struct iio_dev *indio_dev,
        sdata->dev = &spi->dev;
        sdata->tf = &st_sensors_tf_spi;
        sdata->get_irq_data_ready = st_sensors_spi_get_irq;
+
+       return 0;
 }
 EXPORT_SYMBOL(st_sensors_spi_configure);
 
index 5cc63d4..4b87e79 100644 (file)
@@ -400,9 +400,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
        if (err)
                return err;
 
-       err = st_sensors_check_device_support(indio_dev,
-                                       ARRAY_SIZE(st_gyro_sensors_settings),
-                                       st_gyro_sensors_settings);
+       err = st_sensors_verify_id(indio_dev);
        if (err < 0)
                goto st_gyro_power_off;
 
index bb70820..b5c6242 100644 (file)
@@ -91,7 +91,9 @@ static int st_gyro_spi_probe(struct spi_device *spi)
        gdata = iio_priv(indio_dev);
        gdata->sensor_settings = (struct st_sensor_settings *)settings;
 
-       st_sensors_spi_configure(indio_dev, spi, gdata);
+       err = st_sensors_spi_configure(indio_dev, spi);
+       if (err < 0)
+               return err;
 
        err = st_gyro_common_probe(indio_dev);
        if (err < 0)
index 43a49a5..3f313ae 100644 (file)
@@ -502,9 +502,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
        if (err)
                return err;
 
-       err = st_sensors_check_device_support(indio_dev,
-                                       ARRAY_SIZE(st_magn_sensors_settings),
-                                       st_magn_sensors_settings);
+       err = st_sensors_verify_id(indio_dev);
        if (err < 0)
                goto st_magn_power_off;
 
index a3045af..fbf909b 100644 (file)
@@ -73,7 +73,9 @@ static int st_magn_spi_probe(struct spi_device *spi)
        mdata = iio_priv(indio_dev);
        mdata->sensor_settings = (struct st_sensor_settings *)settings;
 
-       st_sensors_spi_configure(indio_dev, spi, mdata);
+       err = st_sensors_spi_configure(indio_dev, spi);
+       if (err < 0)
+               return err;
 
        err = st_magn_common_probe(indio_dev);
        if (err < 0)
index 35d80ff..a783fc0 100644 (file)
@@ -698,9 +698,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
        if (err)
                return err;
 
-       err = st_sensors_check_device_support(indio_dev,
-                                       ARRAY_SIZE(st_press_sensors_settings),
-                                       st_press_sensors_settings);
+       err = st_sensors_verify_id(indio_dev);
        if (err < 0)
                goto st_press_power_off;
 
index 3e8c1ff..7c8b702 100644 (file)
@@ -83,7 +83,9 @@ static int st_press_spi_probe(struct spi_device *spi)
        press_data = iio_priv(indio_dev);
        press_data->sensor_settings = (struct st_sensor_settings *)settings;
 
-       st_sensors_spi_configure(indio_dev, spi, press_data);
+       err = st_sensors_spi_configure(indio_dev, spi);
+       if (err < 0)
+               return err;
 
        err = st_press_common_probe(indio_dev);
        if (err < 0)
index 17fbf3e..566b955 100644 (file)
@@ -338,8 +338,7 @@ int st_sensors_get_settings_index(const char *name,
                                  const struct st_sensor_settings *list,
                                  const int list_length);
 
-int st_sensors_check_device_support(struct iio_dev *indio_dev,
-       int num_sensors_list, const struct st_sensor_settings *sensor_settings);
+int st_sensors_verify_id(struct iio_dev *indio_dev);
 
 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
                                struct device_attribute *attr, char *buf);
index 6020f71..90b25f0 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/spi/spi.h>
 #include <linux/iio/common/st_sensors.h>
 
-void st_sensors_spi_configure(struct iio_dev *indio_dev,
-                       struct spi_device *spi, struct st_sensor_data *sdata);
+int st_sensors_spi_configure(struct iio_dev *indio_dev,
+                            struct spi_device *spi);
 
 #endif /* ST_SENSORS_SPI_H */