Lines Matching defs:omap
3 * dwc3-omap.c - OMAP Specific Glue layer
151 static u32 dwc3_omap_read_utmi_ctrl(struct dwc3_omap *omap)
153 return dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_CTRL +
154 omap->utmi_otg_offset);
157 static void dwc3_omap_write_utmi_ctrl(struct dwc3_omap *omap, u32 value)
159 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_CTRL +
160 omap->utmi_otg_offset, value);
164 static u32 dwc3_omap_read_irq0_status(struct dwc3_omap *omap)
166 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_RAW_0 -
167 omap->irq0_offset);
170 static void dwc3_omap_write_irq0_status(struct dwc3_omap *omap, u32 value)
172 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_0 -
173 omap->irq0_offset, value);
177 static u32 dwc3_omap_read_irqmisc_status(struct dwc3_omap *omap)
179 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_RAW_MISC +
180 omap->irqmisc_offset);
183 static void dwc3_omap_write_irqmisc_status(struct dwc3_omap *omap, u32 value)
185 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_MISC +
186 omap->irqmisc_offset, value);
190 static void dwc3_omap_write_irqmisc_set(struct dwc3_omap *omap, u32 value)
192 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_MISC +
193 omap->irqmisc_offset, value);
197 static void dwc3_omap_write_irq0_set(struct dwc3_omap *omap, u32 value)
199 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0 -
200 omap->irq0_offset, value);
203 static void dwc3_omap_write_irqmisc_clr(struct dwc3_omap *omap, u32 value)
205 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_MISC +
206 omap->irqmisc_offset, value);
209 static void dwc3_omap_write_irq0_clr(struct dwc3_omap *omap, u32 value)
211 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_0 -
212 omap->irq0_offset, value);
215 static void dwc3_omap_set_mailbox(struct dwc3_omap *omap,
223 if (omap->vbus_reg) {
224 ret = regulator_enable(omap->vbus_reg);
226 dev_err(omap->dev, "regulator enable failed\n");
231 val = dwc3_omap_read_utmi_ctrl(omap);
233 dwc3_omap_write_utmi_ctrl(omap, val);
237 val = dwc3_omap_read_utmi_ctrl(omap);
241 dwc3_omap_write_utmi_ctrl(omap, val);
245 if (omap->vbus_reg && regulator_is_enabled(omap->vbus_reg))
246 regulator_disable(omap->vbus_reg);
247 val = dwc3_omap_read_utmi_ctrl(omap);
249 dwc3_omap_write_utmi_ctrl(omap, val);
253 val = dwc3_omap_read_utmi_ctrl(omap);
257 dwc3_omap_write_utmi_ctrl(omap, val);
261 dev_WARN(omap->dev, "invalid state\n");
265 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap);
266 static void dwc3_omap_disable_irqs(struct dwc3_omap *omap);
270 struct dwc3_omap *omap = _omap;
272 if (dwc3_omap_read_irqmisc_status(omap) ||
273 dwc3_omap_read_irq0_status(omap)) {
275 dwc3_omap_disable_irqs(omap);
284 struct dwc3_omap *omap = _omap;
288 reg = dwc3_omap_read_irqmisc_status(omap);
289 dwc3_omap_write_irqmisc_status(omap, reg);
291 reg = dwc3_omap_read_irq0_status(omap);
292 dwc3_omap_write_irq0_status(omap, reg);
295 dwc3_omap_enable_irqs(omap);
300 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
306 dwc3_omap_write_irq0_set(omap, reg);
318 dwc3_omap_write_irqmisc_set(omap, reg);
321 static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
327 dwc3_omap_write_irq0_clr(omap, reg);
339 dwc3_omap_write_irqmisc_clr(omap, reg);
345 struct dwc3_omap *omap = container_of(nb, struct dwc3_omap, id_nb);
348 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
350 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
358 struct dwc3_omap *omap = container_of(nb, struct dwc3_omap, vbus_nb);
361 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
363 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
368 static void dwc3_omap_map_offset(struct dwc3_omap *omap)
370 struct device_node *node = omap->dev->of_node;
381 omap->irq_eoi_offset = USBOTGSS_EOI_OFFSET;
382 omap->irq0_offset = USBOTGSS_IRQ0_OFFSET;
383 omap->irqmisc_offset = USBOTGSS_IRQMISC_OFFSET;
384 omap->utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET;
385 omap->debug_offset = USBOTGSS_DEBUG_OFFSET;
389 static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap)
392 struct device_node *node = omap->dev->of_node;
395 reg = dwc3_omap_read_utmi_ctrl(omap);
407 dev_WARN(omap->dev, "UNKNOWN utmi mode %d\n", utmi_mode);
410 dwc3_omap_write_utmi_ctrl(omap, reg);
413 static int dwc3_omap_extcon_register(struct dwc3_omap *omap)
416 struct device_node *node = omap->dev->of_node;
420 edev = extcon_get_edev_by_phandle(omap->dev, 0);
422 dev_vdbg(omap->dev, "couldn't get extcon device\n");
426 omap->vbus_nb.notifier_call = dwc3_omap_vbus_notifier;
427 ret = devm_extcon_register_notifier(omap->dev, edev,
428 EXTCON_USB, &omap->vbus_nb);
430 dev_vdbg(omap->dev, "failed to register notifier for USB\n");
432 omap->id_nb.notifier_call = dwc3_omap_id_notifier;
433 ret = devm_extcon_register_notifier(omap->dev, edev,
434 EXTCON_USB_HOST, &omap->id_nb);
436 dev_vdbg(omap->dev, "failed to register notifier for USB-HOST\n");
439 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
441 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
444 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
446 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
448 omap->edev = edev;
458 struct dwc3_omap *omap;
472 omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL);
473 if (!omap)
476 platform_set_drvdata(pdev, omap);
494 omap->dev = dev;
495 omap->irq = irq;
496 omap->base = base;
497 omap->vbus_reg = vbus_reg;
506 dwc3_omap_map_offset(omap);
507 dwc3_omap_set_utmi_mode(omap);
509 ret = dwc3_omap_extcon_register(omap);
519 ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt,
521 "dwc3-omap", omap);
524 omap->irq, ret);
527 dwc3_omap_enable_irqs(omap);
539 struct dwc3_omap *omap = platform_get_drvdata(pdev);
541 dwc3_omap_disable_irqs(omap);
542 disable_irq(omap->irq);
543 of_platform_depopulate(omap->dev);
562 struct dwc3_omap *omap = dev_get_drvdata(dev);
564 omap->utmi_otg_ctrl = dwc3_omap_read_utmi_ctrl(omap);
565 dwc3_omap_disable_irqs(omap);
572 struct dwc3_omap *omap = dev_get_drvdata(dev);
574 dwc3_omap_write_utmi_ctrl(omap, omap->utmi_otg_ctrl);
575 dwc3_omap_enable_irqs(omap);
586 struct dwc3_omap *omap = dev_get_drvdata(dev);
588 if (extcon_get_state(omap->edev, EXTCON_USB))
589 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
591 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
593 if (extcon_get_state(omap->edev, EXTCON_USB_HOST))
594 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
596 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
614 .name = "omap-dwc3",
622 MODULE_ALIAS("platform:omap-dwc3");