From patchwork Fri Jul 19 19:00:22 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Rini X-Patchwork-Id: 260330 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id E2BDB2C0098 for ; Sat, 20 Jul 2013 05:01:07 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 9B6364A032; Fri, 19 Jul 2013 21:00:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MyQJ8H5fDGDJ; Fri, 19 Jul 2013 21:00:58 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 567664A033; Fri, 19 Jul 2013 21:00:42 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id CC9814A021 for ; Fri, 19 Jul 2013 21:00:38 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JgbfoWoT8xEq for ; Fri, 19 Jul 2013 21:00:34 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-gh0-f173.google.com (mail-gh0-f173.google.com [209.85.160.173]) by theia.denx.de (Postfix) with ESMTPS id 1A6A24A025 for ; Fri, 19 Jul 2013 21:00:28 +0200 (CEST) Received: by mail-gh0-f173.google.com with SMTP id g16so1411110ghb.18 for ; Fri, 19 Jul 2013 12:00:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=9i4/hx5vhsoIVo4370VhE4OxeNllLW8Hcik8HtIew2I=; b=v07D3rEjwCepmmnYsOKw6EU5hDo7+WVntsfRC2vzk7t2catg0vqEWUOkvpHC3Mo2RH ZT0TXqaLx69r6H68U0C/7mUEoBWgABejaoZk0SMb7vRGVtX/c4cnbIfssdiNl9QIH9N8 I1mG8ps1W4eBmKbfOZPeIkNL3p1c+9HQWVRj8iqJH8G5p0t9HQVB5+Hoinaq+PIIR/nr PDsWazrKqeBd+GUNdYdXiRFT7ldySL2ALAGOoRIc5SQ+Opd7foHgvu3M5JtacWziyYR8 7z7FzNNlUmNDNYCQkPQ1SbmoqQJJPjIScCyaNrtl0C6u/ymzPy9vnv0Ahb8cYlLOQe7u pDdA== X-Received: by 10.236.55.39 with SMTP id j27mr9569518yhc.78.1374260426932; Fri, 19 Jul 2013 12:00:26 -0700 (PDT) Received: from localhost.localdomain (cpe-065-184-250-089.ec.res.rr.com. [65.184.250.89]) by mx.google.com with ESMTPSA id b48sm23285743yhc.8.2013.07.19.12.00.25 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 19 Jul 2013 12:00:26 -0700 (PDT) From: Tom Rini To: u-boot@lists.denx.de Date: Fri, 19 Jul 2013 15:00:22 -0400 Message-Id: <1374260426-9085-2-git-send-email-trini@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1374260426-9085-1-git-send-email-trini@ti.com> References: <1374260426-9085-1-git-send-email-trini@ti.com> Cc: Greg Guyotte Subject: [U-Boot] [PATCH 2/6] drivers/power/pmic: Add tps65217 driver X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de From: Greg Guyotte Add a driver for the TPS65217 PMIC that is found in the Beaglebone family of boards. Signed-off-by: Greg Guyotte [trini: Split and rework Greg's changes into new drivers/power framework] Signed-off-by: Tom Rini --- drivers/power/pmic/Makefile | 1 + drivers/power/pmic/pmic_tps65217.c | 108 ++++++++++++++++++++++++++++++++++++ include/power/tps65217.h | 92 ++++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 drivers/power/pmic/pmic_tps65217.c create mode 100644 include/power/tps65217.h diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile index 14d426f..473cb80 100644 --- a/drivers/power/pmic/Makefile +++ b/drivers/power/pmic/Makefile @@ -29,6 +29,7 @@ COBJS-$(CONFIG_POWER_MAX8998) += pmic_max8998.o COBJS-$(CONFIG_POWER_MAX8997) += pmic_max8997.o COBJS-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o COBJS-$(CONFIG_POWER_MAX77686) += pmic_max77686.o +COBJS-$(CONFIG_POWER_TPS65217) += pmic_tps65217.o COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/drivers/power/pmic/pmic_tps65217.c b/drivers/power/pmic/pmic_tps65217.c new file mode 100644 index 0000000..c84bbcd --- /dev/null +++ b/drivers/power/pmic/pmic_tps65217.c @@ -0,0 +1,108 @@ +/* + * (C) Copyright 2011-2013 + * Texas Instruments, + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include +#include + +/** + * tps65217_reg_read() - Generic function that can read a TPS65217 register + * @src_reg: Source register address + * @src_val: Address of destination variable + */ +uchar tps65217_reg_read(uchar src_reg, uchar *src_val) +{ + if (i2c_read(TPS65217_CHIP_PM, src_reg, 1, src_val, 1)) + return 1; + return 0; +} + +/** + * tps65217_reg_write() - Generic function that can write a TPS65217 PMIC + * register or bit field regardless of protection + * level. + * + * @prot_level: Register password protection. + * use PROT_LEVEL_NONE, PROT_LEVEL_1, or PROT_LEVEL_2 + * @dest_reg: Register address to write. + * @dest_val: Value to write. + * @mask: Bit mask (8 bits) to be applied. Function will only + * change bits that are set in the bit mask. + * + * @return: 0 for success, 1 for failure. + */ +int tps65217_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val, + uchar mask) +{ + uchar read_val; + uchar xor_reg; + + /* + * If we are affecting only a bit field, read dest_reg and apply the + * mask + */ + if (mask != MASK_ALL_BITS) { + if (i2c_read(TPS65217_CHIP_PM, dest_reg, 1, &read_val, 1)) + return 1; + read_val &= (~mask); + read_val |= (dest_val & mask); + dest_val = read_val; + } + + if (prot_level > 0) { + xor_reg = dest_reg ^ PASSWORD_UNLOCK; + if (i2c_write(TPS65217_CHIP_PM, PASSWORD, 1, &xor_reg, 1)) + return 1; + } + + if (i2c_write(TPS65217_CHIP_PM, dest_reg, 1, &dest_val, 1)) + return 1; + + if (prot_level == PROT_LEVEL_2) { + if (i2c_write(TPS65217_CHIP_PM, PASSWORD, 1, &xor_reg, 1)) + return 1; + + if (i2c_write(TPS65217_CHIP_PM, dest_reg, 1, &dest_val, 1)) + return 1; + } + + return 0; +} + +int tps65217_voltage_update(uchar dc_cntrl_reg, uchar volt_sel) +{ + if ((dc_cntrl_reg != DEFDCDC1) && (dc_cntrl_reg != DEFDCDC2) && + (dc_cntrl_reg != DEFDCDC3)) + return 1; + + /* set voltage level */ + if (tps65217_reg_write(PROT_LEVEL_2, dc_cntrl_reg, volt_sel, + MASK_ALL_BITS)) + return 1; + + /* set GO bit to initiate voltage transition */ + if (tps65217_reg_write(PROT_LEVEL_2, DEFSLEW, DCDC_GO, DCDC_GO)) + return 1; + + return 0; +} diff --git a/include/power/tps65217.h b/include/power/tps65217.h new file mode 100644 index 0000000..c12a709 --- /dev/null +++ b/include/power/tps65217.h @@ -0,0 +1,92 @@ +/* + * (C) Copyright 2011-2013 + * Texas Instruments, + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __TPS65217_H__ +#define __TPS65217_H__ + +/* I2C chip address */ +#define TPS65217_CHIP_PM 0x24 + +/* Registers */ +#define CHIPID 0x00 +#define POWER_PATH 0x01 +#define INTERRUPT 0x02 +#define CHGCONFIG0 0x03 +#define CHGCONFIG1 0x04 +#define CHGCONFIG2 0x05 +#define CHGCONFIG3 0x06 +#define WLEDCTRL1 0x07 +#define WLEDCTRL2 0x08 +#define MUXCTRL 0x09 +#define STATUS 0x0A +#define PASSWORD 0x0B +#define PGOOD 0x0C +#define DEFPG 0x0D +#define DEFDCDC1 0x0E +#define DEFDCDC2 0x0F +#define DEFDCDC3 0x10 +#define DEFSLEW 0x11 +#define DEFLDO1 0x12 +#define DEFLDO2 0x13 +#define DEFLS1 0x14 +#define DEFLS2 0x15 +#define ENABLE 0x16 +#define DEFUVLO 0x18 +#define SEQ1 0x19 +#define SEQ2 0x1A +#define SEQ3 0x1B +#define SEQ4 0x1C +#define SEQ5 0x1D +#define SEQ6 0x1E + +#define PROT_LEVEL_NONE 0x00 +#define PROT_LEVEL_1 0x01 +#define PROT_LEVEL_2 0x02 + +#define PASSWORD_LOCK_FOR_WRITE 0x00 +#define PASSWORD_UNLOCK 0x7D + +#define DCDC_GO 0x80 + +#define MASK_ALL_BITS 0xFF + +#define USB_INPUT_CUR_LIMIT_MASK 0x03 +#define USB_INPUT_CUR_LIMIT_100MA 0x00 +#define USB_INPUT_CUR_LIMIT_500MA 0x01 +#define USB_INPUT_CUR_LIMIT_1300MA 0x02 +#define USB_INPUT_CUR_LIMIT_1800MA 0x03 + +#define DCDC_VOLT_SEL_1275MV 0x0F +#define DCDC_VOLT_SEL_1325MV 0x11 + +#define LDO_MASK 0x1F +#define LDO_VOLTAGE_OUT_3_3 0x1F + +#define PWR_SRC_USB_BITMASK 0x4 +#define PWR_SRC_AC_BITMASK 0x8 + +uchar tps65217_reg_read(uchar src_reg, uchar *src_val); +int tps65217_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val, + uchar mask); +int tps65217_voltage_update(uchar dc_cntrl_reg, uchar volt_sel); +#endif