usb: r8a66597: Remove BE support
[oweals/u-boot.git] / drivers / usb / host / r8a66597-hcd.c
index 2a4e7ff4b3720b9e1eb92acb7768f3d6ca940667..2b9f8a150a13940dc041352103dbac39ddcb7cd0 100644 (file)
@@ -1,26 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * R8A66597 HCD (Host Controller Driver) for u-boot
  *
  * Copyright (C) 2008  Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
  */
 
 #include <common.h>
+#include <console.h>
 #include <usb.h>
 #include <asm/io.h>
+#include <linux/iopoll.h>
 
 #include "r8a66597.h"
 
 #define R8A66597_DPRINT(...)
 #endif
 
-static const char hcd_name[] = "r8a66597_hcd";
-static unsigned short clock = CONFIG_R8A66597_XTAL;
-static unsigned short vif = CONFIG_R8A66597_LDRV;
-static unsigned short endian = CONFIG_R8A66597_ENDIAN;
 static struct r8a66597 gr8a66597;
 
 static void get_hub_data(struct usb_device *dev, u16 *hub_devnum, u16 *hubport)
@@ -76,17 +61,6 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
        u16 tmp;
        int i = 0;
 
-#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
-       do {
-               r8a66597_write(r8a66597, SCKE, SYSCFG0);
-               tmp = r8a66597_read(r8a66597, SYSCFG0);
-               if (i++ > 1000) {
-                       printf("register access fail.\n");
-                       return -1;
-               }
-       } while ((tmp & SCKE) != SCKE);
-       r8a66597_write(r8a66597, 0x04, 0x02);
-#else
        do {
                r8a66597_write(r8a66597, USBE, SYSCFG0);
                tmp = r8a66597_read(r8a66597, SYSCFG0);
@@ -96,32 +70,30 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
                }
        } while ((tmp & USBE) != USBE);
        r8a66597_bclr(r8a66597, USBE, SYSCFG0);
-       r8a66597_mdfy(r8a66597, clock, XTAL, SYSCFG0);
-
-       i = 0;
-       r8a66597_bset(r8a66597, XCKE, SYSCFG0);
-       do {
-               udelay(1000);
-               tmp = r8a66597_read(r8a66597, SYSCFG0);
-               if (i++ > 500) {
-                       printf("register access fail.\n");
-                       return -1;
-               }
-       } while ((tmp & SCKE) != SCKE);
-#endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */
+       /*
+        * RZ/A Only:
+        * Bits XTAL(UCKSEL) and UPLLE in SYSCFG0 for USB0 controls both USB0
+        * and USB1, so we must always set the USB0 register
+        */
+#if (CONFIG_R8A66597_XTAL == 1)
+       setbits(le16, R8A66597_BASE0, XTAL);
+#endif
+       mdelay(1);
+       setbits(le16, R8A66597_BASE0, UPLLE);
+       mdelay(1);
+       r8a66597_bset(r8a66597, SUSPM, SUSPMODE0);
 
        return 0;
 }
 
 static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
 {
-       r8a66597_bclr(r8a66597, SCKE, SYSCFG0);
-       udelay(1);
-#if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
-       r8a66597_bclr(r8a66597, PLLC, SYSCFG0);
-       r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
+       r8a66597_bclr(r8a66597, SUSPM, SUSPMODE0);
+
+       clrbits(le16, R8A66597_BASE0, UPLLE);
+       mdelay(1);
        r8a66597_bclr(r8a66597, USBE, SYSCFG0);
-#endif
+       mdelay(1);
 }
 
 static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
@@ -131,8 +103,6 @@ static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
        val = port ? DRPD : DCFM | DRPD;
        r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
        r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
-
-       r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port));
 }
 
 static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
@@ -162,17 +132,16 @@ static int enable_controller(struct r8a66597 *r8a66597)
        if (ret < 0)
                return ret;
 
-       r8a66597_bset(r8a66597, vif & LDRV, PINCFG);
        r8a66597_bset(r8a66597, USBE, SYSCFG0);
 
        r8a66597_bset(r8a66597, INTL, SOFCFG);
        r8a66597_write(r8a66597, 0, INTENB0);
-       r8a66597_write(r8a66597, 0, INTENB1);
-       r8a66597_write(r8a66597, 0, INTENB2);
+       for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
+               r8a66597_write(r8a66597, 0, get_intenb_reg(port));
 
-       r8a66597_bset(r8a66597, endian & BIGEND, CFIFOSEL);
-       r8a66597_bset(r8a66597, endian & BIGEND, D0FIFOSEL);
-       r8a66597_bset(r8a66597, endian & BIGEND, D1FIFOSEL);
+       r8a66597_bclr(r8a66597, BIGEND, CFIFOSEL);
+       r8a66597_bclr(r8a66597, BIGEND, D0FIFOSEL);
+       r8a66597_bclr(r8a66597, BIGEND, D1FIFOSEL);
        r8a66597_bset(r8a66597, TRNENSEL, SOFCFG);
 
        for (port = 0; port < R8A66597_MAX_ROOT_HUB; port++)
@@ -280,12 +249,22 @@ static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
        unsigned long setup_addr = USBREQ;
        u16 intsts1;
        int timeout = 3000;
+       u16 dcpctr;
        u16 devsel = setup->request == USB_REQ_SET_ADDRESS ? 0 : dev->devnum;
 
        r8a66597_write(r8a66597, make_devsel(devsel) |
                                 (8 << dev->maxpacketsize), DCPMAXP);
        r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1);
 
+       dcpctr = r8a66597_read(r8a66597, DCPCTR);
+       if ((dcpctr & PID) == PID_BUF) {
+               if (readw_poll_timeout(r8a66597->reg + DCPCTR, dcpctr,
+                                      dcpctr & BSTS, 1000) < 0) {
+                       printf("DCPCTR BSTS timeout!\n");
+                       return -ETIMEDOUT;
+               }
+       }
+
        for (i = 0; i < 4; i++) {
                r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr);
                setup_addr += 2;
@@ -553,116 +532,11 @@ static int check_usb_device_connecting(struct r8a66597 *r8a66597)
        return -1;      /* fail */
 }
 
-/* based on usb_ohci.c */
-#define min_t(type, x, y) \
-               ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
 /*-------------------------------------------------------------------------*
  * Virtual Root Hub
  *-------------------------------------------------------------------------*/
 
-/* Device descriptor */
-static __u8 root_hub_dev_des[] =
-{
-       0x12,       /*  __u8  bLength; */
-       0x01,       /*  __u8  bDescriptorType; Device */
-       0x10,       /*  __u16 bcdUSB; v1.1 */
-       0x01,
-       0x09,       /*  __u8  bDeviceClass; HUB_CLASSCODE */
-       0x00,       /*  __u8  bDeviceSubClass; */
-       0x00,       /*  __u8  bDeviceProtocol; */
-       0x08,       /*  __u8  bMaxPacketSize0; 8 Bytes */
-       0x00,       /*  __u16 idVendor; */
-       0x00,
-       0x00,       /*  __u16 idProduct; */
-       0x00,
-       0x00,       /*  __u16 bcdDevice; */
-       0x00,
-       0x00,       /*  __u8  iManufacturer; */
-       0x01,       /*  __u8  iProduct; */
-       0x00,       /*  __u8  iSerialNumber; */
-       0x01        /*  __u8  bNumConfigurations; */
-};
-
-/* Configuration descriptor */
-static __u8 root_hub_config_des[] =
-{
-       0x09,       /*  __u8  bLength; */
-       0x02,       /*  __u8  bDescriptorType; Configuration */
-       0x19,       /*  __u16 wTotalLength; */
-       0x00,
-       0x01,       /*  __u8  bNumInterfaces; */
-       0x01,       /*  __u8  bConfigurationValue; */
-       0x00,       /*  __u8  iConfiguration; */
-       0x40,       /*  __u8  bmAttributes; */
-
-       0x00,       /*  __u8  MaxPower; */
-
-       /* interface */
-       0x09,       /*  __u8  if_bLength; */
-       0x04,       /*  __u8  if_bDescriptorType; Interface */
-       0x00,       /*  __u8  if_bInterfaceNumber; */
-       0x00,       /*  __u8  if_bAlternateSetting; */
-       0x01,       /*  __u8  if_bNumEndpoints; */
-       0x09,       /*  __u8  if_bInterfaceClass; HUB_CLASSCODE */
-       0x00,       /*  __u8  if_bInterfaceSubClass; */
-       0x00,       /*  __u8  if_bInterfaceProtocol; */
-       0x00,       /*  __u8  if_iInterface; */
-
-       /* endpoint */
-       0x07,       /*  __u8  ep_bLength; */
-       0x05,       /*  __u8  ep_bDescriptorType; Endpoint */
-       0x81,       /*  __u8  ep_bEndpointAddress; IN Endpoint 1 */
-       0x03,       /*  __u8  ep_bmAttributes; Interrupt */
-       0x02,       /*  __u16 ep_wMaxPacketSize; ((MAX_ROOT_PORTS + 1) / 8 */
-       0x00,
-       0xff        /*  __u8  ep_bInterval; 255 ms */
-};
-
-static unsigned char root_hub_str_index0[] =
-{
-       0x04,                   /*  __u8  bLength; */
-       0x03,                   /*  __u8  bDescriptorType; String-descriptor */
-       0x09,                   /*  __u8  lang ID */
-       0x04,                   /*  __u8  lang ID */
-};
-
-static unsigned char root_hub_str_index1[] =
-{
-       34,                     /*  __u8  bLength; */
-       0x03,                   /*  __u8  bDescriptorType; String-descriptor */
-       'R',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '8',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'A',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '6',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '6',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '5',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '9',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       '7',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       ' ',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'R',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'o',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'o',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       't',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'H',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'u',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-       'b',                    /*  __u8  Unicode */
-       0,                              /*  __u8  Unicode */
-};
+#include <usbroothubdes.h>
 
 static int r8a66597_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
                        void *buffer, int transfer_len, struct devrequest *cmd)
@@ -673,7 +547,6 @@ static int r8a66597_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
        int stat = 0;
        __u16 bmRType_bReq;
        __u16 wValue;
-       __u16 wIndex;
        __u16 wLength;
        unsigned char data[32];
 
@@ -686,7 +559,6 @@ static int r8a66597_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
 
        bmRType_bReq  = cmd->requesttype | (cmd->request << 8);
        wValue        = cpu_to_le16 (cmd->value);
-       wIndex        = cpu_to_le16 (cmd->index);
        wLength       = cpu_to_le16 (cmd->length);
 
        switch (bmRType_bReq) {
@@ -908,13 +780,13 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
        return 0;
 }
 
-int usb_lowlevel_init(int index, void **controller))
+int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
 {
        struct r8a66597 *r8a66597 = &gr8a66597;
 
        R8A66597_DPRINT("%s\n", __func__);
 
-       memset(r8a66597, 0, sizeof(r8a66597));
+       memset(r8a66597, 0, sizeof(*r8a66597));
        r8a66597->reg = CONFIG_R8A66597_BASE_ADDR;
 
        disable_controller(r8a66597);