[PATCH v14 08/12] usb: chipidea: move otg relate things to otg file

Alexander Shishkin alexander.shishkin at linux.intel.com
Fri Aug 9 09:09:05 EDT 2013


Peter Chen <peter.chen at freescale.com> writes:

A few typos:

> Move otg relate things to otg file.

"related"

>
> Tested-by: Marek Vasut <marex at denx.de>
> Signed-off-by: Peter Chen <peter.chen at freescale.com>
> ---
>  drivers/usb/chipidea/core.c |   63 +++++++++----------------------------------
>  drivers/usb/chipidea/otg.c  |   57 +++++++++++++++++++++++++++++++++++++-
>  drivers/usb/chipidea/otg.h  |    2 +
>  3 files changed, 70 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
> index 2223954..30be811 100644
> --- a/drivers/usb/chipidea/core.c
> +++ b/drivers/usb/chipidea/core.c
> @@ -294,40 +294,6 @@ int hw_device_reset(struct ci_hdrc *ci, u32 mode)
>  	return 0;
>  }
>  
> -/**
> - * ci_otg_role - pick role based on ID pin state
> - * @ci: the controller
> - */
> -static enum ci_role ci_otg_role(struct ci_hdrc *ci)
> -{
> -	u32 sts = hw_read(ci, OP_OTGSC, ~0);
> -	enum ci_role role = sts & OTGSC_ID
> -		? CI_ROLE_GADGET
> -		: CI_ROLE_HOST;
> -
> -	return role;
> -}
> -
> -/**
> - * ci_role_work - perform role changing based on ID pin
> - * @work: work struct
> - */
> -static void ci_role_work(struct work_struct *work)
> -{
> -	struct ci_hdrc *ci = container_of(work, struct ci_hdrc, work);
> -	enum ci_role role = ci_otg_role(ci);
> -
> -	if (role != ci->role) {
> -		dev_dbg(ci->dev, "switching from %s to %s\n",
> -			ci_role(ci)->name, ci->roles[role]->name);
> -
> -		ci_role_stop(ci);
> -		ci_role_start(ci, role);
> -	}
> -
> -	enable_irq(ci->irq);
> -}
> -
>  static irqreturn_t ci_irq(int irq, void *data)
>  {
>  	struct ci_hdrc *ci = data;
> @@ -430,6 +396,8 @@ static inline void ci_role_destroy(struct ci_hdrc *ci)
>  {
>  	ci_hdrc_gadget_destroy(ci);
>  	ci_hdrc_host_destroy(ci);
> +	if (ci->is_otg)
> +		ci_hdrc_otg_destory(ci);

"destroy"

>  }
>  
>  static void ci_get_otg_capable(struct ci_hdrc *ci)
> @@ -496,13 +464,6 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>  		return -ENODEV;
>  	}
>  
> -	INIT_WORK(&ci->work, ci_role_work);
> -	ci->wq = create_singlethread_workqueue("ci_otg");
> -	if (!ci->wq) {
> -		dev_err(dev, "can't create workqueue\n");
> -		return -ENODEV;
> -	}
> -
>  	/* To know if controller is OTG capable or not */
>  	ci_get_otg_capable(ci);
>  
> @@ -533,8 +494,15 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>  
>  	if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) {
>  		dev_err(dev, "no supported roles\n");
> -		ret = -ENODEV;
> -		goto rm_wq;
> +		return -ENODEV;
> +	}
> +
> +	if (ci->is_otg) {
> +		ret = ci_hdrc_otg_init(ci);
> +		if (ret) {
> +			dev_err(dev, "init otg fails, ret = %d\n", ret);
> +			goto stop;
> +		}
>  	}
>  
>  	if (ci->roles[CI_ROLE_HOST] && ci->roles[CI_ROLE_GADGET]) {
> @@ -545,7 +513,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>  			 */
>  			mdelay(2);
>  			ci->role = ci_otg_role(ci);
> -			ci_hdrc_otg_init(ci);
> +			ci_enable_otg_interrupt(ci, OTGSC_IDIE);
>  		} else {
>  			/*
>  			 * If the controller is not OTG capable, but support
> @@ -563,7 +531,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>  	ret = ci_role_start(ci, ci->role);
>  	if (ret) {
>  		dev_err(dev, "can't start %s role\n", ci_role(ci)->name);
> -		goto rm_wq;
> +		goto stop;
>  	}
>  
>  	platform_set_drvdata(pdev, ci);
> @@ -579,9 +547,6 @@ static int ci_hdrc_probe(struct platform_device *pdev)
>  	free_irq(ci->irq, ci);
>  stop:
>  	ci_role_destroy(ci);
> -rm_wq:
> -	flush_workqueue(ci->wq);
> -	destroy_workqueue(ci->wq);
>  
>  	return ret;
>  }
> @@ -591,8 +556,6 @@ static int ci_hdrc_remove(struct platform_device *pdev)
>  	struct ci_hdrc *ci = platform_get_drvdata(pdev);
>  
>  	dbg_remove_files(ci);
> -	flush_workqueue(ci->wq);
> -	destroy_workqueue(ci->wq);
>  	free_irq(ci->irq, ci);
>  	ci_role_destroy(ci);
>  
> diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c
> index abefb4d..68f2faf 100644
> --- a/drivers/usb/chipidea/otg.c
> +++ b/drivers/usb/chipidea/otg.c
> @@ -39,12 +39,65 @@ void ci_disable_otg_interrupt(struct ci_hdrc *ci, u32 bits)
>  }
>  
>  /**
> - * ci_hdrc_otg_init - initialize otgsc bits
> + * ci_otg_role - pick role based on ID pin state
> + * @ci: the controller
> + */
> +enum ci_role ci_otg_role(struct ci_hdrc *ci)
> +{
> +	u32 sts = hw_read(ci, OP_OTGSC, ~0);
> +	enum ci_role role = sts & OTGSC_ID
> +		? CI_ROLE_GADGET
> +		: CI_ROLE_HOST;
> +
> +	return role;
> +}
> +
> +/**
> + * ci_role_work - perform role changing based on ID pin
> + * @work: work struct
> + */
> +static void ci_role_work(struct work_struct *work)
> +{
> +	struct ci_hdrc *ci = container_of(work, struct ci_hdrc, work);
> +	enum ci_role role = ci_otg_role(ci);
> +
> +	if (role != ci->role) {
> +		dev_dbg(ci->dev, "switching from %s to %s\n",
> +			ci_role(ci)->name, ci->roles[role]->name);
> +
> +		ci_role_stop(ci);
> +		ci_role_start(ci, role);
> +	}
> +
> +	enable_irq(ci->irq);
> +}
> +
> +/**
> + * ci_hdrc_otg_init - initialize otg struct
>   * ci: the controller
>   */
>  int ci_hdrc_otg_init(struct ci_hdrc *ci)
>  {
> -	ci_enable_otg_interrupt(ci, OTGSC_IDIE);
> +	INIT_WORK(&ci->work, ci_role_work);
> +	ci->wq = create_singlethread_workqueue("ci_otg");
> +	if (!ci->wq) {
> +		dev_err(ci->dev, "can't create workqueue\n");
> +		return -ENODEV;
> +	}
>  
>  	return 0;
>  }
> +
> +/**
> + * ci_hdrc_otg_destroy - destory otg struct

"destroy"

> + * ci: the controller
> + */
> +void ci_hdrc_otg_destory(struct ci_hdrc *ci)

"destroy"

> +{
> +	if (ci->wq) {
> +		flush_workqueue(ci->wq);
> +		destroy_workqueue(ci->wq);
> +	}
> +	ci_disable_otg_interrupt(ci, OTGSC_INT_EN_BITS);
> +	ci_clear_otg_interrupt(ci, OTGSC_INT_STATUS_BITS);
> +}
> diff --git a/drivers/usb/chipidea/otg.h b/drivers/usb/chipidea/otg.h
> index f24ec37..8913062 100644
> --- a/drivers/usb/chipidea/otg.h
> +++ b/drivers/usb/chipidea/otg.h
> @@ -15,5 +15,7 @@ int ci_hdrc_otg_init(struct ci_hdrc *ci);
>  void ci_clear_otg_interrupt(struct ci_hdrc *ci, u32 bits);
>  void ci_enable_otg_interrupt(struct ci_hdrc *ci, u32 bits);
>  void ci_disable_otg_interrupt(struct ci_hdrc *ci, u32 bits);
> +void ci_hdrc_otg_destory(struct ci_hdrc *ci);

"destroy"

> +enum ci_role ci_otg_role(struct ci_hdrc *ci);
>  
>  #endif /* __DRIVERS_USB_CHIPIDEA_OTG_H */
> -- 
> 1.7.0.4



More information about the linux-arm-kernel mailing list