diff options
Diffstat (limited to 'drivers/usb/host/r8a66597-hcd.c')
-rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 62 |
1 files changed, 15 insertions, 47 deletions
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index f1626e58c141..56976cc0352a 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -46,31 +46,10 @@ MODULE_LICENSE("GPL"); | |||
46 | MODULE_AUTHOR("Yoshihiro Shimoda"); | 46 | MODULE_AUTHOR("Yoshihiro Shimoda"); |
47 | MODULE_ALIAS("platform:r8a66597_hcd"); | 47 | MODULE_ALIAS("platform:r8a66597_hcd"); |
48 | 48 | ||
49 | #define DRIVER_VERSION "10 Apr 2008" | 49 | #define DRIVER_VERSION "2009-05-26" |
50 | 50 | ||
51 | static const char hcd_name[] = "r8a66597_hcd"; | 51 | static const char hcd_name[] = "r8a66597_hcd"; |
52 | 52 | ||
53 | /* module parameters */ | ||
54 | #if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597) | ||
55 | static unsigned short clock = XTAL12; | ||
56 | module_param(clock, ushort, 0644); | ||
57 | MODULE_PARM_DESC(clock, "input clock: 48MHz=32768, 24MHz=16384, 12MHz=0 " | ||
58 | "(default=0)"); | ||
59 | #endif | ||
60 | |||
61 | static unsigned short vif = LDRV; | ||
62 | module_param(vif, ushort, 0644); | ||
63 | MODULE_PARM_DESC(vif, "input VIF: 3.3V=32768, 1.5V=0(default=32768)"); | ||
64 | |||
65 | static unsigned short endian; | ||
66 | module_param(endian, ushort, 0644); | ||
67 | MODULE_PARM_DESC(endian, "data endian: big=256, little=0 (default=0)"); | ||
68 | |||
69 | static unsigned short irq_sense = 0xff; | ||
70 | module_param(irq_sense, ushort, 0644); | ||
71 | MODULE_PARM_DESC(irq_sense, "IRQ sense: low level=32, falling edge=0 " | ||
72 | "(default=32)"); | ||
73 | |||
74 | static void packet_write(struct r8a66597 *r8a66597, u16 pipenum); | 53 | static void packet_write(struct r8a66597 *r8a66597, u16 pipenum); |
75 | static int r8a66597_get_frame(struct usb_hcd *hcd); | 54 | static int r8a66597_get_frame(struct usb_hcd *hcd); |
76 | 55 | ||
@@ -136,7 +115,8 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597) | |||
136 | } | 115 | } |
137 | } while ((tmp & USBE) != USBE); | 116 | } while ((tmp & USBE) != USBE); |
138 | r8a66597_bclr(r8a66597, USBE, SYSCFG0); | 117 | r8a66597_bclr(r8a66597, USBE, SYSCFG0); |
139 | r8a66597_mdfy(r8a66597, clock, XTAL, SYSCFG0); | 118 | r8a66597_mdfy(r8a66597, get_xtal_from_pdata(r8a66597->pdata), XTAL, |
119 | SYSCFG0); | ||
140 | 120 | ||
141 | i = 0; | 121 | i = 0; |
142 | r8a66597_bset(r8a66597, XCKE, SYSCFG0); | 122 | r8a66597_bset(r8a66597, XCKE, SYSCFG0); |
@@ -203,6 +183,9 @@ static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port) | |||
203 | static int enable_controller(struct r8a66597 *r8a66597) | 183 | static int enable_controller(struct r8a66597 *r8a66597) |
204 | { | 184 | { |
205 | int ret, port; | 185 | int ret, port; |
186 | u16 vif = r8a66597->pdata->vif ? LDRV : 0; | ||
187 | u16 irq_sense = r8a66597->irq_sense_low ? INTL : 0; | ||
188 | u16 endian = r8a66597->pdata->endian ? BIGEND : 0; | ||
206 | 189 | ||
207 | ret = r8a66597_clock_enable(r8a66597); | 190 | ret = r8a66597_clock_enable(r8a66597); |
208 | if (ret < 0) | 191 | if (ret < 0) |
@@ -2373,7 +2356,7 @@ static int __init_or_module r8a66597_remove(struct platform_device *pdev) | |||
2373 | return 0; | 2356 | return 0; |
2374 | } | 2357 | } |
2375 | 2358 | ||
2376 | static int __init r8a66597_probe(struct platform_device *pdev) | 2359 | static int __devinit r8a66597_probe(struct platform_device *pdev) |
2377 | { | 2360 | { |
2378 | #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) && defined(CONFIG_HAVE_CLK) | 2361 | #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) && defined(CONFIG_HAVE_CLK) |
2379 | char clk_name[8]; | 2362 | char clk_name[8]; |
@@ -2418,6 +2401,12 @@ static int __init r8a66597_probe(struct platform_device *pdev) | |||
2418 | goto clean_up; | 2401 | goto clean_up; |
2419 | } | 2402 | } |
2420 | 2403 | ||
2404 | if (pdev->dev.platform_data == NULL) { | ||
2405 | dev_err(&pdev->dev, "no platform data\n"); | ||
2406 | ret = -ENODEV; | ||
2407 | goto clean_up; | ||
2408 | } | ||
2409 | |||
2421 | /* initialize hcd */ | 2410 | /* initialize hcd */ |
2422 | hcd = usb_create_hcd(&r8a66597_hc_driver, &pdev->dev, (char *)hcd_name); | 2411 | hcd = usb_create_hcd(&r8a66597_hc_driver, &pdev->dev, (char *)hcd_name); |
2423 | if (!hcd) { | 2412 | if (!hcd) { |
@@ -2428,6 +2417,8 @@ static int __init r8a66597_probe(struct platform_device *pdev) | |||
2428 | r8a66597 = hcd_to_r8a66597(hcd); | 2417 | r8a66597 = hcd_to_r8a66597(hcd); |
2429 | memset(r8a66597, 0, sizeof(struct r8a66597)); | 2418 | memset(r8a66597, 0, sizeof(struct r8a66597)); |
2430 | dev_set_drvdata(&pdev->dev, r8a66597); | 2419 | dev_set_drvdata(&pdev->dev, r8a66597); |
2420 | r8a66597->pdata = pdev->dev.platform_data; | ||
2421 | r8a66597->irq_sense_low = irq_trigger == IRQF_TRIGGER_LOW; | ||
2431 | 2422 | ||
2432 | #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) && defined(CONFIG_HAVE_CLK) | 2423 | #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) && defined(CONFIG_HAVE_CLK) |
2433 | snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id); | 2424 | snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id); |
@@ -2458,29 +2449,6 @@ static int __init r8a66597_probe(struct platform_device *pdev) | |||
2458 | 2449 | ||
2459 | hcd->rsrc_start = res->start; | 2450 | hcd->rsrc_start = res->start; |
2460 | 2451 | ||
2461 | /* irq_sense setting on cmdline takes precedence over resource | ||
2462 | * settings, so the introduction of irqflags in IRQ resourse | ||
2463 | * won't disturb existing setups */ | ||
2464 | switch (irq_sense) { | ||
2465 | case INTL: | ||
2466 | irq_trigger = IRQF_TRIGGER_LOW; | ||
2467 | break; | ||
2468 | case 0: | ||
2469 | irq_trigger = IRQF_TRIGGER_FALLING; | ||
2470 | break; | ||
2471 | case 0xff: | ||
2472 | if (irq_trigger) | ||
2473 | irq_sense = (irq_trigger & IRQF_TRIGGER_LOW) ? | ||
2474 | INTL : 0; | ||
2475 | else { | ||
2476 | irq_sense = INTL; | ||
2477 | irq_trigger = IRQF_TRIGGER_LOW; | ||
2478 | } | ||
2479 | break; | ||
2480 | default: | ||
2481 | dev_err(&pdev->dev, "Unknown irq_sense value.\n"); | ||
2482 | } | ||
2483 | |||
2484 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); | 2452 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); |
2485 | if (ret != 0) { | 2453 | if (ret != 0) { |
2486 | dev_err(&pdev->dev, "Failed to add hcd\n"); | 2454 | dev_err(&pdev->dev, "Failed to add hcd\n"); |