Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Link Layer for Samsung S3FWRN5 NCI based Driver
0004  *
0005  * Copyright (C) 2015 Samsung Electrnoics
0006  * Robert Baldyga <r.baldyga@samsung.com>
0007  * Copyright (C) 2020 Samsung Electrnoics
0008  * Bongsu Jeon <bongsu.jeon@samsung.com>
0009  */
0010 
0011 #include <linux/gpio.h>
0012 #include <linux/delay.h>
0013 #include <linux/module.h>
0014 
0015 #include "phy_common.h"
0016 
0017 void s3fwrn5_phy_set_wake(void *phy_id, bool wake)
0018 {
0019     struct phy_common *phy = phy_id;
0020 
0021     mutex_lock(&phy->mutex);
0022     gpio_set_value(phy->gpio_fw_wake, wake);
0023     if (wake)
0024         msleep(S3FWRN5_EN_WAIT_TIME);
0025     mutex_unlock(&phy->mutex);
0026 }
0027 EXPORT_SYMBOL(s3fwrn5_phy_set_wake);
0028 
0029 bool s3fwrn5_phy_power_ctrl(struct phy_common *phy, enum s3fwrn5_mode mode)
0030 {
0031     if (phy->mode == mode)
0032         return false;
0033 
0034     phy->mode = mode;
0035 
0036     gpio_set_value(phy->gpio_en, 1);
0037     gpio_set_value(phy->gpio_fw_wake, 0);
0038     if (mode == S3FWRN5_MODE_FW)
0039         gpio_set_value(phy->gpio_fw_wake, 1);
0040 
0041     if (mode != S3FWRN5_MODE_COLD) {
0042         msleep(S3FWRN5_EN_WAIT_TIME);
0043         gpio_set_value(phy->gpio_en, 0);
0044         msleep(S3FWRN5_EN_WAIT_TIME);
0045     }
0046 
0047     return true;
0048 }
0049 EXPORT_SYMBOL(s3fwrn5_phy_power_ctrl);
0050 
0051 void s3fwrn5_phy_set_mode(void *phy_id, enum s3fwrn5_mode mode)
0052 {
0053     struct phy_common *phy = phy_id;
0054 
0055     mutex_lock(&phy->mutex);
0056 
0057     s3fwrn5_phy_power_ctrl(phy, mode);
0058 
0059     mutex_unlock(&phy->mutex);
0060 }
0061 EXPORT_SYMBOL(s3fwrn5_phy_set_mode);
0062 
0063 enum s3fwrn5_mode s3fwrn5_phy_get_mode(void *phy_id)
0064 {
0065     struct phy_common *phy = phy_id;
0066     enum s3fwrn5_mode mode;
0067 
0068     mutex_lock(&phy->mutex);
0069 
0070     mode = phy->mode;
0071 
0072     mutex_unlock(&phy->mutex);
0073 
0074     return mode;
0075 }
0076 EXPORT_SYMBOL(s3fwrn5_phy_get_mode);