0001
0002
0003
0004
0005
0006
0007
0008
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);