^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-1.0+ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Renesas USB driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2011 Renesas Solutions Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2019 Renesas Electronics Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef RENESAS_USB_MOD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define RENESAS_USB_MOD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/usb/renesas_usbhs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct usbhs_irq_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) u16 intsts0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) u16 intsts1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) u16 brdysts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) u16 nrdysts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) u16 bempsts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct usbhs_mod {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * entry point from common.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int (*start)(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) int (*stop)(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * INTSTS0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* DVST (DVSQ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) int (*irq_dev_state)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* CTRT (CTSQ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int (*irq_ctrl_stage)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* BEMP / BEMPSTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int (*irq_empty)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u16 irq_bempsts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* BRDY / BRDYSTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int (*irq_ready)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u16 irq_brdysts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * INTSTS1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* ATTCHE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int (*irq_attch)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* DTCHE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int (*irq_dtch)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /* SIGN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int (*irq_sign)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* SACK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int (*irq_sack)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct usbhs_priv *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct usbhs_mod_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct usbhs_mod *mod[USBHS_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct usbhs_mod *curt; /* current mod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * INTSTS0 :: VBINT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * This function will be used as autonomy mode (runtime_pwctrl == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * when the platform doesn't have own get_vbus function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * This callback cannot be member of "struct usbhs_mod" because it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * will be used even though host/gadget has not been selected.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) int (*irq_vbus)(struct usbhs_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * This function will be used on any gadget mode. To simplify the code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * this member is in here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) int (*get_vbus)(struct platform_device *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * for host/gadget module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int usbhs_mod_is_host(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int usbhs_mod_change(struct usbhs_priv *priv, int id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int usbhs_mod_probe(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) void usbhs_mod_remove(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) void usbhs_mod_autonomy_mode(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) void usbhs_mod_non_autonomy_mode(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * status functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * callback functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define usbhs_mod_call(priv, func, param...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct usbhs_mod *mod; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) mod = usbhs_mod_get_current(priv); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) !mod ? -ENODEV : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) !mod->func ? 0 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) mod->func(param); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define usbhs_priv_to_modinfo(priv) (&priv->mod_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define usbhs_mod_info_call(priv, func, param...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct usbhs_mod_info *info; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) info = usbhs_priv_to_modinfo(priv); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) !info->func ? 0 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) info->func(param); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * host / gadget control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #if defined(CONFIG_USB_RENESAS_USBHS_HCD) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) extern int usbhs_mod_host_probe(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) extern int usbhs_mod_host_remove(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static inline int usbhs_mod_host_probe(struct usbhs_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static inline void usbhs_mod_host_remove(struct usbhs_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #if defined(CONFIG_USB_RENESAS_USBHS_UDC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) extern int usbhs_mod_gadget_probe(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) extern void usbhs_mod_gadget_remove(struct usbhs_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #endif /* RENESAS_USB_MOD_H */