board: msm7x27a: Put BT vregs in PinControl mode.
BT vregs are being put in pin control mode
so that they will go in low power mode when in standby.
Signed-off-by: Rahul Kashyap <rkashyap@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm7x27a.c b/arch/arm/mach-msm/board-msm7x27a.c
index 8cd55cf..4e4df0d 100644
--- a/arch/arm/mach-msm/board-msm7x27a.c
+++ b/arch/arm/mach-msm/board-msm7x27a.c
@@ -122,6 +122,7 @@
/* FM Platform power and shutdown routines */
#define FPGA_MSM_CNTRL_REG2 0x90008010
+
static void config_pcm_i2s_mode(int mode)
{
void __iomem *cfg_ptr;
@@ -419,7 +420,6 @@
/* Releasing the 1.8V Regulator */
if (fm_regulator != NULL) {
rc = vreg_disable(fm_regulator);
-
if (rc)
pr_err("%s: disable regulator failed:(%d)\n",
__func__, rc);
@@ -456,16 +456,22 @@
static struct platform_device msm_bt_power_device = {
.name = "bt_power",
};
- struct bahama_config_register {
+struct bahama_config_register {
u8 reg;
u8 value;
u8 mask;
- };
-static const char * const vregs_bahama_name[] = {
- "msme1",
- "bt",
};
-static struct vreg *vregs_bahama[ARRAY_SIZE(vregs_bahama_name)];
+struct bt_vreg_info {
+ const char *name;
+ unsigned int pmapp_id;
+ unsigned int level;
+ unsigned int is_pin_controlled;
+ struct vreg *vregs;
+};
+static struct bt_vreg_info bt_vregs[] = {
+ {"msme1", 2, 1800, 0, NULL},
+ {"bt", 21, 2900, 1, NULL}
+};
static int bahama_bt(int on)
{
@@ -619,42 +625,51 @@
static int bluetooth_switch_regulators(int on)
{
int i, rc = 0;
+ const char *id = "BTPW";
- for (i = 0; i < ARRAY_SIZE(vregs_bahama_name); i++) {
- if (!vregs_bahama[i]) {
+ for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) {
+ if (!bt_vregs[i].vregs) {
pr_err("%s: vreg_get %s failed(%d)\n",
- __func__, vregs_bahama_name[i], rc);
+ __func__, bt_vregs[i].name, rc);
goto vreg_fail;
}
- rc = on ? vreg_set_level(vregs_bahama[i], i ? 2900 :
- 1800) : 0;
+ rc = on ? vreg_set_level(bt_vregs[i].vregs,
+ bt_vregs[i].level) : 0;
if (rc < 0) {
pr_err("%s: vreg set level failed (%d)\n",
__func__, rc);
goto vreg_set_level_fail;
}
-
- rc = on ? vreg_enable(vregs_bahama[i]) :
- vreg_disable(vregs_bahama[i]);
+ if (bt_vregs[i].is_pin_controlled == 1) {
+ rc = pmapp_vreg_pincntrl_vote(id,
+ bt_vregs[i].pmapp_id,
+ PMAPP_CLOCK_ID_D1,
+ on ? PMAPP_CLOCK_VOTE_ON :
+ PMAPP_CLOCK_VOTE_OFF);
+ } else {
+ rc = on ? vreg_enable(bt_vregs[i].vregs) :
+ vreg_disable(bt_vregs[i].vregs);
+ }
if (rc < 0) {
pr_err("%s: vreg %s %s failed(%d)\n",
- __func__, vregs_bahama_name[i],
- on ? "enable" : "disable", rc);
+ __func__, bt_vregs[i].name,
+ on ? "enable" : "disable", rc);
goto vreg_fail;
- }
+ }
}
+
return rc;
vreg_fail:
while (i) {
if (on)
- vreg_disable(vregs_bahama[--i]);
+ vreg_disable(bt_vregs[--i].vregs);
}
vreg_set_level_fail:
- vreg_put(vregs_bahama[0]);
- vreg_put(vregs_bahama[1]);
+ vreg_put(bt_vregs[0].vregs);
+ vreg_put(bt_vregs[1].vregs);
return rc;
}
@@ -889,14 +904,14 @@
static int __init bt_power_init(void)
{
int i, rc = 0;
- for (i = 0; i < ARRAY_SIZE(vregs_bahama_name); i++) {
- vregs_bahama[i] = vreg_get(NULL,
- vregs_bahama_name[i]);
- if (IS_ERR(vregs_bahama[i])) {
+ for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) {
+ bt_vregs[i].vregs = vreg_get(NULL,
+ bt_vregs[i].name);
+ if (IS_ERR(bt_vregs[i].vregs)) {
pr_err("%s: vreg get %s failed (%ld)\n",
- __func__, vregs_bahama_name[i],
- PTR_ERR(vregs_bahama[i]));
- rc = PTR_ERR(vregs_bahama[i]);
+ __func__, bt_vregs[i].name,
+ PTR_ERR(bt_vregs[i].vregs));
+ rc = PTR_ERR(bt_vregs[i].vregs);
goto vreg_get_fail;
}
}
@@ -907,7 +922,7 @@
vreg_get_fail:
while (i)
- vreg_put(vregs_bahama[--i]);
+ vreg_put(bt_vregs[--i].vregs);
return rc;
}