1cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature/* 2cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * drivers/w1/slaves/w1_bq27000.c 3cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * 4cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * Copyright (C) 2007 Texas Instruments, Inc. 5cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * 6cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * This file is licensed under the terms of the GNU General Public License 7cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * version 2. This program is licensed "as is" without any warranty of any 8cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * kind, whether express or implied. 9cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature * 10cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature */ 11cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 12cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/kernel.h> 13cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/module.h> 14cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/device.h> 15cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/types.h> 16cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/platform_device.h> 17cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include <linux/mutex.h> 189f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown#include <linux/power/bq27x00_battery.h> 19cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 20cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include "../w1.h" 21cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include "../w1_int.h" 22cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#include "../w1_family.h" 23cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 24cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#define HDQ_CMD_READ (0) 25cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature#define HDQ_CMD_WRITE (1<<7) 26cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 27cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic int F_ID; 28cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 299f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrownstatic int w1_bq27000_read(struct device *dev, unsigned int reg) 30cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature{ 31cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature u8 val; 329f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown struct w1_slave *sl = container_of(dev->parent, struct w1_slave, dev); 33cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 34f6e8a1d7b4c4087e13913da43deb45b3e3413f29NeilBrown mutex_lock(&sl->master->mutex); 35cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature w1_write_8(sl->master, HDQ_CMD_READ | reg); 36cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature val = w1_read_8(sl->master); 37f6e8a1d7b4c4087e13913da43deb45b3e3413f29NeilBrown mutex_unlock(&sl->master->mutex); 38cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 39cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature return val; 40cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature} 419f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown 429f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrownstatic struct bq27000_platform_data bq27000_battery_info = { 439f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown .read = w1_bq27000_read, 449f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown .name = "bq27000-battery", 459f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown}; 46cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 47cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic int w1_bq27000_add_slave(struct w1_slave *sl) 48cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature{ 49cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature int ret; 50cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature struct platform_device *pdev; 51cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 529f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown pdev = platform_device_alloc("bq27000-battery", -1); 53cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature if (!pdev) { 54cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature ret = -ENOMEM; 55cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature return ret; 56cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature } 579f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown ret = platform_device_add_data(pdev, 589f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown &bq27000_battery_info, 599f3519d2ed26d2ede5b6432fb64af0e7e8ed13e3NeilBrown sizeof(bq27000_battery_info)); 60cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature pdev->dev.parent = &sl->dev; 61cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 62cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature ret = platform_device_add(pdev); 63cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature if (ret) 64cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature goto pdev_add_failed; 65cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 66cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature dev_set_drvdata(&sl->dev, pdev); 67cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 68cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature goto success; 69cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 70cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturepdev_add_failed: 71cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature platform_device_unregister(pdev); 72cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturesuccess: 73cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature return ret; 74cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature} 75cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 76cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic void w1_bq27000_remove_slave(struct w1_slave *sl) 77cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature{ 78cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature struct platform_device *pdev = dev_get_drvdata(&sl->dev); 79cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 80cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature platform_device_unregister(pdev); 81cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature} 82cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 83cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic struct w1_family_ops w1_bq27000_fops = { 84cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature .add_slave = w1_bq27000_add_slave, 85cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature .remove_slave = w1_bq27000_remove_slave, 86cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature}; 87cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 88cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic struct w1_family w1_bq27000_family = { 89cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature .fid = 1, 90cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature .fops = &w1_bq27000_fops, 91cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature}; 92cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 93cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic int __init w1_bq27000_init(void) 94cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature{ 95cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature if (F_ID) 96cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature w1_bq27000_family.fid = F_ID; 97cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 98cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature return w1_register_family(&w1_bq27000_family); 99cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature} 100cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 101cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturestatic void __exit w1_bq27000_exit(void) 102cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature{ 103cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature w1_unregister_family(&w1_bq27000_family); 104cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature} 105cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 106cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 107cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturemodule_init(w1_bq27000_init); 108cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturemodule_exit(w1_bq27000_exit); 109cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 110cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkaturemodule_param(F_ID, int, S_IRUSR); 111cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan ChikkatureMODULE_PARM_DESC(F_ID, "1-wire slave FID for BQ device"); 112cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan Chikkature 113cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan ChikkatureMODULE_LICENSE("GPL"); 114cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan ChikkatureMODULE_AUTHOR("Texas Instruments Ltd"); 115cfbc619033d3a2eee8f7aa9314e21b96cf34d399Madhusudhan ChikkatureMODULE_DESCRIPTION("HDQ/1-wire slave driver bq27000 battery monitor chip"); 116