Lines Matching +full:cec +full:- +full:gpio

1 // SPDX-License-Identifier: GPL-2.0-only
7 #include <linux/gpio/consumer.h>
12 #include <media/cec-notifier.h>
13 #include <media/cec-pin.h>
37 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_read() local
39 if (cec->cec_is_low) in cec_gpio_read()
41 return gpiod_get_value(cec->cec_gpio); in cec_gpio_read()
46 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_high() local
48 if (!cec->cec_is_low) in cec_gpio_high()
50 cec->cec_is_low = false; in cec_gpio_high()
51 gpiod_set_value(cec->cec_gpio, 1); in cec_gpio_high()
56 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_low() local
58 if (cec->cec_is_low) in cec_gpio_low()
60 cec->cec_is_low = true; in cec_gpio_low()
61 gpiod_set_value(cec->cec_gpio, 0); in cec_gpio_low()
66 struct cec_gpio *cec = priv; in cec_hpd_gpio_irq_handler_thread() local
68 cec_queue_pin_hpd_event(cec->adap, cec->hpd_is_high, cec->hpd_ts); in cec_hpd_gpio_irq_handler_thread()
74 struct cec_gpio *cec = priv; in cec_5v_gpio_irq_handler() local
75 int val = gpiod_get_value(cec->v5_gpio); in cec_5v_gpio_irq_handler()
78 if (val < 0 || is_high == cec->v5_is_high) in cec_5v_gpio_irq_handler()
80 cec->v5_ts = ktime_get(); in cec_5v_gpio_irq_handler()
81 cec->v5_is_high = is_high; in cec_5v_gpio_irq_handler()
87 struct cec_gpio *cec = priv; in cec_5v_gpio_irq_handler_thread() local
89 cec_queue_pin_5v_event(cec->adap, cec->v5_is_high, cec->v5_ts); in cec_5v_gpio_irq_handler_thread()
95 struct cec_gpio *cec = priv; in cec_hpd_gpio_irq_handler() local
96 int val = gpiod_get_value(cec->hpd_gpio); in cec_hpd_gpio_irq_handler()
99 if (val < 0 || is_high == cec->hpd_is_high) in cec_hpd_gpio_irq_handler()
101 cec->hpd_ts = ktime_get(); in cec_hpd_gpio_irq_handler()
102 cec->hpd_is_high = is_high; in cec_hpd_gpio_irq_handler()
108 struct cec_gpio *cec = priv; in cec_gpio_irq_handler() local
109 int val = gpiod_get_value(cec->cec_gpio); in cec_gpio_irq_handler()
112 cec_pin_changed(cec->adap, val > 0); in cec_gpio_irq_handler()
118 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_enable_irq() local
120 enable_irq(cec->cec_irq); in cec_gpio_enable_irq()
126 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_disable_irq() local
128 disable_irq(cec->cec_irq); in cec_gpio_disable_irq()
133 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_status() local
135 seq_printf(file, "mode: %s\n", cec->cec_is_low ? "low-drive" : "read"); in cec_gpio_status()
136 seq_printf(file, "using irq: %d\n", cec->cec_irq); in cec_gpio_status()
137 if (cec->hpd_gpio) in cec_gpio_status()
139 cec->hpd_is_high ? "high" : "low"); in cec_gpio_status()
140 if (cec->v5_gpio) in cec_gpio_status()
142 cec->v5_is_high ? "high" : "low"); in cec_gpio_status()
147 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_read_hpd() local
149 if (!cec->hpd_gpio) in cec_gpio_read_hpd()
150 return -ENOTTY; in cec_gpio_read_hpd()
151 return gpiod_get_value(cec->hpd_gpio); in cec_gpio_read_hpd()
156 struct cec_gpio *cec = cec_get_drvdata(adap); in cec_gpio_read_5v() local
158 if (!cec->v5_gpio) in cec_gpio_read_5v()
159 return -ENOTTY; in cec_gpio_read_5v()
160 return gpiod_get_value(cec->v5_gpio); in cec_gpio_read_5v()
176 struct device *dev = &pdev->dev; in cec_gpio_probe()
178 struct cec_gpio *cec; in cec_gpio_probe() local
183 if (PTR_ERR(hdmi_dev) == -EPROBE_DEFER) in cec_gpio_probe()
188 cec = devm_kzalloc(dev, sizeof(*cec), GFP_KERNEL); in cec_gpio_probe()
189 if (!cec) in cec_gpio_probe()
190 return -ENOMEM; in cec_gpio_probe()
192 cec->dev = dev; in cec_gpio_probe()
194 cec->cec_gpio = devm_gpiod_get(dev, "cec", GPIOD_OUT_HIGH_OPEN_DRAIN); in cec_gpio_probe()
195 if (IS_ERR(cec->cec_gpio)) in cec_gpio_probe()
196 return PTR_ERR(cec->cec_gpio); in cec_gpio_probe()
197 cec->cec_irq = gpiod_to_irq(cec->cec_gpio); in cec_gpio_probe()
199 cec->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in cec_gpio_probe()
200 if (IS_ERR(cec->hpd_gpio)) in cec_gpio_probe()
201 return PTR_ERR(cec->hpd_gpio); in cec_gpio_probe()
203 cec->v5_gpio = devm_gpiod_get_optional(dev, "v5", GPIOD_IN); in cec_gpio_probe()
204 if (IS_ERR(cec->v5_gpio)) in cec_gpio_probe()
205 return PTR_ERR(cec->v5_gpio); in cec_gpio_probe()
207 cec->adap = cec_pin_allocate_adapter(&cec_gpio_pin_ops, in cec_gpio_probe()
208 cec, pdev->name, caps); in cec_gpio_probe()
209 if (IS_ERR(cec->adap)) in cec_gpio_probe()
210 return PTR_ERR(cec->adap); in cec_gpio_probe()
212 ret = devm_request_irq(dev, cec->cec_irq, cec_gpio_irq_handler, in cec_gpio_probe()
214 cec->adap->name, cec); in cec_gpio_probe()
218 if (cec->hpd_gpio) { in cec_gpio_probe()
219 cec->hpd_irq = gpiod_to_irq(cec->hpd_gpio); in cec_gpio_probe()
220 ret = devm_request_threaded_irq(dev, cec->hpd_irq, in cec_gpio_probe()
225 "hpd-gpio", cec); in cec_gpio_probe()
230 if (cec->v5_gpio) { in cec_gpio_probe()
231 cec->v5_irq = gpiod_to_irq(cec->v5_gpio); in cec_gpio_probe()
232 ret = devm_request_threaded_irq(dev, cec->v5_irq, in cec_gpio_probe()
237 "v5-gpio", cec); in cec_gpio_probe()
243 cec->notifier = cec_notifier_cec_adap_register(hdmi_dev, NULL, in cec_gpio_probe()
244 cec->adap); in cec_gpio_probe()
245 if (!cec->notifier) { in cec_gpio_probe()
246 ret = -ENOMEM; in cec_gpio_probe()
251 ret = cec_register_adapter(cec->adap, &pdev->dev); in cec_gpio_probe()
255 platform_set_drvdata(pdev, cec); in cec_gpio_probe()
259 cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); in cec_gpio_probe()
261 cec_delete_adapter(cec->adap); in cec_gpio_probe()
267 struct cec_gpio *cec = platform_get_drvdata(pdev); in cec_gpio_remove() local
269 cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); in cec_gpio_remove()
270 cec_unregister_adapter(cec->adap); in cec_gpio_remove()
275 .compatible = "cec-gpio",
285 .name = "cec-gpio",
294 MODULE_DESCRIPTION("CEC GPIO driver");