mirror of
https://github.com/torvalds/linux
synced 2024-10-08 12:22:38 +00:00
iio: move 3-wire spi initialization to st_sensors_spi
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>
This commit is contained in:
parent
570c2c55ef
commit
1ecd245e0e
|
@ -1183,9 +1183,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = st_sensors_check_device_support(indio_dev,
|
err = st_sensors_verify_id(indio_dev);
|
||||||
ARRAY_SIZE(st_accel_sensors_settings),
|
|
||||||
st_accel_sensors_settings);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto st_accel_power_off;
|
goto st_accel_power_off;
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,9 @@ static int st_accel_spi_probe(struct spi_device *spi)
|
||||||
adata = iio_priv(indio_dev);
|
adata = iio_priv(indio_dev);
|
||||||
adata->sensor_settings = (struct st_sensor_settings *)settings;
|
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);
|
err = st_accel_common_probe(indio_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
|
@ -608,31 +608,6 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(st_sensors_read_info_raw);
|
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
|
* st_sensors_get_settings_index() - get index of the sensor settings for a
|
||||||
* specific device from list of settings
|
* 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);
|
EXPORT_SYMBOL(st_sensors_get_settings_index);
|
||||||
|
|
||||||
int st_sensors_check_device_support(struct iio_dev *indio_dev,
|
/*
|
||||||
int num_sensors_list,
|
* st_sensors_verify_id() - verify sensor ID (WhoAmI) is matching with the
|
||||||
const struct st_sensor_settings *sensor_settings)
|
* 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);
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
||||||
int i, err;
|
int err;
|
||||||
u8 wai;
|
u8 wai;
|
||||||
|
|
||||||
i = st_sensors_get_settings_index(indio_dev->name,
|
if (sdata->sensor_settings->wai_addr) {
|
||||||
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) {
|
|
||||||
err = sdata->tf->read_byte(&sdata->tb, sdata->dev,
|
err = sdata->tf->read_byte(&sdata->tb, sdata->dev,
|
||||||
sensor_settings[i].wai_addr, &wai);
|
sdata->sensor_settings->wai_addr,
|
||||||
|
&wai);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(&indio_dev->dev,
|
||||||
"failed to read Who-Am-I register.\n");
|
"failed to read Who-Am-I register.\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sensor_settings[i].wai != wai) {
|
if (sdata->sensor_settings->wai != wai) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(&indio_dev->dev,
|
||||||
"%s: WhoAmI mismatch (0x%x).\n",
|
"%s: WhoAmI mismatch (0x%x).\n",
|
||||||
indio_dev->name, wai);
|
indio_dev->name, wai);
|
||||||
|
@ -697,12 +666,9 @@ int st_sensors_check_device_support(struct iio_dev *indio_dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sdata->sensor_settings =
|
return 0;
|
||||||
(struct st_sensor_settings *)&sensor_settings[i];
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(st_sensors_check_device_support);
|
EXPORT_SYMBOL(st_sensors_verify_id);
|
||||||
|
|
||||||
ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
|
ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
|
|
|
@ -102,9 +102,68 @@ static const struct st_sensor_transfer_function st_sensors_tf_spi = {
|
||||||
.read_multiple_byte = st_sensors_spi_read_multiple_byte,
|
.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);
|
spi_set_drvdata(spi, indio_dev);
|
||||||
|
|
||||||
indio_dev->dev.parent = &spi->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->dev = &spi->dev;
|
||||||
sdata->tf = &st_sensors_tf_spi;
|
sdata->tf = &st_sensors_tf_spi;
|
||||||
sdata->get_irq_data_ready = st_sensors_spi_get_irq;
|
sdata->get_irq_data_ready = st_sensors_spi_get_irq;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(st_sensors_spi_configure);
|
EXPORT_SYMBOL(st_sensors_spi_configure);
|
||||||
|
|
||||||
|
|
|
@ -400,9 +400,7 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = st_sensors_check_device_support(indio_dev,
|
err = st_sensors_verify_id(indio_dev);
|
||||||
ARRAY_SIZE(st_gyro_sensors_settings),
|
|
||||||
st_gyro_sensors_settings);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto st_gyro_power_off;
|
goto st_gyro_power_off;
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,9 @@ static int st_gyro_spi_probe(struct spi_device *spi)
|
||||||
gdata = iio_priv(indio_dev);
|
gdata = iio_priv(indio_dev);
|
||||||
gdata->sensor_settings = (struct st_sensor_settings *)settings;
|
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);
|
err = st_gyro_common_probe(indio_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
|
@ -502,9 +502,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = st_sensors_check_device_support(indio_dev,
|
err = st_sensors_verify_id(indio_dev);
|
||||||
ARRAY_SIZE(st_magn_sensors_settings),
|
|
||||||
st_magn_sensors_settings);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto st_magn_power_off;
|
goto st_magn_power_off;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,9 @@ static int st_magn_spi_probe(struct spi_device *spi)
|
||||||
mdata = iio_priv(indio_dev);
|
mdata = iio_priv(indio_dev);
|
||||||
mdata->sensor_settings = (struct st_sensor_settings *)settings;
|
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);
|
err = st_magn_common_probe(indio_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
|
@ -698,9 +698,7 @@ int st_press_common_probe(struct iio_dev *indio_dev)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = st_sensors_check_device_support(indio_dev,
|
err = st_sensors_verify_id(indio_dev);
|
||||||
ARRAY_SIZE(st_press_sensors_settings),
|
|
||||||
st_press_sensors_settings);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto st_press_power_off;
|
goto st_press_power_off;
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,9 @@ static int st_press_spi_probe(struct spi_device *spi)
|
||||||
press_data = iio_priv(indio_dev);
|
press_data = iio_priv(indio_dev);
|
||||||
press_data->sensor_settings = (struct st_sensor_settings *)settings;
|
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);
|
err = st_press_common_probe(indio_dev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
|
@ -338,8 +338,7 @@ int st_sensors_get_settings_index(const char *name,
|
||||||
const struct st_sensor_settings *list,
|
const struct st_sensor_settings *list,
|
||||||
const int list_length);
|
const int list_length);
|
||||||
|
|
||||||
int st_sensors_check_device_support(struct iio_dev *indio_dev,
|
int st_sensors_verify_id(struct iio_dev *indio_dev);
|
||||||
int num_sensors_list, const struct st_sensor_settings *sensor_settings);
|
|
||||||
|
|
||||||
ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
|
ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf);
|
struct device_attribute *attr, char *buf);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/iio/common/st_sensors.h>
|
#include <linux/iio/common/st_sensors.h>
|
||||||
|
|
||||||
void st_sensors_spi_configure(struct iio_dev *indio_dev,
|
int st_sensors_spi_configure(struct iio_dev *indio_dev,
|
||||||
struct spi_device *spi, struct st_sensor_data *sdata);
|
struct spi_device *spi);
|
||||||
|
|
||||||
#endif /* ST_SENSORS_SPI_H */
|
#endif /* ST_SENSORS_SPI_H */
|
||||||
|
|
Loading…
Reference in a new issue