You of course need to release the reset before the kernel tries to initialise USB.
However it sounds like your USB3320 is working (as in, the ULPI communications are okay) but there is some other issue with USB, like a signal integrity issue.
If you have access to a 500MHz+ oscilloscope you can attempt to probe the ULPI signals and see if those are OK. If you have a 1GHz+ scope then you can look at the raw USB signalling layer. You could also try with an old USB hub that only supports USB 1.1, I still keep one around, it forces the USB interface into low/full speed configuration which removes a lot of the USB layer signal integrity issues.
You can also try writing a baremetal program to read and write the ULPI scratch register or if you deregister the ULPI interface from the devicetree you can do this from userspace as root. Here is a quick example, you will need to modify it to work:
#define ULPI_BASE 0xe0002000
#define ULPI_VIEWPORT_OFFS 0x170
#define ULPI_VIEWPORT_ADDR (ULPI_BASE + ULPI_VIEWPORT_OFFS)
#define ULPI_SS (1 << 27)
#define ULPI_RWCTRL (1 << 29)
#define ULPI_RWRUN (1 << 30)
#define ULPI_WU (1 << 31)
/*
* Wake the ULPI PHY up for communication
*
* returns 0 on success.
*/
int ulpi_wakeup()
{
int err;
if (readl(ULPI_VIEWPORT_OFFS) & ULPI_SS)
return 0; /* already awake */
writel(ULPI_WU, ULPI_VIEWPORT_OFFS);
err = ulpi_wait(ULPI_WU);
if (err)
printf("ULPI wakeup timed out\r\n");
return err;
}
/*
* Issue a ULPI read/write request
*
* @value - the ULPI request
*/
int ulpi_request(uint32_t value)
{
int err;
writel(value, ULPI_VIEWPORT_OFFS);
err = ulpi_wait(ULPI_RWRUN);
if (err)
printf("ULPI request timed out\r\n");
return err;
}
int ulpi_write(uint8_t reg, uint32_t value)
{
uint32_t addr = (uintptr_t)reg & 0xFF;
uint32_t val = ULPI_RWRUN | ULPI_RWCTRL | addr << 16 | (value & 0xff);
return ulpi_request(val);
}
uint32_t ulpi_read(uint8_t reg)
{
int err;
uint32_t val = ULPI_RWRUN | ((uintptr_t)reg & 0xFF) << 16;
err = ulpi_request(val);
if (err)
return err;
return (readl(ULPI_VIEWPORT_OFFS) >> 8) & 0xff;
}
`writel` and `readl` are found in kernel source, but essentially just raw read and write at memory address by mmap of /dev/mem. This is based on the kernel driver for the chipidea controller, but ported over for userspace as kernel can write addresses directly but sudo userspace needs to use /dev/mem to write private memory as it is still protected. Obviously I do not recommend this for production use, but it is okay for testing.
The scratch register is at 0x16 you should be able to write a value to this and read it back and on the scope you will see ULPI activity on each of these operations.
Note.... I do not know if you are using chipidea ULPI or not. If you have an AXI USB controller, you would need to change addresses etc. Same if you have a different ULPI driver or USB3.0 etc.