linux/drivers/iio/magnetometer/ak8975.c
<<
>>
Prefs
   1/*
   2 * A sensor driver for the magnetometer AK8975.
   3 *
   4 * Magnetic compass sensor driver for monitoring magnetic flux information.
   5 *
   6 * Copyright (c) 2010, NVIDIA Corporation.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful, but WITHOUT
  14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  16 * more details.
  17 *
  18 * You should have received a copy of the GNU General Public License along
  19 * with this program; if not, write to the Free Software Foundation, Inc.,
  20 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/kernel.h>
  25#include <linux/slab.h>
  26#include <linux/i2c.h>
  27#include <linux/interrupt.h>
  28#include <linux/err.h>
  29#include <linux/mutex.h>
  30#include <linux/delay.h>
  31#include <linux/bitops.h>
  32#include <linux/gpio.h>
  33#include <linux/of_gpio.h>
  34#include <linux/acpi.h>
  35
  36#include <linux/iio/iio.h>
  37#include <linux/iio/sysfs.h>
  38/*
  39 * Register definitions, as well as various shifts and masks to get at the
  40 * individual fields of the registers.
  41 */
  42#define AK8975_REG_WIA                  0x00
  43#define AK8975_DEVICE_ID                0x48
  44
  45#define AK8975_REG_INFO                 0x01
  46
  47#define AK8975_REG_ST1                  0x02
  48#define AK8975_REG_ST1_DRDY_SHIFT       0
  49#define AK8975_REG_ST1_DRDY_MASK        (1 << AK8975_REG_ST1_DRDY_SHIFT)
  50
  51#define AK8975_REG_HXL                  0x03
  52#define AK8975_REG_HXH                  0x04
  53#define AK8975_REG_HYL                  0x05
  54#define AK8975_REG_HYH                  0x06
  55#define AK8975_REG_HZL                  0x07
  56#define AK8975_REG_HZH                  0x08
  57#define AK8975_REG_ST2                  0x09
  58#define AK8975_REG_ST2_DERR_SHIFT       2
  59#define AK8975_REG_ST2_DERR_MASK        (1 << AK8975_REG_ST2_DERR_SHIFT)
  60
  61#define AK8975_REG_ST2_HOFL_SHIFT       3
  62#define AK8975_REG_ST2_HOFL_MASK        (1 << AK8975_REG_ST2_HOFL_SHIFT)
  63
  64#define AK8975_REG_CNTL                 0x0A
  65#define AK8975_REG_CNTL_MODE_SHIFT      0
  66#define AK8975_REG_CNTL_MODE_MASK       (0xF << AK8975_REG_CNTL_MODE_SHIFT)
  67#define AK8975_REG_CNTL_MODE_POWER_DOWN 0x00
  68#define AK8975_REG_CNTL_MODE_ONCE       0x01
  69#define AK8975_REG_CNTL_MODE_SELF_TEST  0x08
  70#define AK8975_REG_CNTL_MODE_FUSE_ROM   0x0F
  71
  72#define AK8975_REG_RSVC                 0x0B
  73#define AK8975_REG_ASTC                 0x0C
  74#define AK8975_REG_TS1                  0x0D
  75#define AK8975_REG_TS2                  0x0E
  76#define AK8975_REG_I2CDIS               0x0F
  77#define AK8975_REG_ASAX                 0x10
  78#define AK8975_REG_ASAY                 0x11
  79#define AK8975_REG_ASAZ                 0x12
  80
  81#define AK8975_MAX_REGS                 AK8975_REG_ASAZ
  82
  83/*
  84 * AK09912 Register definitions
  85 */
  86#define AK09912_REG_WIA1                0x00
  87#define AK09912_REG_WIA2                0x01
  88#define AK09912_DEVICE_ID               0x04
  89#define AK09911_DEVICE_ID               0x05
  90
  91#define AK09911_REG_INFO1               0x02
  92#define AK09911_REG_INFO2               0x03
  93
  94#define AK09912_REG_ST1                 0x10
  95
  96#define AK09912_REG_ST1_DRDY_SHIFT      0
  97#define AK09912_REG_ST1_DRDY_MASK       (1 << AK09912_REG_ST1_DRDY_SHIFT)
  98
  99#define AK09912_REG_HXL                 0x11
 100#define AK09912_REG_HXH                 0x12
 101#define AK09912_REG_HYL                 0x13
 102#define AK09912_REG_HYH                 0x14
 103#define AK09912_REG_HZL                 0x15
 104#define AK09912_REG_HZH                 0x16
 105#define AK09912_REG_TMPS                0x17
 106
 107#define AK09912_REG_ST2                 0x18
 108#define AK09912_REG_ST2_HOFL_SHIFT      3
 109#define AK09912_REG_ST2_HOFL_MASK       (1 << AK09912_REG_ST2_HOFL_SHIFT)
 110
 111#define AK09912_REG_CNTL1               0x30
 112
 113#define AK09912_REG_CNTL2               0x31
 114#define AK09912_REG_CNTL_MODE_POWER_DOWN        0x00
 115#define AK09912_REG_CNTL_MODE_ONCE      0x01
 116#define AK09912_REG_CNTL_MODE_SELF_TEST 0x10
 117#define AK09912_REG_CNTL_MODE_FUSE_ROM  0x1F
 118#define AK09912_REG_CNTL2_MODE_SHIFT    0
 119#define AK09912_REG_CNTL2_MODE_MASK     (0x1F << AK09912_REG_CNTL2_MODE_SHIFT)
 120
 121#define AK09912_REG_CNTL3               0x32
 122
 123#define AK09912_REG_TS1                 0x33
 124#define AK09912_REG_TS2                 0x34
 125#define AK09912_REG_TS3                 0x35
 126#define AK09912_REG_I2CDIS              0x36
 127#define AK09912_REG_TS4                 0x37
 128
 129#define AK09912_REG_ASAX                0x60
 130#define AK09912_REG_ASAY                0x61
 131#define AK09912_REG_ASAZ                0x62
 132
 133#define AK09912_MAX_REGS                AK09912_REG_ASAZ
 134
 135/*
 136 * Miscellaneous values.
 137 */
 138#define AK8975_MAX_CONVERSION_TIMEOUT   500
 139#define AK8975_CONVERSION_DONE_POLL_TIME 10
 140#define AK8975_DATA_READY_TIMEOUT       ((100*HZ)/1000)
 141
 142/*
 143 * Precalculate scale factor (in Gauss units) for each axis and
 144 * store in the device data.
 145 *
 146 * This scale factor is axis-dependent, and is derived from 3 calibration
 147 * factors ASA(x), ASA(y), and ASA(z).
 148 *
 149 * These ASA values are read from the sensor device at start of day, and
 150 * cached in the device context struct.
 151 *
 152 * Adjusting the flux value with the sensitivity adjustment value should be
 153 * done via the following formula:
 154 *
 155 * Hadj = H * ( ( ( (ASA-128)*0.5 ) / 128 ) + 1 )
 156 * where H is the raw value, ASA is the sensitivity adjustment, and Hadj
 157 * is the resultant adjusted value.
 158 *
 159 * We reduce the formula to:
 160 *
 161 * Hadj = H * (ASA + 128) / 256
 162 *
 163 * H is in the range of -4096 to 4095.  The magnetometer has a range of
 164 * +-1229uT.  To go from the raw value to uT is:
 165 *
 166 * HuT = H * 1229/4096, or roughly, 3/10.
 167 *
 168 * Since 1uT = 0.01 gauss, our final scale factor becomes:
 169 *
 170 * Hadj = H * ((ASA + 128) / 256) * 3/10 * 1/100
 171 * Hadj = H * ((ASA + 128) * 0.003) / 256
 172 *
 173 * Since ASA doesn't change, we cache the resultant scale factor into the
 174 * device context in ak8975_setup().
 175 *
 176 * Given we use IIO_VAL_INT_PLUS_MICRO bit when displaying the scale, we
 177 * multiply the stored scale value by 1e6.
 178 */
 179static long ak8975_raw_to_gauss(u16 data)
 180{
 181        return (((long)data + 128) * 3000) / 256;
 182}
 183
 184/*
 185 * For AK8963 and AK09911, same calculation, but the device is less sensitive:
 186 *
 187 * H is in the range of +-8190.  The magnetometer has a range of
 188 * +-4912uT.  To go from the raw value to uT is:
 189 *
 190 * HuT = H * 4912/8190, or roughly, 6/10, instead of 3/10.
 191 */
 192
 193static long ak8963_09911_raw_to_gauss(u16 data)
 194{
 195        return (((long)data + 128) * 6000) / 256;
 196}
 197
 198/*
 199 * For AK09912, same calculation, except the device is more sensitive:
 200 *
 201 * H is in the range of -32752 to 32752.  The magnetometer has a range of
 202 * +-4912uT.  To go from the raw value to uT is:
 203 *
 204 * HuT = H * 4912/32752, or roughly, 3/20, instead of 3/10.
 205 */
 206static long ak09912_raw_to_gauss(u16 data)
 207{
 208        return (((long)data + 128) * 1500) / 256;
 209}
 210
 211/* Compatible Asahi Kasei Compass parts */
 212enum asahi_compass_chipset {
 213        AK8975,
 214        AK8963,
 215        AK09911,
 216        AK09912,
 217        AK_MAX_TYPE
 218};
 219
 220enum ak_ctrl_reg_addr {
 221        ST1,
 222        ST2,
 223        CNTL,
 224        ASA_BASE,
 225        MAX_REGS,
 226        REGS_END,
 227};
 228
 229enum ak_ctrl_reg_mask {
 230        ST1_DRDY,
 231        ST2_HOFL,
 232        ST2_DERR,
 233        CNTL_MODE,
 234        MASK_END,
 235};
 236
 237enum ak_ctrl_mode {
 238        POWER_DOWN,
 239        MODE_ONCE,
 240        SELF_TEST,
 241        FUSE_ROM,
 242        MODE_END,
 243};
 244
 245struct ak_def {
 246        enum asahi_compass_chipset type;
 247        long (*raw_to_gauss)(u16 data);
 248        u16 range;
 249        u8 ctrl_regs[REGS_END];
 250        u8 ctrl_masks[MASK_END];
 251        u8 ctrl_modes[MODE_END];
 252        u8 data_regs[3];
 253};
 254
 255static const struct ak_def ak_def_array[AK_MAX_TYPE] = {
 256        {
 257                .type = AK8975,
 258                .raw_to_gauss = ak8975_raw_to_gauss,
 259                .range = 4096,
 260                .ctrl_regs = {
 261                        AK8975_REG_ST1,
 262                        AK8975_REG_ST2,
 263                        AK8975_REG_CNTL,
 264                        AK8975_REG_ASAX,
 265                        AK8975_MAX_REGS},
 266                .ctrl_masks = {
 267                        AK8975_REG_ST1_DRDY_MASK,
 268                        AK8975_REG_ST2_HOFL_MASK,
 269                        AK8975_REG_ST2_DERR_MASK,
 270                        AK8975_REG_CNTL_MODE_MASK},
 271                .ctrl_modes = {
 272                        AK8975_REG_CNTL_MODE_POWER_DOWN,
 273                        AK8975_REG_CNTL_MODE_ONCE,
 274                        AK8975_REG_CNTL_MODE_SELF_TEST,
 275                        AK8975_REG_CNTL_MODE_FUSE_ROM},
 276                .data_regs = {
 277                        AK8975_REG_HXL,
 278                        AK8975_REG_HYL,
 279                        AK8975_REG_HZL},
 280        },
 281        {
 282                .type = AK8963,
 283                .raw_to_gauss = ak8963_09911_raw_to_gauss,
 284                .range = 8190,
 285                .ctrl_regs = {
 286                        AK8975_REG_ST1,
 287                        AK8975_REG_ST2,
 288                        AK8975_REG_CNTL,
 289                        AK8975_REG_ASAX,
 290                        AK8975_MAX_REGS},
 291                .ctrl_masks = {
 292                        AK8975_REG_ST1_DRDY_MASK,
 293                        AK8975_REG_ST2_HOFL_MASK,
 294                        0,
 295                        AK8975_REG_CNTL_MODE_MASK},
 296                .ctrl_modes = {
 297                        AK8975_REG_CNTL_MODE_POWER_DOWN,
 298                        AK8975_REG_CNTL_MODE_ONCE,
 299                        AK8975_REG_CNTL_MODE_SELF_TEST,
 300                        AK8975_REG_CNTL_MODE_FUSE_ROM},
 301                .data_regs = {
 302                        AK8975_REG_HXL,
 303                        AK8975_REG_HYL,
 304                        AK8975_REG_HZL},
 305        },
 306        {
 307                .type = AK09911,
 308                .raw_to_gauss = ak8963_09911_raw_to_gauss,
 309                .range = 8192,
 310                .ctrl_regs = {
 311                        AK09912_REG_ST1,
 312                        AK09912_REG_ST2,
 313                        AK09912_REG_CNTL2,
 314                        AK09912_REG_ASAX,
 315                        AK09912_MAX_REGS},
 316                .ctrl_masks = {
 317                        AK09912_REG_ST1_DRDY_MASK,
 318                        AK09912_REG_ST2_HOFL_MASK,
 319                        0,
 320                        AK09912_REG_CNTL2_MODE_MASK},
 321                .ctrl_modes = {
 322                        AK09912_REG_CNTL_MODE_POWER_DOWN,
 323                        AK09912_REG_CNTL_MODE_ONCE,
 324                        AK09912_REG_CNTL_MODE_SELF_TEST,
 325                        AK09912_REG_CNTL_MODE_FUSE_ROM},
 326                .data_regs = {
 327                        AK09912_REG_HXL,
 328                        AK09912_REG_HYL,
 329                        AK09912_REG_HZL},
 330        },
 331        {
 332                .type = AK09912,
 333                .raw_to_gauss = ak09912_raw_to_gauss,
 334                .range = 32752,
 335                .ctrl_regs = {
 336                        AK09912_REG_ST1,
 337                        AK09912_REG_ST2,
 338                        AK09912_REG_CNTL2,
 339                        AK09912_REG_ASAX,
 340                        AK09912_MAX_REGS},
 341                .ctrl_masks = {
 342                        AK09912_REG_ST1_DRDY_MASK,
 343                        AK09912_REG_ST2_HOFL_MASK,
 344                        0,
 345                        AK09912_REG_CNTL2_MODE_MASK},
 346                .ctrl_modes = {
 347                        AK09912_REG_CNTL_MODE_POWER_DOWN,
 348                        AK09912_REG_CNTL_MODE_ONCE,
 349                        AK09912_REG_CNTL_MODE_SELF_TEST,
 350                        AK09912_REG_CNTL_MODE_FUSE_ROM},
 351                .data_regs = {
 352                        AK09912_REG_HXL,
 353                        AK09912_REG_HYL,
 354                        AK09912_REG_HZL},
 355        }
 356};
 357
 358/*
 359 * Per-instance context data for the device.
 360 */
 361struct ak8975_data {
 362        struct i2c_client       *client;
 363        const struct ak_def     *def;
 364        struct attribute_group  attrs;
 365        struct mutex            lock;
 366        u8                      asa[3];
 367        long                    raw_to_gauss[3];
 368        int                     eoc_gpio;
 369        int                     eoc_irq;
 370        wait_queue_head_t       data_ready_queue;
 371        unsigned long           flags;
 372        u8                      cntl_cache;
 373};
 374
 375/*
 376 * Return 0 if the i2c device is the one we expect.
 377 * return a negative error number otherwise
 378 */
 379static int ak8975_who_i_am(struct i2c_client *client,
 380                           enum asahi_compass_chipset type)
 381{
 382        u8 wia_val[2];
 383        int ret;
 384
 385        /*
 386         * Signature for each device:
 387         * Device   |  WIA1      |  WIA2
 388         * AK09912  |  DEVICE_ID |  AK09912_DEVICE_ID
 389         * AK09911  |  DEVICE_ID |  AK09911_DEVICE_ID
 390         * AK8975   |  DEVICE_ID |  NA
 391         * AK8963   |  DEVICE_ID |  NA
 392         */
 393        ret = i2c_smbus_read_i2c_block_data(client, AK09912_REG_WIA1,
 394                                            2, wia_val);
 395        if (ret < 0) {
 396                dev_err(&client->dev, "Error reading WIA\n");
 397                return ret;
 398        }
 399
 400        if (wia_val[0] != AK8975_DEVICE_ID)
 401                return -ENODEV;
 402
 403        switch (type) {
 404        case AK8975:
 405        case AK8963:
 406                return 0;
 407        case AK09911:
 408                if (wia_val[1] == AK09911_DEVICE_ID)
 409                        return 0;
 410                break;
 411        case AK09912:
 412                if (wia_val[1] == AK09912_DEVICE_ID)
 413                        return 0;
 414                break;
 415        default:
 416                dev_err(&client->dev, "Type %d unknown\n", type);
 417        }
 418        return -ENODEV;
 419}
 420
 421/*
 422 * Helper function to write to CNTL register.
 423 */
 424static int ak8975_set_mode(struct ak8975_data *data, enum ak_ctrl_mode mode)
 425{
 426        u8 regval;
 427        int ret;
 428
 429        regval = (data->cntl_cache & ~data->def->ctrl_masks[CNTL_MODE]) |
 430                 data->def->ctrl_modes[mode];
 431        ret = i2c_smbus_write_byte_data(data->client,
 432                                        data->def->ctrl_regs[CNTL], regval);
 433        if (ret < 0) {
 434                return ret;
 435        }
 436        data->cntl_cache = regval;
 437        /* After mode change wait atleast 100us */
 438        usleep_range(100, 500);
 439
 440        return 0;
 441}
 442
 443/*
 444 * Handle data ready irq
 445 */
 446static irqreturn_t ak8975_irq_handler(int irq, void *data)
 447{
 448        struct ak8975_data *ak8975 = data;
 449
 450        set_bit(0, &ak8975->flags);
 451        wake_up(&ak8975->data_ready_queue);
 452
 453        return IRQ_HANDLED;
 454}
 455
 456/*
 457 * Install data ready interrupt handler
 458 */
 459static int ak8975_setup_irq(struct ak8975_data *data)
 460{
 461        struct i2c_client *client = data->client;
 462        int rc;
 463        int irq;
 464
 465        init_waitqueue_head(&data->data_ready_queue);
 466        clear_bit(0, &data->flags);
 467        if (client->irq)
 468                irq = client->irq;
 469        else
 470                irq = gpio_to_irq(data->eoc_gpio);
 471
 472        rc = devm_request_irq(&client->dev, irq, ak8975_irq_handler,
 473                              IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 474                              dev_name(&client->dev), data);
 475        if (rc < 0) {
 476                dev_err(&client->dev,
 477                        "irq %d request failed, (gpio %d): %d\n",
 478                        irq, data->eoc_gpio, rc);
 479                return rc;
 480        }
 481
 482        data->eoc_irq = irq;
 483
 484        return rc;
 485}
 486
 487
 488/*
 489 * Perform some start-of-day setup, including reading the asa calibration
 490 * values and caching them.
 491 */
 492static int ak8975_setup(struct i2c_client *client)
 493{
 494        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 495        struct ak8975_data *data = iio_priv(indio_dev);
 496        int ret;
 497
 498        /* Write the fused rom access mode. */
 499        ret = ak8975_set_mode(data, FUSE_ROM);
 500        if (ret < 0) {
 501                dev_err(&client->dev, "Error in setting fuse access mode\n");
 502                return ret;
 503        }
 504
 505        /* Get asa data and store in the device data. */
 506        ret = i2c_smbus_read_i2c_block_data(client,
 507                                            data->def->ctrl_regs[ASA_BASE],
 508                                            3, data->asa);
 509        if (ret < 0) {
 510                dev_err(&client->dev, "Not able to read asa data\n");
 511                return ret;
 512        }
 513
 514        /* After reading fuse ROM data set power-down mode */
 515        ret = ak8975_set_mode(data, POWER_DOWN);
 516        if (ret < 0) {
 517                dev_err(&client->dev, "Error in setting power-down mode\n");
 518                return ret;
 519        }
 520
 521        if (data->eoc_gpio > 0 || client->irq > 0) {
 522                ret = ak8975_setup_irq(data);
 523                if (ret < 0) {
 524                        dev_err(&client->dev,
 525                                "Error setting data ready interrupt\n");
 526                        return ret;
 527                }
 528        }
 529
 530        data->raw_to_gauss[0] = data->def->raw_to_gauss(data->asa[0]);
 531        data->raw_to_gauss[1] = data->def->raw_to_gauss(data->asa[1]);
 532        data->raw_to_gauss[2] = data->def->raw_to_gauss(data->asa[2]);
 533
 534        return 0;
 535}
 536
 537static int wait_conversion_complete_gpio(struct ak8975_data *data)
 538{
 539        struct i2c_client *client = data->client;
 540        u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
 541        int ret;
 542
 543        /* Wait for the conversion to complete. */
 544        while (timeout_ms) {
 545                msleep(AK8975_CONVERSION_DONE_POLL_TIME);
 546                if (gpio_get_value(data->eoc_gpio))
 547                        break;
 548                timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
 549        }
 550        if (!timeout_ms) {
 551                dev_err(&client->dev, "Conversion timeout happened\n");
 552                return -EINVAL;
 553        }
 554
 555        ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
 556        if (ret < 0)
 557                dev_err(&client->dev, "Error in reading ST1\n");
 558
 559        return ret;
 560}
 561
 562static int wait_conversion_complete_polled(struct ak8975_data *data)
 563{
 564        struct i2c_client *client = data->client;
 565        u8 read_status;
 566        u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
 567        int ret;
 568
 569        /* Wait for the conversion to complete. */
 570        while (timeout_ms) {
 571                msleep(AK8975_CONVERSION_DONE_POLL_TIME);
 572                ret = i2c_smbus_read_byte_data(client,
 573                                               data->def->ctrl_regs[ST1]);
 574                if (ret < 0) {
 575                        dev_err(&client->dev, "Error in reading ST1\n");
 576                        return ret;
 577                }
 578                read_status = ret;
 579                if (read_status)
 580                        break;
 581                timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
 582        }
 583        if (!timeout_ms) {
 584                dev_err(&client->dev, "Conversion timeout happened\n");
 585                return -EINVAL;
 586        }
 587
 588        return read_status;
 589}
 590
 591/* Returns 0 if the end of conversion interrupt occured or -ETIME otherwise */
 592static int wait_conversion_complete_interrupt(struct ak8975_data *data)
 593{
 594        int ret;
 595
 596        ret = wait_event_timeout(data->data_ready_queue,
 597                                 test_bit(0, &data->flags),
 598                                 AK8975_DATA_READY_TIMEOUT);
 599        clear_bit(0, &data->flags);
 600
 601        return ret > 0 ? 0 : -ETIME;
 602}
 603
 604/*
 605 * Emits the raw flux value for the x, y, or z axis.
 606 */
 607static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
 608{
 609        struct ak8975_data *data = iio_priv(indio_dev);
 610        struct i2c_client *client = data->client;
 611        int ret;
 612
 613        mutex_lock(&data->lock);
 614
 615        /* Set up the device for taking a sample. */
 616        ret = ak8975_set_mode(data, MODE_ONCE);
 617        if (ret < 0) {
 618                dev_err(&client->dev, "Error in setting operating mode\n");
 619                goto exit;
 620        }
 621
 622        /* Wait for the conversion to complete. */
 623        if (data->eoc_irq)
 624                ret = wait_conversion_complete_interrupt(data);
 625        else if (gpio_is_valid(data->eoc_gpio))
 626                ret = wait_conversion_complete_gpio(data);
 627        else
 628                ret = wait_conversion_complete_polled(data);
 629        if (ret < 0)
 630                goto exit;
 631
 632        /* This will be executed only for non-interrupt based waiting case */
 633        if (ret & data->def->ctrl_masks[ST1_DRDY]) {
 634                ret = i2c_smbus_read_byte_data(client,
 635                                               data->def->ctrl_regs[ST2]);
 636                if (ret < 0) {
 637                        dev_err(&client->dev, "Error in reading ST2\n");
 638                        goto exit;
 639                }
 640                if (ret & (data->def->ctrl_masks[ST2_DERR] |
 641                           data->def->ctrl_masks[ST2_HOFL])) {
 642                        dev_err(&client->dev, "ST2 status error 0x%x\n", ret);
 643                        ret = -EINVAL;
 644                        goto exit;
 645                }
 646        }
 647
 648        /* Read the flux value from the appropriate register
 649           (the register is specified in the iio device attributes). */
 650        ret = i2c_smbus_read_word_data(client, data->def->data_regs[index]);
 651        if (ret < 0) {
 652                dev_err(&client->dev, "Read axis data fails\n");
 653                goto exit;
 654        }
 655
 656        mutex_unlock(&data->lock);
 657
 658        /* Clamp to valid range. */
 659        *val = clamp_t(s16, ret, -data->def->range, data->def->range);
 660        return IIO_VAL_INT;
 661
 662exit:
 663        mutex_unlock(&data->lock);
 664        return ret;
 665}
 666
 667static int ak8975_read_raw(struct iio_dev *indio_dev,
 668                           struct iio_chan_spec const *chan,
 669                           int *val, int *val2,
 670                           long mask)
 671{
 672        struct ak8975_data *data = iio_priv(indio_dev);
 673
 674        switch (mask) {
 675        case IIO_CHAN_INFO_RAW:
 676                return ak8975_read_axis(indio_dev, chan->address, val);
 677        case IIO_CHAN_INFO_SCALE:
 678                *val = 0;
 679                *val2 = data->raw_to_gauss[chan->address];
 680                return IIO_VAL_INT_PLUS_MICRO;
 681        }
 682        return -EINVAL;
 683}
 684
 685#define AK8975_CHANNEL(axis, index)                                     \
 686        {                                                               \
 687                .type = IIO_MAGN,                                       \
 688                .modified = 1,                                          \
 689                .channel2 = IIO_MOD_##axis,                             \
 690                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |          \
 691                             BIT(IIO_CHAN_INFO_SCALE),                  \
 692                .address = index,                                       \
 693        }
 694
 695static const struct iio_chan_spec ak8975_channels[] = {
 696        AK8975_CHANNEL(X, 0), AK8975_CHANNEL(Y, 1), AK8975_CHANNEL(Z, 2),
 697};
 698
 699static const struct iio_info ak8975_info = {
 700        .read_raw = &ak8975_read_raw,
 701        .driver_module = THIS_MODULE,
 702};
 703
 704static const struct acpi_device_id ak_acpi_match[] = {
 705        {"AK8975", AK8975},
 706        {"AK8963", AK8963},
 707        {"INVN6500", AK8963},
 708        {"AK09911", AK09911},
 709        {"AK09912", AK09912},
 710        { },
 711};
 712MODULE_DEVICE_TABLE(acpi, ak_acpi_match);
 713
 714static const char *ak8975_match_acpi_device(struct device *dev,
 715                                            enum asahi_compass_chipset *chipset)
 716{
 717        const struct acpi_device_id *id;
 718
 719        id = acpi_match_device(dev->driver->acpi_match_table, dev);
 720        if (!id)
 721                return NULL;
 722        *chipset = (int)id->driver_data;
 723
 724        return dev_name(dev);
 725}
 726
 727static int ak8975_probe(struct i2c_client *client,
 728                        const struct i2c_device_id *id)
 729{
 730        struct ak8975_data *data;
 731        struct iio_dev *indio_dev;
 732        int eoc_gpio;
 733        int err;
 734        const char *name = NULL;
 735        enum asahi_compass_chipset chipset = AK_MAX_TYPE;
 736
 737        /* Grab and set up the supplied GPIO. */
 738        if (client->dev.platform_data)
 739                eoc_gpio = *(int *)(client->dev.platform_data);
 740        else if (client->dev.of_node)
 741                eoc_gpio = of_get_gpio(client->dev.of_node, 0);
 742        else
 743                eoc_gpio = -1;
 744
 745        if (eoc_gpio == -EPROBE_DEFER)
 746                return -EPROBE_DEFER;
 747
 748        /* We may not have a GPIO based IRQ to scan, that is fine, we will
 749           poll if so */
 750        if (gpio_is_valid(eoc_gpio)) {
 751                err = devm_gpio_request_one(&client->dev, eoc_gpio,
 752                                                        GPIOF_IN, "ak_8975");
 753                if (err < 0) {
 754                        dev_err(&client->dev,
 755                                "failed to request GPIO %d, error %d\n",
 756                                                        eoc_gpio, err);
 757                        return err;
 758                }
 759        }
 760
 761        /* Register with IIO */
 762        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 763        if (indio_dev == NULL)
 764                return -ENOMEM;
 765
 766        data = iio_priv(indio_dev);
 767        i2c_set_clientdata(client, indio_dev);
 768
 769        data->client = client;
 770        data->eoc_gpio = eoc_gpio;
 771        data->eoc_irq = 0;
 772
 773        /* id will be NULL when enumerated via ACPI */
 774        if (id) {
 775                chipset = (enum asahi_compass_chipset)(id->driver_data);
 776                name = id->name;
 777        } else if (ACPI_HANDLE(&client->dev))
 778                name = ak8975_match_acpi_device(&client->dev, &chipset);
 779        else
 780                return -ENOSYS;
 781
 782        if (chipset >= AK_MAX_TYPE) {
 783                dev_err(&client->dev, "AKM device type unsupported: %d\n",
 784                        chipset);
 785                return -ENODEV;
 786        }
 787
 788        data->def = &ak_def_array[chipset];
 789        err = ak8975_who_i_am(client, data->def->type);
 790        if (err < 0) {
 791                dev_err(&client->dev, "Unexpected device\n");
 792                return err;
 793        }
 794        dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
 795
 796        /* Perform some basic start-of-day setup of the device. */
 797        err = ak8975_setup(client);
 798        if (err < 0) {
 799                dev_err(&client->dev, "%s initialization fails\n", name);
 800                return err;
 801        }
 802
 803        mutex_init(&data->lock);
 804        indio_dev->dev.parent = &client->dev;
 805        indio_dev->channels = ak8975_channels;
 806        indio_dev->num_channels = ARRAY_SIZE(ak8975_channels);
 807        indio_dev->info = &ak8975_info;
 808        indio_dev->modes = INDIO_DIRECT_MODE;
 809        indio_dev->name = name;
 810        return devm_iio_device_register(&client->dev, indio_dev);
 811}
 812
 813static const struct i2c_device_id ak8975_id[] = {
 814        {"ak8975", AK8975},
 815        {"ak8963", AK8963},
 816        {"AK8963", AK8963},
 817        {"ak09911", AK09911},
 818        {"ak09912", AK09912},
 819        {}
 820};
 821
 822MODULE_DEVICE_TABLE(i2c, ak8975_id);
 823
 824static const struct of_device_id ak8975_of_match[] = {
 825        { .compatible = "asahi-kasei,ak8975", },
 826        { .compatible = "ak8975", },
 827        { .compatible = "asahi-kasei,ak8963", },
 828        { .compatible = "ak8963", },
 829        { .compatible = "asahi-kasei,ak09911", },
 830        { .compatible = "ak09911", },
 831        { .compatible = "asahi-kasei,ak09912", },
 832        { .compatible = "ak09912", },
 833        {}
 834};
 835MODULE_DEVICE_TABLE(of, ak8975_of_match);
 836
 837static struct i2c_driver ak8975_driver = {
 838        .driver = {
 839                .name   = "ak8975",
 840                .of_match_table = of_match_ptr(ak8975_of_match),
 841                .acpi_match_table = ACPI_PTR(ak_acpi_match),
 842        },
 843        .probe          = ak8975_probe,
 844        .id_table       = ak8975_id,
 845};
 846module_i2c_driver(ak8975_driver);
 847
 848MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
 849MODULE_DESCRIPTION("AK8975 magnetometer driver");
 850MODULE_LICENSE("GPL");
 851