static int bcm4329_bt_rfkill_set_power(void *data, bool blocked)
{
+ /*
+ * check if BT gpio_shutdown line status and current request are same.
+ * If same, then return, else perform requested operation.
+ */
+ if (gpio_get_value(bcm4329_rfkill->gpio_shutdown) && !blocked)
+ return 0;
+
if (blocked) {
if (bcm4329_rfkill->gpio_shutdown)
gpio_direction_output(bcm4329_rfkill->gpio_shutdown, 0);
if (bcm4329_rfkill->gpio_reset)
gpio_direction_output(bcm4329_rfkill->gpio_reset, 0);
if (bcm4329_rfkill->bt_32k_clk)
- clk_disable(bcm4329_rfkill->bt_32k_clk);
+ clk_disable_unprepare(bcm4329_rfkill->bt_32k_clk);
} else {
if (bcm4329_rfkill->bt_32k_clk)
- clk_enable(bcm4329_rfkill->bt_32k_clk);
+ clk_prepare_enable(bcm4329_rfkill->bt_32k_clk);
if (bcm4329_rfkill->gpio_shutdown)
{
gpio_direction_output(bcm4329_rfkill->gpio_shutdown, 0);
"bcm4329_nreset_gpio");
if (res) {
bcm4329_rfkill->gpio_reset = res->start;
- tegra_gpio_enable(bcm4329_rfkill->gpio_reset);
ret = gpio_request(bcm4329_rfkill->gpio_reset,
"bcm4329_nreset_gpio");
} else {
- pr_warn("%s : can't find reset gpio.\n", __func__);
+ pr_warn("%s : can't find reset gpio. "
+ "reset gpio may not be defined for "
+ "this platform \n", __func__);
bcm4329_rfkill->gpio_reset = 0;
}
"bcm4329_nshutdown_gpio");
if (res) {
bcm4329_rfkill->gpio_shutdown = res->start;
- tegra_gpio_enable(bcm4329_rfkill->gpio_shutdown);
ret = gpio_request(bcm4329_rfkill->gpio_shutdown,
"bcm4329_nshutdown_gpio");
} else {
- pr_warn("%s : can't find shutdown gpio.\n", __func__);
+ pr_warn("%s : can't find shutdown gpio "
+ "shutdown gpio may not be defined for "
+ "this platform \n", __func__);
bcm4329_rfkill->gpio_shutdown = 0;
}
goto free_bcm_res;
if (bcm4329_rfkill->bt_32k_clk && enable)
- clk_enable(bcm4329_rfkill->bt_32k_clk);
+ clk_prepare_enable(bcm4329_rfkill->bt_32k_clk);
if (bcm4329_rfkill->gpio_shutdown)
gpio_direction_output(bcm4329_rfkill->gpio_shutdown, enable);
if (bcm4329_rfkill->gpio_reset)
if (bcm4329_rfkill->gpio_reset)
gpio_free(bcm4329_rfkill->gpio_reset);
if (bcm4329_rfkill->bt_32k_clk && enable)
- clk_disable(bcm4329_rfkill->bt_32k_clk);
+ clk_disable_unprepare(bcm4329_rfkill->bt_32k_clk);
if (bcm4329_rfkill->bt_32k_clk)
clk_put(bcm4329_rfkill->bt_32k_clk);
kfree(bcm4329_rfkill);