diff mbox

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

Message ID 1375432445-31918-9-git-send-email-peter.chen@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Chen Aug. 2, 2013, 8:34 a.m. UTC
Move otg relate things to otg file.

Tested-by: Marek Vasut <marex@denx.de>
Signed-off-by: Peter Chen <peter.chen@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(-)

Comments

Alexander Shishkin Aug. 9, 2013, 1:09 p.m. UTC | #1
Peter Chen <peter.chen@freescale.com> writes:

A few typos:

> Move otg relate things to otg file.

"related"

>
> Tested-by: Marek Vasut <marex@denx.de>
> Signed-off-by: Peter Chen <peter.chen@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
diff mbox

Patch

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);
 }
 
 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
+ * ci: the controller
+ */
+void ci_hdrc_otg_destory(struct ci_hdrc *ci)
+{
+	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);
+enum ci_role ci_otg_role(struct ci_hdrc *ci);
 
 #endif /* __DRIVERS_USB_CHIPIDEA_OTG_H */