user: Translate the below assembly code into C programming language:

```asm
<hiusb_start_hcd>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <local_irq_save@plt>
  mov    $0x1204016c,%esi
  mov    $0x301,%edi
  call   <writel@plt>
  mov    $0x2,%edi
  call   <wait_ms@plt>
  mov    $0x1204012c,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  orl    $0x2000,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1204012c,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0xa,%edi
  call   <wait_ms@plt>
  mov    $0x12040120,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  orl    $0x800,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x12040120,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0xa,%edi
  call   <wait_ms@plt>
  mov    $0x12040120,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  andl   $0xfffff7ff,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x12040120,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0xa,%edi
  call   <wait_ms@plt>
  mov    $0x1204016c,%esi
  mov    $0x1,%edi
  call   <writel@plt>
  mov    $0x2,%edi
  call   <wait_ms@plt>
  mov    $0x1212012c,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  orl    $0x426,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1212012c,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <wait_ms@plt>
  mov    $0x1212012c,%esi
  mov    $0x0,%edi
  call   <writel@plt>
  mov    $0x2,%edi
  call   <wait_ms@plt>
  mov    $0x1204012c,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  orl    $0x2000,-0xc(%rbp)
  orl    $0x1000,-0xc(%rbp)
  orl    $0x800,-0xc(%rbp)
  orl    $0x400,-0xc(%rbp)
  orl    $0x200,-0xc(%rbp)
  orl    $0x100,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1204012c,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <wait_ms@plt>
  mov    $0x1204012c,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  andl   $0xffffdfff,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1204012c,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <wait_ms@plt>
  mov    $0x1100c2c0,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  orl    $0x80000000,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c2c0,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x1100c200,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  andl   $0xffffffef,-0xc(%rbp)
  andl   $0xfffffff7,-0xc(%rbp)
  andl   $0xffffffbf,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c200,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x14,%edi
  call   <wait_ms@plt>
  mov    $0x1100c110,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  andl   $0xffffcfff,-0xc(%rbp)
  orl    $0x1000,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c110,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x12120094,%esi
  mov    $0x0,%edi
  call   <writel@plt>
  mov    $0xa,%edi
  call   <udelay@plt>
  mov    $0x12120094,%esi
  mov    $0x1820,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <udelay@plt>
  mov    $0x12120094,%esi
  mov    $0xa,%edi
  call   <writel@plt>
  mov    $0xa,%edi
  call   <udelay@plt>
  mov    $0x12120094,%esi
  mov    $0xbb2a,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <udelay@plt>
  mov    $0x1100c2c0,%edi
  call   <readl@plt>
  mov    %eax,-0xc(%rbp)
  andl   $0x7fffffff,-0xc(%rbp)
  andl   $0xfffdffff,-0xc(%rbp)
  andl   $0xffffffc7,-0xc(%rbp)
  orl    $0x8,-0xc(%rbp)
  andl   $0xfffffff9,-0xc(%rbp)
  orl    $0x2,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c2c0,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x64,%edi
  call   <wait_ms@plt>
  movl   $0x23100000,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c108,%esi
  mov    %eax,%edi
  call   <writel@plt>
  movl   $0x23100000,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    $0x1100c10c,%esi
  mov    %eax,%edi
  call   <writel@plt>
  mov    $0x14,%edi
  call   <wait_ms@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <local_irq_restore@plt>
  nop
  leave
  ret
```

assistant: ```c
void hiusb_start_hcd(void) {
  unsigned long flags;
  unsigned int reg;
  local_irq_save(flags);
  writel(0x301, (0x1204016c));
  wait_ms(2);
  reg = readl((0x12040000 + 0x12c));
  reg |= (1 << 13);
  writel(reg, (0x12040000 + 0x12c));
  wait_ms(10);
  reg = readl((0x12040000 + 0x120));
  reg |= (1 << 11);
  writel(reg, (0x12040000 + 0x120));
  wait_ms(10);
  reg = readl((0x12040000 + 0x120));
  reg &= ~(1 << 11);
  writel(reg, (0x12040000 + 0x120));
  wait_ms(10);
  writel(0x1, (0x1204016c));
  wait_ms(2);
  reg = readl((0x12120000 + 0x12c));
  reg |= ((0x1 << 5) | (0x6 << 0) | (0x4 << 8));
  writel(reg, (0x12120000 + 0x12c));
  wait_ms(100);
  writel(0x0, (0x12120000 + 0x12c));
  wait_ms(2);
  reg = readl((0x12040000 + 0x12c));
  reg |= (1 << 13);
  reg |= (1 << 12);
  reg |= (1 << 11);
  reg |= (1 << 10);
  reg |= (1 << 9);
  reg |= (1 << 8);
  writel(reg, (0x12040000 + 0x12c));
  wait_ms(100);
  reg = readl((0x12040000 + 0x12c));
  reg &= ~((1 << 13));
  writel(reg, (0x12040000 + 0x12c));
  wait_ms(100);
  reg = readl((0x11000000) + 0xC2C0);
  reg |= (1 << 31);
  writel(reg, (0x11000000) + 0xC2C0);
  reg = readl((0x11000000) + 0xC200);
  reg &= ~(1 << 4);
  reg &= ~(1 << 3);
  reg &= ~(0x1 << 6);
  writel(reg, (0x11000000) + 0xC200);
  wait_ms(20);
  reg = readl((0x11000000) + 0xC110);
  reg &= ~((1 << 12) | (1 << 13));
  reg |= (1 << 12);
  writel(reg, (0x11000000) + 0xC110);
  writel(0x0, (0x12120000 + 0x94));
  udelay(10);
  writel(0x1820, (0x12120000 + 0x94));
  udelay(100);
  writel(0xa, (0x12120000 + 0x94));
  udelay(10);
  writel(0xbb2a, (0x12120000 + 0x94));
  udelay(100);
  reg = readl((0x11000000) + 0xC2C0);
  reg &= ~(1 << 31);
  reg &= ~(1 << 17);
  reg &= ~(0x7 << 3);
  reg |= (1 << 3);
  reg &= ~(0x3 << 1);
  reg |= (1 << 1);
  writel(reg, (0x11000000) + 0xC2C0);
  wait_ms(100);
  reg = (1 << 29) | (3 << 24) | (0x10 << 16);
  writel(reg, (0x11000000) + 0xC108);
  reg = (1 << 29) | (3 << 24) | (0x10 << 16);
  writel(reg, (0x11000000) + 0xC10C);
  wait_ms(20);
  local_irq_restore(flags);
}
```