summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mx5/pm_da9053.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-mx5/pm_da9053.c')
-rw-r--r--arch/arm/mach-mx5/pm_da9053.c325
1 files changed, 30 insertions, 295 deletions
diff --git a/arch/arm/mach-mx5/pm_da9053.c b/arch/arm/mach-mx5/pm_da9053.c
index b75cddae3d45..63eda3a36245 100644
--- a/arch/arm/mach-mx5/pm_da9053.c
+++ b/arch/arm/mach-mx5/pm_da9053.c
@@ -33,231 +33,38 @@
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <mach/i2c.h>
+#include "pmic.h"
/** Defines ********************************************************************
*******************************************************************************/
+/* have to hard-code the preset voltage here for they share the register
+as the normal setting on Da9053 */
+/* preset buck core to 850 mv */
+#define BUCKCORE_SUSPEND_PRESET 0xCE
+/* preset buck core to 950 mv */
+#define BUCKPRO_SUSPEND_PRESET 0xD2
+/* preset ldo6 to 1200 mv */
+#define LDO6_SUSPEND_PRESET 0xC0
+/* preset ldo10 to 1200 mv */
+#define iLDO10_SUSPEND_PRESET 0xC0
+/* set VUSB 2V5 active during suspend */
+#define BUCKPERI_SUSPEND_SW_STEP 0x50
+/* restore VUSB 2V5 active after suspend */
+#define BUCKPERI_RESTORE_SW_STEP 0x55
+/* restore VUSB 2V5 power supply after suspend */
+#define SUPPLY_RESTORE_VPERISW_EN 0x20
+#define CONF_BIT 0x80
+#define DA9053_SLEEP_DELAY 0x1f
+#define DA9052_CONTROLC_SMD_SET 0x62
+#define DA9052_GPIO0809_SMD_SET 0x18
+#define DA9052_ID1415_SMD_SET 0x1
+#define DA9052_GPI9_IRQ_MASK 0x2
-/* IMX I2C registers */
-#define IMX_I2C_IADR 0x00 /* i2c slave address */
-#define IMX_I2C_IFDR 0x04 /* i2c frequency divider */
-#define IMX_I2C_I2CR 0x08 /* i2c control */
-#define IMX_I2C_I2SR 0x0C /* i2c status */
-#define IMX_I2C_I2DR 0x10 /* i2c transfer data */
-
-/* Bits of IMX I2C registers */
-#define I2SR_RXAK 0x01
-#define I2SR_IIF 0x02
-#define I2SR_SRW 0x04
-#define I2SR_IAL 0x10
-#define I2SR_IBB 0x20
-#define I2SR_IAAS 0x40
-#define I2SR_ICF 0x80
-#define I2CR_RSTA 0x04
-#define I2CR_TXAK 0x08
-#define I2CR_MTX 0x10
-#define I2CR_MSTA 0x20
-#define I2CR_IIEN 0x40
-#define I2CR_IEN 0x80
-
-static void __iomem *base;
-static int stopped;
-
-/** Functions for IMX I2C adapter driver ***************************************
-*******************************************************************************/
-
-static int pm_i2c_imx_bus_busy(int for_busy)
-{
- unsigned int temp;
-
- while (1) {
- temp = readb(base + IMX_I2C_I2SR);
- if (for_busy && (temp & I2SR_IBB))
- break;
- if (!for_busy && !(temp & I2SR_IBB))
- break;
- pr_debug("waiting bus busy=%d\n", for_busy);
- }
-
- return 0;
-}
-
-static int pm_i2c_imx_trx_complete(void)
-{
- unsigned int temp;
- while (!((temp = readb(base + IMX_I2C_I2SR)) & I2SR_IIF))
- pr_debug("waiting or I2SR_IIF\n");
- temp &= ~I2SR_IIF;
- writeb(temp, base + IMX_I2C_I2SR);
-
- return 0;
-}
-
-static int pm_i2c_imx_acked(void)
-{
- if (readb(base + IMX_I2C_I2SR) & I2SR_RXAK) {
- pr_info("<%s> No ACK\n", __func__);
- return -EIO; /* No ACK */
- }
- return 0;
-}
-
-static int pm_i2c_imx_start(void)
-{
- unsigned int temp = 0;
- int result;
-
- /* Enable I2C controller */
- writeb(0, base + IMX_I2C_I2SR);
- writeb(I2CR_IEN, base + IMX_I2C_I2CR);
-
- /* Wait controller to be stable */
- udelay(50);
-
- /* Start I2C transaction */
- temp = readb(base + IMX_I2C_I2CR);
- temp |= I2CR_MSTA;
- writeb(temp, base + IMX_I2C_I2CR);
- result = pm_i2c_imx_bus_busy(1);
-
- temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK;
- writeb(temp, base + IMX_I2C_I2CR);
- return result;
-}
-
-static void pm_i2c_imx_stop(void)
-{
- unsigned int temp = 0;
-
- /* Stop I2C transaction */
- temp = readb(base + IMX_I2C_I2CR);
- temp &= ~(I2CR_MSTA | I2CR_MTX);
- writeb(temp, base + IMX_I2C_I2CR);
-
- pm_i2c_imx_bus_busy(0);
-
- /* Disable I2C controller */
- writeb(0, base + IMX_I2C_I2CR);
-}
-
-static int pm_i2c_imx_write(struct i2c_msg *msgs)
-{
- int i, result;
-
- /* write slave address */
- writeb(msgs->addr << 1, base + IMX_I2C_I2DR);
- result = pm_i2c_imx_trx_complete();
- if (result)
- return result;
- result = pm_i2c_imx_acked();
- if (result)
- return result;
-
- /* write data */
- for (i = 0; i < msgs->len; i++) {
- writeb(msgs->buf[i], base + IMX_I2C_I2DR);
- result = pm_i2c_imx_trx_complete();
- if (result)
- return result;
- result = pm_i2c_imx_acked();
- if (result)
- return result;
- }
- return 0;
-}
-
-static int pm_i2c_imx_read(struct i2c_msg *msgs)
-{
- int i, result;
- unsigned int temp;
-
- /* write slave address */
- writeb((msgs->addr << 1) | 0x01, base + IMX_I2C_I2DR);
- result = pm_i2c_imx_trx_complete();
- if (result)
- return result;
- result = pm_i2c_imx_acked();
- if (result)
- return result;
-
- /* setup bus to read data */
- temp = readb(base + IMX_I2C_I2CR);
- temp &= ~I2CR_MTX;
- if (msgs->len - 1)
- temp &= ~I2CR_TXAK;
- writeb(temp, base + IMX_I2C_I2CR);
- readb(base + IMX_I2C_I2DR); /* dummy read */
-
- /* read data */
- for (i = 0; i < msgs->len; i++) {
- result = pm_i2c_imx_trx_complete();
- if (result)
- return result;
- if (i == (msgs->len - 1)) {
- /* It must generate STOP before read I2DR to prevent
- controller from generating another clock cycle */
- temp = readb(base + IMX_I2C_I2CR);
- temp &= ~(I2CR_MSTA | I2CR_MTX);
- writeb(temp, base + IMX_I2C_I2CR);
- pm_i2c_imx_bus_busy(0);
- stopped = 1;
- } else if (i == (msgs->len - 2)) {
- temp = readb(base + IMX_I2C_I2CR);
- temp |= I2CR_TXAK;
- writeb(temp, base + IMX_I2C_I2CR);
- }
- msgs->buf[i] = readb(base + IMX_I2C_I2DR);
- }
- return 0;
-}
-
-int pm_i2c_imx_xfer(struct i2c_msg *msgs, int num)
-{
- unsigned int i, temp;
- int result;
-
- /* Start I2C transfer */
- result = pm_i2c_imx_start();
- if (result)
- goto fail0;
-
- /* read/write data */
- for (i = 0; i < num; i++) {
- if (i) {
- temp = readb(base + IMX_I2C_I2CR);
- temp |= I2CR_RSTA;
- writeb(temp, base + IMX_I2C_I2CR);
- result = pm_i2c_imx_bus_busy(1);
- if (result)
- goto fail0;
- }
- /* write/read data */
- if (msgs[i].flags & I2C_M_RD)
- result = pm_i2c_imx_read(&msgs[i]);
- else
- result = pm_i2c_imx_write(&msgs[i]);
- if (result)
- goto fail0;
- }
-
-fail0:
- /* Stop I2C transfer */
- pm_i2c_imx_stop();
-
- return (result < 0) ? result : num;
-}
-
-void pm_da9053_i2c_init(u32 base_addr)
-{
- base = ioremap(base_addr, SZ_4K);
-}
-
-void pm_da9053_i2c_deinit(void)
-{
- iounmap(base);
-}
+static u8 volt_settings[DA9052_LDO10_REG - DA9052_BUCKCORE_REG + 1];
+extern int pm_i2c_imx_xfer(struct i2c_msg *msgs, int num);
-void pm_da9053_read_reg(u8 reg, u8 *value)
+static void pm_da9053_read_reg(u8 reg, u8 *value)
{
unsigned char buf[2] = {0, 0};
struct i2c_msg i2cmsg[2];
@@ -278,7 +85,7 @@ void pm_da9053_read_reg(u8 reg, u8 *value)
*value = buf[1];
}
-void pm_da9053_write_reg(u8 reg, u8 value)
+static void pm_da9053_write_reg(u8 reg, u8 value)
{
unsigned char buf[2] = {0, 0};
struct i2c_msg i2cmsg[2];
@@ -291,25 +98,6 @@ void pm_da9053_write_reg(u8 reg, u8 value)
pm_i2c_imx_xfer(i2cmsg, 1);
}
-/* have to hard-code the preset voltage here for they share the register
-as the normal setting on Da9053 */
-/* preset buck core to 850 mv */
-#define BUCKCORE_SUSPEND_PRESET 0xCE
-/* preset buck core to 950 mv */
-#define BUCKPRO_SUSPEND_PRESET 0xD2
-/* preset ldo6 to 1200 mv */
-#define LDO6_SUSPEND_PRESET 0xC0
-/* preset ldo10 to 1200 mv */
-#define iLDO10_SUSPEND_PRESET 0xC0
-/* set VUSB 2V5 active during suspend */
-#define BUCKPERI_SUSPEND_SW_STEP 0x50
-/* restore VUSB 2V5 active after suspend */
-#define BUCKPERI_RESTORE_SW_STEP 0x55
-/* restore VUSB 2V5 power supply after suspend */
-#define SUPPLY_RESTORE_VPERISW_EN 0x20
-#define CONF_BIT 0x80
-
-static u8 volt_settings[DA9052_LDO10_REG - DA9052_BUCKCORE_REG + 1];
static void pm_da9053_preset_voltage(void)
{
u8 reg, data;
@@ -327,7 +115,8 @@ static void pm_da9053_preset_voltage(void)
pm_da9053_write_reg(DA9052_ID1213_REG, BUCKPERI_SUSPEND_SW_STEP);
}
-void pm_da9053_dump(int start, int end)
+#if 0
+static void pm_da9053_dump(int start, int end)
{
u8 reg, data;
for (reg = start; reg <= end; reg++) {
@@ -336,13 +125,7 @@ void pm_da9053_dump(int start, int end)
reg, data);
}
}
-
-#define DA9053_SLEEP_DELAY 0x1f
-
-#define DA9052_CONTROLC_SMD_SET 0x62
-#define DA9052_GPIO0809_SMD_SET 0x18
-#define DA9052_ID1415_SMD_SET 0x1
-#define DA9052_GPI9_IRQ_MASK 0x2
+#endif
int da9053_suspend_cmd_sw(void)
{
@@ -375,7 +158,6 @@ int da9053_suspend_cmd_sw(void)
return 0;
}
-
int da9053_suspend_cmd_hw(void)
{
unsigned char buf[2] = {0, 0};
@@ -438,50 +220,3 @@ int da9053_restore_volt_settings(void)
clk_put(i2c_clk);
return 0;
}
-
-int da9053_poweroff_cmd(void)
-{
- unsigned char buf[2] = {0, 0};
- struct clk *i2c_clk;
- u8 data;
- buf[0] = 29;
-
- i2c_clk = clk_get(NULL, "i2c_clk");
- if (IS_ERR(i2c_clk)) {
- pr_err("unable to get i2c clk\n");
- return PTR_ERR(i2c_clk);
- }
- clk_enable(i2c_clk);
-
- pm_da9053_read_reg(DA9052_CONTROLB_REG, &data);
- data |= DA9052_CONTROLB_SHUTDOWN;
- pm_da9053_write_reg(DA9052_CONTROLB_REG, data);
-
- clk_disable(i2c_clk);
- clk_put(i2c_clk);
- return 0;
-}
-
-int da9053_resume_dump(void)
-{
- unsigned char buf[2] = {0, 0};
- struct clk *i2c_clk;
- buf[0] = 29;
-
- i2c_clk = clk_get(NULL, "i2c_clk");
- if (IS_ERR(i2c_clk)) {
- pr_err("unable to get i2c clk\n");
- return PTR_ERR(i2c_clk);
- }
- clk_enable(i2c_clk);
-
- pm_da9053_dump(46, 59);
- pm_da9053_dump(25, 25);
- pm_da9053_dump(29, 29);
- pm_da9053_dump(36, 36);
-
- clk_disable(i2c_clk);
- clk_put(i2c_clk);
- return 0;
-}
-