usb: dwc2: set parameter values in probe function
So the parameters can be used in both host and gadget modes. Also consolidate param functions in the core.h Acked-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
a6d249d837
commit
ecb176c63a
@ -3044,6 +3044,7 @@ void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
|
|||||||
dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
|
dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
|
||||||
dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
|
dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dwc2_set_parameters);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* During device initialization, read various hardware configuration
|
* During device initialization, read various hardware configuration
|
||||||
@ -3210,6 +3211,24 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dwc2_get_hwparams);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets all parameters to the given value.
|
||||||
|
*
|
||||||
|
* Assumes that the dwc2_core_params struct contains only integers.
|
||||||
|
*/
|
||||||
|
void dwc2_set_all_params(struct dwc2_core_params *params, int value)
|
||||||
|
{
|
||||||
|
int *p = (int *)params;
|
||||||
|
size_t size = sizeof(*params) / sizeof(*p);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
p[i] = value;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dwc2_set_all_params);
|
||||||
|
|
||||||
|
|
||||||
u16 dwc2_get_otg_version(struct dwc2_hsotg *hsotg)
|
u16 dwc2_get_otg_version(struct dwc2_hsotg *hsotg)
|
||||||
{
|
{
|
||||||
|
@ -1071,6 +1071,15 @@ extern void dwc2_set_param_ahbcfg(struct dwc2_hsotg *hsotg, int val);
|
|||||||
|
|
||||||
extern void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val);
|
extern void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val);
|
||||||
|
|
||||||
|
extern void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
|
||||||
|
const struct dwc2_core_params *params);
|
||||||
|
|
||||||
|
extern void dwc2_set_all_params(struct dwc2_core_params *params, int value);
|
||||||
|
|
||||||
|
extern int dwc2_get_hwparams(struct dwc2_hsotg *hsotg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dump core registers and SPRAM
|
* Dump core registers and SPRAM
|
||||||
*/
|
*/
|
||||||
@ -1119,14 +1128,12 @@ extern int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg);
|
|||||||
extern void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg);
|
extern void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg);
|
||||||
extern void dwc2_hcd_start(struct dwc2_hsotg *hsotg);
|
extern void dwc2_hcd_start(struct dwc2_hsotg *hsotg);
|
||||||
#else
|
#else
|
||||||
static inline void dwc2_set_all_params(struct dwc2_core_params *params, int value) {}
|
|
||||||
static inline int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
|
static inline int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
static inline void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg) {}
|
static inline void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg) {}
|
||||||
static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {}
|
static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {}
|
||||||
static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {}
|
static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {}
|
||||||
static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
|
static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq)
|
||||||
const struct dwc2_core_params *params)
|
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2748,8 +2748,6 @@ static void dwc2_hcd_free(struct dwc2_hsotg *hsotg)
|
|||||||
destroy_workqueue(hsotg->wq_otg);
|
destroy_workqueue(hsotg->wq_otg);
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(hsotg->core_params);
|
|
||||||
hsotg->core_params = NULL;
|
|
||||||
del_timer(&hsotg->wkp_timer);
|
del_timer(&hsotg->wkp_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2761,30 +2759,13 @@ static void dwc2_hcd_release(struct dwc2_hsotg *hsotg)
|
|||||||
dwc2_hcd_free(hsotg);
|
dwc2_hcd_free(hsotg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets all parameters to the given value.
|
|
||||||
*
|
|
||||||
* Assumes that the dwc2_core_params struct contains only integers.
|
|
||||||
*/
|
|
||||||
void dwc2_set_all_params(struct dwc2_core_params *params, int value)
|
|
||||||
{
|
|
||||||
int *p = (int *)params;
|
|
||||||
size_t size = sizeof(*params) / sizeof(*p);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
p[i] = value;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(dwc2_set_all_params);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initializes the HCD. This function allocates memory for and initializes the
|
* Initializes the HCD. This function allocates memory for and initializes the
|
||||||
* static parts of the usb_hcd and dwc2_hsotg structures. It also registers the
|
* static parts of the usb_hcd and dwc2_hsotg structures. It also registers the
|
||||||
* USB bus with the core and calls the hc_driver->start() function. It returns
|
* USB bus with the core and calls the hc_driver->start() function. It returns
|
||||||
* a negative error on failure.
|
* a negative error on failure.
|
||||||
*/
|
*/
|
||||||
int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
|
int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq)
|
||||||
const struct dwc2_core_params *params)
|
|
||||||
{
|
{
|
||||||
struct usb_hcd *hcd;
|
struct usb_hcd *hcd;
|
||||||
struct dwc2_host_chan *channel;
|
struct dwc2_host_chan *channel;
|
||||||
@ -2797,12 +2778,6 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
|
|||||||
|
|
||||||
dev_dbg(hsotg->dev, "DWC OTG HCD INIT\n");
|
dev_dbg(hsotg->dev, "DWC OTG HCD INIT\n");
|
||||||
|
|
||||||
/* Detect config values from hardware */
|
|
||||||
retval = dwc2_get_hwparams(hsotg);
|
|
||||||
|
|
||||||
if (retval)
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
|
|
||||||
hcfg = readl(hsotg->regs + HCFG);
|
hcfg = readl(hsotg->regs + HCFG);
|
||||||
@ -2821,15 +2796,6 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
|
|||||||
hsotg->last_frame_num = HFNUM_MAX_FRNUM;
|
hsotg->last_frame_num = HFNUM_MAX_FRNUM;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hsotg->core_params = kzalloc(sizeof(*hsotg->core_params), GFP_KERNEL);
|
|
||||||
if (!hsotg->core_params)
|
|
||||||
goto error1;
|
|
||||||
|
|
||||||
dwc2_set_all_params(hsotg->core_params, -1);
|
|
||||||
|
|
||||||
/* Validate parameter values */
|
|
||||||
dwc2_set_parameters(hsotg, params);
|
|
||||||
|
|
||||||
/* Check if the bus driver or platform code has setup a dma_mask */
|
/* Check if the bus driver or platform code has setup a dma_mask */
|
||||||
if (hsotg->core_params->dma_enable > 0 &&
|
if (hsotg->core_params->dma_enable > 0 &&
|
||||||
hsotg->dev->dma_mask == NULL) {
|
hsotg->dev->dma_mask == NULL) {
|
||||||
|
@ -451,13 +451,8 @@ static inline u8 dwc2_hcd_is_pipe_out(struct dwc2_hcd_pipe_info *pipe)
|
|||||||
return !dwc2_hcd_is_pipe_in(pipe);
|
return !dwc2_hcd_is_pipe_in(pipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
|
extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq);
|
||||||
const struct dwc2_core_params *params);
|
|
||||||
extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg);
|
extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg);
|
||||||
extern void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
|
|
||||||
const struct dwc2_core_params *params);
|
|
||||||
extern void dwc2_set_all_params(struct dwc2_core_params *params, int value);
|
|
||||||
extern int dwc2_get_hwparams(struct dwc2_hsotg *hsotg);
|
|
||||||
|
|
||||||
/* Transaction Execution Functions */
|
/* Transaction Execution Functions */
|
||||||
extern enum dwc2_transaction_type dwc2_hcd_select_transactions(
|
extern enum dwc2_transaction_type dwc2_hcd_select_transactions(
|
||||||
|
@ -241,6 +241,21 @@ static int dwc2_driver_probe(struct platform_device *dev)
|
|||||||
spin_lock_init(&hsotg->lock);
|
spin_lock_init(&hsotg->lock);
|
||||||
mutex_init(&hsotg->init_mutex);
|
mutex_init(&hsotg->init_mutex);
|
||||||
|
|
||||||
|
/* Detect config values from hardware */
|
||||||
|
retval = dwc2_get_hwparams(hsotg);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
hsotg->core_params = devm_kzalloc(&dev->dev,
|
||||||
|
sizeof(*hsotg->core_params), GFP_KERNEL);
|
||||||
|
if (!hsotg->core_params)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
dwc2_set_all_params(hsotg->core_params, -1);
|
||||||
|
|
||||||
|
/* Validate parameter values */
|
||||||
|
dwc2_set_parameters(hsotg, params);
|
||||||
|
|
||||||
if (hsotg->dr_mode != USB_DR_MODE_HOST) {
|
if (hsotg->dr_mode != USB_DR_MODE_HOST) {
|
||||||
retval = dwc2_gadget_init(hsotg, irq);
|
retval = dwc2_gadget_init(hsotg, irq);
|
||||||
if (retval)
|
if (retval)
|
||||||
@ -249,7 +264,7 @@ static int dwc2_driver_probe(struct platform_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {
|
if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {
|
||||||
retval = dwc2_hcd_init(hsotg, irq, params);
|
retval = dwc2_hcd_init(hsotg, irq);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
if (hsotg->gadget_enabled)
|
if (hsotg->gadget_enabled)
|
||||||
s3c_hsotg_remove(hsotg);
|
s3c_hsotg_remove(hsotg);
|
||||||
|
Loading…
Reference in New Issue
Block a user