diff options
author | satish kumar sugasi <quic_ssugasi@quicinc.com> | 2022-02-16 23:58:19 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2022-02-17 09:26:43 -0800 |
commit | d3174b47220932d627785702c5e379ac6b50efbd (patch) | |
tree | 87cf3a4be45d947e2e145ad68cd7806f9001fd4c | |
parent | 88a332ba60f48731c9ec9481810ddcc3c84be7e2 (diff) | |
download | bt-d3174b47220932d627785702c5e379ac6b50efbd.tar.gz |
FM: Add ALT_SLEEP_CLK support for power on chip
This enables/disable alt_sleep_clock during FM on/off
Change-Id: I95fbe011e34c80c013f13875bf9472e50aa05742
-rw-r--r-- | rtc6226/radio-rtc6226-i2c.c | 68 | ||||
-rw-r--r-- | rtc6226/radio-rtc6226.h | 1 |
2 files changed, 69 insertions, 0 deletions
diff --git a/rtc6226/radio-rtc6226-i2c.c b/rtc6226/radio-rtc6226-i2c.c index 0b5d0c7..30d3bcf 100644 --- a/rtc6226/radio-rtc6226-i2c.c +++ b/rtc6226/radio-rtc6226-i2c.c @@ -393,6 +393,35 @@ open_err_req_irq: return retval; } +static int rtc6226_fm_alt_sleep_clk_reg_cfg(struct rtc6226_device *radio, bool power) +{ + int rc =0; + struct fm_power_vreg_data *vreg; + + vreg = radio->alt_sleep_clkreg; + if (!vreg) { + FMDERR("In %s, vio reg is NULL\n", __func__); + return rc; + } + if (power) { + FMDBG("vreg is : %s\n", vreg->name); + rc = regulator_enable(vreg->reg); + if (rc < 0) { + FMDERR("reg enable(%s) failed.rc=%d\n", vreg->name, rc); + return rc; + } + vreg->is_enabled = true; + } else { + rc = regulator_disable(vreg->reg); + if (rc < 0) { + FMDERR("reg disable(%s) fail rc=%d\n", vreg->name, rc); + return rc; + } + vreg->is_enabled = false; + } + return rc; +} + static int rtc6226_fm_vio_reg_cfg(struct rtc6226_device *radio, bool on) { int rc = 0; @@ -525,6 +554,13 @@ static int rtc6226_fm_power_cfg(struct rtc6226_device *radio, bool powerflag) rtc6226_fm_vdd_reg_cfg(radio, false); return rc; } + rc = rtc6226_fm_alt_sleep_clk_reg_cfg(radio, powerflag); + if (rc < 0) { + FMDERR("In %s, vio reg cfg failed %x\n", __func__, rc); + rtc6226_fm_vdd_reg_cfg(radio, false); + rtc6226_fm_vio_reg_cfg(radio, false); + return rc; + } } else { /* Turn OFF sequence */ rc = rtc6226_fm_vdd_reg_cfg(radio, powerflag); @@ -533,6 +569,9 @@ static int rtc6226_fm_power_cfg(struct rtc6226_device *radio, bool powerflag) rc = rtc6226_fm_vio_reg_cfg(radio, powerflag); if (rc < 0) FMDERR("In %s, vio reg cfg failed %x\n", __func__, rc); + rc = rtc6226_fm_alt_sleep_clk_reg_cfg(radio, powerflag); + if (rc < 0) + FMDERR("In %s, alt_sleep_clk_ reg cfg failed %x\n", __func__, rc); } return rc; } @@ -705,6 +744,7 @@ static int rtc6226_i2c_probe(struct i2c_client *client, struct v4l2_ctrl_handler *hdl; struct regulator *vddvreg = NULL; struct regulator *viovreg = NULL; + struct regulator *alt_sleep_clk_vreg = NULL; int retval = 0; int i = 0; int kfifo_alloc_rc = 0; @@ -740,6 +780,15 @@ static int rtc6226_i2c_probe(struct i2c_client *client, return retval; } + alt_sleep_clk_vreg = regulator_get(&client->dev, "alt-sleep-clk"); + if (IS_ERR(alt_sleep_clk_vreg)) { + retval = PTR_ERR(alt_sleep_clk_vreg); + FMDERR("%s: regulator_get(alt_sleep_clk) failed. retval=%d\n", + __func__, retval); + regulator_put(vddvreg); + regulator_put(viovreg); + return retval; + } /* private data allocation and initialization */ radio = kzalloc(sizeof(struct rtc6226_device), GFP_KERNEL); if (!radio) { @@ -813,6 +862,19 @@ static int rtc6226_i2c_probe(struct i2c_client *client, FMDERR("%s: parsing vio-supply failed\n", __func__); goto err_v4l2; } + radio->alt_sleep_clkreg = devm_kzalloc(&client->dev, + sizeof(struct fm_power_vreg_data), + GFP_KERNEL); + if (!radio->alt_sleep_clkreg) { + FMDERR("%s: allocating memory for alt_sleep_clk vreg failed\n", + __func__); + retval = -ENOMEM; + goto err_v4l2; + } + radio->alt_sleep_clkreg->reg = alt_sleep_clk_vreg; + radio->alt_sleep_clkreg->name = "alt-sleep-clk"; + radio->alt_sleep_clkreg->is_enabled = false; + /* Initialize pin control*/ retval = rtc6226_pinctrl_init(radio); if (retval) { @@ -922,6 +984,12 @@ err_vreg: } else { regulator_put(vddvreg); } + if (radio && radio->alt_sleep_clkreg && radio->alt_sleep_clkreg->reg) { + regulator_put(radio->alt_sleep_clkreg->reg); + devm_kfree(&client->dev, radio->alt_sleep_clkreg); + } else { + regulator_put(alt_sleep_clk_vreg); + } kfree(radio); return retval; } diff --git a/rtc6226/radio-rtc6226.h b/rtc6226/radio-rtc6226.h index 19d5cb4..4e092d4 100644 --- a/rtc6226/radio-rtc6226.h +++ b/rtc6226/radio-rtc6226.h @@ -482,6 +482,7 @@ struct rtc6226_device { struct v4l2_ctrl_handler ctrl_handler; struct fm_power_vreg_data *vddreg; struct fm_power_vreg_data *vioreg; + struct fm_power_vreg_data *alt_sleep_clkreg; int band; int space; atomic_t users; |