[PATCH v2 1/2] bluetooth: btnxpuart: Support for controller wakeup gpio config

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Loic,

This looks good to me.

Reviewed-by: Neeraj Sanjay Kale <neeraj.sanjaykale@xxxxxxx>

Thanks,
Neeraj

> When using the out-of-band WAKE_IN and WAKE_OUT pins, we have to tell
> the firmware which pins to use (from controller point of view). This allows to
> report remote wakeup support when WAKE_OUT(c2h) is configured.
> 
> Signed-off-by: Loic Poulain <loic.poulain@xxxxxxxxxx>
> ---
>  v2: - Move pin properties read in ps_setup
>      - Display warning in case of wakein prop without related gpio
> 
>  drivers/bluetooth/btnxpuart.c | 32 ++++++++++++++++++++++++++++----
>  1 file changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
> index aa5ec1d444a9..4f2f429c9800 100644
> --- a/drivers/bluetooth/btnxpuart.c
> +++ b/drivers/bluetooth/btnxpuart.c
> @@ -447,8 +447,14 @@ static int ps_setup(struct hci_dev *hdev)
>                 return PTR_ERR(psdata->h2c_ps_gpio);
>         }
> 
> -       if (!psdata->h2c_ps_gpio)
> +       if (device_property_read_u8(&serdev->dev, "nxp,wakein-pin", &psdata-
> >h2c_wakeup_gpio)) {
> +               psdata->h2c_wakeup_gpio = 0xff; /* 0xff: use default pin/gpio */
> +       } else if (!psdata->h2c_ps_gpio) {
> +               bt_dev_warn(hdev, "nxp,wakein-pin property without
> + device-wakeup GPIO");
>                 psdata->h2c_wakeup_gpio = 0xff;
> +       }
> +
> +       device_property_read_u8(&serdev->dev, "nxp,wakeout-pin",
> + &psdata->c2h_wakeup_gpio);
> 
>         psdata->hdev = hdev;
>         INIT_WORK(&psdata->work, ps_work_func); @@ -540,9 +546,11 @@
> static int send_wakeup_method_cmd(struct hci_dev *hdev, void *data)
> 
>         pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode;
>         pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio;
> +       pcmd.h2c_wakeup_gpio = 0xff;
>         switch (psdata->h2c_wakeupmode) {
>         case WAKEUP_METHOD_GPIO:
>                 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_GPIO;
> +               pcmd.h2c_wakeup_gpio = psdata->h2c_wakeup_gpio;
>                 break;
>         case WAKEUP_METHOD_DTR:
>                 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_DSR; @@ -
> 552,7 +560,6 @@ static int send_wakeup_method_cmd(struct hci_dev *hdev,
> void *data)
>                 pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_BREAK;
>                 break;
>         }
> -       pcmd.h2c_wakeup_gpio = 0xff;
> 
>         skb = nxp_drv_send_cmd(hdev, HCI_NXP_WAKEUP_METHOD,
> sizeof(pcmd), &pcmd);
>         if (IS_ERR(skb)) {
> @@ -586,8 +593,13 @@ static void ps_init(struct hci_dev *hdev)
>         usleep_range(5000, 10000);
> 
>         psdata->ps_state = PS_STATE_AWAKE;
> -       psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE;
> -       psdata->c2h_wakeup_gpio = 0xff;
> +
> +       if (psdata->c2h_wakeup_gpio) {
> +               psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_GPIO;
> +       } else {
> +               psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE;
> +               psdata->c2h_wakeup_gpio = 0xff;
> +       }
> 
>         psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID;
>         if (psdata->h2c_ps_gpio)
> @@ -1266,6 +1278,17 @@ static int nxp_shutdown(struct hci_dev *hdev)
>         return 0;
>  }
> 
> +static bool nxp_wakeup(struct hci_dev *hdev) {
> +       struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
> +       struct ps_data *psdata = &nxpdev->psdata;
> +
> +       if (psdata->c2h_wakeupmode != BT_HOST_WAKEUP_METHOD_NONE)
> +               return true;
> +
> +       return false;
> +}
> +
>  static int btnxpuart_queue_skb(struct hci_dev *hdev, struct sk_buff *skb)  {
>         struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); @@ -1546,6
> +1569,7 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
>         hdev->send  = nxp_enqueue;
>         hdev->hw_error = nxp_hw_err;
>         hdev->shutdown = nxp_shutdown;
> +       hdev->wakeup = nxp_wakeup;
>         SET_HCIDEV_DEV(hdev, &serdev->dev);
> 
>         if (hci_register_dev(hdev) < 0) {
> --
> 2.34.1






[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux