androidComputer: changed for display
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk30 / board-rk31-sdk-vmac.c
1 //$_FOR_ROCKCHIP_RBOX_$
2
3 static int rk30_vmac_register_set(void)
4 {
5     //config rk30 vmac as rmii
6     writel_relaxed(0x3 << 16 | 0x2, RK30_GRF_BASE + GRF_SOC_CON1);
7     int val = readl_relaxed(RK30_GRF_BASE + GRF_IO_CON3);
8     writel_relaxed(val | 0xf << 16 | 0xf, RK30_GRF_BASE + GRF_IO_CON3);
9     return 0;
10 }
11
12 static int rk30_rmii_io_init(void)
13 {
14     int err;
15     printk("enter %s ",__func__);
16
17     iomux_set(RMII_TXEN);
18     iomux_set(RMII_TXD1);
19     iomux_set(RMII_TXD0);
20     iomux_set(RMII_RXD0);
21     iomux_set(RMII_RXD1);
22     iomux_set(RMII_CLKOUT);
23     iomux_set(RMII_RXERR);
24     iomux_set(RMII_CRS);
25     iomux_set(RMII_MD);
26     iomux_set(RMII_MDCLK);
27
28     if(INVALID_GPIO != PHY_PWR_EN_GPIO)
29     {
30         //phy power gpio request
31         iomux_set(PHY_PWR_EN_IOMUX); 
32         err = gpio_request(PHY_PWR_EN_GPIO, "phy_power_en");
33         if (err) {
34             printk("request phy power en pin faile ! \n");
35             return -1;
36         }
37         //phy power down
38         gpio_direction_output(PHY_PWR_EN_GPIO, !PHY_PWR_EN_VALUE);
39     }
40
41     return 0;
42 }
43
44 static int rk30_rmii_io_deinit(void)
45 {
46     //phy power down
47     printk("enter %s ",__func__);
48
49     if(INVALID_GPIO != PHY_PWR_EN_GPIO)
50     {
51         gpio_direction_output(PHY_PWR_EN_GPIO, !PHY_PWR_EN_VALUE);
52         //free
53         gpio_free(PHY_PWR_EN_GPIO);
54     }
55
56     return 0;
57 }
58
59 static int rk30_rmii_power_control(int enable)
60 {
61     printk("enter %s ,enable = %d ",__func__,enable);
62
63     if (enable){
64             iomux_set(RMII_TXEN);
65             iomux_set(RMII_TXD1);
66             iomux_set(RMII_TXD0);
67             iomux_set(RMII_RXD0);
68             iomux_set(RMII_RXD1);
69             iomux_set(RMII_CLKOUT);
70             iomux_set(RMII_RXERR);
71             iomux_set(RMII_CRS);
72             iomux_set(RMII_MD);
73             iomux_set(RMII_MDCLK);
74
75             if(INVALID_GPIO != PHY_PWR_EN_GPIO)
76        { 
77             //reset power
78                 gpio_direction_output(PHY_PWR_EN_GPIO, !PHY_PWR_EN_VALUE);
79                 msleep(20);
80                 gpio_direction_output(PHY_PWR_EN_GPIO, PHY_PWR_EN_VALUE);
81        }        
82     }else {
83         if(INVALID_GPIO != PHY_PWR_EN_GPIO)
84         {
85                  gpio_direction_output(PHY_PWR_EN_GPIO, !PHY_PWR_EN_VALUE);
86         } 
87     }
88
89     return 0;
90 }
91
92 #define BIT_EMAC_SPEED      (1 << 1)
93 static int rk29_vmac_speed_switch(int speed)
94 {
95     //printk("%s--speed=%d\n", __FUNCTION__, speed);
96     if (10 == speed) {
97         writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) & (~BIT_EMAC_SPEED) | (BIT_EMAC_SPEED << 16), RK30_GRF_BASE + GRF_SOC_CON1);
98     } else {
99         writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) | ( BIT_EMAC_SPEED) | (BIT_EMAC_SPEED << 16), RK30_GRF_BASE + GRF_SOC_CON1);
100     }
101 }
102
103 struct rk29_vmac_platform_data board_vmac_data = {
104         .vmac_register_set = rk30_vmac_register_set,
105         .rmii_io_init = rk30_rmii_io_init,
106         .rmii_io_deinit = rk30_rmii_io_deinit,
107         .rmii_power_control = rk30_rmii_power_control,
108         .rmii_speed_switch = rk29_vmac_speed_switch,
109 };