lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 23 Jul 2013 12:16:28 +0530
From:	George Cherian <george.cherian@...com>
To:	Sebastian Andrzej Siewior <bigeasy@...utronix.de>
CC:	<linux-usb@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
	<balbi@...com>
Subject: Re: [PATCH 05/16] usb: musb: dsps: use proper child nodes

On 7/22/2013 11:39 PM, Sebastian Andrzej Siewior wrote:
> This moves the two instances from the big node into two child nodes. The
> glue layer ontop does almost nothing.
> There is one devices containing the (2) phy, (2) usb and later the dma
> engine. The usb device is the "glue device" which contains the musb
> device as a child. This is what we do ever since.
> The new file musb_am335x is just here to prob the new bus and populate
> child devices.
> There are a lot of changes to the dsps file as a result of the changes:
> - musb_core_offset
>    This is gone. The device tree provides memory ressources information
>    for the device there is no need to "fix" things
> - instances
>    This is gone as well. If we have two instances then we have have two
>    child enabled nodes in the device tree. For instance the SoC in beagle
>    bone has two USB instances but only one has been wired up so there is
>    no need to load and init the second instance since it won't be used.
> - dsps_glue is now per glue device
>    In the past there was one of this structs but with an array of two and
>    each instance accessed its variable depending on the platform device
>    id.
> - no unneeded copy of structs
>    I do not know why struct dsps_musb_wrapper is copied but it is not
>    necessary. The same goes for musb_hdrc_platform_data which allocated
>    on demand and then again by platform_device_add_data(). One copy is
>    enough.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@...utronix.de>
> ---
>   arch/arm/boot/dts/am335x-bone.dts  |  12 ++
>   arch/arm/boot/dts/am335x-evm.dts   |  20 +++
>   arch/arm/boot/dts/am335x-evmsk.dts |  12 ++
>   arch/arm/boot/dts/am33xx.dtsi      |  89 +++++++++++--
>   drivers/usb/musb/Kconfig           |   4 +
>   drivers/usb/musb/Makefile          |   3 +
>   drivers/usb/musb/musb_am335x.c     |  55 ++++++++
>   drivers/usb/musb/musb_dsps.c       | 255 ++++++++++++++-----------------------
>   8 files changed, 279 insertions(+), 171 deletions(-)
>   create mode 100644 drivers/usb/musb/musb_am335x.c
>
> diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts
> index 444b4ed..2c2ac84 100644
> --- a/arch/arm/boot/dts/am335x-bone.dts
> +++ b/arch/arm/boot/dts/am335x-bone.dts
> @@ -120,6 +120,18 @@
>   			status = "okay";
>   		};
>   
> +		musb: usb@...00000 {
> +			status = "okay";
> +
> +			phy@...01300 {
> +				status = "okay";
> +			};
> +
> +			usb@...01000 {
> +				status = "okay";
> +			};
> +		};
> +
>   		i2c0: i2c@...0b000 {
>   			pinctrl-names = "default";
>   			pinctrl-0 = <&i2c0_pins>;
> diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
> index 3aee1a4..a3a642a 100644
> --- a/arch/arm/boot/dts/am335x-evm.dts
> +++ b/arch/arm/boot/dts/am335x-evm.dts
> @@ -171,6 +171,26 @@
>   			};
>   		};
>   
> +		musb: usb@...00000 {
> +			status = "okay";
> +
> +			phy@...01300 {
> +				status = "okay";
> +			};
> +
> +			phy@...01b00 {
> +				status = "okay";
> +			};
> +
> +			usb@...01000 {
> +				status = "no";
> +			};
Any reason usb0 is disabled for am33xx evm? Just for testing?

> +
> +			usb@...01800 {
> +				status = "okay";
> +			};
> +		};
> +
>   		i2c1: i2c@...2a000 {
>   			pinctrl-names = "default";
>   			pinctrl-0 = <&i2c1_pins>;
> diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts
> index 0c8ad17..766c23a 100644
> --- a/arch/arm/boot/dts/am335x-evmsk.dts
> +++ b/arch/arm/boot/dts/am335x-evmsk.dts
> @@ -207,6 +207,18 @@
>   			};
>   		};
>   
> +		musb: usb@...00000 {
> +			status = "okay";
> +
> +			phy@...01300 {
> +				status = "okay";
> +			};
> +
> +			usb@...01000 {
> +				status = "okay";
> +			};
> +		};
> +
>   		epwmss2: epwmss@...04000 {
>   			status = "okay";
>   
> diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
> index 38b446b..81afb27 100644
> --- a/arch/arm/boot/dts/am33xx.dtsi
> +++ b/arch/arm/boot/dts/am33xx.dtsi
> @@ -26,6 +26,10 @@
>   		serial5 = &uart5;
>   		d_can0 = &dcan0;
>   		d_can1 = &dcan1;
> +		usb0 = &usb0;
> +		usb1 = &usb1;
> +		phy0 = &usb0_phy;
> +		phy1 = &usb1_phy;
>   	};
>   
>   	cpus {
> @@ -333,21 +337,78 @@
>   			status = "disabled";
>   		};
>   
> -		usb@...00000 {
> -			compatible = "ti,musb-am33xx";
> -			reg = <0x47400000 0x1000	/* usbss */
> -			       0x47401000 0x800		/* musb instance 0 */
> -			       0x47401800 0x800>;	/* musb instance 1 */
> -			interrupts = <17		/* usbss */
> -				      18		/* musb instance 0 */
> -				      19>;		/* musb instance 1 */
> -			multipoint = <1>;
> -			num-eps = <16>;
> -			ram-bits = <12>;
> -			port0-mode = <3>;
> -			port1-mode = <3>;
> -			power = <250>;
> +		usb: usb@...00000 {
> +			compatible = "ti,am33xx-usb";
> +			reg = <0x47400000 0x1000>;
> +			ranges;
> +			#address-cells = <1>;
> +			#size-cells = <1>;
>   			ti,hwmods = "usb_otg_hs";
> +			status = "disabled";
> +
> +			usb0_phy: phy@...01300 {
> +				compatible = "ti,am335x-usb-phy";
> +				reg = <0x44e10620 0x8
> +					0x47401300 0x100>;
> +				reg-names = "reset_mod", "phy";
> +				status = "disabled";
> +			};
> +
> +			usb0: usb@...01000 {
> +				compatible = "ti,musb-am33xx";
> +				ranges;
> +				#address-cells = <1>;
> +				#size-cells = <1>;
> +				reg = <0x47401000 0x200>;
> +				reg-names = "control";
> +				status = "disabled";
> +
> +				musb0: usb@...01400 {
> +					compatible = "mg,musbmhdrc";
> +					reg = <0x47401400 0x400>;
> +					reg-names = "mc";
> +					interrupts = <18>;
> +					interrupt-names = "mc";
> +					multipoint = <1>;
> +					num-eps = <16>;
> +					ram-bits = <12>;
> +					port-mode = <3>;
> +					power = <250>;
> +					phys = <&usb0_phy>;
> +				};
> +			};
> +
> +			usb1_phy: phy@...01b00 {
> +				compatible = "ti,am335x-usb-phy";
> +				reg = <0x44e10628 0x8
> +					0x47401b00 0x100>;
> +				reg-names = "reset_mod", "phy";
> +				status = "disabled";
> +			};
> +
> +			usb1: usb@...01800 {
> +				compatible = "ti,musb-am33xx";
> +				ranges;
> +				#address-cells = <1>;
> +				#size-cells = <1>;
> +				reg = <0x47401800 0x200>;
> +				reg-names = "control";
> +				status = "disabled";
> +
> +				musb1: usb@...01c00 {
> +					compatible = "mg,musbmhdrc";
> +					reg = <0x47401c00 0x400>;
> +					reg-names = "mc";
> +					interrupts = <19>;
> +					interrupt-names = "mc";
> +					multipoint = <1>;
> +					num-eps = <16>;
> +					ram-bits = <12>;
> +					port-mode = <3>;
> +					power = <250>;
> +					phys = <&usb1_phy>;
> +				};
> +			};
>   		};
>   
>   		epwmss0: epwmss@...00000 {
> diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
> index 797e3fd..b7257ae 100644
> --- a/drivers/usb/musb/Kconfig
> +++ b/drivers/usb/musb/Kconfig
> @@ -83,6 +83,7 @@ config USB_MUSB_AM35X
>   
>   config USB_MUSB_DSPS
>   	tristate "TI DSPS platforms"
> +	select USB_MUSB_AM335X_CHILD
>   
>   config USB_MUSB_BLACKFIN
>   	tristate "Blackfin"
> @@ -93,6 +94,9 @@ config USB_MUSB_UX500
>   
>   endchoice
>   
> +config USB_MUSB_AM335X_CHILD
> +	tristate
> +
>   choice
>   	prompt 'MUSB DMA mode'
>   	default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM
> diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
> index 2b82ed7..52f552c 100644
> --- a/drivers/usb/musb/Makefile
> +++ b/drivers/usb/musb/Makefile
> @@ -20,6 +20,9 @@ obj-$(CONFIG_USB_MUSB_DA8XX)			+= da8xx.o
>   obj-$(CONFIG_USB_MUSB_BLACKFIN)			+= blackfin.o
>   obj-$(CONFIG_USB_MUSB_UX500)			+= ux500.o
>   
> +
> +obj-$(CONFIG_USB_MUSB_AM335X_CHILD)		+= musb_am335x.o
> +
>   # the kconfig must guarantee that only one of the
>   # possible I/O schemes will be enabled at a time ...
>   # PIO only, or DMA (several potential schemes).
> diff --git a/drivers/usb/musb/musb_am335x.c b/drivers/usb/musb/musb_am335x.c
> new file mode 100644
> index 0000000..41ac5b5
> --- /dev/null
> +++ b/drivers/usb/musb/musb_am335x.c
> @@ -0,0 +1,55 @@
> +#include <linux/init.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/module.h>
> +#include <linux/of_platform.h>
> +
> +static int am335x_child_probe(struct platform_device *pdev)
> +{
> +	int ret;
> +
> +	pm_runtime_enable(&pdev->dev);
> +
> +	ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
> +	if (ret)
> +		goto err;
> +
> +	return 0;
> +err:
> +	pm_runtime_disable(&pdev->dev);
> +	return ret;
> +}
> +
> +static int of_remove_populated_child(struct device *dev, void *d)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +
> +	of_device_unregister(pdev);
> +	return 0;
> +}
> +
> +static int am335x_child_remove(struct platform_device *pdev)
> +{
> +	device_for_each_child(&pdev->dev, NULL, of_remove_populated_child);
> +	pm_runtime_disable(&pdev->dev);
> +	return 0;
> +}
> +
> +static const struct of_device_id am335x_child_of_match[] = {
> +	{ .compatible = "ti,am33xx-usb" },
> +	{  },
> +};
> +MODULE_DEVICE_TABLE(of, am335x_child_of_match);
> +
> +static struct platform_driver am335x_child_driver = {
> +	.probe		= am335x_child_probe,
> +	.remove         = am335x_child_remove,
> +	.driver         = {
> +		.name   = "am335x-usb-childs",
> +		.of_match_table	= of_match_ptr(am335x_child_of_match),
> +	},
> +};
> +
> +module_platform_driver(am335x_child_driver);
> +MODULE_DESCRIPTION("AM33xx child devices");
> +MODULE_LICENSE("GPL v2");
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index 1440fac..37ebcbc 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -43,6 +43,7 @@
>   #include <linux/of.h>
>   #include <linux/of_device.h>
>   #include <linux/of_address.h>
> +#include <linux/of_irq.h>
>   
>   #include "musb_core.h"
>   
> @@ -106,10 +107,7 @@ struct dsps_musb_wrapper {
>   	/* bit positions for mode */
>   	unsigned	iddig:5;
>   	/* miscellaneous stuff */
> -	u32		musb_core_offset;
>   	u8		poll_seconds;
> -	/* number of musb instances */
> -	u8		instances;
>   };
>   
>   /**
> @@ -117,10 +115,10 @@ struct dsps_musb_wrapper {
>    */
>   struct dsps_glue {
>   	struct device *dev;
> -	struct platform_device *musb[2];	/* child musb pdev */
> +	struct platform_device *musb;	/* child musb pdev */
>   	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
> -	struct timer_list timer[2];	/* otg_workaround timer */
> -	unsigned long last_timer[2];    /* last timer data for each instance */
> +	struct timer_list timer;	/* otg_workaround timer */
> +	unsigned long last_timer;    /* last timer data for each instance */
>   };
>   
>   /**
> @@ -170,7 +168,6 @@ static void otg_timer(unsigned long _musb)
>   	struct musb *musb = (void *)_musb;
>   	void __iomem *mregs = musb->mregs;
>   	struct device *dev = musb->controller;
> -	struct platform_device *pdev = to_platform_device(dev);
>   	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
>   	const struct dsps_musb_wrapper *wrp = glue->wrp;
>   	u8 devctl;
> @@ -207,7 +204,7 @@ static void otg_timer(unsigned long _musb)
>   	case OTG_STATE_B_IDLE:
>   		devctl = dsps_readb(mregs, MUSB_DEVCTL);
>   		if (devctl & MUSB_DEVCTL_BDEVICE)
> -			mod_timer(&glue->timer[pdev->id],
> +			mod_timer(&glue->timer,
>   					jiffies + wrp->poll_seconds * HZ);
>   		else
>   			musb->xceiv->state = OTG_STATE_A_IDLE;
> @@ -221,7 +218,6 @@ static void otg_timer(unsigned long _musb)
>   static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
>   {
>   	struct device *dev = musb->controller;
> -	struct platform_device *pdev = to_platform_device(dev);
>   	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
>   
>   	if (timeout == 0)
> @@ -232,23 +228,23 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
>   				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
>   		dev_dbg(musb->controller, "%s active, deleting timer\n",
>   				usb_otg_state_string(musb->xceiv->state));
> -		del_timer(&glue->timer[pdev->id]);
> -		glue->last_timer[pdev->id] = jiffies;
> +		del_timer(&glue->timer);
> +		glue->last_timer = jiffies;
>   		return;
>   	}
>   
> -	if (time_after(glue->last_timer[pdev->id], timeout) &&
> -				timer_pending(&glue->timer[pdev->id])) {
> +	if (time_after(glue->last_timer, timeout) &&
> +				timer_pending(&glue->timer)) {
>   		dev_dbg(musb->controller,
>   			"Longer idle timer already pending, ignoring...\n");
>   		return;
>   	}
> -	glue->last_timer[pdev->id] = timeout;
> +	glue->last_timer = timeout;
>   
>   	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
>   		usb_otg_state_string(musb->xceiv->state),
>   			jiffies_to_msecs(timeout - jiffies));
> -	mod_timer(&glue->timer[pdev->id], timeout);
> +	mod_timer(&glue->timer, timeout);
>   }
>   
>   static irqreturn_t dsps_interrupt(int irq, void *hci)
> @@ -256,7 +252,6 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
>   	struct musb  *musb = hci;
>   	void __iomem *reg_base = musb->ctrl_base;
>   	struct device *dev = musb->controller;
> -	struct platform_device *pdev = to_platform_device(dev);
>   	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
>   	const struct dsps_musb_wrapper *wrp = glue->wrp;
>   	unsigned long flags;
> @@ -316,7 +311,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
>   			 */
>   			musb->int_usb &= ~MUSB_INTR_VBUSERROR;
>   			musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> -			mod_timer(&glue->timer[pdev->id],
> +			mod_timer(&glue->timer,
>   					jiffies + wrp->poll_seconds * HZ);
>   			WARNING("VBUS error workaround (delay coming)\n");
>   		} else if (drvvbus) {
> @@ -324,7 +319,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
>   			MUSB_HST_MODE(musb);
>   			musb->xceiv->otg->default_a = 1;
>   			musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> -			del_timer(&glue->timer[pdev->id]);
> +			del_timer(&glue->timer);
>   		} else {
>   			musb->is_active = 0;
>   			MUSB_DEV_MODE(musb);
> @@ -351,8 +346,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
>   
>   	/* Poll for ID change */
>   	if (musb->xceiv->state == OTG_STATE_B_IDLE)
> -		mod_timer(&glue->timer[pdev->id],
> -			 jiffies + wrp->poll_seconds * HZ);
> +		mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
>   
>   	spin_unlock_irqrestore(&musb->lock, flags);
>   
> @@ -362,31 +356,34 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
>   static int dsps_musb_init(struct musb *musb)
>   {
>   	struct device *dev = musb->controller;
> -	struct platform_device *pdev = to_platform_device(dev);
>   	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
> +	struct platform_device *parent = to_platform_device(dev->parent);
>   	const struct dsps_musb_wrapper *wrp = glue->wrp;
> -	void __iomem *reg_base = musb->ctrl_base;
> +	void __iomem *reg_base;
> +	struct resource *r;
>   	u32 rev, val;
> -	int status;
>   
> -	/* mentor core register starts at offset of 0x400 from musb base */
> -	musb->mregs += wrp->musb_core_offset;
> +	r = platform_get_resource_byname(parent, IORESOURCE_MEM, "control");
> +	if (!r)
> +		return -EINVAL;
> +
> +	reg_base = devm_ioremap_resource(dev, r);
> +	if (!musb->ctrl_base)
> +		return -EINVAL;
> +	musb->ctrl_base = reg_base;
>   
>   	/* NOP driver needs change if supporting dual instance */
> -	musb->xceiv = devm_usb_get_phy_by_phandle(glue->dev, "phys", 0);
> -	if (IS_ERR_OR_NULL(musb->xceiv))
> -		return -EPROBE_DEFER;
> +	musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0);
> +	if (IS_ERR(musb->xceiv))
> +		return PTR_ERR(musb->xceiv);
>   
>   	/* Returns zero if e.g. not clocked */
>   	rev = dsps_readl(reg_base, wrp->revision);
> -	if (!rev) {
> -		status = -ENODEV;
> -		goto err0;
> -	}
> +	if (!rev)
> +		return -ENODEV;
>   
>   	usb_phy_init(musb->xceiv);
> -
> -	setup_timer(&glue->timer[pdev->id], otg_timer, (unsigned long) musb);
> +	setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
>   
>   	/* Reset the musb */
>   	dsps_writel(reg_base, wrp->control, (1 << wrp->reset));
> @@ -402,17 +399,14 @@ static int dsps_musb_init(struct musb *musb)
>   	dsps_writel(reg_base, wrp->eoi, 0);
>   
>   	return 0;
> -err0:
> -	return status;
>   }
>   
>   static int dsps_musb_exit(struct musb *musb)
>   {
>   	struct device *dev = musb->controller;
> -	struct platform_device *pdev = to_platform_device(dev);
>   	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
>   
> -	del_timer_sync(&glue->timer[pdev->id]);
> +	del_timer_sync(&glue->timer);
>   
>   	usb_phy_shutdown(musb->xceiv);
>   	return 0;
> @@ -430,106 +424,98 @@ static struct musb_platform_ops dsps_ops = {
>   
>   static u64 musb_dmamask = DMA_BIT_MASK(32);
>   
> -static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
> +static int get_int_prop(struct device_node *dn, const char *s)
>   {
> -	struct device *dev = glue->dev;
> -	struct platform_device *pdev = to_platform_device(dev);
> -	struct musb_hdrc_platform_data  *pdata = dev->platform_data;
> -	struct device_node *np = pdev->dev.of_node;
> -	struct musb_hdrc_config	*config;
> -	struct platform_device	*musb;
> -	struct resource *res;
> +	int ret;
> +	u32 val;
> +
> +	ret = of_property_read_u32(dn, s, &val);
> +	if (ret)
> +		return 0;
> +	return val;
> +}
> +
> +static int dsps_create_musb_pdev(struct dsps_glue *glue,
> +		struct platform_device *parent)
> +{
> +	struct musb_hdrc_platform_data pdata;
>   	struct resource	resources[2];
> -	char res_name[11];
> +	struct device *dev = &parent->dev;
> +	struct musb_hdrc_config	*config;
> +	struct platform_device *musb;
> +	struct device_node *dn = parent->dev.of_node;
> +	struct device_node *child_node;
>   	int ret;
>   
> -	/* first resource is for usbss, so start index from 1 */
> -	res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
> -	if (!res) {
> -		dev_err(dev, "failed to get memory for instance %d\n", id);
> -		ret = -ENODEV;
> -		goto err0;
> +	child_node = of_get_child_by_name(dn, "usb");
> +	if (!child_node)
> +		return -EINVAL;
> +
> +	memset(resources, 0, sizeof(resources));
> +	ret = of_address_to_resource(child_node, 0, &resources[0]);
> +	if (ret) {
> +		dev_err(dev, "failed to get memory.\n");
> +		return ret;
>   	}
> -	res->parent = NULL;
> -	resources[0] = *res;
> -
> -	/* first resource is for usbss, so start index from 1 */
> -	res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1);
> -	if (!res) {
> -		dev_err(dev, "failed to get irq for instance %d\n", id);
> -		ret = -ENODEV;
> -		goto err0;
> +
> +	ret = of_irq_to_resource(child_node, 0, &resources[1]);
> +	if (ret == 0) {
> +		dev_err(dev, "failed to get irq.\n");
> +		ret = -EINVAL;
> +		return ret;
>   	}
> -	res->parent = NULL;
> -	resources[1] = *res;
> -	resources[1].name = "mc";
>   
>   	/* allocate the child platform device */
>   	musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
>   	if (!musb) {
>   		dev_err(dev, "failed to allocate musb device\n");
> -		ret = -ENOMEM;
> -		goto err0;
> +		return -ENOMEM;
>   	}
>   
>   	musb->dev.parent		= dev;
>   	musb->dev.dma_mask		= &musb_dmamask;
>   	musb->dev.coherent_dma_mask	= musb_dmamask;
> +	musb->dev.of_node		= of_node_get(child_node);
>   
> -	glue->musb[id]			= musb;
> +	glue->musb = musb;
>   
> -	ret = platform_device_add_resources(musb, resources, 2);
> +	ret = platform_device_add_resources(musb, resources,
> +			ARRAY_SIZE(resources));
>   	if (ret) {
>   		dev_err(dev, "failed to add resources\n");
> -		goto err2;
> +		goto err;
>   	}
>   
> -	if (np) {
> -		pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
> -		if (!pdata) {
> -			dev_err(&pdev->dev,
> -				"failed to allocate musb platform data\n");
> -			ret = -ENOMEM;
> -			goto err2;
> -		}
> -
> -		config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
> -		if (!config) {
> -			dev_err(&pdev->dev,
> -				"failed to allocate musb hdrc config\n");
> -			ret = -ENOMEM;
> -			goto err2;
> -		}
> -
> -		of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps);
> -		of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits);
> -		snprintf(res_name, sizeof(res_name), "port%d-mode", id);
> -		of_property_read_u32(np, res_name, (u32 *)&pdata->mode);
> -		of_property_read_u32(np, "power", (u32 *)&pdata->power);
> -		config->multipoint = of_property_read_bool(np, "multipoint");
> -
> -		pdata->config		= config;
> +	config = devm_kzalloc(&parent->dev, sizeof(*config), GFP_KERNEL);
> +	if (!config) {
> +		dev_err(dev, "failed to allocate musb hdrc config\n");
> +		ret = -ENOMEM;
> +		goto err;
>   	}
> +	pdata.config = config;
> +	pdata.platform_ops = &dsps_ops;
>   
> -	pdata->platform_ops		= &dsps_ops;
> +	config->num_eps = get_int_prop(child_node, "num-eps");
> +	config->ram_bits = get_int_prop(child_node, "ram-bits");
> +	pdata.mode = get_int_prop(child_node, "port-mode");
> +	pdata.power = get_int_prop(child_node, "power");
> +	config->multipoint = of_property_read_bool(child_node, "multipoint");
>   
> -	ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
> +	ret = platform_device_add_data(musb, &pdata, sizeof(pdata));
>   	if (ret) {
>   		dev_err(dev, "failed to add platform_data\n");
> -		goto err2;
> +		goto err;
>   	}
>   
>   	ret = platform_device_add(musb);
>   	if (ret) {
>   		dev_err(dev, "failed to register musb device\n");
> -		goto err2;
> +		goto err;
>   	}
> -
>   	return 0;
>   
> -err2:
> +err:
>   	platform_device_put(musb);
> -err0:
>   	return ret;
>   }
>   
> @@ -538,14 +524,12 @@ static int dsps_probe(struct platform_device *pdev)
>   	const struct of_device_id *match;
>   	const struct dsps_musb_wrapper *wrp;
>   	struct dsps_glue *glue;
> -	struct resource *iomem;
> -	int ret, i;
> +	int ret;
>   
>   	match = of_match_node(musb_dsps_of_match, pdev->dev.of_node);
>   	if (!match) {
>   		dev_err(&pdev->dev, "fail to get matching of_match struct\n");
> -		ret = -EINVAL;
> -		goto err0;
> +		return -EINVAL;
>   	}
>   	wrp = match->data;
>   
> @@ -553,29 +537,13 @@ static int dsps_probe(struct platform_device *pdev)
>   	glue = kzalloc(sizeof(*glue), GFP_KERNEL);
>   	if (!glue) {
>   		dev_err(&pdev->dev, "unable to allocate glue memory\n");
> -		ret = -ENOMEM;
> -		goto err0;
> -	}
> -
> -	/* get memory resource */
> -	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> -	if (!iomem) {
> -		dev_err(&pdev->dev, "failed to get usbss mem resourse\n");
> -		ret = -ENODEV;
> -		goto err1;
> +		return -ENOMEM;
>   	}
>   
>   	glue->dev = &pdev->dev;
> +	glue->wrp = wrp;
>   
> -	glue->wrp = kmemdup(wrp, sizeof(*wrp), GFP_KERNEL);
> -	if (!glue->wrp) {
> -		dev_err(&pdev->dev, "failed to duplicate wrapper struct memory\n");
> -		ret = -ENOMEM;
> -		goto err1;
> -	}
>   	platform_set_drvdata(pdev, glue);
> -
> -	/* enable the usbss clocks */
>   	pm_runtime_enable(&pdev->dev);
>   
>   	ret = pm_runtime_get_sync(&pdev->dev);
> @@ -584,17 +552,9 @@ static int dsps_probe(struct platform_device *pdev)
>   		goto err2;
>   	}
>   
> -	/* create the child platform device for all instances of musb */
> -	for (i = 0; i < wrp->instances ; i++) {
> -		ret = dsps_create_musb_pdev(glue, i);
> -		if (ret != 0) {
> -			dev_err(&pdev->dev, "failed to create child pdev\n");
> -			/* release resources of previously created instances */
> -			for (i--; i >= 0 ; i--)
> -				platform_device_unregister(glue->musb[i]);
> -			goto err3;
> -		}
> -	}
> +	ret = dsps_create_musb_pdev(glue, pdev);
> +	if (ret)
> +		goto err3;
>   
>   	return 0;
>   
> @@ -602,26 +562,19 @@ static int dsps_probe(struct platform_device *pdev)
>   	pm_runtime_put(&pdev->dev);
>   err2:
>   	pm_runtime_disable(&pdev->dev);
> -	kfree(glue->wrp);
> -err1:
>   	kfree(glue);
> -err0:
>   	return ret;
>   }
> +
>   static int dsps_remove(struct platform_device *pdev)
>   {
>   	struct dsps_glue *glue = platform_get_drvdata(pdev);
> -	const struct dsps_musb_wrapper *wrp = glue->wrp;
> -	int i;
>   
> -	/* delete the child platform device */
> -	for (i = 0; i < wrp->instances ; i++)
> -		platform_device_unregister(glue->musb[i]);
> +	platform_device_unregister(glue->musb);
>   
>   	/* disable usbss clocks */
>   	pm_runtime_put(&pdev->dev);
>   	pm_runtime_disable(&pdev->dev);
> -	kfree(glue->wrp);
>   	kfree(glue);
>   	return 0;
>   }
> @@ -652,9 +605,7 @@ static const struct dsps_musb_wrapper ti81xx_driver_data = {
>   	.rxep_shift		= 16,
>   	.rxep_mask		= 0xfffe,
>   	.rxep_bitmap		= (0xfffe << 16),
> -	.musb_core_offset	= 0x400,
>   	.poll_seconds		= 2,
> -	.instances		= 1,
>   };
>   
>   static const struct of_device_id musb_dsps_of_match[] = {
> @@ -678,14 +629,4 @@ MODULE_AUTHOR("Ravi B <ravibabu@...com>");
>   MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@...com>");
>   MODULE_LICENSE("GPL v2");
>   
> -static int __init dsps_init(void)
> -{
> -	return platform_driver_register(&dsps_usbss_driver);
> -}
> -subsys_initcall(dsps_init);
> -
> -static void __exit dsps_exit(void)
> -{
> -	platform_driver_unregister(&dsps_usbss_driver);
> -}
> -module_exit(dsps_exit);
> +module_platform_driver(dsps_usbss_driver);


-- 
-George

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ