ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / board-rk30-sdk-vmac.c
1 static int rk30_vmac_register_set(void)
2 {
3         //config rk30 vmac as rmii
4         writel_relaxed(0x3 << 16 | 0x2, RK30_GRF_BASE + GRF_SOC_CON1);
5         return 0;
6 }
7
8 static int rk30_rmii_io_init(void)
9 {
10         int err;
11         rk30_mux_api_set(GPIO1D6_CIF1DATA11_NAME, GPIO1D_GPIO1D6);
12
13         rk30_mux_api_set(GPIO1D2_CIF1CLKIN_NAME, GPIO1D_GPIO1D2);
14         rk30_mux_api_set(GPIO1D1_CIF1HREF_MIIMDCLK_NAME, GPIO1D_MII_MDCLK);
15         rk30_mux_api_set(GPIO1D0_CIF1VSYNC_MIIMD_NAME, GPIO1D_MII_MD);
16
17         rk30_mux_api_set(GPIO1C7_CIFDATA9_RMIIRXD0_NAME, GPIO1C_RMII_RXD0);
18         rk30_mux_api_set(GPIO1C6_CIFDATA8_RMIIRXD1_NAME, GPIO1C_RMII_RXD1);
19         rk30_mux_api_set(GPIO1C5_CIFDATA7_RMIICRSDVALID_NAME, GPIO1C_RMII_CRS_DVALID);
20         rk30_mux_api_set(GPIO1C4_CIFDATA6_RMIIRXERR_NAME, GPIO1C_RMII_RX_ERR);
21         rk30_mux_api_set(GPIO1C3_CIFDATA5_RMIITXD0_NAME, GPIO1C_RMII_TXD0);
22         rk30_mux_api_set(GPIO1C2_CIF1DATA4_RMIITXD1_NAME, GPIO1C_RMII_TXD1);
23         rk30_mux_api_set(GPIO1C1_CIFDATA3_RMIITXEN_NAME, GPIO1C_RMII_TX_EN);
24         rk30_mux_api_set(GPIO1C0_CIF1DATA2_RMIICLKOUT_RMIICLKIN_NAME, GPIO1C_RMII_CLKOUT);
25
26         //phy power gpio
27         err = gpio_request(PHY_PWR_EN_GPIO, "phy_power_en");
28         if (err) {
29                 return -1;
30         }
31         //phy power down
32         gpio_direction_output(PHY_PWR_EN_GPIO, GPIO_LOW);
33         gpio_set_value(PHY_PWR_EN_GPIO, GPIO_LOW);
34         return 0;
35 }
36
37 static int rk30_rmii_io_deinit(void)
38 {
39         //phy power down
40         gpio_direction_output(PHY_PWR_EN_GPIO, GPIO_LOW);
41         gpio_set_value(PHY_PWR_EN_GPIO, GPIO_LOW);
42         //free
43         gpio_free(PHY_PWR_EN_GPIO);
44         return 0;
45 }
46
47 static int rk30_rmii_power_control(int enable)
48 {
49         if (enable) {
50                 //enable phy power
51                 printk("power on phy\n");
52                 rk30_mux_api_set(GPIO1D6_CIF1DATA11_NAME, GPIO1D_GPIO1D6);
53
54                 rk30_mux_api_set(GPIO1D2_CIF1CLKIN_NAME, GPIO1D_GPIO1D2);
55                 rk30_mux_api_set(GPIO1D1_CIF1HREF_MIIMDCLK_NAME, GPIO1D_MII_MDCLK);
56                 rk30_mux_api_set(GPIO1D0_CIF1VSYNC_MIIMD_NAME, GPIO1D_MII_MD);
57
58                 rk30_mux_api_set(GPIO1C7_CIFDATA9_RMIIRXD0_NAME, GPIO1C_RMII_RXD0);
59                 rk30_mux_api_set(GPIO1C6_CIFDATA8_RMIIRXD1_NAME, GPIO1C_RMII_RXD1);
60                 rk30_mux_api_set(GPIO1C5_CIFDATA7_RMIICRSDVALID_NAME, GPIO1C_RMII_CRS_DVALID);
61                 rk30_mux_api_set(GPIO1C4_CIFDATA6_RMIIRXERR_NAME, GPIO1C_RMII_RX_ERR);
62                 rk30_mux_api_set(GPIO1C3_CIFDATA5_RMIITXD0_NAME, GPIO1C_RMII_TXD0);
63                 rk30_mux_api_set(GPIO1C2_CIF1DATA4_RMIITXD1_NAME, GPIO1C_RMII_TXD1);
64                 rk30_mux_api_set(GPIO1C1_CIFDATA3_RMIITXEN_NAME, GPIO1C_RMII_TX_EN);
65                 rk30_mux_api_set(GPIO1C0_CIF1DATA2_RMIICLKOUT_RMIICLKIN_NAME, GPIO1C_RMII_CLKOUT);
66                 gpio_direction_output(PHY_PWR_EN_GPIO, GPIO_HIGH);
67                 gpio_set_value(PHY_PWR_EN_GPIO, GPIO_HIGH);
68         }else {
69                 gpio_direction_output(PHY_PWR_EN_GPIO, GPIO_LOW);
70                 gpio_set_value(PHY_PWR_EN_GPIO, GPIO_LOW);
71         }
72         return 0;
73 }
74
75 #define BIT_EMAC_SPEED      (1 << 1)
76 static int rk29_vmac_speed_switch(int speed)
77 {
78         //printk("%s--speed=%d\n", __FUNCTION__, speed);
79         if (10 == speed) {
80             writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) & (~BIT_EMAC_SPEED), RK30_GRF_BASE + GRF_SOC_CON1);
81         } else {
82             writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) | ( BIT_EMAC_SPEED), RK30_GRF_BASE + GRF_SOC_CON1);
83         }
84 }
85
86 struct rk29_vmac_platform_data board_vmac_data = {
87         .vmac_register_set = rk30_vmac_register_set,
88         .rmii_io_init = rk30_rmii_io_init,
89         .rmii_io_deinit = rk30_rmii_io_deinit,
90         .rmii_power_control = rk30_rmii_power_control,
91         .rmii_speed_switch = rk29_vmac_speed_switch,
92 };