Commit c6861377 authored by Daniel Baluta's avatar Daniel Baluta Committed by Jonathan Cameron

iio: accel: kxcjk-1013: add support for kxtj2-1009

This patch adds support for KXTJ2-1009 3-axis acceleromenter sensor.
KXTJ2-1009 uses the same register definitions as KXCJK-1013.

The specification for KXTJ2-1009 can be downloaded from:
http://www.kionix.com/sites/default/files/KXTJ2-1009%20Specifications%20Rev%204.pdfReviewed-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarDaniel Baluta <daniel.baluta@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 8ecbb3c3
...@@ -99,7 +99,8 @@ config KXCJK1013 ...@@ -99,7 +99,8 @@ config KXCJK1013
select IIO_TRIGGERED_BUFFER select IIO_TRIGGERED_BUFFER
help help
Say Y here if you want to build a driver for the Kionix KXCJK-1013 Say Y here if you want to build a driver for the Kionix KXCJK-1013
triaxial acceleration sensor. This driver also supports KXCJ9-1008. triaxial acceleration sensor. This driver also supports KXCJ9-1008
and KXTJ2-1009.
To compile this driver as a module, choose M here: the module will To compile this driver as a module, choose M here: the module will
be called kxcjk-1013. be called kxcjk-1013.
......
...@@ -85,6 +85,13 @@ ...@@ -85,6 +85,13 @@
#define KXCJK1013_DEFAULT_WAKE_THRES 1 #define KXCJK1013_DEFAULT_WAKE_THRES 1
enum kx_chipset {
KXCJK1013,
KXCJ91008,
KXTJ21009,
KX_MAX_CHIPS /* this must be last */
};
struct kxcjk1013_data { struct kxcjk1013_data {
struct i2c_client *client; struct i2c_client *client;
struct iio_trigger *dready_trig; struct iio_trigger *dready_trig;
...@@ -100,6 +107,7 @@ struct kxcjk1013_data { ...@@ -100,6 +107,7 @@ struct kxcjk1013_data {
int ev_enable_state; int ev_enable_state;
bool motion_trigger_on; bool motion_trigger_on;
int64_t timestamp; int64_t timestamp;
enum kx_chipset chipset;
}; };
enum kxcjk1013_axis { enum kxcjk1013_axis {
...@@ -133,10 +141,53 @@ static const struct { ...@@ -133,10 +141,53 @@ static const struct {
static const struct { static const struct {
int odr_bits; int odr_bits;
int usec; int usec;
} odr_start_up_times[] = { {0x08, 100000}, {0x09, 100000}, {0x0A, 100000}, } odr_start_up_times[KX_MAX_CHIPS][12] = {
{0x0B, 100000}, { 0, 80000}, {0x01, 41000}, /* KXCJK-1013 */
{0x02, 21000}, {0x03, 11000}, {0x04, 6400}, {
{0x05, 3900}, {0x06, 2700}, {0x07, 2100} }; {0x08, 100000},
{0x09, 100000},
{0x0A, 100000},
{0x0B, 100000},
{0, 80000},
{0x01, 41000},
{0x02, 21000},
{0x03, 11000},
{0x04, 6400},
{0x05, 3900},
{0x06, 2700},
{0x07, 2100},
},
/* KXCJ9-1008 */
{
{0x08, 100000},
{0x09, 100000},
{0x0A, 100000},
{0x0B, 100000},
{0, 80000},
{0x01, 41000},
{0x02, 21000},
{0x03, 11000},
{0x04, 6400},
{0x05, 3900},
{0x06, 2700},
{0x07, 2100},
},
/* KXCTJ2-1009 */
{
{0x08, 1240000},
{0x09, 621000},
{0x0A, 309000},
{0x0B, 151000},
{0, 80000},
{0x01, 41000},
{0x02, 21000},
{0x03, 11000},
{0x04, 6000},
{0x05, 4000},
{0x06, 3000},
{0x07, 2000},
},
};
static const struct { static const struct {
u16 scale; u16 scale;
...@@ -310,10 +361,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data) ...@@ -310,10 +361,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data)
{ {
int i; int i;
int idx = data->chipset;
for (i = 0; i < ARRAY_SIZE(odr_start_up_times); ++i) { for (i = 0; i < ARRAY_SIZE(odr_start_up_times[idx]); ++i) {
if (odr_start_up_times[i].odr_bits == data->odr_bits) if (odr_start_up_times[idx][i].odr_bits == data->odr_bits)
return odr_start_up_times[i].usec; return odr_start_up_times[idx][i].usec;
} }
return KXCJK1013_MAX_STARTUP_TIME_US; return KXCJK1013_MAX_STARTUP_TIME_US;
...@@ -1074,10 +1126,21 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private) ...@@ -1074,10 +1126,21 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, static const char *kxcjk1013_match_acpi_device(struct device *dev,
struct kxcjk1013_data *data) enum kx_chipset *chipset)
{ {
const struct acpi_device_id *id; const struct acpi_device_id *id;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return NULL;
*chipset = (enum kx_chipset)id->driver_data;
return dev_name(dev);
}
static int kxcjk1013_gpio_probe(struct i2c_client *client,
struct kxcjk1013_data *data)
{
struct device *dev; struct device *dev;
struct gpio_desc *gpio; struct gpio_desc *gpio;
int ret; int ret;
...@@ -1086,12 +1149,6 @@ static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, ...@@ -1086,12 +1149,6 @@ static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client,
return -EINVAL; return -EINVAL;
dev = &client->dev; dev = &client->dev;
if (!ACPI_HANDLE(dev))
return -ENODEV;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return -ENODEV;
/* data ready gpio interrupt pin */ /* data ready gpio interrupt pin */
gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0); gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0);
...@@ -1117,6 +1174,7 @@ static int kxcjk1013_probe(struct i2c_client *client, ...@@ -1117,6 +1174,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
struct kxcjk1013_data *data; struct kxcjk1013_data *data;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct kxcjk_1013_platform_data *pdata; struct kxcjk_1013_platform_data *pdata;
const char *name;
int ret; int ret;
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
...@@ -1133,6 +1191,15 @@ static int kxcjk1013_probe(struct i2c_client *client, ...@@ -1133,6 +1191,15 @@ static int kxcjk1013_probe(struct i2c_client *client,
else else
data->active_high_intr = true; /* default polarity */ data->active_high_intr = true; /* default polarity */
if (id) {
data->chipset = (enum kx_chipset)(id->driver_data);
name = id->name;
} else if (ACPI_HANDLE(&client->dev)) {
name = kxcjk1013_match_acpi_device(&client->dev,
&data->chipset);
} else
return -ENODEV;
ret = kxcjk1013_chip_init(data); ret = kxcjk1013_chip_init(data);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1142,12 +1209,12 @@ static int kxcjk1013_probe(struct i2c_client *client, ...@@ -1142,12 +1209,12 @@ static int kxcjk1013_probe(struct i2c_client *client,
indio_dev->dev.parent = &client->dev; indio_dev->dev.parent = &client->dev;
indio_dev->channels = kxcjk1013_channels; indio_dev->channels = kxcjk1013_channels;
indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels); indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels);
indio_dev->name = KXCJK1013_DRV_NAME; indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &kxcjk1013_info; indio_dev->info = &kxcjk1013_info;
if (client->irq < 0) if (client->irq < 0)
client->irq = kxcjk1013_acpi_gpio_probe(client, data); client->irq = kxcjk1013_gpio_probe(client, data);
if (client->irq >= 0) { if (client->irq >= 0) {
ret = devm_request_threaded_irq(&client->dev, client->irq, ret = devm_request_threaded_irq(&client->dev, client->irq,
...@@ -1325,15 +1392,17 @@ static const struct dev_pm_ops kxcjk1013_pm_ops = { ...@@ -1325,15 +1392,17 @@ static const struct dev_pm_ops kxcjk1013_pm_ops = {
}; };
static const struct acpi_device_id kx_acpi_match[] = { static const struct acpi_device_id kx_acpi_match[] = {
{"KXCJ1013", 0}, {"KXCJ1013", KXCJK1013},
{"KXCJ1008", 0}, {"KXCJ1008", KXCJ91008},
{"KXTJ1009", KXTJ21009},
{ }, { },
}; };
MODULE_DEVICE_TABLE(acpi, kx_acpi_match); MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
static const struct i2c_device_id kxcjk1013_id[] = { static const struct i2c_device_id kxcjk1013_id[] = {
{"kxcjk1013", 0}, {"kxcjk1013", KXCJK1013},
{"kxcj91008", 0}, {"kxcj91008", KXCJ91008},
{"kxtj21009", KXTJ21009},
{} {}
}; };
......
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