xref: /openbmc/linux/drivers/nfc/s3fwrn5/phy_common.c (revision aa6159ab)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Link Layer for Samsung S3FWRN5 NCI based Driver
4  *
5  * Copyright (C) 2015 Samsung Electrnoics
6  * Robert Baldyga <r.baldyga@samsung.com>
7  * Copyright (C) 2020 Samsung Electrnoics
8  * Bongsu Jeon <bongsu.jeon@samsung.com>
9  */
10 
11 #include <linux/gpio.h>
12 #include <linux/delay.h>
13 #include <linux/module.h>
14 
15 #include "phy_common.h"
16 
17 void s3fwrn5_phy_set_wake(void *phy_id, bool wake)
18 {
19 	struct phy_common *phy = phy_id;
20 
21 	mutex_lock(&phy->mutex);
22 	gpio_set_value(phy->gpio_fw_wake, wake);
23 	msleep(S3FWRN5_EN_WAIT_TIME);
24 	mutex_unlock(&phy->mutex);
25 }
26 EXPORT_SYMBOL(s3fwrn5_phy_set_wake);
27 
28 bool s3fwrn5_phy_power_ctrl(struct phy_common *phy, enum s3fwrn5_mode mode)
29 {
30 	if (phy->mode == mode)
31 		return false;
32 
33 	phy->mode = mode;
34 
35 	gpio_set_value(phy->gpio_en, 1);
36 	gpio_set_value(phy->gpio_fw_wake, 0);
37 	if (mode == S3FWRN5_MODE_FW)
38 		gpio_set_value(phy->gpio_fw_wake, 1);
39 
40 	if (mode != S3FWRN5_MODE_COLD) {
41 		msleep(S3FWRN5_EN_WAIT_TIME);
42 		gpio_set_value(phy->gpio_en, 0);
43 		msleep(S3FWRN5_EN_WAIT_TIME);
44 	}
45 
46 	return true;
47 }
48 EXPORT_SYMBOL(s3fwrn5_phy_power_ctrl);
49 
50 void s3fwrn5_phy_set_mode(void *phy_id, enum s3fwrn5_mode mode)
51 {
52 	struct phy_common *phy = phy_id;
53 
54 	mutex_lock(&phy->mutex);
55 
56 	s3fwrn5_phy_power_ctrl(phy, mode);
57 
58 	mutex_unlock(&phy->mutex);
59 }
60 EXPORT_SYMBOL(s3fwrn5_phy_set_mode);
61 
62 enum s3fwrn5_mode s3fwrn5_phy_get_mode(void *phy_id)
63 {
64 	struct phy_common *phy = phy_id;
65 	enum s3fwrn5_mode mode;
66 
67 	mutex_lock(&phy->mutex);
68 
69 	mode = phy->mode;
70 
71 	mutex_unlock(&phy->mutex);
72 
73 	return mode;
74 }
75 EXPORT_SYMBOL(s3fwrn5_phy_get_mode);
76