|
@@ -85,6 +85,13 @@
|
|
|
|
|
|
#define KXCJK1013_DEFAULT_WAKE_THRES 1
|
|
|
|
|
|
+enum kx_chipset {
|
|
|
+ KXCJK1013,
|
|
|
+ KXCJ91008,
|
|
|
+ KXTJ21009,
|
|
|
+ KX_MAX_CHIPS /* this must be last */
|
|
|
+};
|
|
|
+
|
|
|
struct kxcjk1013_data {
|
|
|
struct i2c_client *client;
|
|
|
struct iio_trigger *dready_trig;
|
|
@@ -100,6 +107,7 @@ struct kxcjk1013_data {
|
|
|
int ev_enable_state;
|
|
|
bool motion_trigger_on;
|
|
|
int64_t timestamp;
|
|
|
+ enum kx_chipset chipset;
|
|
|
};
|
|
|
|
|
|
enum kxcjk1013_axis {
|
|
@@ -133,10 +141,53 @@ static const struct {
|
|
|
static const struct {
|
|
|
int odr_bits;
|
|
|
int usec;
|
|
|
-} odr_start_up_times[] = { {0x08, 100000}, {0x09, 100000}, {0x0A, 100000},
|
|
|
- {0x0B, 100000}, { 0, 80000}, {0x01, 41000},
|
|
|
- {0x02, 21000}, {0x03, 11000}, {0x04, 6400},
|
|
|
- {0x05, 3900}, {0x06, 2700}, {0x07, 2100} };
|
|
|
+} odr_start_up_times[KX_MAX_CHIPS][12] = {
|
|
|
+ /* KXCJK-1013 */
|
|
|
+ {
|
|
|
+ {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 {
|
|
|
u16 scale;
|
|
@@ -310,10 +361,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
|
|
|
static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data)
|
|
|
{
|
|
|
int i;
|
|
|
+ int idx = data->chipset;
|
|
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(odr_start_up_times); ++i) {
|
|
|
- if (odr_start_up_times[i].odr_bits == data->odr_bits)
|
|
|
- return odr_start_up_times[i].usec;
|
|
|
+ for (i = 0; i < ARRAY_SIZE(odr_start_up_times[idx]); ++i) {
|
|
|
+ if (odr_start_up_times[idx][i].odr_bits == data->odr_bits)
|
|
|
+ return odr_start_up_times[idx][i].usec;
|
|
|
}
|
|
|
|
|
|
return KXCJK1013_MAX_STARTUP_TIME_US;
|
|
@@ -1074,10 +1126,21 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
-static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client,
|
|
|
- struct kxcjk1013_data *data)
|
|
|
+static const char *kxcjk1013_match_acpi_device(struct device *dev,
|
|
|
+ enum kx_chipset *chipset)
|
|
|
{
|
|
|
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 gpio_desc *gpio;
|
|
|
int ret;
|
|
@@ -1086,12 +1149,6 @@ static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client,
|
|
|
return -EINVAL;
|
|
|
|
|
|
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 */
|
|
|
gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0);
|
|
@@ -1117,6 +1174,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
|
|
struct kxcjk1013_data *data;
|
|
|
struct iio_dev *indio_dev;
|
|
|
struct kxcjk_1013_platform_data *pdata;
|
|
|
+ const char *name;
|
|
|
int ret;
|
|
|
|
|
|
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
|
|
@@ -1133,6 +1191,15 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
|
|
else
|
|
|
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);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
@@ -1142,12 +1209,12 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
|
|
indio_dev->dev.parent = &client->dev;
|
|
|
indio_dev->channels = 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->info = &kxcjk1013_info;
|
|
|
|
|
|
if (client->irq < 0)
|
|
|
- client->irq = kxcjk1013_acpi_gpio_probe(client, data);
|
|
|
+ client->irq = kxcjk1013_gpio_probe(client, data);
|
|
|
|
|
|
if (client->irq >= 0) {
|
|
|
ret = devm_request_threaded_irq(&client->dev, client->irq,
|
|
@@ -1325,15 +1392,17 @@ static const struct dev_pm_ops kxcjk1013_pm_ops = {
|
|
|
};
|
|
|
|
|
|
static const struct acpi_device_id kx_acpi_match[] = {
|
|
|
- {"KXCJ1013", 0},
|
|
|
- {"KXCJ1008", 0},
|
|
|
+ {"KXCJ1013", KXCJK1013},
|
|
|
+ {"KXCJ1008", KXCJ91008},
|
|
|
+ {"KXTJ1009", KXTJ21009},
|
|
|
{ },
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
|
|
|
|
|
|
static const struct i2c_device_id kxcjk1013_id[] = {
|
|
|
- {"kxcjk1013", 0},
|
|
|
- {"kxcj91008", 0},
|
|
|
+ {"kxcjk1013", KXCJK1013},
|
|
|
+ {"kxcj91008", KXCJ91008},
|
|
|
+ {"kxtj21009", KXTJ21009},
|
|
|
{}
|
|
|
};
|
|
|
|