status = "disabled";
};
- usb0_phy: phy@47401300 {
+ usb0_phy: usb-phy@47401300 {
compatible = "ti,am335x-usb-phy";
reg = <0x47401300 0x100>;
reg-names = "phy";
usb0: usb@47401000 {
compatible = "ti,musb-am33xx";
- ranges;
- #address-cells = <1>;
- #size-cells = <1>;
- reg = <0x47401000 0x200>;
- reg-names = "control";
status = "disabled";
-
- musb0: usb@47401400 {
- 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>;
+ reg = <0x47401400 0x400
+ 0x47401000 0x200>;
+ reg-names = "mc", "control";
+
+ interrupts = <18>;
+ interrupt-names = "mc";
+ dr_mode = "otg";
+ mentor,multipoint = <1>;
+ mentor,num-eps = <16>;
+ mentor,ram-bits = <12>;
+ mentor,power = <500>;
+ phys = <&usb0_phy>;
dmas = <&cppi41dma 0 0 &cppi41dma 1 0
&cppi41dma 2 0 &cppi41dma 3 0
"tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
"tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
"tx14", "tx15";
- };
};
- usb1_phy: phy@47401b00 {
+ usb1_phy: usb-phy@47401b00 {
compatible = "ti,am335x-usb-phy";
reg = <0x47401b00 0x100>;
reg-names = "phy";
usb1: usb@47401800 {
compatible = "ti,musb-am33xx";
- ranges;
- #address-cells = <1>;
- #size-cells = <1>;
- reg = <0x47401800 0x200>;
- reg-names = "control";
status = "disabled";
-
- musb1: usb@47401c00 {
- 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>;
+ reg = <0x47401c00 0x400
+ 0x47401800 0x200>;
+ reg-names = "mc", "control";
+ interrupts = <19>;
+ interrupt-names = "mc";
+ dr_mode = "otg";
+ mentor,multipoint = <1>;
+ mentor,num-eps = <16>;
+ mentor,ram-bits = <12>;
+ mentor,power = <500>;
+ phys = <&usb1_phy>;
dmas = <&cppi41dma 15 0 &cppi41dma 16 0
&cppi41dma 17 0 &cppi41dma 18 0
"tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
"tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
"tx14", "tx15";
- };
};
- cppi41dma: dma@07402000 {
+ cppi41dma: dma-controller@07402000 {
compatible = "ti,am3359-cppi41";
reg = <0x47400000 0x1000
0x47402000 0x1000
#include <linux/of_device.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
+#include <linux/usb/of.h>
#include "musb_core.h"
return val;
}
+static int get_musb_port_mode(struct device *dev)
+{
+ enum usb_dr_mode mode;
+
+ mode = of_usb_get_dr_mode(dev->of_node);
+ switch (mode) {
+ case USB_DR_MODE_HOST:
+ return MUSB_PORT_MODE_HOST;
+
+ case USB_DR_MODE_PERIPHERAL:
+ return MUSB_PORT_MODE_GADGET;
+
+ case USB_DR_MODE_UNKNOWN:
+ case USB_DR_MODE_OTG:
+ default:
+ return MUSB_PORT_MODE_DUAL_ROLE;
+ };
+}
+
static int dsps_create_musb_pdev(struct dsps_glue *glue,
struct platform_device *parent)
{
struct musb_hdrc_platform_data pdata;
struct resource resources[2];
+ struct resource *res;
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;
- 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) {
+ res = platform_get_resource_byname(parent, IORESOURCE_MEM, "mc");
+ if (!res) {
dev_err(dev, "failed to get memory.\n");
- return ret;
+ return -EINVAL;
}
+ resources[0] = *res;
- ret = of_irq_to_resource(child_node, 0, &resources[1]);
- if (ret == 0) {
+ res = platform_get_resource_byname(parent, IORESOURCE_IRQ, "mc");
+ if (!res) {
dev_err(dev, "failed to get irq.\n");
- ret = -EINVAL;
- return ret;
+ return -EINVAL;
}
+ resources[1] = *res;
/* allocate the child platform device */
musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
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);
+ musb->dev.of_node = of_node_get(dn);
glue->musb = musb;
pdata.config = config;
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");
+ config->num_eps = get_int_prop(dn, "mentor,num-eps");
+ config->ram_bits = get_int_prop(dn, "mentor,ram-bits");
+ pdata.mode = get_musb_port_mode(dev);
+ /* DT keeps this entry in mA, musb expects it as per USB spec */
+ pdata.power = get_int_prop(dn, "mentor,power") / 2;
+ config->multipoint = of_property_read_bool(dn, "mentor,multipoint");
ret = platform_device_add_data(musb, &pdata, sizeof(pdata));
if (ret) {