source: trunk/target/linux/ppc40x/patches/120-usb-isp116x-hcd-add-of-binding.patch @ 27826

Last change on this file since 27826 was 27826, checked in by kaloz, 5 years ago

[ppc40x]: upgrade to 3.0 (magicbox ata and openrb usb is broken, but the current kernel didn't compile at all, so...)

File size: 7.0 KB
  • drivers/usb/host/isp116x-hcd.c

    a b static struct hc_driver isp116x_hc_drive 
    15351535 
    15361536/*----------------------------------------------------------------*/ 
    15371537 
     1538#ifdef CONFIG_USB_ISP116X_HCD_PLATFORM 
    15381539static int isp116x_remove(struct platform_device *pdev) 
    15391540{ 
    15401541        struct usb_hcd *hcd = platform_get_drvdata(pdev); 
    static struct platform_driver isp116x_dr 
    17081709        }, 
    17091710}; 
    17101711 
     1712static inline int isp116x_platform_register(void) 
     1713{ 
     1714        return platform_driver_register(&isp116x_driver); 
     1715} 
     1716 
     1717static inline void isp116x_platform_unregister(void) 
     1718{ 
     1719        platform_driver_unregister(&isp116x_driver); 
     1720} 
     1721#else 
     1722static inline int isp116x_platform_register(void) { return 0; }; 
     1723static void isp116x_platform_unregister(void) {}; 
     1724#endif /* CONFIG_USB_ISP116X_PLATFORM */ 
     1725 
     1726/*-----------------------------------------------------------------*/ 
     1727 
     1728#ifdef CONFIG_USB_ISP116X_HCD_OF 
     1729 
     1730#include <linux/of.h> 
     1731#include <linux/of_device.h> 
     1732#include <linux/of_platform.h> 
     1733 
     1734#ifdef USE_PLATFORM_DELAY 
     1735static void isp116x_of_delay(struct device *ddev, int delay) 
     1736{ 
     1737        ndelay(delay); 
     1738} 
     1739#else 
     1740#define isp116x_of_delay        NULL 
     1741#endif 
     1742 
     1743static int __devinit isp116x_of_probe(struct of_device *op, 
     1744                                      const struct of_device_id *match) 
     1745{ 
     1746        struct device_node *dn = op->node; 
     1747        struct usb_hcd *hcd; 
     1748        struct isp116x *isp116x; 
     1749        struct resource addr, data, ires; 
     1750        struct isp116x_platform_data *board; 
     1751        void __iomem *addr_reg; 
     1752        void __iomem *data_reg; 
     1753        int irq; 
     1754        int ret = 0; 
     1755        unsigned long irqflags; 
     1756 
     1757        ret = of_address_to_resource(dn, 0, &data); 
     1758        if (ret) 
     1759                return ret; 
     1760 
     1761        ret = of_address_to_resource(dn, 1, &addr); 
     1762        if (ret) 
     1763                return ret; 
     1764 
     1765        ret = of_irq_to_resource(dn, 1, &ires); 
     1766        if (ret) 
     1767                return ret; 
     1768 
     1769        irqflags = ires.flags & IRQF_TRIGGER_MASK; 
     1770 
     1771        board = kzalloc(sizeof(struct isp116x_platform_data), GFP_KERNEL); 
     1772        if (board == NULL) 
     1773                return -ENOMEM; 
     1774 
     1775        if (!request_mem_region(addr.start, resource_size(&addr), hcd_name)) { 
     1776                ret = -EBUSY; 
     1777                goto err_free_board; 
     1778        } 
     1779 
     1780        addr_reg = ioremap_nocache(addr.start, resource_size(&addr)); 
     1781        if (addr_reg == NULL) { 
     1782                ret = -ENOMEM; 
     1783                goto err_release_addr; 
     1784        } 
     1785 
     1786        if (!request_mem_region(data.start, resource_size(&data), hcd_name)) { 
     1787                ret = -EBUSY; 
     1788                goto err_unmap_addr; 
     1789        } 
     1790 
     1791        data_reg = ioremap_nocache(data.start, resource_size(&data)); 
     1792        if (data_reg == NULL) { 
     1793                ret = -ENOMEM; 
     1794                goto err_release_data; 
     1795        } 
     1796 
     1797        irq = irq_of_parse_and_map(op->node, 0); 
     1798        if (irq == NO_IRQ) { 
     1799                ret = -EINVAL; 
     1800                goto err_unmap_data; 
     1801        } 
     1802 
     1803        /* allocate and initialize hcd */ 
     1804        hcd = usb_create_hcd(&isp116x_hc_driver, &op->dev, dev_name(&op->dev)); 
     1805        if (!hcd) { 
     1806                ret = -ENOMEM; 
     1807                goto err_irq_dispose; 
     1808        } 
     1809 
     1810        /* this rsrc_start is bogus */ 
     1811        hcd->rsrc_start = addr.start; 
     1812        isp116x = hcd_to_isp116x(hcd); 
     1813        isp116x->data_reg = data_reg; 
     1814        isp116x->addr_reg = addr_reg; 
     1815        isp116x->board = board; 
     1816        spin_lock_init(&isp116x->lock); 
     1817        INIT_LIST_HEAD(&isp116x->async); 
     1818 
     1819        board->delay = isp116x_of_delay; 
     1820        if (of_get_property(dn, "sel15Kres", NULL)) 
     1821                board->sel15Kres = 1; 
     1822        if (of_get_property(dn, "oc_enable", NULL)) 
     1823                board->oc_enable = 1; 
     1824        if (of_get_property(dn, "remote_wakeup_enable", NULL)) 
     1825                board->remote_wakeup_enable = 1; 
     1826 
     1827        if (of_get_property(dn, "int_act_high", NULL)) 
     1828                board->int_act_high = 1; 
     1829        if (of_get_property(dn, "int_edge_triggered", NULL)) 
     1830                board->int_edge_triggered = 1; 
     1831 
     1832        ret = usb_add_hcd(hcd, irq, irqflags | IRQF_DISABLED); 
     1833        if (ret) 
     1834                goto err_put_hcd; 
     1835 
     1836        ret = create_debug_file(isp116x); 
     1837        if (ret) { 
     1838                ERR("Couldn't create debugfs entry\n"); 
     1839                goto err_remove_hcd; 
     1840        } 
     1841 
     1842        return 0; 
     1843 
     1844 err_remove_hcd: 
     1845        usb_remove_hcd(hcd); 
     1846 err_put_hcd: 
     1847        usb_put_hcd(hcd); 
     1848 err_irq_dispose: 
     1849        irq_dispose_mapping(irq); 
     1850 err_unmap_data: 
     1851        iounmap(data_reg); 
     1852 err_release_data: 
     1853        release_mem_region(data.start, resource_size(&data)); 
     1854 err_unmap_addr: 
     1855        iounmap(addr_reg); 
     1856 err_release_addr: 
     1857        release_mem_region(addr.start, resource_size(&addr)); 
     1858 err_free_board: 
     1859        kfree(board); 
     1860        return ret; 
     1861} 
     1862 
     1863static __devexit int isp116x_of_remove(struct of_device *op) 
     1864{ 
     1865        struct usb_hcd *hcd = dev_get_drvdata(&op->dev); 
     1866        struct isp116x *isp116x; 
     1867        struct resource res; 
     1868 
     1869        if (!hcd) 
     1870                return 0; 
     1871 
     1872        dev_set_drvdata(&op->dev, NULL); 
     1873 
     1874        isp116x = hcd_to_isp116x(hcd); 
     1875        remove_debug_file(isp116x); 
     1876        usb_remove_hcd(hcd); 
     1877 
     1878        irq_dispose_mapping(hcd->irq); 
     1879 
     1880        iounmap(isp116x->data_reg); 
     1881        (void) of_address_to_resource(op->node, 0, &res); 
     1882        release_mem_region(res.start, resource_size(&res)); 
     1883 
     1884        iounmap(isp116x->addr_reg); 
     1885        (void) of_address_to_resource(op->node, 1, &res); 
     1886        release_mem_region(res.start, resource_size(&res)); 
     1887 
     1888        kfree(isp116x->board); 
     1889        usb_put_hcd(hcd); 
     1890 
     1891        return 0; 
     1892} 
     1893 
     1894static struct of_device_id isp116x_of_match[] = { 
     1895        { .compatible = "isp116x-hcd", }, 
     1896        {}, 
     1897}; 
     1898 
     1899static struct of_platform_driver isp116x_of_platform_driver = { 
     1900        .owner          = THIS_MODULE, 
     1901        .name           = "isp116x-hcd-of", 
     1902        .match_table    = isp116x_of_match, 
     1903        .probe          = isp116x_of_probe, 
     1904        .remove         = __devexit_p(isp116x_of_remove), 
     1905        .driver         = { 
     1906                .name   = "isp116x-hcd-of", 
     1907                .owner  = THIS_MODULE, 
     1908        }, 
     1909}; 
     1910 
     1911static int __init isp116x_of_register(void) 
     1912{ 
     1913        return of_register_platform_driver(&isp116x_of_platform_driver); 
     1914} 
     1915 
     1916static void __exit isp116x_of_unregister(void) 
     1917{ 
     1918        of_unregister_platform_driver(&isp116x_of_platform_driver); 
     1919} 
     1920 
     1921MODULE_DEVICE_TABLE(of, isp116x_of_match); 
     1922 
     1923#else 
     1924static inline int isp116x_of_register(void) { return 0; }; 
     1925static void isp116x_of_unregister(void) {}; 
     1926#endif /* CONFIG_USB_ISP116X_HCD_OF */ 
     1927 
    17111928/*-----------------------------------------------------------------*/ 
    17121929 
    17131930static int __init isp116x_init(void) 
    17141931{ 
     1932        int ret; 
     1933 
    17151934        if (usb_disabled()) 
    17161935                return -ENODEV; 
    17171936 
    17181937        INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION); 
    1719         return platform_driver_register(&isp116x_driver); 
     1938        ret = isp116x_platform_register(); 
     1939        if (ret) 
     1940                return ret; 
     1941 
     1942        ret = isp116x_of_register(); 
     1943        if (ret) 
     1944                goto err_platform_unregister; 
     1945 
     1946        return 0; 
     1947 
     1948 err_platform_unregister: 
     1949        isp116x_platform_unregister(); 
     1950        return ret; 
    17201951} 
    17211952 
    17221953module_init(isp116x_init); 
    17231954 
    17241955static void __exit isp116x_cleanup(void) 
    17251956{ 
    1726         platform_driver_unregister(&isp116x_driver); 
     1957        isp116x_of_unregister(); 
     1958        isp116x_platform_unregister(); 
    17271959} 
    17281960 
    17291961module_exit(isp116x_cleanup); 
  • drivers/usb/host/Kconfig

    a b config USB_ISP116X_HCD 
    242242          To compile this driver as a module, choose M here: the 
    243243          module will be called isp116x-hcd. 
    244244 
     245config USB_ISP116X_HCD_PLATFORM 
     246        bool "ISP116X support for controllers on platform bus" 
     247        depends on USB_ISP116X_HCD 
     248        default n if PPC_OF 
     249        default y 
     250        ---help--- 
     251          Enables support for the ISP116x USB controller present on the 
     252          platform bus. 
     253 
     254config USB_ISP116X_HCD_OF 
     255        bool "ISP116X support for controllers on OF platform bus" 
     256        depends on USB_ISP116X_HCD && PPC_OF 
     257        default y if PPC_OF 
     258        default n 
     259        ---help--- 
     260          Enables support for the ISP116x USB controller present on the 
     261          OpenFirmware platform bus. 
     262 
    245263config USB_ISP1760_HCD 
    246264        tristate "ISP 1760 HCD support" 
    247265        depends on USB && EXPERIMENTAL 
Note: See TracBrowser for help on using the repository browser.