From: Piotr Wilczek <p.wilczek@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3] drivers:power:max77686: add function to set voltage and mode
Date: Mon, 15 Jul 2013 13:29:33 +0200 [thread overview]
Message-ID: <51E3DD1D.5050408@samsung.com> (raw)
In-Reply-To: <1372147187-19518-1-git-send-email-p.wilczek@samsung.com>
Dear Tom,
This patch is delegated to you. Could you review this patch for the next
release?
Best regards,
Piotr Wilczek
--
Samsung R&D Institute Poland (SRPOL)
On 06/25/2013 09:59 AM, Piotr Wilczek wrote:
> This patch add new functions to pmic max77686 to set voltage and mode.
>
> Signed-off-by: Piotr Wilczek <p.wilczek@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> CC: Minkyu Kang <mk7.kang@samsung.com>
> CC: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>
> Acked-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
> ---
> Changes in v3:
> - removed magic values
> - used ARRAY_SIZE() for array size calculation
> - used switch case instead if else if
> - added return when pmic read error occurs
>
> Changes in v2:
> - changed printf to debug
>
> drivers/power/pmic/pmic_max77686.c | 192 ++++++++++++++++++++++++++++++++++++
> include/power/max77686_pmic.h | 26 +++++
> 2 files changed, 218 insertions(+)
>
> diff --git a/drivers/power/pmic/pmic_max77686.c b/drivers/power/pmic/pmic_max77686.c
> index 7fcb4c0..3960ca9 100644
> --- a/drivers/power/pmic/pmic_max77686.c
> +++ b/drivers/power/pmic/pmic_max77686.c
> @@ -30,6 +30,198 @@
>
> 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;
> +
> + 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 (hex >= 0 && hex <= MAX77686_LDO_VOLT_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;
> +
> + if (ldo < 1 && ldo > 26) {
> + printf("%s: %d is wrong ldo number\n", __func__, ldo);
> + return -1;
> + }
> +
> + adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
> + hex = max77686_ldo_volt2hex(ldo, uV);
> +
> + if (!hex)
> + return -1;
> +
> + ret = pmic_reg_read(p, adr, &val);
> + if (ret)
> + return ret;
> +
> + val &= ~MAX77686_LDO_VOLT_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, 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;
> +
> + /* mode */
> + switch (opmode) {
> + case OPMODE_OFF:
> + mode = MAX77686_LDO_MODE_OFF;
> + break;
> + case 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 = MAX77686_LDO_MODE_STANDBY;
> + break;
> + default:
> + mode = 0xff;
> + }
> + break;
> + case OPMODE_LPM:
> + mode = MAX77686_LDO_MODE_LPM;
> + break;
> + case OPMODE_ON:
> + mode = MAX77686_LDO_MODE_ON;
> + break;
> + default:
> + 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);
> + if (ret)
> + return ret;
> +
> + val &= ~MAX77686_LDO_MODE_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, mode_shift;
> +
> + size = ARRAY_SIZE(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:
> + mode_shift = MAX77686_BUCK_MODE_SHIFT_2;
> + break;
> + default:
> + mode_shift = MAX77686_BUCK_MODE_SHIFT_1;
> + }
> +
> + mask = MAX77686_BUCK_MODE_MASK << mode_shift;
> +
> + /* mode */
> + switch (opmode) {
> + case OPMODE_OFF:
> + mode = MAX77686_BUCK_MODE_OFF;
> + break;
> + case OPMODE_STANDBY:
> + switch (buck) {
> + case 1:
> + case 2:
> + case 3:
> + case 4:
> + mode = MAX77686_BUCK_MODE_STANDBY << mode_shift;
> + break;
> + default:
> + mode = 0xff;
> + }
> + break;
> + case OPMODE_LPM:
> + switch (buck) {
> + case 2:
> + case 3:
> + case 4:
> + mode = MAX77686_BUCK_MODE_LPM << mode_shift;
> + break;
> + default:
> + mode = 0xff;
> + }
> + break;
> + case OPMODE_ON:
> + mode = MAX77686_BUCK_MODE_ON << mode_shift;
> + break;
> + default:
> + 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);
> + if (ret)
> + return ret;
> +
> + 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 1c374a9..7339a3e 100644
> --- a/include/power/max77686_pmic.h
> +++ b/include/power/max77686_pmic.h
> @@ -155,6 +155,32 @@ 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);
> +
> +#define MAX77686_LDO_VOLT_MAX_HEX 0x3f
> +#define MAX77686_LDO_VOLT_MASK 0x3f
> +#define MAX77686_LDO_MODE_MASK 0xc0
> +#define MAX77686_LDO_MODE_OFF (0x00 << 0x06)
> +#define MAX77686_LDO_MODE_STANDBY (0x01 << 0x06)
> +#define MAX77686_LDO_MODE_LPM (0x02 << 0x06)
> +#define MAX77686_LDO_MODE_ON (0x03 << 0x06)
> +#define MAX77686_BUCK_MODE_MASK 0x03
> +#define MAX77686_BUCK_MODE_SHIFT_1 0x00
> +#define MAX77686_BUCK_MODE_SHIFT_2 0x04
> +#define MAX77686_BUCK_MODE_OFF 0x00
> +#define MAX77686_BUCK_MODE_STANDBY 0x01
> +#define MAX77686_BUCK_MODE_LPM 0x02
> +#define MAX77686_BUCK_MODE_ON 0x03
> +
> /* Buck1 1 volt value */
> #define MAX77686_BUCK1OUT_1V 0x5
> /* Buck1 1.05 volt value */
>
next prev parent reply other threads:[~2013-07-15 11:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-21 12:54 [U-Boot] [PATCH V2] drivers:power:max77686: add function to set voltage and mode Piotr Wilczek
2013-06-21 16:23 ` Minkyu Kang
2013-06-24 8:44 ` Piotr Wilczek
2013-06-25 7:59 ` [U-Boot] [PATCH v3] " Piotr Wilczek
2013-07-04 7:54 ` Piotr Wilczek
2013-07-15 11:29 ` Piotr Wilczek [this message]
2013-07-15 14:46 ` Tom Rini
2013-08-30 3:26 ` Minkyu Kang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51E3DD1D.5050408@samsung.com \
--to=p.wilczek@samsung.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.