Lines Matching +full:uart +full:- +full:attached
1 // SPDX-License-Identifier: GPL-2.0+
3 * extcon-fsa9480.c - Fairchild Semiconductor FSA9480 extcon driver
7 * Loosely based on old fsa9480 misc-device driver.
20 #include <linux/extcon-provider.h>
86 * D- [7:5] / D+ [4:2]
87 * 000: Open all / 001: USB / 010: AUDIO / 011: UART / 100: V_AUDIO
169 ret = regmap_write(usbsw->regmap, reg, value);
171 dev_err(usbsw->dev, "%s: err %d\n", __func__, ret);
180 ret = regmap_read(usbsw->regmap, reg, &val);
182 dev_err(usbsw->dev, "%s: err %d\n", __func__, ret);
194 ret = regmap_bulk_read(usbsw->regmap, FSA9480_REG_INT1, regs, 2);
196 dev_err(usbsw->dev, "%s: err %d\n", __func__, ret);
203 u16 mask, bool attached)
206 int dev = fls64(mask) - 1;
210 int cable = fls64(cables) - 1;
212 extcon_set_state_sync(usbsw->edev, cable, attached);
228 dev_err(usbsw->dev, "%s: failed to read registers", __func__);
233 dev_info(usbsw->dev, "dev1: 0x%x, dev2: 0x%x\n", val1, val2);
236 fsa9480_handle_change(usbsw, usbsw->cable & ~val, false);
238 /* then handle attached ones */
239 fsa9480_handle_change(usbsw, val & ~usbsw->cable, true);
241 usbsw->cable = val;
265 if (!client->irq) {
266 dev_err(&client->dev, "no interrupt provided\n");
267 return -EINVAL;
270 info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL);
272 return -ENOMEM;
273 info->dev = &client->dev;
278 info->edev = devm_extcon_dev_allocate(info->dev,
280 if (IS_ERR(info->edev)) {
281 dev_err(info->dev, "failed to allocate memory for extcon\n");
282 ret = -ENOMEM;
286 ret = devm_extcon_dev_register(info->dev, info->edev);
288 dev_err(info->dev, "failed to register extcon device\n");
292 info->regmap = devm_regmap_init_i2c(client, &fsa9480_regmap_config);
293 if (IS_ERR(info->regmap)) {
294 ret = PTR_ERR(info->regmap);
295 dev_err(info->dev, "failed to allocate register map: %d\n",
311 ret = devm_request_threaded_irq(info->dev, client->irq, NULL,
316 dev_err(info->dev, "failed to request IRQ\n");
320 device_init_wakeup(info->dev, true);
331 if (device_may_wakeup(&client->dev) && client->irq)
332 enable_irq_wake(client->irq);
341 if (device_may_wakeup(&client->dev) && client->irq)
342 disable_irq_wake(client->irq);