Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.18 1069 lines 28 kB view raw
1/* 2 * tps65010 - driver for tps6501x power management chips 3 * 4 * Copyright (C) 2004 Texas Instruments 5 * Copyright (C) 2004-2005 David Brownell 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22#include <linux/kernel.h> 23#include <linux/module.h> 24#include <linux/init.h> 25#include <linux/slab.h> 26#include <linux/interrupt.h> 27#include <linux/device.h> 28#include <linux/i2c.h> 29#include <linux/delay.h> 30#include <linux/workqueue.h> 31#include <linux/suspend.h> 32#include <linux/debugfs.h> 33#include <linux/seq_file.h> 34#include <linux/mutex.h> 35 36#include <asm/irq.h> 37#include <asm/mach-types.h> 38 39#include <asm/arch/gpio.h> 40#include <asm/arch/mux.h> 41#include <asm/arch/tps65010.h> 42 43/*-------------------------------------------------------------------------*/ 44 45#define DRIVER_VERSION "2 May 2005" 46#define DRIVER_NAME (tps65010_driver.driver.name) 47 48MODULE_DESCRIPTION("TPS6501x Power Management Driver"); 49MODULE_LICENSE("GPL"); 50 51static unsigned short normal_i2c[] = { 0x48, /* 0x49, */ I2C_CLIENT_END }; 52 53I2C_CLIENT_INSMOD; 54 55static struct i2c_driver tps65010_driver; 56 57/*-------------------------------------------------------------------------*/ 58 59/* This driver handles a family of multipurpose chips, which incorporate 60 * voltage regulators, lithium ion/polymer battery charging, GPIOs, LEDs, 61 * and other features often needed in portable devices like cell phones 62 * or digital cameras. 63 * 64 * The tps65011 and tps65013 have different voltage settings compared 65 * to tps65010 and tps65012. The tps65013 has a NO_CHG status/irq. 66 * All except tps65010 have "wait" mode, possibly defaulted so that 67 * battery-insert != device-on. 68 * 69 * We could distinguish between some models by checking VDCDC1.UVLO or 70 * other registers, unless they've been changed already after powerup 71 * as part of board setup by a bootloader. 72 */ 73enum tps_model { 74 TPS_UNKNOWN = 0, 75 TPS65010, 76 TPS65011, 77 TPS65012, 78 TPS65013, 79}; 80 81struct tps65010 { 82 struct i2c_client client; 83 struct mutex lock; 84 int irq; 85 struct work_struct work; 86 struct dentry *file; 87 unsigned charging:1; 88 unsigned por:1; 89 unsigned model:8; 90 u16 vbus; 91 unsigned long flags; 92#define FLAG_VBUS_CHANGED 0 93#define FLAG_IRQ_ENABLE 1 94 95 /* copies of last register state */ 96 u8 chgstatus, regstatus, chgconf; 97 u8 nmask1, nmask2; 98 99 /* not currently tracking GPIO state */ 100}; 101 102#define POWER_POLL_DELAY msecs_to_jiffies(5000) 103 104/*-------------------------------------------------------------------------*/ 105 106#if defined(DEBUG) || defined(CONFIG_DEBUG_FS) 107 108static void dbg_chgstat(char *buf, size_t len, u8 chgstatus) 109{ 110 snprintf(buf, len, "%02x%s%s%s%s%s%s%s%s\n", 111 chgstatus, 112 (chgstatus & TPS_CHG_USB) ? " USB" : "", 113 (chgstatus & TPS_CHG_AC) ? " AC" : "", 114 (chgstatus & TPS_CHG_THERM) ? " therm" : "", 115 (chgstatus & TPS_CHG_TERM) ? " done" : 116 ((chgstatus & (TPS_CHG_USB|TPS_CHG_AC)) 117 ? " (charging)" : ""), 118 (chgstatus & TPS_CHG_TAPER_TMO) ? " taper_tmo" : "", 119 (chgstatus & TPS_CHG_CHG_TMO) ? " charge_tmo" : "", 120 (chgstatus & TPS_CHG_PRECHG_TMO) ? " prechg_tmo" : "", 121 (chgstatus & TPS_CHG_TEMP_ERR) ? " temp_err" : ""); 122} 123 124static void dbg_regstat(char *buf, size_t len, u8 regstatus) 125{ 126 snprintf(buf, len, "%02x %s%s%s%s%s%s%s%s\n", 127 regstatus, 128 (regstatus & TPS_REG_ONOFF) ? "off" : "(on)", 129 (regstatus & TPS_REG_COVER) ? " uncover" : "", 130 (regstatus & TPS_REG_UVLO) ? " UVLO" : "", 131 (regstatus & TPS_REG_NO_CHG) ? " NO_CHG" : "", 132 (regstatus & TPS_REG_PG_LD02) ? " ld02_bad" : "", 133 (regstatus & TPS_REG_PG_LD01) ? " ld01_bad" : "", 134 (regstatus & TPS_REG_PG_MAIN) ? " main_bad" : "", 135 (regstatus & TPS_REG_PG_CORE) ? " core_bad" : ""); 136} 137 138static void dbg_chgconf(int por, char *buf, size_t len, u8 chgconfig) 139{ 140 const char *hibit; 141 142 if (por) 143 hibit = (chgconfig & TPS_CHARGE_POR) 144 ? "POR=69ms" : "POR=1sec"; 145 else 146 hibit = (chgconfig & TPS65013_AUA) ? "AUA" : ""; 147 148 snprintf(buf, len, "%02x %s%s%s AC=%d%% USB=%dmA %sCharge\n", 149 chgconfig, hibit, 150 (chgconfig & TPS_CHARGE_RESET) ? " reset" : "", 151 (chgconfig & TPS_CHARGE_FAST) ? " fast" : "", 152 ({int p; switch ((chgconfig >> 3) & 3) { 153 case 3: p = 100; break; 154 case 2: p = 75; break; 155 case 1: p = 50; break; 156 default: p = 25; break; 157 }; p; }), 158 (chgconfig & TPS_VBUS_CHARGING) 159 ? ((chgconfig & TPS_VBUS_500MA) ? 500 : 100) 160 : 0, 161 (chgconfig & TPS_CHARGE_ENABLE) ? "" : "No"); 162} 163 164#endif 165 166#ifdef DEBUG 167 168static void show_chgstatus(const char *label, u8 chgstatus) 169{ 170 char buf [100]; 171 172 dbg_chgstat(buf, sizeof buf, chgstatus); 173 pr_debug("%s: %s %s", DRIVER_NAME, label, buf); 174} 175 176static void show_regstatus(const char *label, u8 regstatus) 177{ 178 char buf [100]; 179 180 dbg_regstat(buf, sizeof buf, regstatus); 181 pr_debug("%s: %s %s", DRIVER_NAME, label, buf); 182} 183 184static void show_chgconfig(int por, const char *label, u8 chgconfig) 185{ 186 char buf [100]; 187 188 dbg_chgconf(por, buf, sizeof buf, chgconfig); 189 pr_debug("%s: %s %s", DRIVER_NAME, label, buf); 190} 191 192#else 193 194static inline void show_chgstatus(const char *label, u8 chgstatus) { } 195static inline void show_regstatus(const char *label, u8 chgstatus) { } 196static inline void show_chgconfig(int por, const char *label, u8 chgconfig) { } 197 198#endif 199 200#ifdef CONFIG_DEBUG_FS 201 202static int dbg_show(struct seq_file *s, void *_) 203{ 204 struct tps65010 *tps = s->private; 205 u8 value, v2; 206 unsigned i; 207 char buf[100]; 208 const char *chip; 209 210 switch (tps->model) { 211 case TPS65010: chip = "tps65010"; break; 212 case TPS65011: chip = "tps65011"; break; 213 case TPS65012: chip = "tps65012"; break; 214 case TPS65013: chip = "tps65013"; break; 215 default: chip = NULL; break; 216 } 217 seq_printf(s, "driver %s\nversion %s\nchip %s\n\n", 218 DRIVER_NAME, DRIVER_VERSION, chip); 219 220 mutex_lock(&tps->lock); 221 222 /* FIXME how can we tell whether a battery is present? 223 * likely involves a charge gauging chip (like BQ26501). 224 */ 225 226 seq_printf(s, "%scharging\n\n", tps->charging ? "" : "(not) "); 227 228 229 /* registers for monitoring battery charging and status; note 230 * that reading chgstat and regstat may ack IRQs... 231 */ 232 value = i2c_smbus_read_byte_data(&tps->client, TPS_CHGCONFIG); 233 dbg_chgconf(tps->por, buf, sizeof buf, value); 234 seq_printf(s, "chgconfig %s", buf); 235 236 value = i2c_smbus_read_byte_data(&tps->client, TPS_CHGSTATUS); 237 dbg_chgstat(buf, sizeof buf, value); 238 seq_printf(s, "chgstat %s", buf); 239 value = i2c_smbus_read_byte_data(&tps->client, TPS_MASK1); 240 dbg_chgstat(buf, sizeof buf, value); 241 seq_printf(s, "mask1 %s", buf); 242 /* ignore ackint1 */ 243 244 value = i2c_smbus_read_byte_data(&tps->client, TPS_REGSTATUS); 245 dbg_regstat(buf, sizeof buf, value); 246 seq_printf(s, "regstat %s", buf); 247 value = i2c_smbus_read_byte_data(&tps->client, TPS_MASK2); 248 dbg_regstat(buf, sizeof buf, value); 249 seq_printf(s, "mask2 %s\n", buf); 250 /* ignore ackint2 */ 251 252 (void) schedule_delayed_work(&tps->work, POWER_POLL_DELAY); 253 254 255 /* VMAIN voltage, enable lowpower, etc */ 256 value = i2c_smbus_read_byte_data(&tps->client, TPS_VDCDC1); 257 seq_printf(s, "vdcdc1 %02x\n", value); 258 259 /* VCORE voltage, vibrator on/off */ 260 value = i2c_smbus_read_byte_data(&tps->client, TPS_VDCDC2); 261 seq_printf(s, "vdcdc2 %02x\n", value); 262 263 /* both LD0s, and their lowpower behavior */ 264 value = i2c_smbus_read_byte_data(&tps->client, TPS_VREGS1); 265 seq_printf(s, "vregs1 %02x\n\n", value); 266 267 268 /* LEDs and GPIOs */ 269 value = i2c_smbus_read_byte_data(&tps->client, TPS_LED1_ON); 270 v2 = i2c_smbus_read_byte_data(&tps->client, TPS_LED1_PER); 271 seq_printf(s, "led1 %s, on=%02x, per=%02x, %d/%d msec\n", 272 (value & 0x80) 273 ? ((v2 & 0x80) ? "on" : "off") 274 : ((v2 & 0x80) ? "blink" : "(nPG)"), 275 value, v2, 276 (value & 0x7f) * 10, (v2 & 0x7f) * 100); 277 278 value = i2c_smbus_read_byte_data(&tps->client, TPS_LED2_ON); 279 v2 = i2c_smbus_read_byte_data(&tps->client, TPS_LED2_PER); 280 seq_printf(s, "led2 %s, on=%02x, per=%02x, %d/%d msec\n", 281 (value & 0x80) 282 ? ((v2 & 0x80) ? "on" : "off") 283 : ((v2 & 0x80) ? "blink" : "off"), 284 value, v2, 285 (value & 0x7f) * 10, (v2 & 0x7f) * 100); 286 287 value = i2c_smbus_read_byte_data(&tps->client, TPS_DEFGPIO); 288 v2 = i2c_smbus_read_byte_data(&tps->client, TPS_MASK3); 289 seq_printf(s, "defgpio %02x mask3 %02x\n", value, v2); 290 291 for (i = 0; i < 4; i++) { 292 if (value & (1 << (4 + i))) 293 seq_printf(s, " gpio%d-out %s\n", i + 1, 294 (value & (1 << i)) ? "low" : "hi "); 295 else 296 seq_printf(s, " gpio%d-in %s %s %s\n", i + 1, 297 (value & (1 << i)) ? "hi " : "low", 298 (v2 & (1 << i)) ? "no-irq" : "irq", 299 (v2 & (1 << (4 + i))) ? "rising" : "falling"); 300 } 301 302 mutex_unlock(&tps->lock); 303 return 0; 304} 305 306static int dbg_tps_open(struct inode *inode, struct file *file) 307{ 308 return single_open(file, dbg_show, inode->u.generic_ip); 309} 310 311static struct file_operations debug_fops = { 312 .open = dbg_tps_open, 313 .read = seq_read, 314 .llseek = seq_lseek, 315 .release = single_release, 316}; 317 318#define DEBUG_FOPS &debug_fops 319 320#else 321#define DEBUG_FOPS NULL 322#endif 323 324/*-------------------------------------------------------------------------*/ 325 326/* handle IRQS in a task context, so we can use I2C calls */ 327static void tps65010_interrupt(struct tps65010 *tps) 328{ 329 u8 tmp = 0, mask, poll; 330 331 /* IRQs won't trigger irqs for certain events, but we can get 332 * others by polling (normally, with external power applied). 333 */ 334 poll = 0; 335 336 /* regstatus irqs */ 337 if (tps->nmask2) { 338 tmp = i2c_smbus_read_byte_data(&tps->client, TPS_REGSTATUS); 339 mask = tmp ^ tps->regstatus; 340 tps->regstatus = tmp; 341 mask &= tps->nmask2; 342 } else 343 mask = 0; 344 if (mask) { 345 tps->regstatus = tmp; 346 /* may need to shut something down ... */ 347 348 /* "off" usually means deep sleep */ 349 if (tmp & TPS_REG_ONOFF) { 350 pr_info("%s: power off button\n", DRIVER_NAME); 351#if 0 352 /* REVISIT: this might need its own workqueue 353 * plus tweaks including deadlock avoidance ... 354 */ 355 software_suspend(); 356#endif 357 poll = 1; 358 } 359 } 360 361 /* chgstatus irqs */ 362 if (tps->nmask1) { 363 tmp = i2c_smbus_read_byte_data(&tps->client, TPS_CHGSTATUS); 364 mask = tmp ^ tps->chgstatus; 365 tps->chgstatus = tmp; 366 mask &= tps->nmask1; 367 } else 368 mask = 0; 369 if (mask) { 370 unsigned charging = 0; 371 372 show_chgstatus("chg/irq", tmp); 373 if (tmp & (TPS_CHG_USB|TPS_CHG_AC)) 374 show_chgconfig(tps->por, "conf", tps->chgconf); 375 376 /* Unless it was turned off or disabled, we charge any 377 * battery whenever there's power available for it 378 * and the charger hasn't been disabled. 379 */ 380 if (!(tps->chgstatus & ~(TPS_CHG_USB|TPS_CHG_AC)) 381 && (tps->chgstatus & (TPS_CHG_USB|TPS_CHG_AC)) 382 && (tps->chgconf & TPS_CHARGE_ENABLE) 383 ) { 384 if (tps->chgstatus & TPS_CHG_USB) { 385 /* VBUS options are readonly until reconnect */ 386 if (mask & TPS_CHG_USB) 387 set_bit(FLAG_VBUS_CHANGED, &tps->flags); 388 charging = 1; 389 } else if (tps->chgstatus & TPS_CHG_AC) 390 charging = 1; 391 } 392 if (charging != tps->charging) { 393 tps->charging = charging; 394 pr_info("%s: battery %scharging\n", 395 DRIVER_NAME, charging ? "" : 396 ((tps->chgstatus & (TPS_CHG_USB|TPS_CHG_AC)) 397 ? "NOT " : "dis")); 398 } 399 } 400 401 /* always poll to detect (a) power removal, without tps65013 402 * NO_CHG IRQ; or (b) restart of charging after stop. 403 */ 404 if ((tps->model != TPS65013 || !tps->charging) 405 && (tps->chgstatus & (TPS_CHG_USB|TPS_CHG_AC))) 406 poll = 1; 407 if (poll) 408 (void) schedule_delayed_work(&tps->work, POWER_POLL_DELAY); 409 410 /* also potentially gpio-in rise or fall */ 411} 412 413/* handle IRQs and polling using keventd for now */ 414static void tps65010_work(void *_tps) 415{ 416 struct tps65010 *tps = _tps; 417 418 mutex_lock(&tps->lock); 419 420 tps65010_interrupt(tps); 421 422 if (test_and_clear_bit(FLAG_VBUS_CHANGED, &tps->flags)) { 423 int status; 424 u8 chgconfig, tmp; 425 426 chgconfig = i2c_smbus_read_byte_data(&tps->client, 427 TPS_CHGCONFIG); 428 chgconfig &= ~(TPS_VBUS_500MA | TPS_VBUS_CHARGING); 429 if (tps->vbus == 500) 430 chgconfig |= TPS_VBUS_500MA | TPS_VBUS_CHARGING; 431 else if (tps->vbus >= 100) 432 chgconfig |= TPS_VBUS_CHARGING; 433 434 status = i2c_smbus_write_byte_data(&tps->client, 435 TPS_CHGCONFIG, chgconfig); 436 437 /* vbus update fails unless VBUS is connected! */ 438 tmp = i2c_smbus_read_byte_data(&tps->client, TPS_CHGCONFIG); 439 tps->chgconf = tmp; 440 show_chgconfig(tps->por, "update vbus", tmp); 441 } 442 443 if (test_and_clear_bit(FLAG_IRQ_ENABLE, &tps->flags)) 444 enable_irq(tps->irq); 445 446 mutex_unlock(&tps->lock); 447} 448 449static irqreturn_t tps65010_irq(int irq, void *_tps, struct pt_regs *regs) 450{ 451 struct tps65010 *tps = _tps; 452 453 disable_irq_nosync(irq); 454 set_bit(FLAG_IRQ_ENABLE, &tps->flags); 455 (void) schedule_work(&tps->work); 456 return IRQ_HANDLED; 457} 458 459/*-------------------------------------------------------------------------*/ 460 461static struct tps65010 *the_tps; 462 463static int __exit tps65010_detach_client(struct i2c_client *client) 464{ 465 struct tps65010 *tps; 466 467 tps = container_of(client, struct tps65010, client); 468#ifdef CONFIG_ARM 469 if (machine_is_omap_h2()) 470 omap_free_gpio(58); 471 if (machine_is_omap_osk()) 472 omap_free_gpio(OMAP_MPUIO(1)); 473#endif 474 free_irq(tps->irq, tps); 475 debugfs_remove(tps->file); 476 if (i2c_detach_client(client) == 0) 477 kfree(tps); 478 the_tps = NULL; 479 return 0; 480} 481 482static int tps65010_noscan(struct i2c_adapter *bus) 483{ 484 /* pure paranoia, in case someone adds another i2c bus 485 * after our init section's gone... 486 */ 487 return -ENODEV; 488} 489 490/* no error returns, they'd just make bus scanning stop */ 491static int __init 492tps65010_probe(struct i2c_adapter *bus, int address, int kind) 493{ 494 struct tps65010 *tps; 495 int status; 496 unsigned long irqflags; 497 498 if (the_tps) { 499 dev_dbg(&bus->dev, "only one %s for now\n", DRIVER_NAME); 500 return 0; 501 } 502 503 tps = kzalloc(sizeof *tps, GFP_KERNEL); 504 if (!tps) 505 return 0; 506 507 mutex_init(&tps->lock); 508 INIT_WORK(&tps->work, tps65010_work, tps); 509 tps->irq = -1; 510 tps->client.addr = address; 511 tps->client.adapter = bus; 512 tps->client.driver = &tps65010_driver; 513 strlcpy(tps->client.name, DRIVER_NAME, I2C_NAME_SIZE); 514 515 status = i2c_attach_client(&tps->client); 516 if (status < 0) { 517 dev_dbg(&bus->dev, "can't attach %s to device %d, err %d\n", 518 DRIVER_NAME, address, status); 519 goto fail1; 520 } 521 522 /* the IRQ is active low, but many gpio lines can't support that 523 * so this driver can use falling-edge triggers instead. 524 */ 525 irqflags = IRQF_SAMPLE_RANDOM; 526#ifdef CONFIG_ARM 527 if (machine_is_omap_h2()) { 528 tps->model = TPS65010; 529 omap_cfg_reg(W4_GPIO58); 530 tps->irq = OMAP_GPIO_IRQ(58); 531 omap_request_gpio(58); 532 omap_set_gpio_direction(58, 1); 533 irqflags |= IRQF_TRIGGER_FALLING; 534 } 535 if (machine_is_omap_osk()) { 536 tps->model = TPS65010; 537 // omap_cfg_reg(U19_1610_MPUIO1); 538 tps->irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)); 539 omap_request_gpio(OMAP_MPUIO(1)); 540 omap_set_gpio_direction(OMAP_MPUIO(1), 1); 541 irqflags |= IRQF_TRIGGER_FALLING; 542 } 543 if (machine_is_omap_h3()) { 544 tps->model = TPS65013; 545 546 // FIXME set up this board's IRQ ... 547 } 548#endif 549 550 if (tps->irq > 0) { 551 status = request_irq(tps->irq, tps65010_irq, 552 irqflags, DRIVER_NAME, tps); 553 if (status < 0) { 554 dev_dbg(&tps->client.dev, "can't get IRQ %d, err %d\n", 555 tps->irq, status); 556 i2c_detach_client(&tps->client); 557 goto fail1; 558 } 559#ifdef CONFIG_ARM 560 /* annoying race here, ideally we'd have an option 561 * to claim the irq now and enable it later. 562 */ 563 disable_irq(tps->irq); 564 set_bit(FLAG_IRQ_ENABLE, &tps->flags); 565#endif 566 } else 567 printk(KERN_WARNING "%s: IRQ not configured!\n", 568 DRIVER_NAME); 569 570 571 switch (tps->model) { 572 case TPS65010: 573 case TPS65012: 574 tps->por = 1; 575 break; 576 case TPS_UNKNOWN: 577 printk(KERN_WARNING "%s: unknown TPS chip\n", DRIVER_NAME); 578 break; 579 /* else CHGCONFIG.POR is replaced by AUA, enabling a WAIT mode */ 580 } 581 tps->chgconf = i2c_smbus_read_byte_data(&tps->client, TPS_CHGCONFIG); 582 show_chgconfig(tps->por, "conf/init", tps->chgconf); 583 584 show_chgstatus("chg/init", 585 i2c_smbus_read_byte_data(&tps->client, TPS_CHGSTATUS)); 586 show_regstatus("reg/init", 587 i2c_smbus_read_byte_data(&tps->client, TPS_REGSTATUS)); 588 589 pr_debug("%s: vdcdc1 0x%02x, vdcdc2 %02x, vregs1 %02x\n", DRIVER_NAME, 590 i2c_smbus_read_byte_data(&tps->client, TPS_VDCDC1), 591 i2c_smbus_read_byte_data(&tps->client, TPS_VDCDC2), 592 i2c_smbus_read_byte_data(&tps->client, TPS_VREGS1)); 593 pr_debug("%s: defgpio 0x%02x, mask3 0x%02x\n", DRIVER_NAME, 594 i2c_smbus_read_byte_data(&tps->client, TPS_DEFGPIO), 595 i2c_smbus_read_byte_data(&tps->client, TPS_MASK3)); 596 597 tps65010_driver.attach_adapter = tps65010_noscan; 598 the_tps = tps; 599 600#if defined(CONFIG_USB_GADGET) && !defined(CONFIG_USB_OTG) 601 /* USB hosts can't draw VBUS. OTG devices could, later 602 * when OTG infrastructure enables it. USB peripherals 603 * could be relying on VBUS while booting, though. 604 */ 605 tps->vbus = 100; 606#endif 607 608 /* unmask the "interesting" irqs, then poll once to 609 * kickstart monitoring, initialize shadowed status 610 * registers, and maybe disable VBUS draw. 611 */ 612 tps->nmask1 = ~0; 613 (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK1, ~tps->nmask1); 614 615 tps->nmask2 = TPS_REG_ONOFF; 616 if (tps->model == TPS65013) 617 tps->nmask2 |= TPS_REG_NO_CHG; 618 (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK2, ~tps->nmask2); 619 620 (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK3, 0x0f 621 | i2c_smbus_read_byte_data(&tps->client, TPS_MASK3)); 622 623 tps65010_work(tps); 624 625 tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL, 626 tps, DEBUG_FOPS); 627 return 0; 628fail1: 629 kfree(tps); 630 return 0; 631} 632 633static int __init tps65010_scan_bus(struct i2c_adapter *bus) 634{ 635 if (!i2c_check_functionality(bus, I2C_FUNC_SMBUS_BYTE_DATA)) 636 return -EINVAL; 637 return i2c_probe(bus, &addr_data, tps65010_probe); 638} 639 640static struct i2c_driver tps65010_driver = { 641 .driver = { 642 .name = "tps65010", 643 }, 644 .attach_adapter = tps65010_scan_bus, 645 .detach_client = __exit_p(tps65010_detach_client), 646}; 647 648/*-------------------------------------------------------------------------*/ 649 650/* Draw from VBUS: 651 * 0 mA -- DON'T DRAW (might supply power instead) 652 * 100 mA -- usb unit load (slowest charge rate) 653 * 500 mA -- usb high power (fast battery charge) 654 */ 655int tps65010_set_vbus_draw(unsigned mA) 656{ 657 unsigned long flags; 658 659 if (!the_tps) 660 return -ENODEV; 661 662 /* assumes non-SMP */ 663 local_irq_save(flags); 664 if (mA >= 500) 665 mA = 500; 666 else if (mA >= 100) 667 mA = 100; 668 else 669 mA = 0; 670 the_tps->vbus = mA; 671 if ((the_tps->chgstatus & TPS_CHG_USB) 672 && test_and_set_bit( 673 FLAG_VBUS_CHANGED, &the_tps->flags)) { 674 /* gadget drivers call this in_irq() */ 675 (void) schedule_work(&the_tps->work); 676 } 677 local_irq_restore(flags); 678 679 return 0; 680} 681EXPORT_SYMBOL(tps65010_set_vbus_draw); 682 683/*-------------------------------------------------------------------------*/ 684/* tps65010_set_gpio_out_value parameter: 685 * gpio: GPIO1, GPIO2, GPIO3 or GPIO4 686 * value: LOW or HIGH 687 */ 688int tps65010_set_gpio_out_value(unsigned gpio, unsigned value) 689{ 690 int status; 691 unsigned defgpio; 692 693 if (!the_tps) 694 return -ENODEV; 695 if ((gpio < GPIO1) || (gpio > GPIO4)) 696 return -EINVAL; 697 698 mutex_lock(&the_tps->lock); 699 700 defgpio = i2c_smbus_read_byte_data(&the_tps->client, TPS_DEFGPIO); 701 702 /* Configure GPIO for output */ 703 defgpio |= 1 << (gpio + 3); 704 705 /* Writing 1 forces a logic 0 on that GPIO and vice versa */ 706 switch (value) { 707 case LOW: 708 defgpio |= 1 << (gpio - 1); /* set GPIO low by writing 1 */ 709 break; 710 /* case HIGH: */ 711 default: 712 defgpio &= ~(1 << (gpio - 1)); /* set GPIO high by writing 0 */ 713 break; 714 } 715 716 status = i2c_smbus_write_byte_data(&the_tps->client, 717 TPS_DEFGPIO, defgpio); 718 719 pr_debug("%s: gpio%dout = %s, defgpio 0x%02x\n", DRIVER_NAME, 720 gpio, value ? "high" : "low", 721 i2c_smbus_read_byte_data(&the_tps->client, TPS_DEFGPIO)); 722 723 mutex_unlock(&the_tps->lock); 724 return status; 725} 726EXPORT_SYMBOL(tps65010_set_gpio_out_value); 727 728/*-------------------------------------------------------------------------*/ 729/* tps65010_set_led parameter: 730 * led: LED1 or LED2 731 * mode: ON, OFF or BLINK 732 */ 733int tps65010_set_led(unsigned led, unsigned mode) 734{ 735 int status; 736 unsigned led_on, led_per, offs; 737 738 if (!the_tps) 739 return -ENODEV; 740 741 if (led == LED1) 742 offs = 0; 743 else { 744 offs = 2; 745 led = LED2; 746 } 747 748 mutex_lock(&the_tps->lock); 749 750 pr_debug("%s: led%i_on 0x%02x\n", DRIVER_NAME, led, 751 i2c_smbus_read_byte_data(&the_tps->client, 752 TPS_LED1_ON + offs)); 753 754 pr_debug("%s: led%i_per 0x%02x\n", DRIVER_NAME, led, 755 i2c_smbus_read_byte_data(&the_tps->client, 756 TPS_LED1_PER + offs)); 757 758 switch (mode) { 759 case OFF: 760 led_on = 1 << 7; 761 led_per = 0 << 7; 762 break; 763 case ON: 764 led_on = 1 << 7; 765 led_per = 1 << 7; 766 break; 767 case BLINK: 768 led_on = 0x30 | (0 << 7); 769 led_per = 0x08 | (1 << 7); 770 break; 771 default: 772 printk(KERN_ERR "%s: Wrong mode parameter for set_led()\n", 773 DRIVER_NAME); 774 mutex_unlock(&the_tps->lock); 775 return -EINVAL; 776 } 777 778 status = i2c_smbus_write_byte_data(&the_tps->client, 779 TPS_LED1_ON + offs, led_on); 780 781 if (status != 0) { 782 printk(KERN_ERR "%s: Failed to write led%i_on register\n", 783 DRIVER_NAME, led); 784 mutex_unlock(&the_tps->lock); 785 return status; 786 } 787 788 pr_debug("%s: led%i_on 0x%02x\n", DRIVER_NAME, led, 789 i2c_smbus_read_byte_data(&the_tps->client, TPS_LED1_ON + offs)); 790 791 status = i2c_smbus_write_byte_data(&the_tps->client, 792 TPS_LED1_PER + offs, led_per); 793 794 if (status != 0) { 795 printk(KERN_ERR "%s: Failed to write led%i_per register\n", 796 DRIVER_NAME, led); 797 mutex_unlock(&the_tps->lock); 798 return status; 799 } 800 801 pr_debug("%s: led%i_per 0x%02x\n", DRIVER_NAME, led, 802 i2c_smbus_read_byte_data(&the_tps->client, 803 TPS_LED1_PER + offs)); 804 805 mutex_unlock(&the_tps->lock); 806 807 return status; 808} 809EXPORT_SYMBOL(tps65010_set_led); 810 811/*-------------------------------------------------------------------------*/ 812/* tps65010_set_vib parameter: 813 * value: ON or OFF 814 */ 815int tps65010_set_vib(unsigned value) 816{ 817 int status; 818 unsigned vdcdc2; 819 820 if (!the_tps) 821 return -ENODEV; 822 823 mutex_lock(&the_tps->lock); 824 825 vdcdc2 = i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC2); 826 vdcdc2 &= ~(1 << 1); 827 if (value) 828 vdcdc2 |= (1 << 1); 829 status = i2c_smbus_write_byte_data(&the_tps->client, 830 TPS_VDCDC2, vdcdc2); 831 832 pr_debug("%s: vibrator %s\n", DRIVER_NAME, value ? "on" : "off"); 833 834 mutex_unlock(&the_tps->lock); 835 return status; 836} 837EXPORT_SYMBOL(tps65010_set_vib); 838 839/*-------------------------------------------------------------------------*/ 840/* tps65010_set_low_pwr parameter: 841 * mode: ON or OFF 842 */ 843int tps65010_set_low_pwr(unsigned mode) 844{ 845 int status; 846 unsigned vdcdc1; 847 848 if (!the_tps) 849 return -ENODEV; 850 851 mutex_lock(&the_tps->lock); 852 853 pr_debug("%s: %s low_pwr, vdcdc1 0x%02x\n", DRIVER_NAME, 854 mode ? "enable" : "disable", 855 i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); 856 857 vdcdc1 = i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1); 858 859 switch (mode) { 860 case OFF: 861 vdcdc1 &= ~TPS_ENABLE_LP; /* disable ENABLE_LP bit */ 862 break; 863 /* case ON: */ 864 default: 865 vdcdc1 |= TPS_ENABLE_LP; /* enable ENABLE_LP bit */ 866 break; 867 } 868 869 status = i2c_smbus_write_byte_data(&the_tps->client, 870 TPS_VDCDC1, vdcdc1); 871 872 if (status != 0) 873 printk(KERN_ERR "%s: Failed to write vdcdc1 register\n", 874 DRIVER_NAME); 875 else 876 pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, 877 i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); 878 879 mutex_unlock(&the_tps->lock); 880 881 return status; 882} 883EXPORT_SYMBOL(tps65010_set_low_pwr); 884 885/*-------------------------------------------------------------------------*/ 886/* tps65010_config_vregs1 parameter: 887 * value to be written to VREGS1 register 888 * Note: The complete register is written, set all bits you need 889 */ 890int tps65010_config_vregs1(unsigned value) 891{ 892 int status; 893 894 if (!the_tps) 895 return -ENODEV; 896 897 mutex_lock(&the_tps->lock); 898 899 pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, 900 i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); 901 902 status = i2c_smbus_write_byte_data(&the_tps->client, 903 TPS_VREGS1, value); 904 905 if (status != 0) 906 printk(KERN_ERR "%s: Failed to write vregs1 register\n", 907 DRIVER_NAME); 908 else 909 pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, 910 i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); 911 912 mutex_unlock(&the_tps->lock); 913 914 return status; 915} 916EXPORT_SYMBOL(tps65010_config_vregs1); 917 918/*-------------------------------------------------------------------------*/ 919/* tps65013_set_low_pwr parameter: 920 * mode: ON or OFF 921 */ 922 923/* FIXME: Assumes AC or USB power is present. Setting AUA bit is not 924 required if power supply is through a battery */ 925 926int tps65013_set_low_pwr(unsigned mode) 927{ 928 int status; 929 unsigned vdcdc1, chgconfig; 930 931 if (!the_tps || the_tps->por) 932 return -ENODEV; 933 934 mutex_lock(&the_tps->lock); 935 936 pr_debug("%s: %s low_pwr, chgconfig 0x%02x vdcdc1 0x%02x\n", 937 DRIVER_NAME, 938 mode ? "enable" : "disable", 939 i2c_smbus_read_byte_data(&the_tps->client, TPS_CHGCONFIG), 940 i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); 941 942 chgconfig = i2c_smbus_read_byte_data(&the_tps->client, TPS_CHGCONFIG); 943 vdcdc1 = i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1); 944 945 switch (mode) { 946 case OFF: 947 chgconfig &= ~TPS65013_AUA; /* disable AUA bit */ 948 vdcdc1 &= ~TPS_ENABLE_LP; /* disable ENABLE_LP bit */ 949 break; 950 /* case ON: */ 951 default: 952 chgconfig |= TPS65013_AUA; /* enable AUA bit */ 953 vdcdc1 |= TPS_ENABLE_LP; /* enable ENABLE_LP bit */ 954 break; 955 } 956 957 status = i2c_smbus_write_byte_data(&the_tps->client, 958 TPS_CHGCONFIG, chgconfig); 959 if (status != 0) { 960 printk(KERN_ERR "%s: Failed to write chconfig register\n", 961 DRIVER_NAME); 962 mutex_unlock(&the_tps->lock); 963 return status; 964 } 965 966 chgconfig = i2c_smbus_read_byte_data(&the_tps->client, TPS_CHGCONFIG); 967 the_tps->chgconf = chgconfig; 968 show_chgconfig(0, "chgconf", chgconfig); 969 970 status = i2c_smbus_write_byte_data(&the_tps->client, 971 TPS_VDCDC1, vdcdc1); 972 973 if (status != 0) 974 printk(KERN_ERR "%s: Failed to write vdcdc1 register\n", 975 DRIVER_NAME); 976 else 977 pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, 978 i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); 979 980 mutex_unlock(&the_tps->lock); 981 982 return status; 983} 984EXPORT_SYMBOL(tps65013_set_low_pwr); 985 986/*-------------------------------------------------------------------------*/ 987 988static int __init tps_init(void) 989{ 990 u32 tries = 3; 991 int status = -ENODEV; 992 993 printk(KERN_INFO "%s: version %s\n", DRIVER_NAME, DRIVER_VERSION); 994 995 /* some boards have startup glitches */ 996 while (tries--) { 997 status = i2c_add_driver(&tps65010_driver); 998 if (the_tps) 999 break; 1000 i2c_del_driver(&tps65010_driver); 1001 if (!tries) { 1002 printk(KERN_ERR "%s: no chip?\n", DRIVER_NAME); 1003 return -ENODEV; 1004 } 1005 pr_debug("%s: re-probe ...\n", DRIVER_NAME); 1006 msleep(10); 1007 } 1008 1009#ifdef CONFIG_ARM 1010 if (machine_is_omap_osk()) { 1011 1012 // FIXME: More should be placed in the initialization code 1013 // of the submodules (DSP, ethernet, power management, 1014 // board-osk.c). Careful: I2C is initialized "late". 1015 1016 /* Let LED1 (D9) blink */ 1017 tps65010_set_led(LED1, BLINK); 1018 1019 /* Disable LED 2 (D2) */ 1020 tps65010_set_led(LED2, OFF); 1021 1022 /* Set GPIO 1 HIGH to disable VBUS power supply; 1023 * OHCI driver powers it up/down as needed. 1024 */ 1025 tps65010_set_gpio_out_value(GPIO1, HIGH); 1026 1027 /* Set GPIO 2 low to turn on LED D3 */ 1028 tps65010_set_gpio_out_value(GPIO2, HIGH); 1029 1030 /* Set GPIO 3 low to take ethernet out of reset */ 1031 tps65010_set_gpio_out_value(GPIO3, LOW); 1032 1033 /* gpio4 for VDD_DSP */ 1034 1035 /* Enable LOW_PWR */ 1036 tps65010_set_low_pwr(ON); 1037 1038 /* Switch VLDO2 to 3.0V for AIC23 */ 1039 tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V | TPS_LDO1_ENABLE); 1040 1041 } else if (machine_is_omap_h2()) { 1042 /* gpio3 for SD, gpio4 for VDD_DSP */ 1043 1044 /* Enable LOW_PWR */ 1045 tps65010_set_low_pwr(ON); 1046 } else if (machine_is_omap_h3()) { 1047 /* gpio4 for SD, gpio3 for VDD_DSP */ 1048#ifdef CONFIG_PM 1049 /* Enable LOW_PWR */ 1050 tps65013_set_low_pwr(ON); 1051#endif 1052 } 1053#endif 1054 1055 return status; 1056} 1057/* NOTE: this MUST be initialized before the other parts of the system 1058 * that rely on it ... but after the i2c bus on which this relies. 1059 * That is, much earlier than on PC-type systems, which don't often use 1060 * I2C as a core system bus. 1061 */ 1062subsys_initcall(tps_init); 1063 1064static void __exit tps_exit(void) 1065{ 1066 i2c_del_driver(&tps65010_driver); 1067} 1068module_exit(tps_exit); 1069