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