Lines Matching full:omap
3 * dwc3-omap.c - OMAP Specific Glue layer
17 #include <linux/platform_data/dwc3-omap.h>
30 * All these registers belong to OMAP's Wrapper around the
146 static u32 dwc3_omap_read_utmi_ctrl(struct dwc3_omap *omap) in dwc3_omap_read_utmi_ctrl() argument
148 return dwc3_omap_readl(omap->base, USBOTGSS_UTMI_OTG_CTRL + in dwc3_omap_read_utmi_ctrl()
149 omap->utmi_otg_offset); in dwc3_omap_read_utmi_ctrl()
152 static void dwc3_omap_write_utmi_ctrl(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_utmi_ctrl() argument
154 dwc3_omap_writel(omap->base, USBOTGSS_UTMI_OTG_CTRL + in dwc3_omap_write_utmi_ctrl()
155 omap->utmi_otg_offset, value); in dwc3_omap_write_utmi_ctrl()
159 static u32 dwc3_omap_read_irq0_status(struct dwc3_omap *omap) in dwc3_omap_read_irq0_status() argument
161 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_RAW_0 - in dwc3_omap_read_irq0_status()
162 omap->irq0_offset); in dwc3_omap_read_irq0_status()
165 static void dwc3_omap_write_irq0_status(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irq0_status() argument
167 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_0 - in dwc3_omap_write_irq0_status()
168 omap->irq0_offset, value); in dwc3_omap_write_irq0_status()
172 static u32 dwc3_omap_read_irqmisc_status(struct dwc3_omap *omap) in dwc3_omap_read_irqmisc_status() argument
174 return dwc3_omap_readl(omap->base, USBOTGSS_IRQSTATUS_RAW_MISC + in dwc3_omap_read_irqmisc_status()
175 omap->irqmisc_offset); in dwc3_omap_read_irqmisc_status()
178 static void dwc3_omap_write_irqmisc_status(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irqmisc_status() argument
180 dwc3_omap_writel(omap->base, USBOTGSS_IRQSTATUS_MISC + in dwc3_omap_write_irqmisc_status()
181 omap->irqmisc_offset, value); in dwc3_omap_write_irqmisc_status()
185 static void dwc3_omap_write_irqmisc_set(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irqmisc_set() argument
187 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_MISC + in dwc3_omap_write_irqmisc_set()
188 omap->irqmisc_offset, value); in dwc3_omap_write_irqmisc_set()
192 static void dwc3_omap_write_irq0_set(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irq0_set() argument
194 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0 - in dwc3_omap_write_irq0_set()
195 omap->irq0_offset, value); in dwc3_omap_write_irq0_set()
198 static void dwc3_omap_write_irqmisc_clr(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irqmisc_clr() argument
200 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_MISC + in dwc3_omap_write_irqmisc_clr()
201 omap->irqmisc_offset, value); in dwc3_omap_write_irqmisc_clr()
204 static void dwc3_omap_write_irq0_clr(struct dwc3_omap *omap, u32 value) in dwc3_omap_write_irq0_clr() argument
206 dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_CLR_0 - in dwc3_omap_write_irq0_clr()
207 omap->irq0_offset, value); in dwc3_omap_write_irq0_clr()
210 static void dwc3_omap_set_mailbox(struct dwc3_omap *omap, in dwc3_omap_set_mailbox() argument
218 if (omap->vbus_reg) { in dwc3_omap_set_mailbox()
219 ret = regulator_enable(omap->vbus_reg); in dwc3_omap_set_mailbox()
221 dev_err(omap->dev, "regulator enable failed\n"); in dwc3_omap_set_mailbox()
226 val = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_set_mailbox()
228 dwc3_omap_write_utmi_ctrl(omap, val); in dwc3_omap_set_mailbox()
232 val = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_set_mailbox()
236 dwc3_omap_write_utmi_ctrl(omap, val); in dwc3_omap_set_mailbox()
240 if (omap->vbus_reg) in dwc3_omap_set_mailbox()
241 regulator_disable(omap->vbus_reg); in dwc3_omap_set_mailbox()
242 val = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_set_mailbox()
244 dwc3_omap_write_utmi_ctrl(omap, val); in dwc3_omap_set_mailbox()
248 val = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_set_mailbox()
252 dwc3_omap_write_utmi_ctrl(omap, val); in dwc3_omap_set_mailbox()
256 dev_WARN(omap->dev, "invalid state\n"); in dwc3_omap_set_mailbox()
260 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap);
261 static void dwc3_omap_disable_irqs(struct dwc3_omap *omap);
265 struct dwc3_omap *omap = _omap; in dwc3_omap_interrupt() local
267 if (dwc3_omap_read_irqmisc_status(omap) || in dwc3_omap_interrupt()
268 dwc3_omap_read_irq0_status(omap)) { in dwc3_omap_interrupt()
270 dwc3_omap_disable_irqs(omap); in dwc3_omap_interrupt()
279 struct dwc3_omap *omap = _omap; in dwc3_omap_interrupt_thread() local
283 reg = dwc3_omap_read_irqmisc_status(omap); in dwc3_omap_interrupt_thread()
284 dwc3_omap_write_irqmisc_status(omap, reg); in dwc3_omap_interrupt_thread()
286 reg = dwc3_omap_read_irq0_status(omap); in dwc3_omap_interrupt_thread()
287 dwc3_omap_write_irq0_status(omap, reg); in dwc3_omap_interrupt_thread()
290 dwc3_omap_enable_irqs(omap); in dwc3_omap_interrupt_thread()
295 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap) in dwc3_omap_enable_irqs() argument
301 dwc3_omap_write_irq0_set(omap, reg); in dwc3_omap_enable_irqs()
313 dwc3_omap_write_irqmisc_set(omap, reg); in dwc3_omap_enable_irqs()
316 static void dwc3_omap_disable_irqs(struct dwc3_omap *omap) in dwc3_omap_disable_irqs() argument
322 dwc3_omap_write_irq0_clr(omap, reg); in dwc3_omap_disable_irqs()
334 dwc3_omap_write_irqmisc_clr(omap, reg); in dwc3_omap_disable_irqs()
340 struct dwc3_omap *omap = container_of(nb, struct dwc3_omap, id_nb); in dwc3_omap_id_notifier() local
343 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND); in dwc3_omap_id_notifier()
345 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT); in dwc3_omap_id_notifier()
353 struct dwc3_omap *omap = container_of(nb, struct dwc3_omap, vbus_nb); in dwc3_omap_vbus_notifier() local
356 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID); in dwc3_omap_vbus_notifier()
358 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF); in dwc3_omap_vbus_notifier()
363 static void dwc3_omap_map_offset(struct dwc3_omap *omap) in dwc3_omap_map_offset() argument
365 struct device_node *node = omap->dev->of_node; in dwc3_omap_map_offset()
376 omap->irq_eoi_offset = USBOTGSS_EOI_OFFSET; in dwc3_omap_map_offset()
377 omap->irq0_offset = USBOTGSS_IRQ0_OFFSET; in dwc3_omap_map_offset()
378 omap->irqmisc_offset = USBOTGSS_IRQMISC_OFFSET; in dwc3_omap_map_offset()
379 omap->utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET; in dwc3_omap_map_offset()
380 omap->debug_offset = USBOTGSS_DEBUG_OFFSET; in dwc3_omap_map_offset()
384 static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap) in dwc3_omap_set_utmi_mode() argument
387 struct device_node *node = omap->dev->of_node; in dwc3_omap_set_utmi_mode()
390 reg = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_set_utmi_mode()
402 dev_WARN(omap->dev, "UNKNOWN utmi mode %d\n", utmi_mode); in dwc3_omap_set_utmi_mode()
405 dwc3_omap_write_utmi_ctrl(omap, reg); in dwc3_omap_set_utmi_mode()
408 static int dwc3_omap_extcon_register(struct dwc3_omap *omap) in dwc3_omap_extcon_register() argument
411 struct device_node *node = omap->dev->of_node; in dwc3_omap_extcon_register()
415 edev = extcon_get_edev_by_phandle(omap->dev, 0); in dwc3_omap_extcon_register()
417 dev_vdbg(omap->dev, "couldn't get extcon device\n"); in dwc3_omap_extcon_register()
421 omap->vbus_nb.notifier_call = dwc3_omap_vbus_notifier; in dwc3_omap_extcon_register()
422 ret = devm_extcon_register_notifier(omap->dev, edev, in dwc3_omap_extcon_register()
423 EXTCON_USB, &omap->vbus_nb); in dwc3_omap_extcon_register()
425 dev_vdbg(omap->dev, "failed to register notifier for USB\n"); in dwc3_omap_extcon_register()
427 omap->id_nb.notifier_call = dwc3_omap_id_notifier; in dwc3_omap_extcon_register()
428 ret = devm_extcon_register_notifier(omap->dev, edev, in dwc3_omap_extcon_register()
429 EXTCON_USB_HOST, &omap->id_nb); in dwc3_omap_extcon_register()
431 dev_vdbg(omap->dev, "failed to register notifier for USB-HOST\n"); in dwc3_omap_extcon_register()
434 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID); in dwc3_omap_extcon_register()
436 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND); in dwc3_omap_extcon_register()
438 omap->edev = edev; in dwc3_omap_extcon_register()
448 struct dwc3_omap *omap; in dwc3_omap_probe() local
465 omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL); in dwc3_omap_probe()
466 if (!omap) in dwc3_omap_probe()
469 platform_set_drvdata(pdev, omap); in dwc3_omap_probe()
490 omap->dev = dev; in dwc3_omap_probe()
491 omap->irq = irq; in dwc3_omap_probe()
492 omap->base = base; in dwc3_omap_probe()
493 omap->vbus_reg = vbus_reg; in dwc3_omap_probe()
502 dwc3_omap_map_offset(omap); in dwc3_omap_probe()
503 dwc3_omap_set_utmi_mode(omap); in dwc3_omap_probe()
506 reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); in dwc3_omap_probe()
508 ret = dwc3_omap_extcon_register(omap); in dwc3_omap_probe()
518 ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, in dwc3_omap_probe()
520 "dwc3-omap", omap); in dwc3_omap_probe()
523 omap->irq, ret); in dwc3_omap_probe()
526 dwc3_omap_enable_irqs(omap); in dwc3_omap_probe()
538 struct dwc3_omap *omap = platform_get_drvdata(pdev); in dwc3_omap_remove() local
540 dwc3_omap_disable_irqs(omap); in dwc3_omap_remove()
541 disable_irq(omap->irq); in dwc3_omap_remove()
542 of_platform_depopulate(omap->dev); in dwc3_omap_remove()
563 struct dwc3_omap *omap = dev_get_drvdata(dev); in dwc3_omap_suspend() local
565 omap->utmi_otg_ctrl = dwc3_omap_read_utmi_ctrl(omap); in dwc3_omap_suspend()
566 dwc3_omap_disable_irqs(omap); in dwc3_omap_suspend()
573 struct dwc3_omap *omap = dev_get_drvdata(dev); in dwc3_omap_resume() local
575 dwc3_omap_write_utmi_ctrl(omap, omap->utmi_otg_ctrl); in dwc3_omap_resume()
576 dwc3_omap_enable_irqs(omap); in dwc3_omap_resume()
587 struct dwc3_omap *omap = dev_get_drvdata(dev); in dwc3_omap_complete() local
589 if (extcon_get_state(omap->edev, EXTCON_USB)) in dwc3_omap_complete()
590 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID); in dwc3_omap_complete()
592 dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF); in dwc3_omap_complete()
594 if (extcon_get_state(omap->edev, EXTCON_USB_HOST)) in dwc3_omap_complete()
595 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND); in dwc3_omap_complete()
597 dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT); in dwc3_omap_complete()
615 .name = "omap-dwc3",
623 MODULE_ALIAS("platform:omap-dwc3");
626 MODULE_DESCRIPTION("DesignWare USB3 OMAP Glue Layer");