/*
 * (C) Copyright 2011
 * egnite GmbH <info@egnite.de>
 *
 * 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
 */

/*
 * Ethernut 5 power management support
 *
 * This board may be supplied via USB, IEEE 802.3af PoE or an
 * auxiliary DC input. An on-board ATmega168 microcontroller,
 * the so called power management controller or PMC, is used
 * to select the supply source and to switch on and off certain
 * energy consuming board components. This allows to reduce the
 * total stand-by consumption to less than 70mW.
 *
 * The main CPU communicates with the PMC via I2C. When
 * CONFIG_CMD_BSP is defined in the board configuration file,
 * then the board specific command 'pwrman' becomes available,
 * which allows to manually deal with the PMC.
 *
 * Two distinct registers are provided by the PMC for enabling
 * and disabling specific features. This avoids the often seen
 * read-modify-write cycle or shadow register requirement.
 * Additional registers are available to query the board
 * status and temperature, the auxiliary voltage and to control
 * the green user LED that is integrated in the reset switch.
 *
 * Note, that the AVR firmware of the PMC is released under BSDL.
 *
 * For additional information visit the project home page at
 * http://www.ethernut.de/
 */
#include <common.h>
#include <asm/arch/at91sam9260.h>
#include <asm/arch/at91_common.h>
#include <asm/arch/gpio.h>
#include <asm/io.h>
#include <i2c.h>

#include "ethernut5_pwrman.h"

/* PMC firmware version */
static int pwrman_major;
static int pwrman_minor;

/*
 * Enable Ethernut 5 power management.
 *
 * This function must be called during board initialization.
 * While we are using u-boot's I2C subsystem, it may be required
 * to enable the serial port before calling this function,
 * in particular when debugging is enabled.
 *
 * If board specific commands are not available, we will activate
 * all board components.
 */
void ethernut5_power_init(void)
{
	pwrman_minor = i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_VERS);
	pwrman_major = pwrman_minor >> 4;
	pwrman_minor &= 15;

#ifndef CONFIG_CMD_BSP
	/* Do not modify anything, if we do not have a known version. */
	if (pwrman_major == 2) {
		/* Without board specific commands we enable all features. */
		i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_ENA, ~PWRMAN_ETHRST);
		i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_DIS, PWRMAN_ETHRST);
	}
#endif
}

/*
 * Reset Ethernet PHY.
 *
 * This function allows the re-configure the PHY after
 * changing its strap pins.
 */
void ethernut5_phy_reset(void)
{
	/* Do not modify anything, if we do not have a known version. */
	if (pwrman_major != 2)
		return;

	/*
	 * Make sure that the Ethernet clock is enabled and the PHY reset
	 * is disabled for at least 100 us.
	 */
	i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_ENA, PWRMAN_ETHCLK);
	i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_DIS, PWRMAN_ETHRST);
	udelay(100);

	/*
	 * LAN8710 strap pins are
	 * PA14 => PHY MODE0
	 * PA15 => PHY MODE1
	 * PA17 => PHY MODE2 => 111b all capable
	 * PA18 => PHY ADDR0 => 0b
	 */
	at91_set_pio_input(AT91_PIO_PORTA, 14, 1);
	at91_set_pio_input(AT91_PIO_PORTA, 15, 1);
	at91_set_pio_input(AT91_PIO_PORTA, 17, 1);
	at91_set_pio_input(AT91_PIO_PORTA, 18, 0);

	/* Activate PHY reset for 100 us. */
	i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_ENA, PWRMAN_ETHRST);
	udelay(100);
	i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_DIS, PWRMAN_ETHRST);

	at91_set_pio_input(AT91_PIO_PORTA, 14, 1);
}

/*
 * Output the firmware version we got during initialization.
 */
void ethernut5_print_version(void)
{
	printf("%u.%u\n", pwrman_major, pwrman_minor);
}

/*
 * All code below this point is optional and implements
 * the 'pwrman' command.
 */
#ifdef CONFIG_CMD_BSP

/* Human readable names of PMC features */
char *pwrman_feat[8] = {
	"board", "vbin", "vbout", "mmc",
	"rs232", "ethclk", "ethrst", "wakeup"
};

/*
 * Print all feature names, that have its related flags enabled.
 */
static void print_flagged_features(u8 flags)
{
	int i;

	for (i = 0; i < 8; i++) {
		if (flags & (1 << i))
			printf("%s ", pwrman_feat[i]);
	}
}

/*
 * Return flags of a given list of feature names.
 *
 * The function stops at the first unknown list entry and
 * returns the number of detected names as a function result.
 */
static int feature_flags(char * const names[], int num, u8 *flags)
{
	int i, j;

	*flags = 0;
	for (i = 0; i < num; i++) {
		for (j = 0; j < 8; j++) {
			if (strcmp(pwrman_feat[j], names[i]) == 0) {
				*flags |= 1 << j;
				break;
			}
		}
		if (j > 7)
			break;
	}
	return i;
}

void ethernut5_print_power(void)
{
	u8 flags;
	int i;

	flags = i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_ENA);
	for (i = 0; i < 2; i++) {
		if (flags) {
			print_flagged_features(flags);
			printf("%s\n", i ? "off" : "on");
		}
		flags = ~flags;
	}
}

void ethernut5_print_celsius(void)
{
	int val;

	/* Read ADC value from LM50 and return Celsius degrees. */
	val = i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_TEMP);
	val *= 5000;	/* 100mV/degree with 5V reference */
	val += 128;	/* 8 bit resolution */
	val /= 256;
	val -= 450;	/* Celsius offset, still x10 */
	/* Output full degrees. */
	printf("%d\n", (val + 5) / 10);
}

void ethernut5_print_voltage(void)
{
	int val;

	/* Read ADC value from divider and return voltage. */
	val = i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_VAUX);
	/* Resistors are 100k and 12.1k */
	val += 5;
	val *= 180948;
	val /= 100000;
	val++;
	/* Calculation was done in 0.1V units. */
	printf("%d\n", (val + 5) / 10);
}

/*
 * Process the board specific 'pwrman' command.
 */
int do_pwrman(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	u8 val;
	int i;

	if (argc == 1) {
		ethernut5_print_power();
	} else if (argc == 2 && strcmp(argv[1], "reset") == 0) {
		at91_set_pio_output(AT91_PIO_PORTB, 8, 1);
		udelay(100);
		at91_set_pio_output(AT91_PIO_PORTB, 8, 0);
		udelay(100000);
	} else if (argc == 2 && strcmp(argv[1], "temp") == 0) {
		ethernut5_print_celsius();
	} else if (argc == 2 && strcmp(argv[1], "vaux") == 0) {
		ethernut5_print_voltage();
	} else if (argc == 2 && strcmp(argv[1], "version") == 0) {
		ethernut5_print_version();
	} else if (strcmp(argv[1], "led") == 0) {
		/* Control the green status LED. Blink frequency unit
		** is 0.1s, very roughly. */
		if (argc == 2) {
			/* No more arguments, output current settings. */
			val = i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_LEDCTL);
			printf("led %u %u\n", val >> 4, val & 15);
		} else {
			/* First argument specifies the on-time. */
			val = (u8) simple_strtoul(argv[2], NULL, 0);
			val <<= 4;
			if (argc > 3) {
				/* Second argument specifies the off-time. */
				val |= (u8) (simple_strtoul(argv[3], NULL, 0)
						& 15);
			}
			/* Update the LED control register. */
			i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_LEDCTL, val);
		}
	} else {
		/* We expect a list of features followed an optional status. */
		argc--;
		i = feature_flags(&argv[1], argc, &val);
		if (argc == i) {
			/* We got a list only, print status. */
			val &= i2c_reg_read(PWRMAN_I2C_ADDR, PWRMAN_REG_STA);
			if (val) {
				if (i > 1)
					print_flagged_features(val);
				printf("active\n");
			} else {
				printf("inactive\n");
			}
		} else {
			/* More arguments. */
			if (i == 0) {
				/* No given feature, use despensibles. */
				val = PWRMAN_DISPENSIBLE;
			}
			if (strcmp(argv[i + 1], "on") == 0) {
				/* Enable features. */
				i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_ENA,
						val);
			} else if (strcmp(argv[i + 1], "off") == 0) {
				/* Disable features. */
				i2c_reg_write(PWRMAN_I2C_ADDR, PWRMAN_REG_DIS,
						val);
			} else {
				printf("Bad parameter %s\n", argv[i + 1]);
				return 1;
			}
		}
	}
	return 0;
}

U_BOOT_CMD(
	pwrman,	CONFIG_SYS_MAXARGS, 1, do_pwrman,
	"power management",
		   "- print settings\n"
	"pwrman feature ...\n"
	"       - print status\n"
	"pwrman [feature ...] on|off\n"
	"       - enable/disable specified or all dispensible features\n"
	"pwrman led [on-time [off-time]]\n"
	"       - print or set led blink timer\n"
	"pwrman temp\n"
	"       - print board temperature (Celsius)\n"
	"pwrman vaux\n"
	"       - print auxiliary input voltage\n"
	"pwrman reset\n"
	"       - reset power management controller\n"
	"pwrman version\n"
	"       - print firmware version\n"
	"\n"
	"        features, (*)=dispensible:\n"
	"          board  - 1.8V and 3.3V supply\n"
	"          vbin   - supply via USB device connector\n"
	"          vbout  - USB host connector supply(*)\n"
	"          mmc    - MMC slot supply(*)\n"
	"          rs232  - RS232 driver\n"
	"          ethclk - Ethernet PHY clock(*)\n"
	"          ethrst - Ethernet PHY reset\n"
	"          wakeup - RTC alarm"
);
#endif /* CONFIG_CMD_BSP */
