diff options
author | Nate Case <ncase@xes-inc.com> | 2008-06-17 12:11:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-07-21 18:16:33 -0400 |
commit | 3faefc88c1a32b0b4a00b9089fab5d917996b16c (patch) | |
tree | 705994b76bea1968e3ae7d4149bd77139374220c /drivers/usb/host/isp1760-if.c | |
parent | 6d243e5c76b632a94d54cac2fe7fe8c0b41cd482 (diff) |
USB: isp1760: Support board-specific hardware configurations
This adds support for hardware configurations that don't match the
chip default register settings (e.g., 16-bit data bus, DACK and
DREQ pulled up instead of down, analog overcurrent mode).
These settings are passed in via the OF device tree. The PCI
interface still assumes the same default values.
Signed-off-by: Nate Case <ncase@xes-inc.com>
Acked-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/isp1760-if.c')
-rw-r--r-- | drivers/usb/host/isp1760-if.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index ad833661ff34..051ef7b6bdc6 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
@@ -35,6 +35,8 @@ static int of_isp1760_probe(struct of_device *dev, | |||
35 | int virq; | 35 | int virq; |
36 | u64 res_len; | 36 | u64 res_len; |
37 | int ret; | 37 | int ret; |
38 | const unsigned int *prop; | ||
39 | unsigned int devflags = 0; | ||
38 | 40 | ||
39 | ret = of_address_to_resource(dp, 0, &memory); | 41 | ret = of_address_to_resource(dp, 0, &memory); |
40 | if (ret) | 42 | if (ret) |
@@ -55,8 +57,32 @@ static int of_isp1760_probe(struct of_device *dev, | |||
55 | virq = irq_create_of_mapping(oirq.controller, oirq.specifier, | 57 | virq = irq_create_of_mapping(oirq.controller, oirq.specifier, |
56 | oirq.size); | 58 | oirq.size); |
57 | 59 | ||
60 | if (of_device_is_compatible(dp, "nxp,usb-isp1761")) | ||
61 | devflags |= ISP1760_FLAG_ISP1761; | ||
62 | |||
63 | if (of_get_property(dp, "port1-disable", NULL) != NULL) | ||
64 | devflags |= ISP1760_FLAG_PORT1_DIS; | ||
65 | |||
66 | /* Some systems wire up only 16 of the 32 data lines */ | ||
67 | prop = of_get_property(dp, "bus-width", NULL); | ||
68 | if (prop && *prop == 16) | ||
69 | devflags |= ISP1760_FLAG_BUS_WIDTH_16; | ||
70 | |||
71 | if (of_get_property(dp, "port1-otg", NULL) != NULL) | ||
72 | devflags |= ISP1760_FLAG_OTG_EN; | ||
73 | |||
74 | if (of_get_property(dp, "analog-oc", NULL) != NULL) | ||
75 | devflags |= ISP1760_FLAG_ANALOG_OC; | ||
76 | |||
77 | if (of_get_property(dp, "dack-polarity", NULL) != NULL) | ||
78 | devflags |= ISP1760_FLAG_DACK_POL_HIGH; | ||
79 | |||
80 | if (of_get_property(dp, "dreq-polarity", NULL) != NULL) | ||
81 | devflags |= ISP1760_FLAG_DREQ_POL_HIGH; | ||
82 | |||
58 | hcd = isp1760_register(memory.start, res_len, virq, | 83 | hcd = isp1760_register(memory.start, res_len, virq, |
59 | IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev)); | 84 | IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev), |
85 | devflags); | ||
60 | if (IS_ERR(hcd)) { | 86 | if (IS_ERR(hcd)) { |
61 | ret = PTR_ERR(hcd); | 87 | ret = PTR_ERR(hcd); |
62 | goto release_reg; | 88 | goto release_reg; |
@@ -87,6 +113,9 @@ static struct of_device_id of_isp1760_match[] = { | |||
87 | { | 113 | { |
88 | .compatible = "nxp,usb-isp1760", | 114 | .compatible = "nxp,usb-isp1760", |
89 | }, | 115 | }, |
116 | { | ||
117 | .compatible = "nxp,usb-isp1761", | ||
118 | }, | ||
90 | { }, | 119 | { }, |
91 | }; | 120 | }; |
92 | MODULE_DEVICE_TABLE(of, of_isp1760_match); | 121 | MODULE_DEVICE_TABLE(of, of_isp1760_match); |
@@ -116,6 +145,7 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev, | |||
116 | int length; | 145 | int length; |
117 | int status = 1; | 146 | int status = 1; |
118 | struct usb_hcd *hcd; | 147 | struct usb_hcd *hcd; |
148 | unsigned int devflags = 0; | ||
119 | 149 | ||
120 | if (usb_disabled()) | 150 | if (usb_disabled()) |
121 | return -ENODEV; | 151 | return -ENODEV; |
@@ -200,7 +230,8 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev, | |||
200 | 230 | ||
201 | dev->dev.dma_mask = NULL; | 231 | dev->dev.dma_mask = NULL; |
202 | hcd = isp1760_register(pci_mem_phy0, length, dev->irq, | 232 | hcd = isp1760_register(pci_mem_phy0, length, dev->irq, |
203 | IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev)); | 233 | IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev), |
234 | devflags); | ||
204 | pci_set_drvdata(dev, hcd); | 235 | pci_set_drvdata(dev, hcd); |
205 | if (!hcd) | 236 | if (!hcd) |
206 | return 0; | 237 | return 0; |