Skip to content

Commit

Permalink
iio: Allow to read mount matrix from ACPI
Browse files Browse the repository at this point in the history
Currently mount matrix is allowed in Device Tree, though there is
no technical issue to extend it to support ACPI.

Convert the function to use device_property_read_string_array() and
thus allow to read mount matrix from ACPI if available.

Example of use in _DSD method:

  Name (_DSD, Package ()
  {
     ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
     Package ()
     {
        Package () { "mount-matrix", Package() {
                "1", "0",     "0",
                "0", "0.866", "0.5",
                "0", "-0.5",  "0.866",
        } },
     }
  })

At the same time drop the "of" prefix from its name and
convert current users.

No functional change intended.

Signed-off-by: Andy Shevchenko <[email protected]>
  • Loading branch information
andy-shev committed May 17, 2019
1 parent 65138fd commit fef6b06
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 43 deletions.
4 changes: 1 addition & 3 deletions drivers/iio/accel/kxsd9.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,9 +420,7 @@ int kxsd9_common_probe(struct device *dev,
indio_dev->available_scan_masks = kxsd9_scan_masks;

/* Read the mounting matrix, if present */
ret = of_iio_read_mount_matrix(dev,
"mount-matrix",
&st->orientation);
ret = iio_read_mount_matrix(dev, "mount-matrix", &st->orientation);
if (ret)
return ret;

Expand Down
3 changes: 1 addition & 2 deletions drivers/iio/gyro/mpu3050-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1150,8 +1150,7 @@ int mpu3050_common_probe(struct device *dev,
mpu3050->divisor = 99;

/* Read the mounting matrix, if present */
ret = of_iio_read_mount_matrix(dev, "mount-matrix",
&mpu3050->orientation);
ret = iio_read_mount_matrix(dev, "mount-matrix", &mpu3050->orientation);
if (ret)
return ret;

Expand Down
4 changes: 2 additions & 2 deletions drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1021,8 +1021,8 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,

pdata = dev_get_platdata(dev);
if (!pdata) {
result = of_iio_read_mount_matrix(dev, "mount-matrix",
&st->orientation);
result = iio_read_mount_matrix(dev, "mount-matrix",
&st->orientation);
if (result) {
dev_err(dev, "Failed to retrieve mounting matrix %d\n",
result);
Expand Down
46 changes: 18 additions & 28 deletions drivers/iio/industrialio-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/poll.h>
#include <linux/property.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/cdev.h>
Expand Down Expand Up @@ -530,8 +531,8 @@ ssize_t iio_show_mount_matrix(struct iio_dev *indio_dev, uintptr_t priv,
EXPORT_SYMBOL_GPL(iio_show_mount_matrix);

/**
* of_iio_read_mount_matrix() - retrieve iio device mounting matrix from
* device-tree "mount-matrix" property
* iio_read_mount_matrix() - retrieve iio device mounting matrix from
* device "mount-matrix" property
* @dev: device the mounting matrix property is assigned to
* @propname: device specific mounting matrix property name
* @matrix: where to store retrieved matrix
Expand All @@ -541,40 +542,29 @@ EXPORT_SYMBOL_GPL(iio_show_mount_matrix);
*
* Return: 0 if success, or a negative error code on failure.
*/
#ifdef CONFIG_OF
int of_iio_read_mount_matrix(const struct device *dev,
const char *propname,
struct iio_mount_matrix *matrix)
int iio_read_mount_matrix(struct device *dev, const char *propname,
struct iio_mount_matrix *matrix)
{
if (dev->of_node) {
int err = of_property_read_string_array(dev->of_node,
propname, matrix->rotation,
ARRAY_SIZE(iio_mount_idmatrix.rotation));
size_t len = ARRAY_SIZE(iio_mount_idmatrix.rotation);
int err;

if (err == ARRAY_SIZE(iio_mount_idmatrix.rotation))
return 0;
err = device_property_read_string_array(dev, propname,
matrix->rotation, len);
if (err == len)
return 0;

if (err >= 0)
/* Invalid number of matrix entries. */
return -EINVAL;
if (err >= 0)
/* Invalid number of matrix entries. */
return -EINVAL;

if (err != -EINVAL)
/* Invalid matrix declaration format. */
return err;
}
if (err != -EINVAL)
/* Invalid matrix declaration format. */
return err;

/* Matrix was not declared at all: fallback to identity. */
return iio_setup_mount_idmatrix(dev, matrix);
}
#else
int of_iio_read_mount_matrix(const struct device *dev,
const char *propname,
struct iio_mount_matrix *matrix)
{
return iio_setup_mount_idmatrix(dev, matrix);
}
#endif
EXPORT_SYMBOL(of_iio_read_mount_matrix);
EXPORT_SYMBOL(iio_read_mount_matrix);

static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
int size, const int *vals)
Expand Down
5 changes: 2 additions & 3 deletions drivers/iio/magnetometer/ak8974.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,9 +733,8 @@ static int ak8974_probe(struct i2c_client *i2c,
ak8974->i2c = i2c;
mutex_init(&ak8974->lock);

ret = of_iio_read_mount_matrix(&i2c->dev,
"mount-matrix",
&ak8974->orientation);
ret = iio_read_mount_matrix(&i2c->dev, "mount-matrix",
&ak8974->orientation);
if (ret)
return ret;

Expand Down
5 changes: 2 additions & 3 deletions drivers/iio/magnetometer/ak8975.c
Original file line number Diff line number Diff line change
Expand Up @@ -911,9 +911,8 @@ static int ak8975_probe(struct i2c_client *client,
data->eoc_irq = 0;

if (!pdata) {
err = of_iio_read_mount_matrix(&client->dev,
"mount-matrix",
&data->orientation);
err = iio_read_mount_matrix(&client->dev, "mount-matrix",
&data->orientation);
if (err)
return err;
} else
Expand Down
4 changes: 2 additions & 2 deletions include/linux/iio/iio.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ struct iio_mount_matrix {

ssize_t iio_show_mount_matrix(struct iio_dev *indio_dev, uintptr_t priv,
const struct iio_chan_spec *chan, char *buf);
int of_iio_read_mount_matrix(const struct device *dev, const char *propname,
struct iio_mount_matrix *matrix);
int iio_read_mount_matrix(struct device *dev, const char *propname,
struct iio_mount_matrix *matrix);

typedef const struct iio_mount_matrix *
(iio_get_mount_matrix_t)(const struct iio_dev *indio_dev,
Expand Down

0 comments on commit fef6b06

Please sign in to comment.