mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.2 KiB
179 lines
4.2 KiB
/* SPDX-License-Identifier: GPL-1.0+ */ |
|
/* |
|
* Renesas USB driver |
|
* |
|
* Copyright (C) 2011 Renesas Solutions Corp. |
|
* Copyright (C) 2019 Renesas Electronics Corporation |
|
* Kuninori Morimoto <[email protected]> |
|
*/ |
|
#ifndef RENESAS_USB_MOD_H |
|
#define RENESAS_USB_MOD_H |
|
|
|
#include <linux/spinlock.h> |
|
#include <linux/usb/renesas_usbhs.h> |
|
#include "common.h" |
|
|
|
/* |
|
* struct |
|
*/ |
|
struct usbhs_irq_state { |
|
u16 intsts0; |
|
u16 intsts1; |
|
u16 brdysts; |
|
u16 nrdysts; |
|
u16 bempsts; |
|
}; |
|
|
|
struct usbhs_mod { |
|
char *name; |
|
|
|
/* |
|
* entry point from common.c |
|
*/ |
|
int (*start)(struct usbhs_priv *priv); |
|
int (*stop)(struct usbhs_priv *priv); |
|
|
|
/* |
|
* INTSTS0 |
|
*/ |
|
|
|
/* DVST (DVSQ) */ |
|
int (*irq_dev_state)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* CTRT (CTSQ) */ |
|
int (*irq_ctrl_stage)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* BEMP / BEMPSTS */ |
|
int (*irq_empty)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
u16 irq_bempsts; |
|
|
|
/* BRDY / BRDYSTS */ |
|
int (*irq_ready)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
u16 irq_brdysts; |
|
|
|
/* |
|
* INTSTS1 |
|
*/ |
|
|
|
/* ATTCHE */ |
|
int (*irq_attch)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* DTCHE */ |
|
int (*irq_dtch)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* SIGN */ |
|
int (*irq_sign)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* SACK */ |
|
int (*irq_sack)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
struct usbhs_priv *priv; |
|
}; |
|
|
|
struct usbhs_mod_info { |
|
struct usbhs_mod *mod[USBHS_MAX]; |
|
struct usbhs_mod *curt; /* current mod */ |
|
|
|
/* |
|
* INTSTS0 :: VBINT |
|
* |
|
* This function will be used as autonomy mode (runtime_pwctrl == 0) |
|
* when the platform doesn't have own get_vbus function. |
|
* |
|
* This callback cannot be member of "struct usbhs_mod" because it |
|
* will be used even though host/gadget has not been selected. |
|
*/ |
|
int (*irq_vbus)(struct usbhs_priv *priv, |
|
struct usbhs_irq_state *irq_state); |
|
|
|
/* |
|
* This function will be used on any gadget mode. To simplify the code, |
|
* this member is in here. |
|
*/ |
|
int (*get_vbus)(struct platform_device *pdev); |
|
}; |
|
|
|
/* |
|
* for host/gadget module |
|
*/ |
|
struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id); |
|
struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv); |
|
void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id); |
|
int usbhs_mod_is_host(struct usbhs_priv *priv); |
|
int usbhs_mod_change(struct usbhs_priv *priv, int id); |
|
int usbhs_mod_probe(struct usbhs_priv *priv); |
|
void usbhs_mod_remove(struct usbhs_priv *priv); |
|
|
|
void usbhs_mod_autonomy_mode(struct usbhs_priv *priv); |
|
void usbhs_mod_non_autonomy_mode(struct usbhs_priv *priv); |
|
|
|
/* |
|
* status functions |
|
*/ |
|
int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state); |
|
int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state); |
|
|
|
/* |
|
* callback functions |
|
*/ |
|
void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod); |
|
|
|
|
|
#define usbhs_mod_call(priv, func, param...) \ |
|
({ \ |
|
struct usbhs_mod *mod; \ |
|
mod = usbhs_mod_get_current(priv); \ |
|
!mod ? -ENODEV : \ |
|
!mod->func ? 0 : \ |
|
mod->func(param); \ |
|
}) |
|
|
|
#define usbhs_priv_to_modinfo(priv) (&priv->mod_info) |
|
#define usbhs_mod_info_call(priv, func, param...) \ |
|
({ \ |
|
struct usbhs_mod_info *info; \ |
|
info = usbhs_priv_to_modinfo(priv); \ |
|
!info->func ? 0 : \ |
|
info->func(param); \ |
|
}) |
|
|
|
/* |
|
* host / gadget control |
|
*/ |
|
#if defined(CONFIG_USB_RENESAS_USBHS_HCD) || \ |
|
defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE) |
|
extern int usbhs_mod_host_probe(struct usbhs_priv *priv); |
|
extern int usbhs_mod_host_remove(struct usbhs_priv *priv); |
|
#else |
|
static inline int usbhs_mod_host_probe(struct usbhs_priv *priv) |
|
{ |
|
return 0; |
|
} |
|
static inline void usbhs_mod_host_remove(struct usbhs_priv *priv) |
|
{ |
|
} |
|
#endif |
|
|
|
#if defined(CONFIG_USB_RENESAS_USBHS_UDC) || \ |
|
defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE) |
|
extern int usbhs_mod_gadget_probe(struct usbhs_priv *priv); |
|
extern void usbhs_mod_gadget_remove(struct usbhs_priv *priv); |
|
#else |
|
static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv) |
|
{ |
|
return 0; |
|
} |
|
static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv) |
|
{ |
|
} |
|
#endif |
|
|
|
#endif /* RENESAS_USB_MOD_H */
|
|
|