From patchwork Thu Apr 4 11:13:13 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Piotr Wilczek X-Patchwork-Id: 233712 X-Patchwork-Delegate: promsoft@gmail.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 D7C482C0090 for ; Thu, 4 Apr 2013 22:13:54 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id B0D924A054; Thu, 4 Apr 2013 13:13:51 +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 S4imGoFu4Bdr; Thu, 4 Apr 2013 13:13:51 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 219A94A03B; Thu, 4 Apr 2013 13:13:43 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8D2E84A027 for ; Thu, 4 Apr 2013 13:13:39 +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 Vscwj3J1CYKA for ; Thu, 4 Apr 2013 13:13:38 +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 mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by theia.denx.de (Postfix) with ESMTP id B263E4A028 for ; Thu, 4 Apr 2013 13:13:37 +0200 (CEST) Received: from epcpsbgm2.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MKQ00M019U9XA40@mailout4.samsung.com> for u-boot@lists.denx.de; Thu, 04 Apr 2013 20:13:35 +0900 (KST) X-AuditID: cbfee61b-b7f076d0000034b6-5c-515d605f2103 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 7C.F6.13494.F506D515; Thu, 04 Apr 2013 20:13:35 +0900 (KST) Received: from mcdsrvbld02.digital.local ([106.116.37.23]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MKQ00A409UC4P40@mmp2.samsung.com>; Thu, 04 Apr 2013 20:13:34 +0900 (KST) From: Piotr Wilczek To: u-boot@lists.denx.de Date: Thu, 04 Apr 2013 13:13:13 +0200 Message-id: <1365074001-5360-2-git-send-email-p.wilczek@samsung.com> X-Mailer: git-send-email 1.7.10 In-reply-to: <1365074001-5360-1-git-send-email-p.wilczek@samsung.com> References: <1365074001-5360-1-git-send-email-p.wilczek@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgluLIzCtJLcpLzFFi42I5/e+xoG58QmygwcvzHBZnm96wW7x5uJnR ouNIC6PFuidrWS1a1h5gtXi7t5Pdgc3j7J0djB59W1YxBjBFcdmkpOZklqUW6dslcGWsbt7I WnBHreLqfc4GxvmyXYycHBICJhLtB9YwQdhiEhfurWfrYuTiEBKYzijRsOgGK4TTxSTRe/kY C0gVm4C2xPI3bxhBbBEBCYlf/VcZQYqYBW4wSuzqawcbJSzgLfHn7AJmEJtFQFVi/8czQHEO Dl4BF4nvRxIgtslLPL3fxwZicwq4Stz4cAfMFgIqufd+MesERt4FjAyrGEVTC5ILipPSc430 ihNzi0vz0vWS83M3MYLD5Zn0DsZVDRaHGAU4GJV4eFf4xwQKsSaWFVfmHmKU4GBWEuHVj4kN FOJNSaysSi3Kjy8qzUktPsQozcGiJM57sNU6UEggPbEkNTs1tSC1CCbLxMEp1cC4/MKL5sD9 22wEUvvvLbxSMc9c8f6pGrn6vEqNjSf9br5R7XC6ZVFdt173te3xcvbdu122Hl+yqVDr67G0 ynM7pqQ5rqsXMphRKCnq4ZLj2MO96PojTgEe5aQ0K2c2798zLB0zr89wFJResf3Dnad736mL rSl36//o81Hu0YRXD3I6jos9Y1uoxFKckWioxVxUnAgASFaK0xMCAAA= Cc: Piotr Wilczek , Kyungmin Park , Rajeshwari Shinde Subject: [U-Boot] [PATCH v2 1/9] pmic:max77686: add function to set voltage and mode 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 This patch add new functions to pmic max77686 to set voltage and mode. Signed-off-by: Piotr Wilczek Signed-off-by: Kyungmin Park CC: Minkyu Kang CC: Rajeshwari Shinde Acked-by:Rajeshwari Shinde --- Changes in v2: - changed printf to debug drivers/power/pmic/pmic_max77686.c | 186 ++++++++++++++++++++++++++++++++++++ include/power/max77686_pmic.h | 11 +++ 2 files changed, 197 insertions(+) diff --git a/drivers/power/pmic/pmic_max77686.c b/drivers/power/pmic/pmic_max77686.c index 7fcb4c0..6b7a1cd 100644 --- a/drivers/power/pmic/pmic_max77686.c +++ b/drivers/power/pmic/pmic_max77686.c @@ -30,6 +30,192 @@ DECLARE_GLOBAL_DATA_PTR; +static const char max77686_buck_addr[] = { + 0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38 +}; + +static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV) +{ + unsigned int hex = 0; + const unsigned int max_hex = 0x3f; + + switch (ldo) { + case 1: + case 2: + case 6: + case 7: + case 8: + case 15: + hex = (uV - 800000) / 25000; + break; + default: + hex = (uV - 800000) / 50000; + } + + if (0 <= hex && hex <= max_hex) + return hex; + + debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV, ldo); + return 0; +} + +int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV) +{ + unsigned int val, ret, hex, adr, mask; + + if (ldo < 1 && 26 < ldo) { + printf("%s: %d is wrong ldo number\n", __func__, ldo); + return -1; + } + + adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1; + mask = 0x3f; + hex = max77686_ldo_volt2hex(ldo, uV); + + if (!hex) + return -1; + + ret = pmic_reg_read(p, adr, &val); + val &= ~mask; + val |= hex; + ret |= pmic_reg_write(p, adr, val); + + return ret; +} + +int max77686_set_ldo_mode(struct pmic *p, int ldo, char opmode) +{ + unsigned int val, ret, mask, adr, mode; + + if (ldo < 1 && 26 < ldo) { + printf("%s: %d is wrong ldo number\n", __func__, ldo); + return -1; + } + + adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1; + + /* mask */ + mask = 0xc0; + + /* mode */ + if (opmode == OPMODE_OFF) { + mode = 0x00; + } else if (opmode == OPMODE_STANDBY) { + switch (ldo) { + case 2: + case 6: + case 7: + case 8: + case 10: + case 11: + case 12: + case 14: + case 15: + case 16: + mode = 0x40; + break; + default: + mode = 0xff; + } + } else if (opmode == OPMODE_LPM) { + mode = 0x80; + } else if (opmode == OPMODE_ON) { + mode = 0xc0; + } else { + mode = 0xff; + } + + if (mode == 0xff) { + printf("%s: %d is not supported on LDO%d\n", + __func__, opmode, ldo); + return -1; + } + + ret = pmic_reg_read(p, adr, &val); + val &= ~mask; + val |= mode; + ret |= pmic_reg_write(p, adr, val); + + return ret; +} + +int max77686_set_buck_mode(struct pmic *p, int buck, char opmode) +{ + unsigned int val, ret, mask, adr, size, mode; + + size = sizeof(max77686_buck_addr) / sizeof(*max77686_buck_addr); + if (buck >= size) { + printf("%s: %d is wrong buck number\n", __func__, buck); + return -1; + } + + adr = max77686_buck_addr[buck]; + + /* mask */ + switch (buck) { + case 2: + case 3: + case 4: + mask = 0x30; + break; + default: + mask = 0x03; + } + + /* mode */ + if (opmode == OPMODE_OFF) { + mode = 0x00; + } else if (opmode == OPMODE_STANDBY) { + switch (buck) { + case 1: + mode = 0x01; + break; + case 2: + case 3: + case 4: + mode = 0x10; + break; + default: + mode = 0xff; + } + } else if (opmode == OPMODE_LPM) { + switch (buck) { + case 2: + case 3: + case 4: + mode = 0x20; + break; + default: + mode = 0xff; + } + } else if (opmode == OPMODE_ON) { + switch (buck) { + case 2: + case 3: + case 4: + mode = 0x30; + break; + default: + mode = 0x03; + } + } else { + mode = 0xff; + } + + if (mode == 0xff) { + printf("%s: %d is not supported on BUCK%d\n", + __func__, opmode, buck); + return -1; + } + + ret = pmic_reg_read(p, adr, &val); + val &= ~mask; + val |= mode; + ret |= pmic_reg_write(p, adr, val); + + return ret; +} + int pmic_init(unsigned char bus) { static const char name[] = "MAX77686_PMIC"; diff --git a/include/power/max77686_pmic.h b/include/power/max77686_pmic.h index fdc7ca9..ce58c02 100644 --- a/include/power/max77686_pmic.h +++ b/include/power/max77686_pmic.h @@ -155,6 +155,17 @@ enum { EN_LDO = (0x3 << 6), }; +enum { + OPMODE_OFF = 0, + OPMODE_STANDBY, + OPMODE_LPM, + OPMODE_ON, +}; + +int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV); +int max77686_set_ldo_mode(struct pmic *p, int ldo, char opmode); +int max77686_set_buck_mode(struct pmic *p, int buck, char opmode); + /* Buck1 1 volt value */ #define MAX77686_BUCK1OUT_1V 0x5 #define MAX77686_BUCK1CTRL_EN (3 << 0)