linux/drivers/w1/slaves/w1_bq27000.c
<<
>>
Prefs
   1/*
   2 * drivers/w1/slaves/w1_bq27000.c
   3 *
   4 * Copyright (C) 2007 Texas Instruments, Inc.
   5 *
   6 * This file is licensed under the terms of the GNU General Public License
   7 * version 2. This program is licensed "as is" without any warranty of any
   8 * kind, whether express or implied.
   9 *
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/device.h>
  15#include <linux/types.h>
  16#include <linux/platform_device.h>
  17#include <linux/mutex.h>
  18#include <linux/power/bq27xxx_battery.h>
  19
  20#include "../w1.h"
  21#include "../w1_int.h"
  22#include "../w1_family.h"
  23
  24#define HDQ_CMD_READ    (0)
  25#define HDQ_CMD_WRITE   (1<<7)
  26
  27static int F_ID;
  28
  29static int w1_bq27000_read(struct device *dev, unsigned int reg)
  30{
  31        u8 val;
  32        struct w1_slave *sl = container_of(dev->parent, struct w1_slave, dev);
  33
  34        mutex_lock(&sl->master->bus_mutex);
  35        w1_write_8(sl->master, HDQ_CMD_READ | reg);
  36        val = w1_read_8(sl->master);
  37        mutex_unlock(&sl->master->bus_mutex);
  38
  39        return val;
  40}
  41
  42static struct bq27xxx_platform_data bq27000_battery_info = {
  43        .read   = w1_bq27000_read,
  44        .name   = "bq27000-battery",
  45        .chip   = BQ27000,
  46};
  47
  48static int w1_bq27000_add_slave(struct w1_slave *sl)
  49{
  50        int ret;
  51        struct platform_device *pdev;
  52
  53        pdev = platform_device_alloc("bq27000-battery", -1);
  54        if (!pdev) {
  55                ret = -ENOMEM;
  56                return ret;
  57        }
  58        ret = platform_device_add_data(pdev,
  59                                       &bq27000_battery_info,
  60                                       sizeof(bq27000_battery_info));
  61        if (ret)
  62                goto pdev_add_failed;
  63        pdev->dev.parent = &sl->dev;
  64
  65        ret = platform_device_add(pdev);
  66        if (ret)
  67                goto pdev_add_failed;
  68
  69        dev_set_drvdata(&sl->dev, pdev);
  70
  71        goto success;
  72
  73pdev_add_failed:
  74        platform_device_put(pdev);
  75success:
  76        return ret;
  77}
  78
  79static void w1_bq27000_remove_slave(struct w1_slave *sl)
  80{
  81        struct platform_device *pdev = dev_get_drvdata(&sl->dev);
  82
  83        platform_device_unregister(pdev);
  84}
  85
  86static struct w1_family_ops w1_bq27000_fops = {
  87        .add_slave      = w1_bq27000_add_slave,
  88        .remove_slave   = w1_bq27000_remove_slave,
  89};
  90
  91static struct w1_family w1_bq27000_family = {
  92        .fid = W1_FAMILY_BQ27000,
  93        .fops = &w1_bq27000_fops,
  94};
  95
  96static int __init w1_bq27000_init(void)
  97{
  98        if (F_ID)
  99                w1_bq27000_family.fid = F_ID;
 100
 101        return w1_register_family(&w1_bq27000_family);
 102}
 103
 104static void __exit w1_bq27000_exit(void)
 105{
 106        w1_unregister_family(&w1_bq27000_family);
 107}
 108
 109
 110module_init(w1_bq27000_init);
 111module_exit(w1_bq27000_exit);
 112
 113module_param(F_ID, int, S_IRUSR);
 114MODULE_PARM_DESC(F_ID, "1-wire slave FID for BQ device");
 115MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_BQ27000));
 116MODULE_LICENSE("GPL");
 117MODULE_AUTHOR("Texas Instruments Ltd");
 118MODULE_DESCRIPTION("HDQ/1-wire slave driver bq27000 battery monitor chip");
 119