tegra2: Enable MMC for Seaboard
[oweals/u-boot.git] / drivers / misc / fsl_pmic.c
index 87f0aedeb6813f04f9b186c370520a69b23641de..23255a59b5588f3eb2d9e8716087cf26457ffe32 100644 (file)
 
 #include <config.h>
 #include <common.h>
-#include <spi.h>
 #include <asm/errno.h>
 #include <linux/types.h>
 #include <fsl_pmic.h>
 
+static int check_param(u32 reg, u32 write)
+{
+       if (reg > 63 || write > 1) {
+               printf("<reg num> = %d is invalid. Should be less then 63\n",
+                       reg);
+               return -1;
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_FSL_PMIC_I2C
+#include <i2c.h>
+
+u32 pmic_reg(u32 reg, u32 val, u32 write)
+{
+       unsigned char buf[4] = { 0 };
+       u32 ret_val = 0;
+
+       if (check_param(reg, write))
+               return -1;
+
+       if (write) {
+               buf[0] = (val >> 16) & 0xff;
+               buf[1] = (val >> 8) & 0xff;
+               buf[2] = (val) & 0xff;
+               if (i2c_write(CONFIG_SYS_FSL_PMIC_I2C_ADDR, reg, 1, buf, 3))
+                       return -1;
+       } else {
+               if (i2c_read(CONFIG_SYS_FSL_PMIC_I2C_ADDR, reg, 1, buf, 3))
+                       return -1;
+               ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
+       }
+
+       return ret_val;
+}
+#else /* SPI interface */
+#include <spi.h>
 static struct spi_slave *slave;
 
 struct spi_slave *pmic_spi_probe(void)
@@ -46,6 +83,7 @@ void pmic_spi_free(struct spi_slave *slave)
 u32 pmic_reg(u32 reg, u32 val, u32 write)
 {
        u32 pmic_tx, pmic_rx;
+       u32 tmp;
 
        if (!slave) {
                slave = pmic_spi_probe();
@@ -54,18 +92,17 @@ u32 pmic_reg(u32 reg, u32 val, u32 write)
                        return -1;
        }
 
-       if (reg > 63 || write > 1) {
-               printf("<reg num> = %d is invalid. Should be less then 63\n",
-                       reg);
+       if (check_param(reg, write))
                return -1;
-       }
 
        if (spi_claim_bus(slave))
                return -1;
 
        pmic_tx = (write << 31) | (reg << 25) | (val & 0x00FFFFFF);
 
-       if (spi_xfer(slave, 4 << 3, &pmic_tx, &pmic_rx,
+       tmp = cpu_to_be32(pmic_tx);
+
+       if (spi_xfer(slave, 4 << 3, &tmp, &pmic_rx,
                        SPI_XFER_BEGIN | SPI_XFER_END)) {
                spi_release_bus(slave);
                return -1;
@@ -73,7 +110,8 @@ u32 pmic_reg(u32 reg, u32 val, u32 write)
 
        if (write) {
                pmic_tx &= ~(1 << 31);
-               if (spi_xfer(slave, 4 << 3, &pmic_tx, &pmic_rx,
+               tmp = cpu_to_be32(pmic_tx);
+               if (spi_xfer(slave, 4 << 3, &tmp, &pmic_rx,
                        SPI_XFER_BEGIN | SPI_XFER_END)) {
                        spi_release_bus(slave);
                        return -1;
@@ -81,8 +119,9 @@ u32 pmic_reg(u32 reg, u32 val, u32 write)
        }
 
        spi_release_bus(slave);
-       return pmic_rx;
+       return cpu_to_be32(pmic_rx);
 }
+#endif
 
 void pmic_reg_write(u32 reg, u32 value)
 {
@@ -156,33 +195,29 @@ static void pmic_dump(int numregs)
        puts("\n");
 }
 
-int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        char *cmd;
        int nregs;
        u32 val;
 
        /* at least two arguments please */
-       if (argc < 2) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 2)
+               return cmd_usage(cmdtp);
 
        cmd = argv[1];
        if (strcmp(cmd, "dump") == 0) {
-               if (argc < 3) {
-                       cmd_usage(cmdtp);
-                       return 1;
-               }
+               if (argc < 3)
+                       return cmd_usage(cmdtp);
+
                nregs = simple_strtoul(argv[2], NULL, 16);
                pmic_dump(nregs);
                return 0;
        }
        if (strcmp(cmd, "write") == 0) {
-               if (argc < 4) {
-                       cmd_usage(cmdtp);
-                       return 1;
-               }
+               if (argc < 4)
+                       return cmd_usage(cmdtp);
+
                nregs = simple_strtoul(argv[2], NULL, 16);
                val = simple_strtoul(argv[3], NULL, 16);
                pmic_reg_write(nregs, val);
@@ -195,6 +230,6 @@ int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 U_BOOT_CMD(
        pmic,   CONFIG_SYS_MAXARGS, 1, do_pmic,
        "Freescale PMIC (Atlas)",
-       "dump [numregs] dump registers\n"
+       "dump [numregs] dump registers\n"
        "pmic write <reg> <value> - write register"
 );