Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: m66592-udc platform data on_chip support

Convert the m66592-udc driver to use the on_chip flag
from platform data to enable on chip behaviour instead
of relying on CONFIG_SUPERH_BUILT_IN_M66592 ugliness.

This makes the code cleaner and also allows us to support
both external and internal m66592 with the same kernel.

It also makes the Kconfig part more future proof since
we with this patch can add support for new processors
with on-chip m66592 without modifying the Kconfig.

The patch adds a m66592 header file for platform data
and ties in platform data to the existing m66592 devices.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

authored by

Magnus Damm and committed by
Paul Mundt
2c59b0b7 cf4f1e76

+262 -165
+7
arch/sh/boards/mach-highlander/setup.c
··· 22 22 #include <linux/irq.h> 23 23 #include <linux/interrupt.h> 24 24 #include <linux/usb/r8a66597.h> 25 + #include <linux/usb/m66592.h> 25 26 #include <net/ax88796.h> 26 27 #include <asm/machvec.h> 27 28 #include <mach/highlander.h> ··· 61 60 .resource = r8a66597_usb_host_resources, 62 61 }; 63 62 63 + static struct m66592_platdata usbf_platdata = { 64 + .xtal = M66592_PLATDATA_XTAL_24MHZ, 65 + .vif = 1, 66 + }; 67 + 64 68 static struct resource m66592_usb_peripheral_resources[] = { 65 69 [0] = { 66 70 .name = "m66592_udc", ··· 87 81 .dev = { 88 82 .dma_mask = NULL, /* don't use dma */ 89 83 .coherent_dma_mask = 0xffffffff, 84 + .platform_data = &usbf_platdata, 90 85 }, 91 86 .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), 92 87 .resource = m66592_usb_peripheral_resources,
+7
arch/sh/boards/mach-x3proto/setup.c
··· 17 17 #include <linux/irq.h> 18 18 #include <linux/interrupt.h> 19 19 #include <linux/usb/r8a66597.h> 20 + #include <linux/usb/m66592.h> 20 21 #include <asm/ilsel.h> 21 22 22 23 static struct resource heartbeat_resources[] = { ··· 90 89 .resource = r8a66597_usb_host_resources, 91 90 }; 92 91 92 + static struct m66592_platdata usbf_platdata = { 93 + .xtal = M66592_PLATDATA_XTAL_24MHZ, 94 + .vif = 1, 95 + }; 96 + 93 97 static struct resource m66592_usb_peripheral_resources[] = { 94 98 [0] = { 95 99 .name = "m66592_udc", ··· 115 109 .dev = { 116 110 .dma_mask = NULL, /* don't use dma */ 117 111 .coherent_dma_mask = 0xffffffff, 112 + .platform_data = &usbf_platdata, 118 113 }, 119 114 .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), 120 115 .resource = m66592_usb_peripheral_resources,
+7 -1
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
··· 13 13 #include <linux/serial_sci.h> 14 14 #include <linux/mm.h> 15 15 #include <linux/uio_driver.h> 16 + #include <linux/usb/m66592.h> 16 17 #include <linux/sh_timer.h> 17 18 #include <asm/clock.h> 18 19 #include <asm/mmzone.h> ··· 48 47 .resource = rtc_resources, 49 48 }; 50 49 50 + static struct m66592_platdata usbf_platdata = { 51 + .on_chip = 1, 52 + }; 53 + 51 54 static struct resource usbf_resources[] = { 52 55 [0] = { 53 - .name = "m66592_udc", 56 + .name = "USBF", 54 57 .start = 0x04480000, 55 58 .end = 0x044800FF, 56 59 .flags = IORESOURCE_MEM, ··· 72 67 .dev = { 73 68 .dma_mask = NULL, 74 69 .coherent_dma_mask = 0xffffffff, 70 + .platform_data = &usbf_platdata, 75 71 }, 76 72 .num_resources = ARRAY_SIZE(usbf_resources), 77 73 .resource = usbf_resources,
-10
drivers/usb/gadget/Kconfig
··· 360 360 default USB_GADGET 361 361 select USB_GADGET_SELECTED 362 362 363 - config SUPERH_BUILT_IN_M66592 364 - boolean "Enable SuperH built-in USB like the M66592" 365 - depends on USB_GADGET_M66592 && CPU_SUBTYPE_SH7722 366 - help 367 - SH7722 has USB like the M66592. 368 - 369 - The transfer rate is very slow when use "Ethernet Gadget". 370 - However, this problem is improved if change a value of 371 - NET_IP_ALIGN to 4. 372 - 373 363 # 374 364 # Controllers available only in discrete form (and all PCI controllers) 375 365 #
+154 -112
drivers/usb/gadget/m66592-udc.c
··· 31 31 32 32 #include "m66592-udc.h" 33 33 34 - 35 34 MODULE_DESCRIPTION("M66592 USB gadget driver"); 36 35 MODULE_LICENSE("GPL"); 37 36 MODULE_AUTHOR("Yoshihiro Shimoda"); 38 37 MODULE_ALIAS("platform:m66592_udc"); 39 38 40 - #define DRIVER_VERSION "26 Jun 2009" 41 - 42 - /* module parameters */ 43 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 44 - static unsigned short endian = M66592_LITTLE; 45 - module_param(endian, ushort, 0644); 46 - MODULE_PARM_DESC(endian, "data endian: big=0, little=0 (default=0)"); 47 - #else 48 - static unsigned short clock = M66592_XTAL24; 49 - module_param(clock, ushort, 0644); 50 - MODULE_PARM_DESC(clock, "input clock: 48MHz=32768, 24MHz=16384, 12MHz=0 " 51 - "(default=16384)"); 52 - 53 - static unsigned short vif = M66592_LDRV; 54 - module_param(vif, ushort, 0644); 55 - MODULE_PARM_DESC(vif, "input VIF: 3.3V=32768, 1.5V=0 (default=32768)"); 56 - 57 - static unsigned short endian; 58 - module_param(endian, ushort, 0644); 59 - MODULE_PARM_DESC(endian, "data endian: big=256, little=0 (default=0)"); 60 - 61 - static unsigned short irq_sense = M66592_INTL; 62 - module_param(irq_sense, ushort, 0644); 63 - MODULE_PARM_DESC(irq_sense, "IRQ sense: low level=2, falling edge=0 " 64 - "(default=2)"); 65 - #endif 39 + #define DRIVER_VERSION "21 July 2009" 66 40 67 41 static const char udc_name[] = "m66592_udc"; 68 42 static const char *m66592_ep_name[] = { ··· 218 244 static inline void pipe_change(struct m66592 *m66592, u16 pipenum) 219 245 { 220 246 struct m66592_ep *ep = m66592->pipenum2ep[pipenum]; 247 + unsigned short mbw; 221 248 222 249 if (ep->use_dma) 223 250 return; ··· 227 252 228 253 ndelay(450); 229 254 230 - m66592_bset(m66592, M66592_MBW, ep->fifosel); 255 + if (m66592->pdata->on_chip) 256 + mbw = M66592_MBW_32; 257 + else 258 + mbw = M66592_MBW_16; 259 + 260 + m66592_bset(m66592, mbw, ep->fifosel); 231 261 } 232 262 233 263 static int pipe_buffer_setting(struct m66592 *m66592, ··· 312 332 static void pipe_initialize(struct m66592_ep *ep) 313 333 { 314 334 struct m66592 *m66592 = ep->m66592; 335 + unsigned short mbw; 315 336 316 337 m66592_mdfy(m66592, 0, M66592_CURPIPE, ep->fifosel); 317 338 ··· 324 343 325 344 ndelay(450); 326 345 327 - m66592_bset(m66592, M66592_MBW, ep->fifosel); 346 + if (m66592->pdata->on_chip) 347 + mbw = M66592_MBW_32; 348 + else 349 + mbw = M66592_MBW_16; 350 + 351 + m66592_bset(m66592, mbw, ep->fifosel); 328 352 } 329 353 } 330 354 ··· 345 359 ep->fifosel = M66592_D0FIFOSEL; 346 360 ep->fifoctr = M66592_D0FIFOCTR; 347 361 ep->fifotrn = M66592_D0FIFOTRN; 348 - #if !defined(CONFIG_SUPERH_BUILT_IN_M66592) 349 - } else if (m66592->num_dma == 1) { 362 + } else if (!m66592->pdata->on_chip && m66592->num_dma == 1) { 350 363 m66592->num_dma++; 351 364 ep->use_dma = 1; 352 365 ep->fifoaddr = M66592_D1FIFO; 353 366 ep->fifosel = M66592_D1FIFOSEL; 354 367 ep->fifoctr = M66592_D1FIFOCTR; 355 368 ep->fifotrn = M66592_D1FIFOTRN; 356 - #endif 357 369 } else { 358 370 ep->use_dma = 0; 359 371 ep->fifoaddr = M66592_CFIFO; ··· 596 612 } 597 613 } 598 614 599 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 600 615 static void init_controller(struct m66592 *m66592) 601 616 { 602 - m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ 603 - m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); 604 - m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); 605 - m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); 617 + unsigned int endian; 606 618 607 - /* This is a workaound for SH7722 2nd cut */ 608 - m66592_bset(m66592, 0x8000, M66592_DVSTCTR); 609 - m66592_bset(m66592, 0x1000, M66592_TESTMODE); 610 - m66592_bclr(m66592, 0x8000, M66592_DVSTCTR); 619 + if (m66592->pdata->on_chip) { 620 + if (m66592->pdata->endian) 621 + endian = 0; /* big endian */ 622 + else 623 + endian = M66592_LITTLE; /* little endian */ 611 624 612 - m66592_bset(m66592, M66592_INTL, M66592_INTENB1); 625 + m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ 626 + m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); 627 + m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); 628 + m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); 613 629 614 - m66592_write(m66592, 0, M66592_CFBCFG); 615 - m66592_write(m66592, 0, M66592_D0FBCFG); 616 - m66592_bset(m66592, endian, M66592_CFBCFG); 617 - m66592_bset(m66592, endian, M66592_D0FBCFG); 630 + /* This is a workaound for SH7722 2nd cut */ 631 + m66592_bset(m66592, 0x8000, M66592_DVSTCTR); 632 + m66592_bset(m66592, 0x1000, M66592_TESTMODE); 633 + m66592_bclr(m66592, 0x8000, M66592_DVSTCTR); 634 + 635 + m66592_bset(m66592, M66592_INTL, M66592_INTENB1); 636 + 637 + m66592_write(m66592, 0, M66592_CFBCFG); 638 + m66592_write(m66592, 0, M66592_D0FBCFG); 639 + m66592_bset(m66592, endian, M66592_CFBCFG); 640 + m66592_bset(m66592, endian, M66592_D0FBCFG); 641 + } else { 642 + unsigned int clock, vif, irq_sense; 643 + 644 + if (m66592->pdata->endian) 645 + endian = M66592_BIGEND; /* big endian */ 646 + else 647 + endian = 0; /* little endian */ 648 + 649 + if (m66592->pdata->vif) 650 + vif = M66592_LDRV; /* 3.3v */ 651 + else 652 + vif = 0; /* 1.5v */ 653 + 654 + switch (m66592->pdata->xtal) { 655 + case M66592_PLATDATA_XTAL_12MHZ: 656 + clock = M66592_XTAL12; 657 + break; 658 + case M66592_PLATDATA_XTAL_24MHZ: 659 + clock = M66592_XTAL24; 660 + break; 661 + case M66592_PLATDATA_XTAL_48MHZ: 662 + clock = M66592_XTAL48; 663 + break; 664 + default: 665 + pr_warning("m66592-udc: xtal configuration error\n"); 666 + clock = 0; 667 + } 668 + 669 + switch (m66592->irq_trigger) { 670 + case IRQF_TRIGGER_LOW: 671 + irq_sense = M66592_INTL; 672 + break; 673 + case IRQF_TRIGGER_FALLING: 674 + irq_sense = 0; 675 + break; 676 + default: 677 + pr_warning("m66592-udc: irq trigger config error\n"); 678 + irq_sense = 0; 679 + } 680 + 681 + m66592_bset(m66592, 682 + (vif & M66592_LDRV) | (endian & M66592_BIGEND), 683 + M66592_PINCFG); 684 + m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ 685 + m66592_mdfy(m66592, clock & M66592_XTAL, M66592_XTAL, 686 + M66592_SYSCFG); 687 + m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); 688 + m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); 689 + m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); 690 + 691 + m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); 692 + 693 + msleep(3); 694 + 695 + m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG); 696 + 697 + msleep(1); 698 + 699 + m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG); 700 + 701 + m66592_bset(m66592, irq_sense & M66592_INTL, M66592_INTENB1); 702 + m66592_write(m66592, M66592_BURST | M66592_CPU_ADR_RD_WR, 703 + M66592_DMA0CFG); 704 + } 618 705 } 619 - #else /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */ 620 - static void init_controller(struct m66592 *m66592) 621 - { 622 - m66592_bset(m66592, (vif & M66592_LDRV) | (endian & M66592_BIGEND), 623 - M66592_PINCFG); 624 - m66592_bset(m66592, M66592_HSE, M66592_SYSCFG); /* High spd */ 625 - m66592_mdfy(m66592, clock & M66592_XTAL, M66592_XTAL, M66592_SYSCFG); 626 - 627 - m66592_bclr(m66592, M66592_USBE, M66592_SYSCFG); 628 - m66592_bclr(m66592, M66592_DPRPU, M66592_SYSCFG); 629 - m66592_bset(m66592, M66592_USBE, M66592_SYSCFG); 630 - 631 - m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); 632 - 633 - msleep(3); 634 - 635 - m66592_bset(m66592, M66592_RCKE | M66592_PLLC, M66592_SYSCFG); 636 - 637 - msleep(1); 638 - 639 - m66592_bset(m66592, M66592_SCKE, M66592_SYSCFG); 640 - 641 - m66592_bset(m66592, irq_sense & M66592_INTL, M66592_INTENB1); 642 - m66592_write(m66592, M66592_BURST | M66592_CPU_ADR_RD_WR, 643 - M66592_DMA0CFG); 644 - } 645 - #endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */ 646 706 647 707 static void disable_controller(struct m66592 *m66592) 648 708 { 649 - #if !defined(CONFIG_SUPERH_BUILT_IN_M66592) 650 - m66592_bclr(m66592, M66592_SCKE, M66592_SYSCFG); 651 - udelay(1); 652 - m66592_bclr(m66592, M66592_PLLC, M66592_SYSCFG); 653 - udelay(1); 654 - m66592_bclr(m66592, M66592_RCKE, M66592_SYSCFG); 655 - udelay(1); 656 - m66592_bclr(m66592, M66592_XCKE, M66592_SYSCFG); 657 - #endif 709 + if (!m66592->pdata->on_chip) { 710 + m66592_bclr(m66592, M66592_SCKE, M66592_SYSCFG); 711 + udelay(1); 712 + m66592_bclr(m66592, M66592_PLLC, M66592_SYSCFG); 713 + udelay(1); 714 + m66592_bclr(m66592, M66592_RCKE, M66592_SYSCFG); 715 + udelay(1); 716 + m66592_bclr(m66592, M66592_XCKE, M66592_SYSCFG); 717 + } 658 718 } 659 719 660 720 static void m66592_start_xclock(struct m66592 *m66592) 661 721 { 662 - #if !defined(CONFIG_SUPERH_BUILT_IN_M66592) 663 722 u16 tmp; 664 723 665 - tmp = m66592_read(m66592, M66592_SYSCFG); 666 - if (!(tmp & M66592_XCKE)) 667 - m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); 668 - #endif 724 + if (!m66592->pdata->on_chip) { 725 + tmp = m66592_read(m66592, M66592_SYSCFG); 726 + if (!(tmp & M66592_XCKE)) 727 + m66592_bset(m66592, M66592_XCKE, M66592_SYSCFG); 728 + } 669 729 } 670 730 671 731 /*-------------------------------------------------------------------------*/ ··· 1197 1169 intsts0 = m66592_read(m66592, M66592_INTSTS0); 1198 1170 intenb0 = m66592_read(m66592, M66592_INTENB0); 1199 1171 1200 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 1201 - if (!intsts0 && !intenb0) { 1172 + if (m66592->pdata->on_chip && !intsts0 && !intenb0) { 1202 1173 /* 1203 1174 * When USB clock stops, it cannot read register. Even if a 1204 1175 * clock stops, the interrupt occurs. So this driver turn on ··· 1207 1180 intsts0 = m66592_read(m66592, M66592_INTSTS0); 1208 1181 intenb0 = m66592_read(m66592, M66592_INTENB0); 1209 1182 } 1210 - #endif 1211 1183 1212 1184 savepipe = m66592_read(m66592, M66592_CFIFOSEL); 1213 1185 ··· 1552 1526 iounmap(m66592->reg); 1553 1527 free_irq(platform_get_irq(pdev, 0), m66592); 1554 1528 m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); 1555 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 1556 - clk_disable(m66592->clk); 1557 - clk_put(m66592->clk); 1529 + #ifdef CONFIG_HAVE_CLK 1530 + if (m66592->pdata->on_chip) { 1531 + clk_disable(m66592->clk); 1532 + clk_put(m66592->clk); 1533 + } 1558 1534 #endif 1559 1535 kfree(m66592); 1560 1536 return 0; ··· 1568 1540 1569 1541 static int __init m66592_probe(struct platform_device *pdev) 1570 1542 { 1571 - struct resource *res; 1572 - int irq; 1543 + struct resource *res, *ires; 1573 1544 void __iomem *reg = NULL; 1574 1545 struct m66592 *m66592 = NULL; 1575 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 1546 + #ifdef CONFIG_HAVE_CLK 1576 1547 char clk_name[8]; 1577 1548 #endif 1578 1549 int ret = 0; ··· 1584 1557 goto clean_up; 1585 1558 } 1586 1559 1587 - irq = platform_get_irq(pdev, 0); 1588 - if (irq < 0) { 1560 + ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1561 + if (!ires) { 1589 1562 ret = -ENODEV; 1590 - pr_err("platform_get_irq error.\n"); 1563 + dev_err(&pdev->dev, 1564 + "platform_get_resource IORESOURCE_IRQ error.\n"); 1591 1565 goto clean_up; 1592 1566 } 1593 1567 ··· 1599 1571 goto clean_up; 1600 1572 } 1601 1573 1574 + if (pdev->dev.platform_data == NULL) { 1575 + dev_err(&pdev->dev, "no platform data\n"); 1576 + ret = -ENODEV; 1577 + goto clean_up; 1578 + } 1579 + 1602 1580 /* initialize ucd */ 1603 1581 m66592 = kzalloc(sizeof(struct m66592), GFP_KERNEL); 1604 1582 if (m66592 == NULL) { 1605 1583 pr_err("kzalloc error\n"); 1606 1584 goto clean_up; 1607 1585 } 1586 + 1587 + m66592->pdata = pdev->dev.platform_data; 1588 + m66592->irq_trigger = ires->flags & IRQF_TRIGGER_MASK; 1608 1589 1609 1590 spin_lock_init(&m66592->lock); 1610 1591 dev_set_drvdata(&pdev->dev, m66592); ··· 1632 1595 m66592->timer.data = (unsigned long)m66592; 1633 1596 m66592->reg = reg; 1634 1597 1635 - ret = request_irq(irq, m66592_irq, IRQF_DISABLED | IRQF_SHARED, 1598 + ret = request_irq(ires->start, m66592_irq, IRQF_DISABLED | IRQF_SHARED, 1636 1599 udc_name, m66592); 1637 1600 if (ret < 0) { 1638 1601 pr_err("request_irq error (%d)\n", ret); 1639 1602 goto clean_up; 1640 1603 } 1641 1604 1642 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 1643 - snprintf(clk_name, sizeof(clk_name), "usbf%d", pdev->id); 1644 - m66592->clk = clk_get(&pdev->dev, clk_name); 1645 - if (IS_ERR(m66592->clk)) { 1646 - dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name); 1647 - ret = PTR_ERR(m66592->clk); 1648 - goto clean_up2; 1605 + #ifdef CONFIG_HAVE_CLK 1606 + if (m66592->pdata->on_chip) { 1607 + snprintf(clk_name, sizeof(clk_name), "usbf%d", pdev->id); 1608 + m66592->clk = clk_get(&pdev->dev, clk_name); 1609 + if (IS_ERR(m66592->clk)) { 1610 + dev_err(&pdev->dev, "cannot get clock \"%s\"\n", 1611 + clk_name); 1612 + ret = PTR_ERR(m66592->clk); 1613 + goto clean_up2; 1614 + } 1615 + clk_enable(m66592->clk); 1649 1616 } 1650 - clk_enable(m66592->clk); 1651 1617 #endif 1652 1618 INIT_LIST_HEAD(&m66592->gadget.ep_list); 1653 1619 m66592->gadget.ep0 = &m66592->ep[0].ep; ··· 1692 1652 return 0; 1693 1653 1694 1654 clean_up3: 1695 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 1696 - clk_disable(m66592->clk); 1697 - clk_put(m66592->clk); 1655 + #ifdef CONFIG_HAVE_CLK 1656 + if (m66592->pdata->on_chip) { 1657 + clk_disable(m66592->clk); 1658 + clk_put(m66592->clk); 1659 + } 1698 1660 clean_up2: 1699 1661 #endif 1700 - free_irq(irq, m66592); 1662 + free_irq(ires->start, m66592); 1701 1663 clean_up: 1702 1664 if (m66592) { 1703 1665 if (m66592->ep0_req)
+43 -42
drivers/usb/gadget/m66592-udc.h
··· 23 23 #ifndef __M66592_UDC_H__ 24 24 #define __M66592_UDC_H__ 25 25 26 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 26 + #ifdef CONFIG_HAVE_CLK 27 27 #include <linux/clk.h> 28 28 #endif 29 + 30 + #include <linux/usb/m66592.h> 29 31 30 32 #define M66592_SYSCFG 0x00 31 33 #define M66592_XTAL 0xC000 /* b15-14: Crystal selection */ ··· 78 76 #define M66592_P_TST_J 0x0001 /* PERI TEST J */ 79 77 #define M66592_P_TST_NORMAL 0x0000 /* PERI Normal Mode */ 80 78 81 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 79 + /* built-in registers */ 82 80 #define M66592_CFBCFG 0x0A 83 81 #define M66592_D0FBCFG 0x0C 84 82 #define M66592_LITTLE 0x0100 /* b8: Little endian mode */ 85 - #else 83 + /* external chip case */ 86 84 #define M66592_PINCFG 0x0A 87 85 #define M66592_LDRV 0x8000 /* b15: Drive Current Adjust */ 88 86 #define M66592_BIGEND 0x0100 /* b8: Big endian mode */ ··· 102 100 #define M66592_PKTM 0x0020 /* b5: Packet mode */ 103 101 #define M66592_DENDE 0x0010 /* b4: Dend enable */ 104 102 #define M66592_OBUS 0x0004 /* b2: OUTbus mode */ 105 - #endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */ 106 103 104 + /* common case */ 107 105 #define M66592_CFIFO 0x10 108 106 #define M66592_D0FIFO 0x14 109 107 #define M66592_D1FIFO 0x18 ··· 115 113 #define M66592_REW 0x4000 /* b14: Buffer rewind */ 116 114 #define M66592_DCLRM 0x2000 /* b13: DMA buffer clear mode */ 117 115 #define M66592_DREQE 0x1000 /* b12: DREQ output enable */ 118 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 119 - #define M66592_MBW 0x0800 /* b11: Maximum bit width for FIFO */ 120 - #else 121 - #define M66592_MBW 0x0400 /* b10: Maximum bit width for FIFO */ 122 - #define M66592_MBW_8 0x0000 /* 8bit */ 123 - #define M66592_MBW_16 0x0400 /* 16bit */ 124 - #endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */ 116 + #define M66592_MBW_8 0x0000 /* 8bit */ 117 + #define M66592_MBW_16 0x0400 /* 16bit */ 118 + #define M66592_MBW_32 0x0800 /* 32bit */ 125 119 #define M66592_TRENB 0x0200 /* b9: Transaction counter enable */ 126 120 #define M66592_TRCLR 0x0100 /* b8: Transaction counter clear */ 127 121 #define M66592_DEZPM 0x0080 /* b7: Zero-length packet mode */ ··· 478 480 struct m66592 { 479 481 spinlock_t lock; 480 482 void __iomem *reg; 481 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) && defined(CONFIG_HAVE_CLK) 483 + #ifdef CONFIG_HAVE_CLK 482 484 struct clk *clk; 483 485 #endif 486 + struct m66592_platdata *pdata; 487 + unsigned long irq_trigger; 484 488 485 489 struct usb_gadget gadget; 486 490 struct usb_gadget_driver *driver; ··· 546 546 { 547 547 unsigned long fifoaddr = (unsigned long)m66592->reg + offset; 548 548 549 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 550 - len = (len + 3) / 4; 551 - insl(fifoaddr, buf, len); 552 - #else 553 - len = (len + 1) / 2; 554 - insw(fifoaddr, buf, len); 555 - #endif 549 + if (m66592->pdata->on_chip) { 550 + len = (len + 3) / 4; 551 + insl(fifoaddr, buf, len); 552 + } else { 553 + len = (len + 1) / 2; 554 + insw(fifoaddr, buf, len); 555 + } 556 556 } 557 557 558 558 static inline void m66592_write(struct m66592 *m66592, u16 val, ··· 566 566 void *buf, unsigned long len) 567 567 { 568 568 unsigned long fifoaddr = (unsigned long)m66592->reg + offset; 569 - #if defined(CONFIG_SUPERH_BUILT_IN_M66592) 570 - unsigned long count; 571 - unsigned char *pb; 572 - int i; 573 569 574 - count = len / 4; 575 - outsl(fifoaddr, buf, count); 570 + if (m66592->pdata->on_chip) { 571 + unsigned long count; 572 + unsigned char *pb; 573 + int i; 576 574 577 - if (len & 0x00000003) { 578 - pb = buf + count * 4; 579 - for (i = 0; i < (len & 0x00000003); i++) { 580 - if (m66592_read(m66592, M66592_CFBCFG)) /* little */ 581 - outb(pb[i], fifoaddr + (3 - i)); 582 - else 583 - outb(pb[i], fifoaddr + i); 575 + count = len / 4; 576 + outsl(fifoaddr, buf, count); 577 + 578 + if (len & 0x00000003) { 579 + pb = buf + count * 4; 580 + for (i = 0; i < (len & 0x00000003); i++) { 581 + if (m66592_read(m66592, M66592_CFBCFG)) /* le */ 582 + outb(pb[i], fifoaddr + (3 - i)); 583 + else 584 + outb(pb[i], fifoaddr + i); 585 + } 586 + } 587 + } else { 588 + unsigned long odd = len & 0x0001; 589 + 590 + len = len / 2; 591 + outsw(fifoaddr, buf, len); 592 + if (odd) { 593 + unsigned char *p = buf + len*2; 594 + outb(*p, fifoaddr); 584 595 } 585 596 } 586 - #else 587 - unsigned long odd = len & 0x0001; 588 - 589 - len = len / 2; 590 - outsw(fifoaddr, buf, len); 591 - if (odd) { 592 - unsigned char *p = buf + len*2; 593 - outb(*p, fifoaddr); 594 - } 595 - #endif /* #if defined(CONFIG_SUPERH_BUILT_IN_M66592) */ 596 597 } 597 598 598 599 static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
+44
include/linux/usb/m66592.h
··· 1 + /* 2 + * M66592 driver platform data 3 + * 4 + * Copyright (C) 2009 Renesas Solutions Corp. 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; version 2 of the License. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 + * 19 + */ 20 + 21 + #ifndef __LINUX_USB_M66592_H 22 + #define __LINUX_USB_M66592_H 23 + 24 + #define M66592_PLATDATA_XTAL_12MHZ 0x01 25 + #define M66592_PLATDATA_XTAL_24MHZ 0x02 26 + #define M66592_PLATDATA_XTAL_48MHZ 0x03 27 + 28 + struct m66592_platdata { 29 + /* one = on chip controller, zero = external controller */ 30 + unsigned on_chip:1; 31 + 32 + /* one = big endian, zero = little endian */ 33 + unsigned endian:1; 34 + 35 + /* (external controller only) M66592_PLATDATA_XTAL_nnMHZ */ 36 + unsigned xtal:2; 37 + 38 + /* (external controller only) one = 3.3V, zero = 1.5V */ 39 + unsigned vif:1; 40 + 41 + }; 42 + 43 + #endif /* __LINUX_USB_M66592_H */ 44 +