Lines Matching +full:phy +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
34 enum s3fwrn5_mode mode; member
40 struct s3fwrn5_i2c_phy *phy = phy_id; in s3fwrn5_i2c_set_wake() local
42 mutex_lock(&phy->mutex); in s3fwrn5_i2c_set_wake()
43 gpio_set_value(phy->gpio_fw_wake, wake); in s3fwrn5_i2c_set_wake()
45 mutex_unlock(&phy->mutex); in s3fwrn5_i2c_set_wake()
48 static void s3fwrn5_i2c_set_mode(void *phy_id, enum s3fwrn5_mode mode) in s3fwrn5_i2c_set_mode() argument
50 struct s3fwrn5_i2c_phy *phy = phy_id; in s3fwrn5_i2c_set_mode() local
52 mutex_lock(&phy->mutex); in s3fwrn5_i2c_set_mode()
54 if (phy->mode == mode) in s3fwrn5_i2c_set_mode()
57 phy->mode = mode; in s3fwrn5_i2c_set_mode()
59 gpio_set_value(phy->gpio_en, 1); in s3fwrn5_i2c_set_mode()
60 gpio_set_value(phy->gpio_fw_wake, 0); in s3fwrn5_i2c_set_mode()
61 if (mode == S3FWRN5_MODE_FW) in s3fwrn5_i2c_set_mode()
62 gpio_set_value(phy->gpio_fw_wake, 1); in s3fwrn5_i2c_set_mode()
64 if (mode != S3FWRN5_MODE_COLD) { in s3fwrn5_i2c_set_mode()
66 gpio_set_value(phy->gpio_en, 0); in s3fwrn5_i2c_set_mode()
70 phy->irq_skip = true; in s3fwrn5_i2c_set_mode()
73 mutex_unlock(&phy->mutex); in s3fwrn5_i2c_set_mode()
78 struct s3fwrn5_i2c_phy *phy = phy_id; in s3fwrn5_i2c_get_mode() local
79 enum s3fwrn5_mode mode; in s3fwrn5_i2c_get_mode() local
81 mutex_lock(&phy->mutex); in s3fwrn5_i2c_get_mode()
83 mode = phy->mode; in s3fwrn5_i2c_get_mode()
85 mutex_unlock(&phy->mutex); in s3fwrn5_i2c_get_mode()
87 return mode; in s3fwrn5_i2c_get_mode()
92 struct s3fwrn5_i2c_phy *phy = phy_id; in s3fwrn5_i2c_write() local
95 mutex_lock(&phy->mutex); in s3fwrn5_i2c_write()
97 phy->irq_skip = false; in s3fwrn5_i2c_write()
99 ret = i2c_master_send(phy->i2c_dev, skb->data, skb->len); in s3fwrn5_i2c_write()
100 if (ret == -EREMOTEIO) { in s3fwrn5_i2c_write()
103 ret = i2c_master_send(phy->i2c_dev, skb->data, skb->len); in s3fwrn5_i2c_write()
106 mutex_unlock(&phy->mutex); in s3fwrn5_i2c_write()
111 if (ret != skb->len) in s3fwrn5_i2c_write()
112 return -EREMOTEIO; in s3fwrn5_i2c_write()
124 static int s3fwrn5_i2c_read(struct s3fwrn5_i2c_phy *phy) in s3fwrn5_i2c_read() argument
132 hdr_size = (phy->mode == S3FWRN5_MODE_NCI) ? in s3fwrn5_i2c_read()
134 ret = i2c_master_recv(phy->i2c_dev, hdr, hdr_size); in s3fwrn5_i2c_read()
139 return -EBADMSG; in s3fwrn5_i2c_read()
141 data_len = (phy->mode == S3FWRN5_MODE_NCI) ? in s3fwrn5_i2c_read()
142 ((struct nci_ctrl_hdr *)hdr)->plen : in s3fwrn5_i2c_read()
143 ((struct s3fwrn5_fw_header *)hdr)->len; in s3fwrn5_i2c_read()
147 return -ENOMEM; in s3fwrn5_i2c_read()
154 ret = i2c_master_recv(phy->i2c_dev, skb_put(skb, data_len), data_len); in s3fwrn5_i2c_read()
157 return -EBADMSG; in s3fwrn5_i2c_read()
161 return s3fwrn5_recv_frame(phy->ndev, skb, phy->mode); in s3fwrn5_i2c_read()
166 struct s3fwrn5_i2c_phy *phy = phy_id; in s3fwrn5_i2c_irq_thread_fn() local
168 if (!phy || !phy->ndev) { in s3fwrn5_i2c_irq_thread_fn()
173 mutex_lock(&phy->mutex); in s3fwrn5_i2c_irq_thread_fn()
175 if (phy->irq_skip) in s3fwrn5_i2c_irq_thread_fn()
178 switch (phy->mode) { in s3fwrn5_i2c_irq_thread_fn()
181 s3fwrn5_i2c_read(phy); in s3fwrn5_i2c_irq_thread_fn()
188 mutex_unlock(&phy->mutex); in s3fwrn5_i2c_irq_thread_fn()
195 struct s3fwrn5_i2c_phy *phy = i2c_get_clientdata(client); in s3fwrn5_i2c_parse_dt() local
196 struct device_node *np = client->dev.of_node; in s3fwrn5_i2c_parse_dt()
199 return -ENODEV; in s3fwrn5_i2c_parse_dt()
201 phy->gpio_en = of_get_named_gpio(np, "en-gpios", 0); in s3fwrn5_i2c_parse_dt()
202 if (!gpio_is_valid(phy->gpio_en)) { in s3fwrn5_i2c_parse_dt()
204 phy->gpio_en = of_get_named_gpio(np, "s3fwrn5,en-gpios", 0); in s3fwrn5_i2c_parse_dt()
205 if (!gpio_is_valid(phy->gpio_en)) in s3fwrn5_i2c_parse_dt()
206 return -ENODEV; in s3fwrn5_i2c_parse_dt()
209 phy->gpio_fw_wake = of_get_named_gpio(np, "wake-gpios", 0); in s3fwrn5_i2c_parse_dt()
210 if (!gpio_is_valid(phy->gpio_fw_wake)) { in s3fwrn5_i2c_parse_dt()
212 phy->gpio_fw_wake = of_get_named_gpio(np, "s3fwrn5,fw-gpios", 0); in s3fwrn5_i2c_parse_dt()
213 if (!gpio_is_valid(phy->gpio_fw_wake)) in s3fwrn5_i2c_parse_dt()
214 return -ENODEV; in s3fwrn5_i2c_parse_dt()
223 struct s3fwrn5_i2c_phy *phy; in s3fwrn5_i2c_probe() local
226 phy = devm_kzalloc(&client->dev, sizeof(*phy), GFP_KERNEL); in s3fwrn5_i2c_probe()
227 if (!phy) in s3fwrn5_i2c_probe()
228 return -ENOMEM; in s3fwrn5_i2c_probe()
230 mutex_init(&phy->mutex); in s3fwrn5_i2c_probe()
231 phy->mode = S3FWRN5_MODE_COLD; in s3fwrn5_i2c_probe()
232 phy->irq_skip = true; in s3fwrn5_i2c_probe()
234 phy->i2c_dev = client; in s3fwrn5_i2c_probe()
235 i2c_set_clientdata(client, phy); in s3fwrn5_i2c_probe()
241 ret = devm_gpio_request_one(&phy->i2c_dev->dev, phy->gpio_en, in s3fwrn5_i2c_probe()
246 ret = devm_gpio_request_one(&phy->i2c_dev->dev, phy->gpio_fw_wake, in s3fwrn5_i2c_probe()
251 ret = s3fwrn5_probe(&phy->ndev, phy, &phy->i2c_dev->dev, &i2c_phy_ops, in s3fwrn5_i2c_probe()
256 ret = devm_request_threaded_irq(&client->dev, phy->i2c_dev->irq, NULL, in s3fwrn5_i2c_probe()
258 S3FWRN5_I2C_DRIVER_NAME, phy); in s3fwrn5_i2c_probe()
260 s3fwrn5_remove(phy->ndev); in s3fwrn5_i2c_probe()
267 struct s3fwrn5_i2c_phy *phy = i2c_get_clientdata(client); in s3fwrn5_i2c_remove() local
269 s3fwrn5_remove(phy->ndev); in s3fwrn5_i2c_remove()
281 { .compatible = "samsung,s3fwrn5-i2c", },