• Home
  • Raw
  • Download

Lines Matching +full:reg +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0+
72 /* For imx6dql, it is host-only controller, for later imx6, it is otg's */
92 int (*init)(struct imx_usbmisc_data *data);
94 int (*post)(struct imx_usbmisc_data *data);
96 int (*set_wakeup)(struct imx_usbmisc_data *data, bool enabled);
105 static inline bool is_imx53_usbmisc(struct imx_usbmisc_data *data);
107 static int usbmisc_imx25_init(struct imx_usbmisc_data *data) in usbmisc_imx25_init() argument
109 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx25_init()
113 if (data->index > 1) in usbmisc_imx25_init()
114 return -EINVAL; in usbmisc_imx25_init()
116 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx25_init()
117 switch (data->index) { in usbmisc_imx25_init()
119 val = readl(usbmisc->base); in usbmisc_imx25_init()
123 writel(val, usbmisc->base); in usbmisc_imx25_init()
126 val = readl(usbmisc->base); in usbmisc_imx25_init()
132 writel(val, usbmisc->base); in usbmisc_imx25_init()
136 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx25_init()
141 static int usbmisc_imx25_post(struct imx_usbmisc_data *data) in usbmisc_imx25_post() argument
143 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx25_post()
144 void __iomem *reg; in usbmisc_imx25_post() local
148 if (data->index > 2) in usbmisc_imx25_post()
149 return -EINVAL; in usbmisc_imx25_post()
151 if (data->index) in usbmisc_imx25_post()
154 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx25_post()
155 reg = usbmisc->base + MX25_USB_PHY_CTRL_OFFSET; in usbmisc_imx25_post()
156 val = readl(reg); in usbmisc_imx25_post()
158 if (data->evdo) in usbmisc_imx25_post()
163 writel(val, reg); in usbmisc_imx25_post()
164 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx25_post()
170 static int usbmisc_imx27_init(struct imx_usbmisc_data *data) in usbmisc_imx27_init() argument
172 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx27_init()
176 switch (data->index) { in usbmisc_imx27_init()
187 return -EINVAL; in usbmisc_imx27_init()
190 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx27_init()
191 if (data->disable_oc) in usbmisc_imx27_init()
192 val = readl(usbmisc->base) | val; in usbmisc_imx27_init()
194 val = readl(usbmisc->base) & ~val; in usbmisc_imx27_init()
195 writel(val, usbmisc->base); in usbmisc_imx27_init()
196 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx27_init()
201 static int usbmisc_imx53_init(struct imx_usbmisc_data *data) in usbmisc_imx53_init() argument
203 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx53_init()
204 void __iomem *reg = NULL; in usbmisc_imx53_init() local
208 if (data->index > 3) in usbmisc_imx53_init()
209 return -EINVAL; in usbmisc_imx53_init()
212 val = readl(usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); in usbmisc_imx53_init()
215 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); in usbmisc_imx53_init()
217 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx53_init()
219 switch (data->index) { in usbmisc_imx53_init()
221 if (data->disable_oc) { in usbmisc_imx53_init()
222 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; in usbmisc_imx53_init()
223 val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG; in usbmisc_imx53_init()
224 writel(val, reg); in usbmisc_imx53_init()
228 if (data->disable_oc) { in usbmisc_imx53_init()
229 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; in usbmisc_imx53_init()
230 val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1; in usbmisc_imx53_init()
231 writel(val, reg); in usbmisc_imx53_init()
235 if (data->ulpi) { in usbmisc_imx53_init()
236 /* set USBH2 into ULPI-mode. */ in usbmisc_imx53_init()
237 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; in usbmisc_imx53_init()
238 val = readl(reg) | MX53_USB_CTRL_1_UH2_ULPI_EN; in usbmisc_imx53_init()
242 writel(val, reg); in usbmisc_imx53_init()
244 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; in usbmisc_imx53_init()
245 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN in usbmisc_imx53_init()
247 writel(val, reg); in usbmisc_imx53_init()
248 if (is_imx53_usbmisc(data)) { in usbmisc_imx53_init()
250 reg = usbmisc->base + in usbmisc_imx53_init()
252 val = readl(reg) | in usbmisc_imx53_init()
254 writel(val, reg); in usbmisc_imx53_init()
258 if (data->disable_oc) { in usbmisc_imx53_init()
259 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; in usbmisc_imx53_init()
260 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; in usbmisc_imx53_init()
261 writel(val, reg); in usbmisc_imx53_init()
265 if (data->ulpi) { in usbmisc_imx53_init()
266 /* set USBH3 into ULPI-mode. */ in usbmisc_imx53_init()
267 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; in usbmisc_imx53_init()
268 val = readl(reg) | MX53_USB_CTRL_1_UH3_ULPI_EN; in usbmisc_imx53_init()
272 writel(val, reg); in usbmisc_imx53_init()
274 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; in usbmisc_imx53_init()
275 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN in usbmisc_imx53_init()
277 writel(val, reg); in usbmisc_imx53_init()
279 if (is_imx53_usbmisc(data)) { in usbmisc_imx53_init()
281 reg = usbmisc->base + in usbmisc_imx53_init()
283 val = readl(reg) | in usbmisc_imx53_init()
285 writel(val, reg); in usbmisc_imx53_init()
288 if (data->disable_oc) { in usbmisc_imx53_init()
289 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; in usbmisc_imx53_init()
290 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; in usbmisc_imx53_init()
291 writel(val, reg); in usbmisc_imx53_init()
296 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx53_init()
302 (struct imx_usbmisc_data *data, bool enabled) in usbmisc_imx6q_set_wakeup() argument
304 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6q_set_wakeup()
311 if (data->index > 3) in usbmisc_imx6q_set_wakeup()
312 return -EINVAL; in usbmisc_imx6q_set_wakeup()
314 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6q_set_wakeup()
315 val = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_set_wakeup()
320 pr_debug("wakeup int at ci_hdrc.%d\n", data->index); in usbmisc_imx6q_set_wakeup()
323 writel(val, usbmisc->base + data->index * 4); in usbmisc_imx6q_set_wakeup()
324 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6q_set_wakeup()
329 static int usbmisc_imx6q_init(struct imx_usbmisc_data *data) in usbmisc_imx6q_init() argument
331 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6q_init()
333 u32 reg; in usbmisc_imx6q_init() local
335 if (data->index > 3) in usbmisc_imx6q_init()
336 return -EINVAL; in usbmisc_imx6q_init()
338 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6q_init()
340 reg = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
341 if (data->disable_oc) { in usbmisc_imx6q_init()
342 reg |= MX6_BM_OVER_CUR_DIS; in usbmisc_imx6q_init()
343 } else if (data->oc_polarity == 1) { in usbmisc_imx6q_init()
345 reg &= ~(MX6_BM_OVER_CUR_DIS | MX6_BM_OVER_CUR_POLARITY); in usbmisc_imx6q_init()
347 reg &= ~(MX6_BM_OVER_CUR_DIS); in usbmisc_imx6q_init()
349 writel(reg, usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
351 /* SoC non-burst setting */ in usbmisc_imx6q_init()
352 reg = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
353 writel(reg | MX6_BM_NON_BURST_SETTING, in usbmisc_imx6q_init()
354 usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
356 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6q_init()
358 usbmisc_imx6q_set_wakeup(data, false); in usbmisc_imx6q_init()
363 static int usbmisc_imx6sx_init(struct imx_usbmisc_data *data) in usbmisc_imx6sx_init() argument
365 void __iomem *reg = NULL; in usbmisc_imx6sx_init() local
367 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6sx_init()
370 usbmisc_imx6q_init(data); in usbmisc_imx6sx_init()
372 if (data->index == 0 || data->index == 1) { in usbmisc_imx6sx_init()
373 reg = usbmisc->base + MX6_USB_OTG1_PHY_CTRL + data->index * 4; in usbmisc_imx6sx_init()
374 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6sx_init()
376 val = readl(reg); in usbmisc_imx6sx_init()
377 writel(val | MX6SX_USB_VBUS_WAKEUP_SOURCE_BVALID, reg); in usbmisc_imx6sx_init()
382 val = readl(usbmisc->base + data->index * 4); in usbmisc_imx6sx_init()
384 usbmisc->base + data->index * 4); in usbmisc_imx6sx_init()
385 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6sx_init()
391 static int usbmisc_vf610_init(struct imx_usbmisc_data *data) in usbmisc_vf610_init() argument
393 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_vf610_init()
394 u32 reg; in usbmisc_vf610_init() local
400 if (data->index >= 1) in usbmisc_vf610_init()
401 return -EINVAL; in usbmisc_vf610_init()
403 if (data->disable_oc) { in usbmisc_vf610_init()
404 reg = readl(usbmisc->base); in usbmisc_vf610_init()
405 writel(reg | VF610_OVER_CUR_DIS, usbmisc->base); in usbmisc_vf610_init()
412 (struct imx_usbmisc_data *data, bool enabled) in usbmisc_imx7d_set_wakeup() argument
414 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_set_wakeup()
420 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_set_wakeup()
421 val = readl(usbmisc->base); in usbmisc_imx7d_set_wakeup()
423 writel(val | wakeup_setting, usbmisc->base); in usbmisc_imx7d_set_wakeup()
426 dev_dbg(data->dev, "wakeup int\n"); in usbmisc_imx7d_set_wakeup()
427 writel(val & ~wakeup_setting, usbmisc->base); in usbmisc_imx7d_set_wakeup()
429 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_set_wakeup()
434 static int usbmisc_imx7d_init(struct imx_usbmisc_data *data) in usbmisc_imx7d_init() argument
436 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_init()
438 u32 reg; in usbmisc_imx7d_init() local
440 if (data->index >= 1) in usbmisc_imx7d_init()
441 return -EINVAL; in usbmisc_imx7d_init()
443 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_init()
444 reg = readl(usbmisc->base); in usbmisc_imx7d_init()
445 if (data->disable_oc) { in usbmisc_imx7d_init()
446 reg |= MX6_BM_OVER_CUR_DIS; in usbmisc_imx7d_init()
447 } else if (data->oc_polarity == 1) { in usbmisc_imx7d_init()
449 reg &= ~(MX6_BM_OVER_CUR_DIS | MX6_BM_OVER_CUR_POLARITY); in usbmisc_imx7d_init()
451 writel(reg, usbmisc->base); in usbmisc_imx7d_init()
453 reg = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_init()
454 reg &= ~MX7D_USB_VBUS_WAKEUP_SOURCE_MASK; in usbmisc_imx7d_init()
455 writel(reg | MX7D_USB_VBUS_WAKEUP_SOURCE_BVALID, in usbmisc_imx7d_init()
456 usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_init()
457 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_init()
459 usbmisc_imx7d_set_wakeup(data, false); in usbmisc_imx7d_init()
500 static inline bool is_imx53_usbmisc(struct imx_usbmisc_data *data) in is_imx53_usbmisc() argument
502 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in is_imx53_usbmisc()
504 return usbmisc->ops == &imx53_usbmisc_ops; in is_imx53_usbmisc()
507 int imx_usbmisc_init(struct imx_usbmisc_data *data) in imx_usbmisc_init() argument
511 if (!data) in imx_usbmisc_init()
514 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_init()
515 if (!usbmisc->ops->init) in imx_usbmisc_init()
517 return usbmisc->ops->init(data); in imx_usbmisc_init()
521 int imx_usbmisc_init_post(struct imx_usbmisc_data *data) in imx_usbmisc_init_post() argument
525 if (!data) in imx_usbmisc_init_post()
528 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_init_post()
529 if (!usbmisc->ops->post) in imx_usbmisc_init_post()
531 return usbmisc->ops->post(data); in imx_usbmisc_init_post()
535 int imx_usbmisc_set_wakeup(struct imx_usbmisc_data *data, bool enabled) in imx_usbmisc_set_wakeup() argument
539 if (!data) in imx_usbmisc_set_wakeup()
542 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_set_wakeup()
543 if (!usbmisc->ops->set_wakeup) in imx_usbmisc_set_wakeup()
545 return usbmisc->ops->set_wakeup(data, enabled); in imx_usbmisc_set_wakeup()
551 .compatible = "fsl,imx25-usbmisc",
552 .data = &imx25_usbmisc_ops,
555 .compatible = "fsl,imx35-usbmisc",
556 .data = &imx25_usbmisc_ops,
559 .compatible = "fsl,imx27-usbmisc",
560 .data = &imx27_usbmisc_ops,
563 .compatible = "fsl,imx51-usbmisc",
564 .data = &imx51_usbmisc_ops,
567 .compatible = "fsl,imx53-usbmisc",
568 .data = &imx53_usbmisc_ops,
571 .compatible = "fsl,imx6q-usbmisc",
572 .data = &imx6q_usbmisc_ops,
575 .compatible = "fsl,vf610-usbmisc",
576 .data = &vf610_usbmisc_ops,
579 .compatible = "fsl,imx6sx-usbmisc",
580 .data = &imx6sx_usbmisc_ops,
583 .compatible = "fsl,imx6ul-usbmisc",
584 .data = &imx6sx_usbmisc_ops,
587 .compatible = "fsl,imx7d-usbmisc",
588 .data = &imx7d_usbmisc_ops,
597 struct imx_usbmisc *data; in usbmisc_imx_probe() local
600 of_id = of_match_device(usbmisc_imx_dt_ids, &pdev->dev); in usbmisc_imx_probe()
602 return -ENODEV; in usbmisc_imx_probe()
604 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in usbmisc_imx_probe()
605 if (!data) in usbmisc_imx_probe()
606 return -ENOMEM; in usbmisc_imx_probe()
608 spin_lock_init(&data->lock); in usbmisc_imx_probe()
611 data->base = devm_ioremap_resource(&pdev->dev, res); in usbmisc_imx_probe()
612 if (IS_ERR(data->base)) in usbmisc_imx_probe()
613 return PTR_ERR(data->base); in usbmisc_imx_probe()
615 data->ops = (const struct usbmisc_ops *)of_id->data; in usbmisc_imx_probe()
616 platform_set_drvdata(pdev, data); in usbmisc_imx_probe()
637 MODULE_ALIAS("platform:usbmisc-imx");
639 MODULE_DESCRIPTION("driver for imx usb non-core registers");