Commit 5a059bd2 authored by Josef Gajdusek's avatar Josef Gajdusek Committed by Jonathan Cameron

staging:iio:hmc5843: Add support for i2c hmc5983

This patch adds support for the hmc5983 i2c interface.
This chip is almost identical to the hmc5883. The difference being added
temperature compensation, additional available sample rate (220Hz) and an SPI
interface.
Signed-off-by: default avatarJosef Gajdusek <atx@atx.name>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 585f7ce2
...@@ -6,6 +6,7 @@ Required properties: ...@@ -6,6 +6,7 @@ Required properties:
Other models which are supported with driver are: Other models which are supported with driver are:
"honeywell,hmc5883" "honeywell,hmc5883"
"honeywell,hmc5883l" "honeywell,hmc5883l"
"honeywell,hmc5983"
- reg : the I2C address of the magnetometer - typically 0x1e - reg : the I2C address of the magnetometer - typically 0x1e
Optional properties: Optional properties:
......
...@@ -20,6 +20,6 @@ config SENSORS_HMC5843_I2C ...@@ -20,6 +20,6 @@ config SENSORS_HMC5843_I2C
This driver can also be compiled as a set of modules. This driver can also be compiled as a set of modules.
If so, these modules will be created: If so, these modules will be created:
- hmc5843_core (core functions) - hmc5843_core (core functions)
- hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L) - hmc5843_i2c (support for HMC5843, HMC5883, HMC5883L and HMC5983)
endmenu endmenu
...@@ -29,6 +29,7 @@ enum hmc5843_ids { ...@@ -29,6 +29,7 @@ enum hmc5843_ids {
HMC5843_ID, HMC5843_ID,
HMC5883_ID, HMC5883_ID,
HMC5883L_ID, HMC5883L_ID,
HMC5983_ID,
}; };
struct hmc5843_data { struct hmc5843_data {
......
...@@ -101,6 +101,11 @@ static const int hmc5883_regval_to_samp_freq[][2] = { ...@@ -101,6 +101,11 @@ static const int hmc5883_regval_to_samp_freq[][2] = {
{75, 0} {75, 0}
}; };
static const int hmc5983_regval_to_samp_freq[][2] = {
{0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0},
{75, 0}, {220, 0}
};
/* Describe chip variants */ /* Describe chip variants */
struct hmc5843_chip_info { struct hmc5843_chip_info {
const struct iio_chan_spec *channels; const struct iio_chan_spec *channels;
...@@ -457,7 +462,7 @@ static const struct iio_chan_spec hmc5843_channels[] = { ...@@ -457,7 +462,7 @@ static const struct iio_chan_spec hmc5843_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(3), IIO_CHAN_SOFT_TIMESTAMP(3),
}; };
/* Beware: Y and Z are exchanged on HMC5883 */ /* Beware: Y and Z are exchanged on HMC5883 and 5983 */
static const struct iio_chan_spec hmc5883_channels[] = { static const struct iio_chan_spec hmc5883_channels[] = {
HMC5843_CHANNEL(X, 0), HMC5843_CHANNEL(X, 0),
HMC5843_CHANNEL(Z, 1), HMC5843_CHANNEL(Z, 1),
...@@ -504,6 +509,15 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = { ...@@ -504,6 +509,15 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
.n_regval_to_nanoscale = .n_regval_to_nanoscale =
ARRAY_SIZE(hmc5883l_regval_to_nanoscale), ARRAY_SIZE(hmc5883l_regval_to_nanoscale),
}, },
[HMC5983_ID] = {
.channels = hmc5883_channels,
.regval_to_samp_freq = hmc5983_regval_to_samp_freq,
.n_regval_to_samp_freq =
ARRAY_SIZE(hmc5983_regval_to_samp_freq),
.regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
.n_regval_to_nanoscale =
ARRAY_SIZE(hmc5883l_regval_to_nanoscale),
}
}; };
static int hmc5843_init(struct hmc5843_data *data) static int hmc5843_init(struct hmc5843_data *data)
...@@ -516,7 +530,7 @@ static int hmc5843_init(struct hmc5843_data *data) ...@@ -516,7 +530,7 @@ static int hmc5843_init(struct hmc5843_data *data)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (id[0] != 'H' || id[1] != '4' || id[2] != '3') { if (id[0] != 'H' || id[1] != '4' || id[2] != '3') {
dev_err(data->dev, "no HMC5843/5883/5883L sensor\n"); dev_err(data->dev, "no HMC5843/5883/5883L/5983 sensor\n");
return -ENODEV; return -ENODEV;
} }
...@@ -620,5 +634,5 @@ int hmc5843_common_remove(struct device *dev) ...@@ -620,5 +634,5 @@ int hmc5843_common_remove(struct device *dev)
EXPORT_SYMBOL(hmc5843_common_remove); EXPORT_SYMBOL(hmc5843_common_remove);
MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>"); MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>");
MODULE_DESCRIPTION("HMC5843/5883/5883L core driver"); MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 core driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/* /*
* i2c driver for hmc5843/5843/5883/5883l * i2c driver for hmc5843/5843/5883/5883l/5983
* *
* Split from hmc5843.c * Split from hmc5843.c
* Copyright (C) Josef Gajdusek <atx@atx.name> * Copyright (C) Josef Gajdusek <atx@atx.name>
...@@ -73,6 +73,7 @@ static const struct i2c_device_id hmc5843_id[] = { ...@@ -73,6 +73,7 @@ static const struct i2c_device_id hmc5843_id[] = {
{ "hmc5843", HMC5843_ID }, { "hmc5843", HMC5843_ID },
{ "hmc5883", HMC5883_ID }, { "hmc5883", HMC5883_ID },
{ "hmc5883l", HMC5883L_ID }, { "hmc5883l", HMC5883L_ID },
{ "hmc5983", HMC5983_ID },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, hmc5843_id); MODULE_DEVICE_TABLE(i2c, hmc5843_id);
...@@ -81,6 +82,7 @@ static const struct of_device_id hmc5843_of_match[] = { ...@@ -81,6 +82,7 @@ static const struct of_device_id hmc5843_of_match[] = {
{ .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID }, { .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID },
{ .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID }, { .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID },
{ .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID }, { .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID },
{ .compatible = "honeywell,hmc5983", .data = (void *)HMC5983_ID },
{} {}
}; };
MODULE_DEVICE_TABLE(of, hmc5843_of_match); MODULE_DEVICE_TABLE(of, hmc5843_of_match);
...@@ -98,5 +100,5 @@ static struct i2c_driver hmc5843_driver = { ...@@ -98,5 +100,5 @@ static struct i2c_driver hmc5843_driver = {
module_i2c_driver(hmc5843_driver); module_i2c_driver(hmc5843_driver);
MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>"); MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");
MODULE_DESCRIPTION("HMC5843/5883/5883L i2c driver"); MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 i2c driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment