linux/drivers/power/supply/ds2781_battery.c
<<
>>
Prefs
   1/*
   2 * 1-wire client/driver for the Maxim/Dallas DS2781 Stand-Alone Fuel Gauge IC
   3 *
   4 * Author: Renata Sayakhova <renata@oktetlabs.ru>
   5 *
   6 * Based on ds2780_battery drivers
   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 version 2 as
  10 * published by the Free Software Foundation.
  11 *
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/slab.h>
  16#include <linux/param.h>
  17#include <linux/pm.h>
  18#include <linux/platform_device.h>
  19#include <linux/power_supply.h>
  20#include <linux/idr.h>
  21
  22#include "../../w1/w1.h"
  23#include "../../w1/slaves/w1_ds2781.h"
  24
  25/* Current unit measurement in uA for a 1 milli-ohm sense resistor */
  26#define DS2781_CURRENT_UNITS    1563
  27/* Charge unit measurement in uAh for a 1 milli-ohm sense resistor */
  28#define DS2781_CHARGE_UNITS             6250
  29/* Number of bytes in user EEPROM space */
  30#define DS2781_USER_EEPROM_SIZE         (DS2781_EEPROM_BLOCK0_END - \
  31                                        DS2781_EEPROM_BLOCK0_START + 1)
  32/* Number of bytes in parameter EEPROM space */
  33#define DS2781_PARAM_EEPROM_SIZE        (DS2781_EEPROM_BLOCK1_END - \
  34                                        DS2781_EEPROM_BLOCK1_START + 1)
  35
  36struct ds2781_device_info {
  37        struct device *dev;
  38        struct power_supply *bat;
  39        struct power_supply_desc bat_desc;
  40        struct device *w1_dev;
  41};
  42
  43enum current_types {
  44        CURRENT_NOW,
  45        CURRENT_AVG,
  46};
  47
  48static const char model[] = "DS2781";
  49static const char manufacturer[] = "Maxim/Dallas";
  50
  51static inline struct ds2781_device_info *
  52to_ds2781_device_info(struct power_supply *psy)
  53{
  54        return power_supply_get_drvdata(psy);
  55}
  56
  57static inline struct power_supply *to_power_supply(struct device *dev)
  58{
  59        return dev_get_drvdata(dev);
  60}
  61
  62static inline int ds2781_battery_io(struct ds2781_device_info *dev_info,
  63        char *buf, int addr, size_t count, int io)
  64{
  65        return w1_ds2781_io(dev_info->w1_dev, buf, addr, count, io);
  66}
  67
  68static int w1_ds2781_read(struct ds2781_device_info *dev_info, char *buf,
  69                int addr, size_t count)
  70{
  71        return ds2781_battery_io(dev_info, buf, addr, count, 0);
  72}
  73
  74static inline int ds2781_read8(struct ds2781_device_info *dev_info, u8 *val,
  75        int addr)
  76{
  77        return ds2781_battery_io(dev_info, val, addr, sizeof(u8), 0);
  78}
  79
  80static int ds2781_read16(struct ds2781_device_info *dev_info, s16 *val,
  81        int addr)
  82{
  83        int ret;
  84        u8 raw[2];
  85
  86        ret = ds2781_battery_io(dev_info, raw, addr, sizeof(raw), 0);
  87        if (ret < 0)
  88                return ret;
  89
  90        *val = (raw[0] << 8) | raw[1];
  91
  92        return 0;
  93}
  94
  95static inline int ds2781_read_block(struct ds2781_device_info *dev_info,
  96        u8 *val, int addr, size_t count)
  97{
  98        return ds2781_battery_io(dev_info, val, addr, count, 0);
  99}
 100
 101static inline int ds2781_write(struct ds2781_device_info *dev_info, u8 *val,
 102        int addr, size_t count)
 103{
 104        return ds2781_battery_io(dev_info, val, addr, count, 1);
 105}
 106
 107static inline int ds2781_store_eeprom(struct device *dev, int addr)
 108{
 109        return w1_ds2781_eeprom_cmd(dev, addr, W1_DS2781_COPY_DATA);
 110}
 111
 112static inline int ds2781_recall_eeprom(struct device *dev, int addr)
 113{
 114        return w1_ds2781_eeprom_cmd(dev, addr, W1_DS2781_RECALL_DATA);
 115}
 116
 117static int ds2781_save_eeprom(struct ds2781_device_info *dev_info, int reg)
 118{
 119        int ret;
 120
 121        ret = ds2781_store_eeprom(dev_info->w1_dev, reg);
 122        if (ret < 0)
 123                return ret;
 124
 125        ret = ds2781_recall_eeprom(dev_info->w1_dev, reg);
 126        if (ret < 0)
 127                return ret;
 128
 129        return 0;
 130}
 131
 132/* Set sense resistor value in mhos */
 133static int ds2781_set_sense_register(struct ds2781_device_info *dev_info,
 134        u8 conductance)
 135{
 136        int ret;
 137
 138        ret = ds2781_write(dev_info, &conductance,
 139                                DS2781_RSNSP, sizeof(u8));
 140        if (ret < 0)
 141                return ret;
 142
 143        return ds2781_save_eeprom(dev_info, DS2781_RSNSP);
 144}
 145
 146/* Get RSGAIN value from 0 to 1.999 in steps of 0.001 */
 147static int ds2781_get_rsgain_register(struct ds2781_device_info *dev_info,
 148        u16 *rsgain)
 149{
 150        return ds2781_read16(dev_info, rsgain, DS2781_RSGAIN_MSB);
 151}
 152
 153/* Set RSGAIN value from 0 to 1.999 in steps of 0.001 */
 154static int ds2781_set_rsgain_register(struct ds2781_device_info *dev_info,
 155        u16 rsgain)
 156{
 157        int ret;
 158        u8 raw[] = {rsgain >> 8, rsgain & 0xFF};
 159
 160        ret = ds2781_write(dev_info, raw,
 161                                DS2781_RSGAIN_MSB, sizeof(raw));
 162        if (ret < 0)
 163                return ret;
 164
 165        return ds2781_save_eeprom(dev_info, DS2781_RSGAIN_MSB);
 166}
 167
 168static int ds2781_get_voltage(struct ds2781_device_info *dev_info,
 169        int *voltage_uV)
 170{
 171        int ret;
 172        char val[2];
 173        int voltage_raw;
 174
 175        ret = w1_ds2781_read(dev_info, val, DS2781_VOLT_MSB, 2 * sizeof(u8));
 176        if (ret < 0)
 177                return ret;
 178        /*
 179         * The voltage value is located in 10 bits across the voltage MSB
 180         * and LSB registers in two's compliment form
 181         * Sign bit of the voltage value is in bit 7 of the voltage MSB register
 182         * Bits 9 - 3 of the voltage value are in bits 6 - 0 of the
 183         * voltage MSB register
 184         * Bits 2 - 0 of the voltage value are in bits 7 - 5 of the
 185         * voltage LSB register
 186         */
 187        voltage_raw = (val[0] << 3) |
 188                (val[1] >> 5);
 189
 190        /* DS2781 reports voltage in units of 9.76mV, but the battery class
 191         * reports in units of uV, so convert by multiplying by 9760. */
 192        *voltage_uV = voltage_raw * 9760;
 193
 194        return 0;
 195}
 196
 197static int ds2781_get_temperature(struct ds2781_device_info *dev_info,
 198        int *temp)
 199{
 200        int ret;
 201        char val[2];
 202        int temp_raw;
 203
 204        ret = w1_ds2781_read(dev_info, val, DS2781_TEMP_MSB, 2 * sizeof(u8));
 205        if (ret < 0)
 206                return ret;
 207        /*
 208         * The temperature value is located in 10 bits across the temperature
 209         * MSB and LSB registers in two's compliment form
 210         * Sign bit of the temperature value is in bit 7 of the temperature
 211         * MSB register
 212         * Bits 9 - 3 of the temperature value are in bits 6 - 0 of the
 213         * temperature MSB register
 214         * Bits 2 - 0 of the temperature value are in bits 7 - 5 of the
 215         * temperature LSB register
 216         */
 217        temp_raw = ((val[0]) << 3) |
 218                (val[1] >> 5);
 219        *temp = temp_raw + (temp_raw / 4);
 220
 221        return 0;
 222}
 223
 224static int ds2781_get_current(struct ds2781_device_info *dev_info,
 225        enum current_types type, int *current_uA)
 226{
 227        int ret, sense_res;
 228        s16 current_raw;
 229        u8 sense_res_raw, reg_msb;
 230
 231        /*
 232         * The units of measurement for current are dependent on the value of
 233         * the sense resistor.
 234         */
 235        ret = ds2781_read8(dev_info, &sense_res_raw, DS2781_RSNSP);
 236        if (ret < 0)
 237                return ret;
 238
 239        if (sense_res_raw == 0) {
 240                dev_err(dev_info->dev, "sense resistor value is 0\n");
 241                return -EINVAL;
 242        }
 243        sense_res = 1000 / sense_res_raw;
 244
 245        if (type == CURRENT_NOW)
 246                reg_msb = DS2781_CURRENT_MSB;
 247        else if (type == CURRENT_AVG)
 248                reg_msb = DS2781_IAVG_MSB;
 249        else
 250                return -EINVAL;
 251
 252        /*
 253         * The current value is located in 16 bits across the current MSB
 254         * and LSB registers in two's compliment form
 255         * Sign bit of the current value is in bit 7 of the current MSB register
 256         * Bits 14 - 8 of the current value are in bits 6 - 0 of the current
 257         * MSB register
 258         * Bits 7 - 0 of the current value are in bits 7 - 0 of the current
 259         * LSB register
 260         */
 261        ret = ds2781_read16(dev_info, &current_raw, reg_msb);
 262        if (ret < 0)
 263                return ret;
 264
 265        *current_uA = current_raw * (DS2781_CURRENT_UNITS / sense_res);
 266        return 0;
 267}
 268
 269static int ds2781_get_accumulated_current(struct ds2781_device_info *dev_info,
 270        int *accumulated_current)
 271{
 272        int ret, sense_res;
 273        s16 current_raw;
 274        u8 sense_res_raw;
 275
 276        /*
 277         * The units of measurement for accumulated current are dependent on
 278         * the value of the sense resistor.
 279         */
 280        ret = ds2781_read8(dev_info, &sense_res_raw, DS2781_RSNSP);
 281        if (ret < 0)
 282                return ret;
 283
 284        if (sense_res_raw == 0) {
 285                dev_err(dev_info->dev, "sense resistor value is 0\n");
 286                return -EINVAL;
 287        }
 288        sense_res = 1000 / sense_res_raw;
 289
 290        /*
 291         * The ACR value is located in 16 bits across the ACR MSB and
 292         * LSB registers
 293         * Bits 15 - 8 of the ACR value are in bits 7 - 0 of the ACR
 294         * MSB register
 295         * Bits 7 - 0 of the ACR value are in bits 7 - 0 of the ACR
 296         * LSB register
 297         */
 298        ret = ds2781_read16(dev_info, &current_raw, DS2781_ACR_MSB);
 299        if (ret < 0)
 300                return ret;
 301
 302        *accumulated_current = current_raw * (DS2781_CHARGE_UNITS / sense_res);
 303        return 0;
 304}
 305
 306static int ds2781_get_capacity(struct ds2781_device_info *dev_info,
 307        int *capacity)
 308{
 309        int ret;
 310        u8 raw;
 311
 312        ret = ds2781_read8(dev_info, &raw, DS2781_RARC);
 313        if (ret < 0)
 314                return ret;
 315
 316        *capacity = raw;
 317        return 0;
 318}
 319
 320static int ds2781_get_status(struct ds2781_device_info *dev_info, int *status)
 321{
 322        int ret, current_uA, capacity;
 323
 324        ret = ds2781_get_current(dev_info, CURRENT_NOW, &current_uA);
 325        if (ret < 0)
 326                return ret;
 327
 328        ret = ds2781_get_capacity(dev_info, &capacity);
 329        if (ret < 0)
 330                return ret;
 331
 332        if (power_supply_am_i_supplied(dev_info->bat)) {
 333                if (capacity == 100)
 334                        *status = POWER_SUPPLY_STATUS_FULL;
 335                else if (current_uA > 50000)
 336                        *status = POWER_SUPPLY_STATUS_CHARGING;
 337                else
 338                        *status = POWER_SUPPLY_STATUS_NOT_CHARGING;
 339        } else {
 340                *status = POWER_SUPPLY_STATUS_DISCHARGING;
 341        }
 342        return 0;
 343}
 344
 345static int ds2781_get_charge_now(struct ds2781_device_info *dev_info,
 346        int *charge_now)
 347{
 348        int ret;
 349        u16 charge_raw;
 350
 351        /*
 352         * The RAAC value is located in 16 bits across the RAAC MSB and
 353         * LSB registers
 354         * Bits 15 - 8 of the RAAC value are in bits 7 - 0 of the RAAC
 355         * MSB register
 356         * Bits 7 - 0 of the RAAC value are in bits 7 - 0 of the RAAC
 357         * LSB register
 358         */
 359        ret = ds2781_read16(dev_info, &charge_raw, DS2781_RAAC_MSB);
 360        if (ret < 0)
 361                return ret;
 362
 363        *charge_now = charge_raw * 1600;
 364        return 0;
 365}
 366
 367static int ds2781_get_control_register(struct ds2781_device_info *dev_info,
 368        u8 *control_reg)
 369{
 370        return ds2781_read8(dev_info, control_reg, DS2781_CONTROL);
 371}
 372
 373static int ds2781_set_control_register(struct ds2781_device_info *dev_info,
 374        u8 control_reg)
 375{
 376        int ret;
 377
 378        ret = ds2781_write(dev_info, &control_reg,
 379                                DS2781_CONTROL, sizeof(u8));
 380        if (ret < 0)
 381                return ret;
 382
 383        return ds2781_save_eeprom(dev_info, DS2781_CONTROL);
 384}
 385
 386static int ds2781_battery_get_property(struct power_supply *psy,
 387        enum power_supply_property psp,
 388        union power_supply_propval *val)
 389{
 390        int ret = 0;
 391        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 392
 393        switch (psp) {
 394        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
 395                ret = ds2781_get_voltage(dev_info, &val->intval);
 396                break;
 397
 398        case POWER_SUPPLY_PROP_TEMP:
 399                ret = ds2781_get_temperature(dev_info, &val->intval);
 400                break;
 401
 402        case POWER_SUPPLY_PROP_MODEL_NAME:
 403                val->strval = model;
 404                break;
 405
 406        case POWER_SUPPLY_PROP_MANUFACTURER:
 407                val->strval = manufacturer;
 408                break;
 409
 410        case POWER_SUPPLY_PROP_CURRENT_NOW:
 411                ret = ds2781_get_current(dev_info, CURRENT_NOW, &val->intval);
 412                break;
 413
 414        case POWER_SUPPLY_PROP_CURRENT_AVG:
 415                ret = ds2781_get_current(dev_info, CURRENT_AVG, &val->intval);
 416                break;
 417
 418        case POWER_SUPPLY_PROP_STATUS:
 419                ret = ds2781_get_status(dev_info, &val->intval);
 420                break;
 421
 422        case POWER_SUPPLY_PROP_CAPACITY:
 423                ret = ds2781_get_capacity(dev_info, &val->intval);
 424                break;
 425
 426        case POWER_SUPPLY_PROP_CHARGE_COUNTER:
 427                ret = ds2781_get_accumulated_current(dev_info, &val->intval);
 428                break;
 429
 430        case POWER_SUPPLY_PROP_CHARGE_NOW:
 431                ret = ds2781_get_charge_now(dev_info, &val->intval);
 432                break;
 433
 434        default:
 435                ret = -EINVAL;
 436        }
 437
 438        return ret;
 439}
 440
 441static enum power_supply_property ds2781_battery_props[] = {
 442        POWER_SUPPLY_PROP_STATUS,
 443        POWER_SUPPLY_PROP_VOLTAGE_NOW,
 444        POWER_SUPPLY_PROP_TEMP,
 445        POWER_SUPPLY_PROP_MODEL_NAME,
 446        POWER_SUPPLY_PROP_MANUFACTURER,
 447        POWER_SUPPLY_PROP_CURRENT_NOW,
 448        POWER_SUPPLY_PROP_CURRENT_AVG,
 449        POWER_SUPPLY_PROP_CAPACITY,
 450        POWER_SUPPLY_PROP_CHARGE_COUNTER,
 451        POWER_SUPPLY_PROP_CHARGE_NOW,
 452};
 453
 454static ssize_t ds2781_get_pmod_enabled(struct device *dev,
 455        struct device_attribute *attr,
 456        char *buf)
 457{
 458        int ret;
 459        u8 control_reg;
 460        struct power_supply *psy = to_power_supply(dev);
 461        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 462
 463        /* Get power mode */
 464        ret = ds2781_get_control_register(dev_info, &control_reg);
 465        if (ret < 0)
 466                return ret;
 467
 468        return sprintf(buf, "%d\n",
 469                 !!(control_reg & DS2781_CONTROL_PMOD));
 470}
 471
 472static ssize_t ds2781_set_pmod_enabled(struct device *dev,
 473        struct device_attribute *attr,
 474        const char *buf,
 475        size_t count)
 476{
 477        int ret;
 478        u8 control_reg, new_setting;
 479        struct power_supply *psy = to_power_supply(dev);
 480        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 481
 482        /* Set power mode */
 483        ret = ds2781_get_control_register(dev_info, &control_reg);
 484        if (ret < 0)
 485                return ret;
 486
 487        ret = kstrtou8(buf, 0, &new_setting);
 488        if (ret < 0)
 489                return ret;
 490
 491        if ((new_setting != 0) && (new_setting != 1)) {
 492                dev_err(dev_info->dev, "Invalid pmod setting (0 or 1)\n");
 493                return -EINVAL;
 494        }
 495
 496        if (new_setting)
 497                control_reg |= DS2781_CONTROL_PMOD;
 498        else
 499                control_reg &= ~DS2781_CONTROL_PMOD;
 500
 501        ret = ds2781_set_control_register(dev_info, control_reg);
 502        if (ret < 0)
 503                return ret;
 504
 505        return count;
 506}
 507
 508static ssize_t ds2781_get_sense_resistor_value(struct device *dev,
 509        struct device_attribute *attr,
 510        char *buf)
 511{
 512        int ret;
 513        u8 sense_resistor;
 514        struct power_supply *psy = to_power_supply(dev);
 515        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 516
 517        ret = ds2781_read8(dev_info, &sense_resistor, DS2781_RSNSP);
 518        if (ret < 0)
 519                return ret;
 520
 521        ret = sprintf(buf, "%d\n", sense_resistor);
 522        return ret;
 523}
 524
 525static ssize_t ds2781_set_sense_resistor_value(struct device *dev,
 526        struct device_attribute *attr,
 527        const char *buf,
 528        size_t count)
 529{
 530        int ret;
 531        u8 new_setting;
 532        struct power_supply *psy = to_power_supply(dev);
 533        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 534
 535        ret = kstrtou8(buf, 0, &new_setting);
 536        if (ret < 0)
 537                return ret;
 538
 539        ret = ds2781_set_sense_register(dev_info, new_setting);
 540        if (ret < 0)
 541                return ret;
 542
 543        return count;
 544}
 545
 546static ssize_t ds2781_get_rsgain_setting(struct device *dev,
 547        struct device_attribute *attr,
 548        char *buf)
 549{
 550        int ret;
 551        u16 rsgain;
 552        struct power_supply *psy = to_power_supply(dev);
 553        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 554
 555        ret = ds2781_get_rsgain_register(dev_info, &rsgain);
 556        if (ret < 0)
 557                return ret;
 558
 559        return sprintf(buf, "%d\n", rsgain);
 560}
 561
 562static ssize_t ds2781_set_rsgain_setting(struct device *dev,
 563        struct device_attribute *attr,
 564        const char *buf,
 565        size_t count)
 566{
 567        int ret;
 568        u16 new_setting;
 569        struct power_supply *psy = to_power_supply(dev);
 570        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 571
 572        ret = kstrtou16(buf, 0, &new_setting);
 573        if (ret < 0)
 574                return ret;
 575
 576        /* Gain can only be from 0 to 1.999 in steps of .001 */
 577        if (new_setting > 1999) {
 578                dev_err(dev_info->dev, "Invalid rsgain setting (0 - 1999)\n");
 579                return -EINVAL;
 580        }
 581
 582        ret = ds2781_set_rsgain_register(dev_info, new_setting);
 583        if (ret < 0)
 584                return ret;
 585
 586        return count;
 587}
 588
 589static ssize_t ds2781_get_pio_pin(struct device *dev,
 590        struct device_attribute *attr,
 591        char *buf)
 592{
 593        int ret;
 594        u8 sfr;
 595        struct power_supply *psy = to_power_supply(dev);
 596        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 597
 598        ret = ds2781_read8(dev_info, &sfr, DS2781_SFR);
 599        if (ret < 0)
 600                return ret;
 601
 602        ret = sprintf(buf, "%d\n", sfr & DS2781_SFR_PIOSC);
 603        return ret;
 604}
 605
 606static ssize_t ds2781_set_pio_pin(struct device *dev,
 607        struct device_attribute *attr,
 608        const char *buf,
 609        size_t count)
 610{
 611        int ret;
 612        u8 new_setting;
 613        struct power_supply *psy = to_power_supply(dev);
 614        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 615
 616        ret = kstrtou8(buf, 0, &new_setting);
 617        if (ret < 0)
 618                return ret;
 619
 620        if ((new_setting != 0) && (new_setting != 1)) {
 621                dev_err(dev_info->dev, "Invalid pio_pin setting (0 or 1)\n");
 622                return -EINVAL;
 623        }
 624
 625        ret = ds2781_write(dev_info, &new_setting,
 626                                DS2781_SFR, sizeof(u8));
 627        if (ret < 0)
 628                return ret;
 629
 630        return count;
 631}
 632
 633static ssize_t ds2781_read_param_eeprom_bin(struct file *filp,
 634                                struct kobject *kobj,
 635                                struct bin_attribute *bin_attr,
 636                                char *buf, loff_t off, size_t count)
 637{
 638        struct device *dev = container_of(kobj, struct device, kobj);
 639        struct power_supply *psy = to_power_supply(dev);
 640        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 641
 642        return ds2781_read_block(dev_info, buf,
 643                                DS2781_EEPROM_BLOCK1_START + off, count);
 644}
 645
 646static ssize_t ds2781_write_param_eeprom_bin(struct file *filp,
 647                                struct kobject *kobj,
 648                                struct bin_attribute *bin_attr,
 649                                char *buf, loff_t off, size_t count)
 650{
 651        struct device *dev = container_of(kobj, struct device, kobj);
 652        struct power_supply *psy = to_power_supply(dev);
 653        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 654        int ret;
 655
 656        ret = ds2781_write(dev_info, buf,
 657                                DS2781_EEPROM_BLOCK1_START + off, count);
 658        if (ret < 0)
 659                return ret;
 660
 661        ret = ds2781_save_eeprom(dev_info, DS2781_EEPROM_BLOCK1_START);
 662        if (ret < 0)
 663                return ret;
 664
 665        return count;
 666}
 667
 668static struct bin_attribute ds2781_param_eeprom_bin_attr = {
 669        .attr = {
 670                .name = "param_eeprom",
 671                .mode = S_IRUGO | S_IWUSR,
 672        },
 673        .size = DS2781_PARAM_EEPROM_SIZE,
 674        .read = ds2781_read_param_eeprom_bin,
 675        .write = ds2781_write_param_eeprom_bin,
 676};
 677
 678static ssize_t ds2781_read_user_eeprom_bin(struct file *filp,
 679                                struct kobject *kobj,
 680                                struct bin_attribute *bin_attr,
 681                                char *buf, loff_t off, size_t count)
 682{
 683        struct device *dev = container_of(kobj, struct device, kobj);
 684        struct power_supply *psy = to_power_supply(dev);
 685        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 686
 687        return ds2781_read_block(dev_info, buf,
 688                                DS2781_EEPROM_BLOCK0_START + off, count);
 689
 690}
 691
 692static ssize_t ds2781_write_user_eeprom_bin(struct file *filp,
 693                                struct kobject *kobj,
 694                                struct bin_attribute *bin_attr,
 695                                char *buf, loff_t off, size_t count)
 696{
 697        struct device *dev = container_of(kobj, struct device, kobj);
 698        struct power_supply *psy = to_power_supply(dev);
 699        struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
 700        int ret;
 701
 702        ret = ds2781_write(dev_info, buf,
 703                                DS2781_EEPROM_BLOCK0_START + off, count);
 704        if (ret < 0)
 705                return ret;
 706
 707        ret = ds2781_save_eeprom(dev_info, DS2781_EEPROM_BLOCK0_START);
 708        if (ret < 0)
 709                return ret;
 710
 711        return count;
 712}
 713
 714static struct bin_attribute ds2781_user_eeprom_bin_attr = {
 715        .attr = {
 716                .name = "user_eeprom",
 717                .mode = S_IRUGO | S_IWUSR,
 718        },
 719        .size = DS2781_USER_EEPROM_SIZE,
 720        .read = ds2781_read_user_eeprom_bin,
 721        .write = ds2781_write_user_eeprom_bin,
 722};
 723
 724static DEVICE_ATTR(pmod_enabled, S_IRUGO | S_IWUSR, ds2781_get_pmod_enabled,
 725        ds2781_set_pmod_enabled);
 726static DEVICE_ATTR(sense_resistor_value, S_IRUGO | S_IWUSR,
 727        ds2781_get_sense_resistor_value, ds2781_set_sense_resistor_value);
 728static DEVICE_ATTR(rsgain_setting, S_IRUGO | S_IWUSR, ds2781_get_rsgain_setting,
 729        ds2781_set_rsgain_setting);
 730static DEVICE_ATTR(pio_pin, S_IRUGO | S_IWUSR, ds2781_get_pio_pin,
 731        ds2781_set_pio_pin);
 732
 733
 734static struct attribute *ds2781_attributes[] = {
 735        &dev_attr_pmod_enabled.attr,
 736        &dev_attr_sense_resistor_value.attr,
 737        &dev_attr_rsgain_setting.attr,
 738        &dev_attr_pio_pin.attr,
 739        NULL
 740};
 741
 742static const struct attribute_group ds2781_attr_group = {
 743        .attrs = ds2781_attributes,
 744};
 745
 746static int ds2781_battery_probe(struct platform_device *pdev)
 747{
 748        struct power_supply_config psy_cfg = {};
 749        int ret = 0;
 750        struct ds2781_device_info *dev_info;
 751
 752        dev_info = devm_kzalloc(&pdev->dev, sizeof(*dev_info), GFP_KERNEL);
 753        if (!dev_info)
 754                return -ENOMEM;
 755
 756        platform_set_drvdata(pdev, dev_info);
 757
 758        dev_info->dev                   = &pdev->dev;
 759        dev_info->w1_dev                = pdev->dev.parent;
 760        dev_info->bat_desc.name         = dev_name(&pdev->dev);
 761        dev_info->bat_desc.type         = POWER_SUPPLY_TYPE_BATTERY;
 762        dev_info->bat_desc.properties   = ds2781_battery_props;
 763        dev_info->bat_desc.num_properties = ARRAY_SIZE(ds2781_battery_props);
 764        dev_info->bat_desc.get_property = ds2781_battery_get_property;
 765
 766        psy_cfg.drv_data                = dev_info;
 767
 768        dev_info->bat = power_supply_register(&pdev->dev, &dev_info->bat_desc,
 769                                                &psy_cfg);
 770        if (IS_ERR(dev_info->bat)) {
 771                dev_err(dev_info->dev, "failed to register battery\n");
 772                ret = PTR_ERR(dev_info->bat);
 773                goto fail;
 774        }
 775
 776        ret = sysfs_create_group(&dev_info->bat->dev.kobj, &ds2781_attr_group);
 777        if (ret) {
 778                dev_err(dev_info->dev, "failed to create sysfs group\n");
 779                goto fail_unregister;
 780        }
 781
 782        ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj,
 783                                        &ds2781_param_eeprom_bin_attr);
 784        if (ret) {
 785                dev_err(dev_info->dev,
 786                                "failed to create param eeprom bin file");
 787                goto fail_remove_group;
 788        }
 789
 790        ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj,
 791                                        &ds2781_user_eeprom_bin_attr);
 792        if (ret) {
 793                dev_err(dev_info->dev,
 794                                "failed to create user eeprom bin file");
 795                goto fail_remove_bin_file;
 796        }
 797
 798        return 0;
 799
 800fail_remove_bin_file:
 801        sysfs_remove_bin_file(&dev_info->bat->dev.kobj,
 802                                &ds2781_param_eeprom_bin_attr);
 803fail_remove_group:
 804        sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2781_attr_group);
 805fail_unregister:
 806        power_supply_unregister(dev_info->bat);
 807fail:
 808        return ret;
 809}
 810
 811static int ds2781_battery_remove(struct platform_device *pdev)
 812{
 813        struct ds2781_device_info *dev_info = platform_get_drvdata(pdev);
 814
 815        /*
 816         * Remove attributes before unregistering power supply
 817         * because 'bat' will be freed on power_supply_unregister() call.
 818         */
 819        sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2781_attr_group);
 820
 821        power_supply_unregister(dev_info->bat);
 822
 823        return 0;
 824}
 825
 826static struct platform_driver ds2781_battery_driver = {
 827        .driver = {
 828                .name = "ds2781-battery",
 829        },
 830        .probe    = ds2781_battery_probe,
 831        .remove   = ds2781_battery_remove,
 832};
 833module_platform_driver(ds2781_battery_driver);
 834
 835MODULE_LICENSE("GPL");
 836MODULE_AUTHOR("Renata Sayakhova <renata@oktetlabs.ru>");
 837MODULE_DESCRIPTION("Maxim/Dallas DS2781 Stand-Alone Fuel Gauage IC driver");
 838MODULE_ALIAS("platform:ds2781-battery");
 839
 840