From a6c8589fe452b5c317eda07cd9043ac2fb076540 Mon Sep 17 00:00:00 2001 From: Albuer Date: Wed, 18 Sep 2013 17:04:29 +0800 Subject: [PATCH] support bluetooth: BK3515A --- net/rfkill/rfkill-rk.c | 49 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/net/rfkill/rfkill-rk.c b/net/rfkill/rfkill-rk.c index 91d7e0182d24..52d6bf2f695b 100755 --- a/net/rfkill/rfkill-rk.c +++ b/net/rfkill/rfkill-rk.c @@ -173,9 +173,9 @@ static int rfkill_rk_setup_gpio(struct rfkill_rk_gpio* gpio, int mux, const char } if (gpio->iomux.name) { - if (mux==1) + if (mux==IOMUX_FGPIO) rk_mux_api_set(gpio->iomux.name, gpio->iomux.fgpio); - else if (mux==2) + else if (mux==IOMUX_FMUX) rk_mux_api_set(gpio->iomux.name, gpio->iomux.fmux); else ;// do nothing @@ -191,13 +191,17 @@ static int rfkill_rk_setup_wake_irq(struct rfkill_rk_data* rfkill) int ret=0; struct rfkill_rk_irq* irq = &(rfkill->pdata->wake_host_irq); +#ifndef CONFIG_BK3515A_COMBO ret = rfkill_rk_setup_gpio(&irq->gpio, IOMUX_FGPIO, rfkill->pdata->name, "wake_host"); if (ret) goto fail1; +#endif if (gpio_is_valid(irq->gpio.io)) { +#ifndef CONFIG_BK3515A_COMBO ret = gpio_pull_updown(irq->gpio.io, (irq->gpio.enable==GPIO_LOW)?GPIOPullUp:GPIOPullDown); if (ret) goto fail2; +#endif LOG("Request irq for bt wakeup host\n"); irq->irq = gpio_to_irq(irq->gpio.io); sprintf(irq->name, "%s_irq", irq->gpio.name); @@ -228,7 +232,24 @@ static inline void rfkill_rk_sleep_bt_internal(struct rfkill_rk_data *rfkill, bo struct rfkill_rk_gpio *wake = &rfkill->pdata->wake_gpio; DBG("*** bt sleep: %d ***\n", sleep); +#ifndef CONFIG_BK3515A_COMBO gpio_direction_output(wake->io, sleep?!wake->enable:wake->enable); +#else + if(!sleep) + { + DBG("HOST_UART0_TX pull down 10us\n"); + if (rfkill_rk_setup_gpio(wake, IOMUX_FGPIO, rfkill->pdata->name, "wake") != 0) { + return; + } + + gpio_direction_output(wake->io, wake->enable); + udelay(10); + gpio_direction_output(wake->io, !wake->enable); + + rk_mux_api_set(wake->iomux.name, wake->iomux.fmux); + gpio_free(wake->io); + } +#endif } static void rfkill_rk_delay_sleep_bt(struct work_struct *work) @@ -402,6 +423,16 @@ static int rfkill_rk_pm_prepare(struct device *dev) // enable bt wakeup host if (gpio_is_valid(wake_host_irq->gpio.io)) { +#ifdef CONFIG_BK3515A_COMBO + int ret = 0; + ret = rfkill_rk_setup_gpio(&wake_host_irq->gpio, IOMUX_FGPIO, rfkill->pdata->name, "wake_host"); + if (ret) + LOG("irq rfkill_rk_setup_gpio failed\n"); + + ret = gpio_pull_updown(wake_host_irq->gpio.io, (wake_host_irq->gpio.enable==GPIO_LOW)?GPIOPullUp:GPIOPullDown); + if (ret) + LOG("irq gpio_pull_updown failed\n"); +#endif DBG("enable irq for bt wakeup host\n"); enable_irq(wake_host_irq->irq); } @@ -433,6 +464,10 @@ static void rfkill_rk_pm_complete(struct device *dev) // ¶ø¶à´Î´¥·¢¸ÃÖÐ¶Ï LOG("** disable irq\n"); disable_irq(wake_host_irq->irq); +#ifdef CONFIG_BK3515A_COMBO + rk_mux_api_set(wake_host_irq->gpio.iomux.name, wake_host_irq->gpio.iomux.fmux); + gpio_free(wake_host_irq->gpio.io); +#endif } /* ʹÓÃUART_RTS£¬´ËʱÀ¶ÑÀÈç¹ûÓÐÊý¾Ý¾Í»áË͵½UART @@ -565,8 +600,10 @@ static int rfkill_rk_probe(struct platform_device *pdev) ret = rfkill_rk_setup_gpio(&pdata->reset_gpio, IOMUX_FGPIO, pdata->name, "reset"); if (ret) goto fail_poweron; +#ifndef CONFIG_BK3515A_COMBO ret = rfkill_rk_setup_gpio(&pdata->wake_gpio, IOMUX_FGPIO, pdata->name, "wake"); if (ret) goto fail_reset; +#endif ret = rfkill_rk_setup_wake_irq(rfkill); if (ret) goto fail_wake; @@ -607,11 +644,15 @@ fail_rts: fail_wake_host_irq: if (gpio_is_valid(pdata->wake_host_irq.gpio.io)){ free_irq(pdata->wake_host_irq.irq, rfkill); +#ifndef CONFIG_BK3515A_COMBO gpio_free(pdata->wake_host_irq.gpio.io); +#endif } fail_wake: +#ifndef CONFIG_BK3515A_COMBO if (gpio_is_valid(pdata->wake_gpio.io)) gpio_free(pdata->wake_gpio.io); +#endif fail_reset: if (gpio_is_valid(pdata->reset_gpio.io)) gpio_free(pdata->reset_gpio.io); @@ -649,11 +690,15 @@ static int rfkill_rk_remove(struct platform_device *pdev) if (gpio_is_valid(rfkill->pdata->wake_host_irq.gpio.io)){ free_irq(rfkill->pdata->wake_host_irq.irq, rfkill); +#ifndef CONFIG_BK3515A_COMBO gpio_free(rfkill->pdata->wake_host_irq.gpio.io); +#endif } +#ifndef CONFIG_BK3515A_COMBO if (gpio_is_valid(rfkill->pdata->wake_gpio.io)) gpio_free(rfkill->pdata->wake_gpio.io); +#endif if (gpio_is_valid(rfkill->pdata->reset_gpio.io)) gpio_free(rfkill->pdata->reset_gpio.io); -- 2.34.1