RE: [PATCHv11 16/19] usb: otg: mv_otg: Start using struct usb_otg

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Heikki Krogerus [mailto:heikki.krogerus@xxxxxxxxxxxxxxx]
> Sent: 2012年2月13日 19:24
> To: Felipe Balbi
> Cc: linux-usb@xxxxxxxxxxxxxxx; Sascha Hauer; Pavankumar Kondeti; Li
> Yang; Eric Miao; Alan Stern; Kishon Vijay Abraham I; Peter Chen; Neil
> Zhang
> Subject: [PATCHv11 16/19] usb: otg: mv_otg: Start using struct usb_otg
> 
> Use struct usb_otg members with OTG specific functions instead
> of usb_phy members.
> 
> Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>
> Reviewed-by: Marek Vasut <marek.vasut@xxxxxxxxx>
> Cc: Neil Zhang <zhangwm@xxxxxxxxxxx>
> ---
>  drivers/usb/otg/mv_otg.c |  110 ++++++++++++++++++++++++++------------
> --------
>  drivers/usb/otg/mv_otg.h |    2 +-
>  2 files changed, 63 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c
> index 6e05d58..6cc6c3f 100644
> --- a/drivers/usb/otg/mv_otg.c
> +++ b/drivers/usb/otg/mv_otg.c
> @@ -55,16 +55,16 @@ static char *state_string[] = {
>  	"a_vbus_err"
>  };
> 
> -static int mv_otg_set_vbus(struct usb_phy *otg, bool on)
> +static int mv_otg_set_vbus(struct usb_otg *otg, bool on)
>  {
> -	struct mv_otg *mvotg = container_of(otg, struct mv_otg, otg);
> +	struct mv_otg *mvotg = container_of(otg->phy, struct mv_otg, phy);
>  	if (mvotg->pdata->set_vbus == NULL)
>  		return -ENODEV;
> 
>  	return mvotg->pdata->set_vbus(on);
>  }
> 
> -static int mv_otg_set_host(struct usb_phy *otg,
> +static int mv_otg_set_host(struct usb_otg *otg,
>  			   struct usb_bus *host)
>  {
>  	otg->host = host;
> @@ -72,7 +72,7 @@ static int mv_otg_set_host(struct usb_phy *otg,
>  	return 0;
>  }
> 
> -static int mv_otg_set_peripheral(struct usb_phy *otg,
> +static int mv_otg_set_peripheral(struct usb_otg *otg,
>  				 struct usb_gadget *gadget)
>  {
>  	otg->gadget = gadget;
> @@ -203,7 +203,7 @@ static void mv_otg_init_irq(struct mv_otg *mvotg)
>  static void mv_otg_start_host(struct mv_otg *mvotg, int on)
>  {
>  #ifdef CONFIG_USB
> -	struct usb_phy *otg = &mvotg->otg;
> +	struct usb_otg *otg = mvotg->phy.otg;
>  	struct usb_hcd *hcd;
> 
>  	if (!otg->host)
> @@ -222,12 +222,12 @@ static void mv_otg_start_host(struct mv_otg
> *mvotg, int on)
> 
>  static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on)
>  {
> -	struct usb_phy *otg = &mvotg->otg;
> +	struct usb_otg *otg = mvotg->phy.otg;
> 
>  	if (!otg->gadget)
>  		return;
> 
> -	dev_info(otg->dev, "gadget %s\n", on ? "on" : "off");
> +	dev_info(mvotg->phy.dev, "gadget %s\n", on ? "on" : "off");
> 
>  	if (on)
>  		usb_gadget_vbus_connect(otg->gadget);
> @@ -343,69 +343,69 @@ static void mv_otg_update_inputs(struct mv_otg
> *mvotg)
>  static void mv_otg_update_state(struct mv_otg *mvotg)
>  {
>  	struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
> -	struct usb_phy *otg = &mvotg->otg;
> -	int old_state = otg->state;
> +	struct usb_phy *phy = &mvotg->phy;
> +	int old_state = phy->state;
> 
>  	switch (old_state) {
>  	case OTG_STATE_UNDEFINED:
> -		otg->state = OTG_STATE_B_IDLE;
> +		phy->state = OTG_STATE_B_IDLE;
>  		/* FALL THROUGH */
>  	case OTG_STATE_B_IDLE:
>  		if (otg_ctrl->id == 0)
> -			otg->state = OTG_STATE_A_IDLE;
> +			phy->state = OTG_STATE_A_IDLE;
>  		else if (otg_ctrl->b_sess_vld)
> -			otg->state = OTG_STATE_B_PERIPHERAL;
> +			phy->state = OTG_STATE_B_PERIPHERAL;
>  		break;
>  	case OTG_STATE_B_PERIPHERAL:
>  		if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0)
> -			otg->state = OTG_STATE_B_IDLE;
> +			phy->state = OTG_STATE_B_IDLE;
>  		break;
>  	case OTG_STATE_A_IDLE:
>  		if (otg_ctrl->id)
> -			otg->state = OTG_STATE_B_IDLE;
> +			phy->state = OTG_STATE_B_IDLE;
>  		else if (!(otg_ctrl->a_bus_drop) &&
>  			 (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det))
> -			otg->state = OTG_STATE_A_WAIT_VRISE;
> +			phy->state = OTG_STATE_A_WAIT_VRISE;
>  		break;
>  	case OTG_STATE_A_WAIT_VRISE:
>  		if (otg_ctrl->a_vbus_vld)
> -			otg->state = OTG_STATE_A_WAIT_BCON;
> +			phy->state = OTG_STATE_A_WAIT_BCON;
>  		break;
>  	case OTG_STATE_A_WAIT_BCON:
>  		if (otg_ctrl->id || otg_ctrl->a_bus_drop
>  		    || otg_ctrl->a_wait_bcon_timeout) {
>  			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
>  			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> -			otg->state = OTG_STATE_A_WAIT_VFALL;
> +			phy->state = OTG_STATE_A_WAIT_VFALL;
>  			otg_ctrl->a_bus_req = 0;
>  		} else if (!otg_ctrl->a_vbus_vld) {
>  			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
>  			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> -			otg->state = OTG_STATE_A_VBUS_ERR;
> +			phy->state = OTG_STATE_A_VBUS_ERR;
>  		} else if (otg_ctrl->b_conn) {
>  			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
>  			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
> -			otg->state = OTG_STATE_A_HOST;
> +			phy->state = OTG_STATE_A_HOST;
>  		}
>  		break;
>  	case OTG_STATE_A_HOST:
>  		if (otg_ctrl->id || !otg_ctrl->b_conn
>  		    || otg_ctrl->a_bus_drop)
> -			otg->state = OTG_STATE_A_WAIT_BCON;
> +			phy->state = OTG_STATE_A_WAIT_BCON;
>  		else if (!otg_ctrl->a_vbus_vld)
> -			otg->state = OTG_STATE_A_VBUS_ERR;
> +			phy->state = OTG_STATE_A_VBUS_ERR;
>  		break;
>  	case OTG_STATE_A_WAIT_VFALL:
>  		if (otg_ctrl->id
>  		    || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld)
>  		    || otg_ctrl->a_bus_req)
> -			otg->state = OTG_STATE_A_IDLE;
> +			phy->state = OTG_STATE_A_IDLE;
>  		break;
>  	case OTG_STATE_A_VBUS_ERR:
>  		if (otg_ctrl->id || otg_ctrl->a_clr_err
>  		    || otg_ctrl->a_bus_drop) {
>  			otg_ctrl->a_clr_err = 0;
> -			otg->state = OTG_STATE_A_WAIT_VFALL;
> +			phy->state = OTG_STATE_A_WAIT_VFALL;
>  		}
>  		break;
>  	default:
> @@ -416,15 +416,17 @@ static void mv_otg_update_state(struct mv_otg
> *mvotg)
>  static void mv_otg_work(struct work_struct *work)
>  {
>  	struct mv_otg *mvotg;
> -	struct usb_phy *otg;
> +	struct usb_phy *phy;
> +	struct usb_otg *otg;
>  	int old_state;
> 
>  	mvotg = container_of((struct delayed_work *)work, struct mv_otg,
> work);
> 
>  run:
>  	/* work queue is single thread, or we need spin_lock to protect
> */
> -	otg = &mvotg->otg;
> -	old_state = otg->state;
> +	phy = &mvotg->phy;
> +	otg = phy->otg;
> +	old_state = phy->state;
> 
>  	if (!mvotg->active)
>  		return;
> @@ -432,14 +434,14 @@ run:
>  	mv_otg_update_inputs(mvotg);
>  	mv_otg_update_state(mvotg);
> 
> -	if (old_state != otg->state) {
> +	if (old_state != phy->state) {
>  		dev_info(&mvotg->pdev->dev, "change from state %s to %s\n",
>  			 state_string[old_state],
> -			 state_string[otg->state]);
> +			 state_string[phy->state]);
> 
> -		switch (otg->state) {
> +		switch (phy->state) {
>  		case OTG_STATE_B_IDLE:
> -			mvotg->otg.default_a = 0;
> +			otg->default_a = 0;
>  			if (old_state == OTG_STATE_B_PERIPHERAL)
>  				mv_otg_start_periphrals(mvotg, 0);
>  			mv_otg_reset(mvotg);
> @@ -450,14 +452,14 @@ run:
>  			mv_otg_start_periphrals(mvotg, 1);
>  			break;
>  		case OTG_STATE_A_IDLE:
> -			mvotg->otg.default_a = 1;
> +			otg->default_a = 1;
>  			mv_otg_enable(mvotg);
>  			if (old_state == OTG_STATE_A_WAIT_VFALL)
>  				mv_otg_start_host(mvotg, 0);
>  			mv_otg_reset(mvotg);
>  			break;
>  		case OTG_STATE_A_WAIT_VRISE:
> -			mv_otg_set_vbus(&mvotg->otg, 1);
> +			mv_otg_set_vbus(otg, 1);
>  			break;
>  		case OTG_STATE_A_WAIT_BCON:
>  			if (old_state != OTG_STATE_A_HOST)
> @@ -479,7 +481,7 @@ run:
>  			 * here. In fact, it need host driver to notify us.
>  			 */
>  			mvotg->otg_ctrl.b_conn = 0;
> -			mv_otg_set_vbus(&mvotg->otg, 0);
> +			mv_otg_set_vbus(otg, 0);
>  			break;
>  		case OTG_STATE_A_VBUS_ERR:
>  			break;
> @@ -548,8 +550,8 @@ set_a_bus_req(struct device *dev, struct
> device_attribute *attr,
>  		return -1;
> 
>  	/* We will use this interface to change to A device */
> -	if (mvotg->otg.state != OTG_STATE_B_IDLE
> -	    && mvotg->otg.state != OTG_STATE_A_IDLE)
> +	if (mvotg->phy.state != OTG_STATE_B_IDLE
> +	    && mvotg->phy.state != OTG_STATE_A_IDLE)
>  		return -1;
> 
>  	/* The clock may disabled and we need to set irq for ID detected
> */
> @@ -579,7 +581,7 @@ set_a_clr_err(struct device *dev, struct
> device_attribute *attr,
>  	      const char *buf, size_t count)
>  {
>  	struct mv_otg *mvotg = dev_get_drvdata(dev);
> -	if (!mvotg->otg.default_a)
> +	if (!mvotg->phy.otg->default_a)
>  		return -1;
> 
>  	if (count > 2)
> @@ -615,7 +617,7 @@ set_a_bus_drop(struct device *dev, struct
> device_attribute *attr,
>  	       const char *buf, size_t count)
>  {
>  	struct mv_otg *mvotg = dev_get_drvdata(dev);
> -	if (!mvotg->otg.default_a)
> +	if (!mvotg->phy.otg->default_a)
>  		return -1;
> 
>  	if (count > 2)
> @@ -688,9 +690,10 @@ int mv_otg_remove(struct platform_device *pdev)
>  	for (clk_i = 0; clk_i <= mvotg->clknum; clk_i++)
>  		clk_put(mvotg->clk[clk_i]);
> 
> -	otg_set_transceiver(NULL);
> +	usb_set_transceiver(NULL);
>  	platform_set_drvdata(pdev, NULL);
> 
> +	kfree(mvotg->phy.otg);
>  	kfree(mvotg);
> 
>  	return 0;
> @@ -700,6 +703,7 @@ static int mv_otg_probe(struct platform_device
> *pdev)
>  {
>  	struct mv_usb_platform_data *pdata = pdev->dev.platform_data;
>  	struct mv_otg *mvotg;
> +	struct usb_otg *otg;
>  	struct resource *r;
>  	int retval = 0, clk_i, i;
>  	size_t size;
> @@ -716,6 +720,12 @@ static int mv_otg_probe(struct platform_device
> *pdev)
>  		return -ENOMEM;
>  	}
> 
> +	otg = kzalloc(sizeof *otg, GFP_KERNEL);
> +	if (!otg) {
> +		kfree(mvotg);
> +		return -ENOMEM;
> +	}
> +
>  	platform_set_drvdata(pdev, mvotg);
> 
>  	mvotg->pdev = pdev;
> @@ -741,12 +751,15 @@ static int mv_otg_probe(struct platform_device
> *pdev)
> 
>  	/* OTG common part */
>  	mvotg->pdev = pdev;
> -	mvotg->otg.dev = &pdev->dev;
> -	mvotg->otg.label = driver_name;
> -	mvotg->otg.set_host = mv_otg_set_host;
> -	mvotg->otg.set_peripheral = mv_otg_set_peripheral;
> -	mvotg->otg.set_vbus = mv_otg_set_vbus;
> -	mvotg->otg.state = OTG_STATE_UNDEFINED;
> +	mvotg->phy.dev = &pdev->dev;
> +	mvotg->phy.otg = otg;
> +	mvotg->phy.label = driver_name;
> +	mvotg->phy.state = OTG_STATE_UNDEFINED;
> +
> +	otg->phy = &mvotg->phy;
> +	otg->set_host = mv_otg_set_host;
> +	otg->set_peripheral = mv_otg_set_peripheral;
> +	otg->set_vbus = mv_otg_set_vbus;
> 
>  	for (i = 0; i < OTG_TIMER_NUM; i++)
>  		init_timer(&mvotg->otg_ctrl.timer[i]);
> @@ -840,7 +853,7 @@ static int mv_otg_probe(struct platform_device
> *pdev)
>  		goto err_disable_clk;
>  	}
> 
> -	retval = otg_set_transceiver(&mvotg->otg);
> +	retval = usb_set_transceiver(&mvotg->phy);
>  	if (retval < 0) {
>  		dev_err(&pdev->dev, "can't register transceiver, %d\n",
>  			retval);
> @@ -867,7 +880,7 @@ static int mv_otg_probe(struct platform_device
> *pdev)
>  	return 0;
> 
>  err_set_transceiver:
> -	otg_set_transceiver(NULL);
> +	usb_set_transceiver(NULL);
>  err_free_irq:
>  	free_irq(mvotg->irq, mvotg);
>  err_disable_clk:
> @@ -888,6 +901,7 @@ err_put_clk:
>  		clk_put(mvotg->clk[clk_i]);
> 
>  	platform_set_drvdata(pdev, NULL);
> +	kfree(otg);
>  	kfree(mvotg);
> 
>  	return retval;
> @@ -898,10 +912,10 @@ static int mv_otg_suspend(struct platform_device
> *pdev, pm_message_t state)
>  {
>  	struct mv_otg *mvotg = platform_get_drvdata(pdev);
> 
> -	if (mvotg->otg.state != OTG_STATE_B_IDLE) {
> +	if (mvotg->phy.state != OTG_STATE_B_IDLE) {
>  		dev_info(&pdev->dev,
>  			 "OTG state is not B_IDLE, it is %d!\n",
> -			 mvotg->otg.state);
> +			 mvotg->phy.state);
>  		return -EAGAIN;
>  	}
> 
> diff --git a/drivers/usb/otg/mv_otg.h b/drivers/usb/otg/mv_otg.h
> index a74ee07..8a9e351 100644
> --- a/drivers/usb/otg/mv_otg.h
> +++ b/drivers/usb/otg/mv_otg.h
> @@ -136,7 +136,7 @@ struct mv_otg_regs {
>  };
> 
>  struct mv_otg {
> -	struct usb_phy otg;
> +	struct usb_phy phy;
>  	struct mv_otg_ctrl otg_ctrl;
> 
>  	/* base address */
> --
> 1.7.5.4

Acked-by: Neil Zhang <zhangwm@xxxxxxxxxxx>

?韬{.n?????%??檩??w?{.n???{炳???骅w*jg????????G??⒏⒎?:+v????????????"??????


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux