linux/drivers/iio/light/max44000.c
<<
>>
Prefs
   1/*
   2 * MAX44000 Ambient and Infrared Proximity Sensor
   3 *
   4 * Copyright (c) 2016, Intel Corporation.
   5 *
   6 * This file is subject to the terms and conditions of version 2 of
   7 * the GNU General Public License.  See the file COPYING in the main
   8 * directory of this archive for more details.
   9 *
  10 * Data sheet: https://datasheets.maximintegrated.com/en/ds/MAX44000.pdf
  11 *
  12 * 7-bit I2C slave address 0x4a
  13 */
  14
  15#include <linux/module.h>
  16#include <linux/init.h>
  17#include <linux/i2c.h>
  18#include <linux/regmap.h>
  19#include <linux/util_macros.h>
  20#include <linux/iio/iio.h>
  21#include <linux/iio/sysfs.h>
  22#include <linux/iio/buffer.h>
  23#include <linux/iio/trigger_consumer.h>
  24#include <linux/iio/triggered_buffer.h>
  25#include <linux/acpi.h>
  26
  27#define MAX44000_DRV_NAME               "max44000"
  28
  29/* Registers in datasheet order */
  30#define MAX44000_REG_STATUS             0x00
  31#define MAX44000_REG_CFG_MAIN           0x01
  32#define MAX44000_REG_CFG_RX             0x02
  33#define MAX44000_REG_CFG_TX             0x03
  34#define MAX44000_REG_ALS_DATA_HI        0x04
  35#define MAX44000_REG_ALS_DATA_LO        0x05
  36#define MAX44000_REG_PRX_DATA           0x16
  37#define MAX44000_REG_ALS_UPTHR_HI       0x06
  38#define MAX44000_REG_ALS_UPTHR_LO       0x07
  39#define MAX44000_REG_ALS_LOTHR_HI       0x08
  40#define MAX44000_REG_ALS_LOTHR_LO       0x09
  41#define MAX44000_REG_PST                0x0a
  42#define MAX44000_REG_PRX_IND            0x0b
  43#define MAX44000_REG_PRX_THR            0x0c
  44#define MAX44000_REG_TRIM_GAIN_GREEN    0x0f
  45#define MAX44000_REG_TRIM_GAIN_IR       0x10
  46
  47/* REG_CFG bits */
  48#define MAX44000_CFG_ALSINTE            0x01
  49#define MAX44000_CFG_PRXINTE            0x02
  50#define MAX44000_CFG_MASK               0x1c
  51#define MAX44000_CFG_MODE_SHUTDOWN      0x00
  52#define MAX44000_CFG_MODE_ALS_GIR       0x04
  53#define MAX44000_CFG_MODE_ALS_G         0x08
  54#define MAX44000_CFG_MODE_ALS_IR        0x0c
  55#define MAX44000_CFG_MODE_ALS_PRX       0x10
  56#define MAX44000_CFG_MODE_PRX           0x14
  57#define MAX44000_CFG_TRIM               0x20
  58
  59/*
  60 * Upper 4 bits are not documented but start as 1 on powerup
  61 * Setting them to 0 causes proximity to misbehave so set them to 1
  62 */
  63#define MAX44000_REG_CFG_RX_DEFAULT 0xf0
  64
  65/* REG_RX bits */
  66#define MAX44000_CFG_RX_ALSTIM_MASK     0x0c
  67#define MAX44000_CFG_RX_ALSTIM_SHIFT    2
  68#define MAX44000_CFG_RX_ALSPGA_MASK     0x03
  69#define MAX44000_CFG_RX_ALSPGA_SHIFT    0
  70
  71/* REG_TX bits */
  72#define MAX44000_LED_CURRENT_MASK       0xf
  73#define MAX44000_LED_CURRENT_MAX        11
  74#define MAX44000_LED_CURRENT_DEFAULT    6
  75
  76#define MAX44000_ALSDATA_OVERFLOW       0x4000
  77
  78struct max44000_data {
  79        struct mutex lock;
  80        struct regmap *regmap;
  81};
  82
  83/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
  84#define MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2 5
  85
  86/* Scale can be multiplied by up to 128x via ALSPGA for measurement gain */
  87static const int max44000_alspga_shift[] = {0, 2, 4, 7};
  88#define MAX44000_ALSPGA_MAX_SHIFT 7
  89
  90/*
  91 * Scale can be multiplied by up to 64x via ALSTIM because of lost resolution
  92 *
  93 * This scaling factor is hidden from userspace and instead accounted for when
  94 * reading raw values from the device.
  95 *
  96 * This makes it possible to cleanly expose ALSPGA as IIO_CHAN_INFO_SCALE and
  97 * ALSTIM as IIO_CHAN_INFO_INT_TIME without the values affecting each other.
  98 *
  99 * Handling this internally is also required for buffer support because the
 100 * channel's scan_type can't be modified dynamically.
 101 */
 102static const int max44000_alstim_shift[] = {0, 2, 4, 6};
 103#define MAX44000_ALSTIM_SHIFT(alstim) (2 * (alstim))
 104
 105/* Available integration times with pretty manual alignment: */
 106static const int max44000_int_time_avail_ns_array[] = {
 107           100000000,
 108            25000000,
 109             6250000,
 110             1562500,
 111};
 112static const char max44000_int_time_avail_str[] =
 113        "0.100 "
 114        "0.025 "
 115        "0.00625 "
 116        "0.001625";
 117
 118/* Available scales (internal to ulux) with pretty manual alignment: */
 119static const int max44000_scale_avail_ulux_array[] = {
 120            31250,
 121           125000,
 122           500000,
 123          4000000,
 124};
 125static const char max44000_scale_avail_str[] =
 126        "0.03125 "
 127        "0.125 "
 128        "0.5 "
 129         "4";
 130
 131#define MAX44000_SCAN_INDEX_ALS 0
 132#define MAX44000_SCAN_INDEX_PRX 1
 133
 134static const struct iio_chan_spec max44000_channels[] = {
 135        {
 136                .type = IIO_LIGHT,
 137                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 138                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
 139                                            BIT(IIO_CHAN_INFO_INT_TIME),
 140                .scan_index = MAX44000_SCAN_INDEX_ALS,
 141                .scan_type = {
 142                        .sign           = 'u',
 143                        .realbits       = 14,
 144                        .storagebits    = 16,
 145                }
 146        },
 147        {
 148                .type = IIO_PROXIMITY,
 149                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
 150                .scan_index = MAX44000_SCAN_INDEX_PRX,
 151                .scan_type = {
 152                        .sign           = 'u',
 153                        .realbits       = 8,
 154                        .storagebits    = 16,
 155                }
 156        },
 157        IIO_CHAN_SOFT_TIMESTAMP(2),
 158        {
 159                .type = IIO_CURRENT,
 160                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 161                                      BIT(IIO_CHAN_INFO_SCALE),
 162                .extend_name = "led",
 163                .output = 1,
 164                .scan_index = -1,
 165        },
 166};
 167
 168static int max44000_read_alstim(struct max44000_data *data)
 169{
 170        unsigned int val;
 171        int ret;
 172
 173        ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
 174        if (ret < 0)
 175                return ret;
 176        return (val & MAX44000_CFG_RX_ALSTIM_MASK) >> MAX44000_CFG_RX_ALSTIM_SHIFT;
 177}
 178
 179static int max44000_write_alstim(struct max44000_data *data, int val)
 180{
 181        return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
 182                                 MAX44000_CFG_RX_ALSTIM_MASK,
 183                                 val << MAX44000_CFG_RX_ALSTIM_SHIFT);
 184}
 185
 186static int max44000_read_alspga(struct max44000_data *data)
 187{
 188        unsigned int val;
 189        int ret;
 190
 191        ret = regmap_read(data->regmap, MAX44000_REG_CFG_RX, &val);
 192        if (ret < 0)
 193                return ret;
 194        return (val & MAX44000_CFG_RX_ALSPGA_MASK) >> MAX44000_CFG_RX_ALSPGA_SHIFT;
 195}
 196
 197static int max44000_write_alspga(struct max44000_data *data, int val)
 198{
 199        return regmap_write_bits(data->regmap, MAX44000_REG_CFG_RX,
 200                                 MAX44000_CFG_RX_ALSPGA_MASK,
 201                                 val << MAX44000_CFG_RX_ALSPGA_SHIFT);
 202}
 203
 204static int max44000_read_alsval(struct max44000_data *data)
 205{
 206        u16 regval;
 207        int alstim, ret;
 208
 209        ret = regmap_bulk_read(data->regmap, MAX44000_REG_ALS_DATA_HI,
 210                               &regval, sizeof(regval));
 211        if (ret < 0)
 212                return ret;
 213        alstim = ret = max44000_read_alstim(data);
 214        if (ret < 0)
 215                return ret;
 216
 217        regval = be16_to_cpu(regval);
 218
 219        /*
 220         * Overflow is explained on datasheet page 17.
 221         *
 222         * It's a warning that either the G or IR channel has become saturated
 223         * and that the value in the register is likely incorrect.
 224         *
 225         * The recommendation is to change the scale (ALSPGA).
 226         * The driver just returns the max representable value.
 227         */
 228        if (regval & MAX44000_ALSDATA_OVERFLOW)
 229                return 0x3FFF;
 230
 231        return regval << MAX44000_ALSTIM_SHIFT(alstim);
 232}
 233
 234static int max44000_write_led_current_raw(struct max44000_data *data, int val)
 235{
 236        /* Maybe we should clamp the value instead? */
 237        if (val < 0 || val > MAX44000_LED_CURRENT_MAX)
 238                return -ERANGE;
 239        if (val >= 8)
 240                val += 4;
 241        return regmap_write_bits(data->regmap, MAX44000_REG_CFG_TX,
 242                                 MAX44000_LED_CURRENT_MASK, val);
 243}
 244
 245static int max44000_read_led_current_raw(struct max44000_data *data)
 246{
 247        unsigned int regval;
 248        int ret;
 249
 250        ret = regmap_read(data->regmap, MAX44000_REG_CFG_TX, &regval);
 251        if (ret < 0)
 252                return ret;
 253        regval &= MAX44000_LED_CURRENT_MASK;
 254        if (regval >= 8)
 255                regval -= 4;
 256        return regval;
 257}
 258
 259static int max44000_read_raw(struct iio_dev *indio_dev,
 260                             struct iio_chan_spec const *chan,
 261                             int *val, int *val2, long mask)
 262{
 263        struct max44000_data *data = iio_priv(indio_dev);
 264        int alstim, alspga;
 265        unsigned int regval;
 266        int ret;
 267
 268        switch (mask) {
 269        case IIO_CHAN_INFO_RAW:
 270                switch (chan->type) {
 271                case IIO_LIGHT:
 272                        mutex_lock(&data->lock);
 273                        ret = max44000_read_alsval(data);
 274                        mutex_unlock(&data->lock);
 275                        if (ret < 0)
 276                                return ret;
 277                        *val = ret;
 278                        return IIO_VAL_INT;
 279
 280                case IIO_PROXIMITY:
 281                        mutex_lock(&data->lock);
 282                        ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
 283                        mutex_unlock(&data->lock);
 284                        if (ret < 0)
 285                                return ret;
 286                        *val = regval;
 287                        return IIO_VAL_INT;
 288
 289                case IIO_CURRENT:
 290                        mutex_lock(&data->lock);
 291                        ret = max44000_read_led_current_raw(data);
 292                        mutex_unlock(&data->lock);
 293                        if (ret < 0)
 294                                return ret;
 295                        *val = ret;
 296                        return IIO_VAL_INT;
 297
 298                default:
 299                        return -EINVAL;
 300                }
 301
 302        case IIO_CHAN_INFO_SCALE:
 303                switch (chan->type) {
 304                case IIO_CURRENT:
 305                        /* Output register is in 10s of miliamps */
 306                        *val = 10;
 307                        return IIO_VAL_INT;
 308
 309                case IIO_LIGHT:
 310                        mutex_lock(&data->lock);
 311                        alspga = ret = max44000_read_alspga(data);
 312                        mutex_unlock(&data->lock);
 313                        if (ret < 0)
 314                                return ret;
 315
 316                        /* Avoid negative shifts */
 317                        *val = (1 << MAX44000_ALSPGA_MAX_SHIFT);
 318                        *val2 = MAX44000_ALS_TO_LUX_DEFAULT_FRACTION_LOG2
 319                                        + MAX44000_ALSPGA_MAX_SHIFT
 320                                        - max44000_alspga_shift[alspga];
 321                        return IIO_VAL_FRACTIONAL_LOG2;
 322
 323                default:
 324                        return -EINVAL;
 325                }
 326
 327        case IIO_CHAN_INFO_INT_TIME:
 328                mutex_lock(&data->lock);
 329                alstim = ret = max44000_read_alstim(data);
 330                mutex_unlock(&data->lock);
 331
 332                if (ret < 0)
 333                        return ret;
 334                *val = 0;
 335                *val2 = max44000_int_time_avail_ns_array[alstim];
 336                return IIO_VAL_INT_PLUS_NANO;
 337
 338        default:
 339                return -EINVAL;
 340        }
 341}
 342
 343static int max44000_write_raw(struct iio_dev *indio_dev,
 344                              struct iio_chan_spec const *chan,
 345                              int val, int val2, long mask)
 346{
 347        struct max44000_data *data = iio_priv(indio_dev);
 348        int ret;
 349
 350        if (mask == IIO_CHAN_INFO_RAW && chan->type == IIO_CURRENT) {
 351                mutex_lock(&data->lock);
 352                ret = max44000_write_led_current_raw(data, val);
 353                mutex_unlock(&data->lock);
 354                return ret;
 355        } else if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT) {
 356                s64 valns = val * NSEC_PER_SEC + val2;
 357                int alstim = find_closest_descending(valns,
 358                                max44000_int_time_avail_ns_array,
 359                                ARRAY_SIZE(max44000_int_time_avail_ns_array));
 360                mutex_lock(&data->lock);
 361                ret = max44000_write_alstim(data, alstim);
 362                mutex_unlock(&data->lock);
 363                return ret;
 364        } else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT) {
 365                s64 valus = val * USEC_PER_SEC + val2;
 366                int alspga = find_closest(valus,
 367                                max44000_scale_avail_ulux_array,
 368                                ARRAY_SIZE(max44000_scale_avail_ulux_array));
 369                mutex_lock(&data->lock);
 370                ret = max44000_write_alspga(data, alspga);
 371                mutex_unlock(&data->lock);
 372                return ret;
 373        }
 374
 375        return -EINVAL;
 376}
 377
 378static int max44000_write_raw_get_fmt(struct iio_dev *indio_dev,
 379                                      struct iio_chan_spec const *chan,
 380                                      long mask)
 381{
 382        if (mask == IIO_CHAN_INFO_INT_TIME && chan->type == IIO_LIGHT)
 383                return IIO_VAL_INT_PLUS_NANO;
 384        else if (mask == IIO_CHAN_INFO_SCALE && chan->type == IIO_LIGHT)
 385                return IIO_VAL_INT_PLUS_MICRO;
 386        else
 387                return IIO_VAL_INT;
 388}
 389
 390static IIO_CONST_ATTR(illuminance_integration_time_available, max44000_int_time_avail_str);
 391static IIO_CONST_ATTR(illuminance_scale_available, max44000_scale_avail_str);
 392
 393static struct attribute *max44000_attributes[] = {
 394        &iio_const_attr_illuminance_integration_time_available.dev_attr.attr,
 395        &iio_const_attr_illuminance_scale_available.dev_attr.attr,
 396        NULL
 397};
 398
 399static const struct attribute_group max44000_attribute_group = {
 400        .attrs = max44000_attributes,
 401};
 402
 403static const struct iio_info max44000_info = {
 404        .driver_module          = THIS_MODULE,
 405        .read_raw               = max44000_read_raw,
 406        .write_raw              = max44000_write_raw,
 407        .write_raw_get_fmt      = max44000_write_raw_get_fmt,
 408        .attrs                  = &max44000_attribute_group,
 409};
 410
 411static bool max44000_readable_reg(struct device *dev, unsigned int reg)
 412{
 413        switch (reg) {
 414        case MAX44000_REG_STATUS:
 415        case MAX44000_REG_CFG_MAIN:
 416        case MAX44000_REG_CFG_RX:
 417        case MAX44000_REG_CFG_TX:
 418        case MAX44000_REG_ALS_DATA_HI:
 419        case MAX44000_REG_ALS_DATA_LO:
 420        case MAX44000_REG_PRX_DATA:
 421        case MAX44000_REG_ALS_UPTHR_HI:
 422        case MAX44000_REG_ALS_UPTHR_LO:
 423        case MAX44000_REG_ALS_LOTHR_HI:
 424        case MAX44000_REG_ALS_LOTHR_LO:
 425        case MAX44000_REG_PST:
 426        case MAX44000_REG_PRX_IND:
 427        case MAX44000_REG_PRX_THR:
 428        case MAX44000_REG_TRIM_GAIN_GREEN:
 429        case MAX44000_REG_TRIM_GAIN_IR:
 430                return true;
 431        default:
 432                return false;
 433        }
 434}
 435
 436static bool max44000_writeable_reg(struct device *dev, unsigned int reg)
 437{
 438        switch (reg) {
 439        case MAX44000_REG_CFG_MAIN:
 440        case MAX44000_REG_CFG_RX:
 441        case MAX44000_REG_CFG_TX:
 442        case MAX44000_REG_ALS_UPTHR_HI:
 443        case MAX44000_REG_ALS_UPTHR_LO:
 444        case MAX44000_REG_ALS_LOTHR_HI:
 445        case MAX44000_REG_ALS_LOTHR_LO:
 446        case MAX44000_REG_PST:
 447        case MAX44000_REG_PRX_IND:
 448        case MAX44000_REG_PRX_THR:
 449        case MAX44000_REG_TRIM_GAIN_GREEN:
 450        case MAX44000_REG_TRIM_GAIN_IR:
 451                return true;
 452        default:
 453                return false;
 454        }
 455}
 456
 457static bool max44000_volatile_reg(struct device *dev, unsigned int reg)
 458{
 459        switch (reg) {
 460        case MAX44000_REG_STATUS:
 461        case MAX44000_REG_ALS_DATA_HI:
 462        case MAX44000_REG_ALS_DATA_LO:
 463        case MAX44000_REG_PRX_DATA:
 464                return true;
 465        default:
 466                return false;
 467        }
 468}
 469
 470static bool max44000_precious_reg(struct device *dev, unsigned int reg)
 471{
 472        return reg == MAX44000_REG_STATUS;
 473}
 474
 475static const struct regmap_config max44000_regmap_config = {
 476        .reg_bits       = 8,
 477        .val_bits       = 8,
 478
 479        .max_register   = MAX44000_REG_PRX_DATA,
 480        .readable_reg   = max44000_readable_reg,
 481        .writeable_reg  = max44000_writeable_reg,
 482        .volatile_reg   = max44000_volatile_reg,
 483        .precious_reg   = max44000_precious_reg,
 484
 485        .use_single_rw  = 1,
 486        .cache_type     = REGCACHE_RBTREE,
 487};
 488
 489static irqreturn_t max44000_trigger_handler(int irq, void *p)
 490{
 491        struct iio_poll_func *pf = p;
 492        struct iio_dev *indio_dev = pf->indio_dev;
 493        struct max44000_data *data = iio_priv(indio_dev);
 494        u16 buf[8]; /* 2x u16 + padding + 8 bytes timestamp */
 495        int index = 0;
 496        unsigned int regval;
 497        int ret;
 498
 499        mutex_lock(&data->lock);
 500        if (test_bit(MAX44000_SCAN_INDEX_ALS, indio_dev->active_scan_mask)) {
 501                ret = max44000_read_alsval(data);
 502                if (ret < 0)
 503                        goto out_unlock;
 504                buf[index++] = ret;
 505        }
 506        if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
 507                ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
 508                if (ret < 0)
 509                        goto out_unlock;
 510                buf[index] = regval;
 511        }
 512        mutex_unlock(&data->lock);
 513
 514        iio_push_to_buffers_with_timestamp(indio_dev, buf,
 515                                           iio_get_time_ns(indio_dev));
 516        iio_trigger_notify_done(indio_dev->trig);
 517        return IRQ_HANDLED;
 518
 519out_unlock:
 520        mutex_unlock(&data->lock);
 521        iio_trigger_notify_done(indio_dev->trig);
 522        return IRQ_HANDLED;
 523}
 524
 525static int max44000_probe(struct i2c_client *client,
 526                          const struct i2c_device_id *id)
 527{
 528        struct max44000_data *data;
 529        struct iio_dev *indio_dev;
 530        int ret, reg;
 531
 532        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 533        if (!indio_dev)
 534                return -ENOMEM;
 535        data = iio_priv(indio_dev);
 536        data->regmap = devm_regmap_init_i2c(client, &max44000_regmap_config);
 537        if (IS_ERR(data->regmap)) {
 538                dev_err(&client->dev, "regmap_init failed!\n");
 539                return PTR_ERR(data->regmap);
 540        }
 541
 542        i2c_set_clientdata(client, indio_dev);
 543        mutex_init(&data->lock);
 544        indio_dev->dev.parent = &client->dev;
 545        indio_dev->info = &max44000_info;
 546        indio_dev->name = MAX44000_DRV_NAME;
 547        indio_dev->channels = max44000_channels;
 548        indio_dev->num_channels = ARRAY_SIZE(max44000_channels);
 549
 550        /*
 551         * The device doesn't have a reset function so we just clear some
 552         * important bits at probe time to ensure sane operation.
 553         *
 554         * Since we don't support interrupts/events the threshold values are
 555         * not important. We also don't touch trim values.
 556         */
 557
 558        /* Reset ALS scaling bits */
 559        ret = regmap_write(data->regmap, MAX44000_REG_CFG_RX,
 560                           MAX44000_REG_CFG_RX_DEFAULT);
 561        if (ret < 0) {
 562                dev_err(&client->dev, "failed to write default CFG_RX: %d\n",
 563                        ret);
 564                return ret;
 565        }
 566
 567        /*
 568         * By default the LED pulse used for the proximity sensor is disabled.
 569         * Set a middle value so that we get some sort of valid data by default.
 570         */
 571        ret = max44000_write_led_current_raw(data, MAX44000_LED_CURRENT_DEFAULT);
 572        if (ret < 0) {
 573                dev_err(&client->dev, "failed to write init config: %d\n", ret);
 574                return ret;
 575        }
 576
 577        /* Reset CFG bits to ALS_PRX mode which allows easy reading of both values. */
 578        reg = MAX44000_CFG_TRIM | MAX44000_CFG_MODE_ALS_PRX;
 579        ret = regmap_write(data->regmap, MAX44000_REG_CFG_MAIN, reg);
 580        if (ret < 0) {
 581                dev_err(&client->dev, "failed to write init config: %d\n", ret);
 582                return ret;
 583        }
 584
 585        /* Read status at least once to clear any stale interrupt bits. */
 586        ret = regmap_read(data->regmap, MAX44000_REG_STATUS, &reg);
 587        if (ret < 0) {
 588                dev_err(&client->dev, "failed to read init status: %d\n", ret);
 589                return ret;
 590        }
 591
 592        ret = iio_triggered_buffer_setup(indio_dev, NULL, max44000_trigger_handler, NULL);
 593        if (ret < 0) {
 594                dev_err(&client->dev, "iio triggered buffer setup failed\n");
 595                return ret;
 596        }
 597
 598        return iio_device_register(indio_dev);
 599}
 600
 601static int max44000_remove(struct i2c_client *client)
 602{
 603        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 604
 605        iio_device_unregister(indio_dev);
 606        iio_triggered_buffer_cleanup(indio_dev);
 607
 608        return 0;
 609}
 610
 611static const struct i2c_device_id max44000_id[] = {
 612        {"max44000", 0},
 613        { }
 614};
 615MODULE_DEVICE_TABLE(i2c, max44000_id);
 616
 617#ifdef CONFIG_ACPI
 618static const struct acpi_device_id max44000_acpi_match[] = {
 619        {"MAX44000", 0},
 620        { }
 621};
 622MODULE_DEVICE_TABLE(acpi, max44000_acpi_match);
 623#endif
 624
 625static struct i2c_driver max44000_driver = {
 626        .driver = {
 627                .name   = MAX44000_DRV_NAME,
 628                .acpi_match_table = ACPI_PTR(max44000_acpi_match),
 629        },
 630        .probe          = max44000_probe,
 631        .remove         = max44000_remove,
 632        .id_table       = max44000_id,
 633};
 634
 635module_i2c_driver(max44000_driver);
 636
 637MODULE_AUTHOR("Crestez Dan Leonard <leonard.crestez@intel.com>");
 638MODULE_DESCRIPTION("MAX44000 Ambient and Infrared Proximity Sensor");
 639MODULE_LICENSE("GPL v2");
 640