1f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/* 2f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Renesas USB driver 3f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * 4f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Copyright (C) 2011 Renesas Solutions Corp. 5f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * 7f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * This program is distributed in the hope that it will be useful, 8f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * but WITHOUT ANY WARRANTY; without even the implied warranty of 9f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * GNU General Public License for more details. 11f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * 12f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * You should have received a copy of the GNU General Public License 13f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * along with this program; if not, write to the Free Software 14f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * 16f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 17f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#ifndef RENESAS_USB_MOD_H 18f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#define RENESAS_USB_MOD_H 19f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 20f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include <linux/spinlock.h> 21f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include <linux/usb/renesas_usbhs.h> 22f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include "./common.h" 23f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 24f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/* 25f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * struct 26f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 27f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_irq_state { 28f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 intsts0; 29f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 intsts1; 30f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 brdysts; 31f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 nrdysts; 32f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 bempsts; 33f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto}; 34f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 35f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod { 36f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto char *name; 37f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 38f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto /* 39f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * entry point from common.c 40f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 41f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*start)(struct usbhs_priv *priv); 42f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*stop)(struct usbhs_priv *priv); 43f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 4489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* 4589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto * INTSTS0 4689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto */ 4789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 4889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* DVST (DVSQ) */ 49f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*irq_dev_state)(struct usbhs_priv *priv, 50f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_irq_state *irq_state); 51f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 5289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* CTRT (CTSQ) */ 53f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*irq_ctrl_stage)(struct usbhs_priv *priv, 54f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_irq_state *irq_state); 55f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 5689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* BEMP / BEMPSTS */ 57f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*irq_empty)(struct usbhs_priv *priv, 58f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_irq_state *irq_state); 59f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 irq_bempsts; 60f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 6189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* BRDY / BRDYSTS */ 62f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto int (*irq_ready)(struct usbhs_priv *priv, 63f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_irq_state *irq_state); 64f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto u16 irq_brdysts; 65f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 6689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* 6789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto * INTSTS1 6889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto */ 6989c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 7089c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* ATTCHE */ 7189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto int (*irq_attch)(struct usbhs_priv *priv, 7289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto struct usbhs_irq_state *irq_state); 7389c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 7489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* DTCHE */ 7589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto int (*irq_dtch)(struct usbhs_priv *priv, 7689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto struct usbhs_irq_state *irq_state); 7789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 7889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* SIGN */ 7989c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto int (*irq_sign)(struct usbhs_priv *priv, 8089c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto struct usbhs_irq_state *irq_state); 8189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 8289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto /* SACK */ 8389c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto int (*irq_sack)(struct usbhs_priv *priv, 8489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto struct usbhs_irq_state *irq_state); 8589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto 86f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_priv *priv; 87f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto}; 88f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 89f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod_info { 90f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_mod *mod[USBHS_MAX]; 91f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_mod *curt; /* current mod */ 92b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto 93b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto /* 94b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * INTSTS0 :: VBINT 95b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * 96b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * This function will be used as autonomy mode 97b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * when platform cannot call notify_hotplug. 98b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * 99b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * This callback cannot be member of "struct usbhs_mod" 100b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * because it will be used even though 101b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto * host/gadget has not been selected. 102b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto */ 103b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto int (*irq_vbus)(struct usbhs_priv *priv, 104b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto struct usbhs_irq_state *irq_state); 105f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto}; 106f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 107f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/* 108f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * for host/gadget module 109f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 110f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id); 111f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv); 112f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id); 1130deb3e77025688e0650e1af672d3e42e15cd8916Kuninori Morimotoint usbhs_mod_is_host(struct usbhs_priv *priv); 114f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_mod_change(struct usbhs_priv *priv, int id); 115f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_mod_probe(struct usbhs_priv *priv); 116f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_mod_remove(struct usbhs_priv *priv); 117f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 118b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimotovoid usbhs_mod_autonomy_mode(struct usbhs_priv *priv); 119b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto 120f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/* 121f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * status functions 122f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 123f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_status_get_device_state(struct usbhs_irq_state *irq_state); 124f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state); 125f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 126f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/* 127f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * callback functions 128f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */ 129f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod); 130f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 131f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 132f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#define usbhs_mod_call(priv, func, param...) \ 133f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto ({ \ 134f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto struct usbhs_mod *mod; \ 135f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto mod = usbhs_mod_get_current(priv); \ 136f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto !mod ? -ENODEV : \ 137f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto !mod->func ? 0 : \ 138f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto mod->func(param); \ 139f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto }) 140f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto 1412f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto/* 142034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto * host / gadget control 1432f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto */ 144951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto#if defined(CONFIG_USB_RENESAS_USBHS_HCD) || \ 145951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE) 146b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_host_probe(struct usbhs_priv *priv); 147b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_host_remove(struct usbhs_priv *priv); 148034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto#else 149034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimotostatic inline int usbhs_mod_host_probe(struct usbhs_priv *priv) 150034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto{ 151034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto return 0; 152034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto} 153034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimotostatic inline void usbhs_mod_host_remove(struct usbhs_priv *priv) 154034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto{ 155034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto} 156034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto#endif 157034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto 158951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto#if defined(CONFIG_USB_RENESAS_USBHS_UDC) || \ 159951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE) 160b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_gadget_probe(struct usbhs_priv *priv); 161b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern void usbhs_mod_gadget_remove(struct usbhs_priv *priv); 1622f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto#else 1632f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimotostatic inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv) 1642f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto{ 1652f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto return 0; 1662f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto} 1672f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimotostatic inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv) 1682f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto{ 1692f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto} 1702f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto#endif 1712f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto 172f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#endif /* RENESAS_USB_MOD_H */ 173