Subversion Repositories freemyipod

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
881 theseven 1
#include "global.h"
2
#include "core/synopsysotg/synopsysotg.h"
3
#include "soc/s5l87xx/regs.h"
4
#include "soc/s5l87xx/clockgate.h"
5
#include "soc/s5l87xx/irq.h"
6
#include "sys/time.h"
7
 
8
static const struct usb_instance* synopsysotg_instance;
9
 
10
void synopsysotg_target_enable_clocks(const struct usb_instance* instance)
11
{
12
    const struct synopsysotg_config* data = (const struct synopsysotg_config*)instance->driver_config;
13
    clockgate_enable(CLOCKGATE_USB_1, true);
14
    clockgate_enable(CLOCKGATE_USB_2, true);
15
    data->core->pcgcctl.d32 = 0;
16
    *((volatile uint32_t*)(PHYBASE + 0x00)) = 0;  /* PHY: Power up */
17
    udelay(10);
18
    *((volatile uint32_t*)(PHYBASE + 0x1c)) = 1;
19
    *((volatile uint32_t*)(PHYBASE + 0x44)) = 0xe3f;
20
    *((volatile uint32_t*)(PHYBASE + 0x08)) = 1;  /* PHY: Assert Software Reset */
21
    udelay(10);
22
    *((volatile uint32_t*)(PHYBASE + 0x08)) = 0;  /* PHY: Deassert Software Reset */
23
    udelay(10);
24
    *((volatile uint32_t*)(PHYBASE + 0x18)) = 0x600;
25
    *((volatile uint32_t*)(PHYBASE + 0x04)) = SYNOPSYSOTG_CLOCK;
26
    udelay(400);
27
}
28
 
29
void synopsysotg_target_disable_clocks(const struct usb_instance* instance)
30
{
31
    *((volatile uint32_t*)(PHYBASE + 0x00)) = 0xf;  /* PHY: Power down */
32
    udelay(10);
33
    *((volatile uint32_t*)(PHYBASE + 0x08)) = 7;  /* PHY: Assert Software Reset */
34
    udelay(10);
35
    const struct synopsysotg_config* data = (const struct synopsysotg_config*)instance->driver_config;
36
    data->core->pcgcctl.d32 = 0;
37
    clockgate_enable(CLOCKGATE_USB_1, false);
38
    clockgate_enable(CLOCKGATE_USB_2, false);
39
}
40
 
41
void synopsysotg_target_enable_irq(const struct usb_instance* instance)
42
{
43
    synopsysotg_instance = instance;
44
    s5l87xx_irq_enable(IRQ_USB_FUNC, true);
45
}
46
 
47
void synopsysotg_target_disable_irq(const struct usb_instance* instance)
48
{
49
    s5l87xx_irq_enable(IRQ_USB_FUNC, false);
50
}
51
 
52
void synopsysotg_target_clear_irq(const struct usb_instance* instance)
53
{
54
}
55
 
56
void int_usb_func_irqhandler()
57
{
58
    synopsysotg_irq(synopsysotg_instance);
59
}
60
 
61
void __attribute__((weak)) synopsysotg_irq(const struct usb_instance* instance)
62
{
63
    synopsysotg_target_disable_irq(instance);
64
}