generic: ar8216: add custom LED support for the AR8327 switch
[openwrt.git] / target / linux / generic / files / include / linux / ar8216_platform.h
1 /*
2  * AR8216 switch driver platform data
3  *
4  * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16
17 #ifndef AR8216_PLATFORM_H
18 #define AR8216_PLATFORM_H
19
20 enum ar8327_pad_mode {
21         AR8327_PAD_NC = 0,
22         AR8327_PAD_MAC2MAC_MII,
23         AR8327_PAD_MAC2MAC_GMII,
24         AR8327_PAD_MAC_SGMII,
25         AR8327_PAD_MAC2PHY_MII,
26         AR8327_PAD_MAC2PHY_GMII,
27         AR8327_PAD_MAC_RGMII,
28         AR8327_PAD_PHY_GMII,
29         AR8327_PAD_PHY_RGMII,
30         AR8327_PAD_PHY_MII,
31 };
32
33 enum ar8327_clk_delay_sel {
34         AR8327_CLK_DELAY_SEL0 = 0,
35         AR8327_CLK_DELAY_SEL1,
36         AR8327_CLK_DELAY_SEL2,
37         AR8327_CLK_DELAY_SEL3,
38 };
39
40 struct ar8327_pad_cfg {
41         enum ar8327_pad_mode mode;
42         bool rxclk_sel;
43         bool txclk_sel;
44         bool pipe_rxclk_sel;
45         bool txclk_delay_en;
46         bool rxclk_delay_en;
47         bool sgmii_delay_en;
48         enum ar8327_clk_delay_sel txclk_delay_sel;
49         enum ar8327_clk_delay_sel rxclk_delay_sel;
50 };
51
52 enum ar8327_port_speed {
53         AR8327_PORT_SPEED_10 = 0,
54         AR8327_PORT_SPEED_100,
55         AR8327_PORT_SPEED_1000,
56 };
57
58 struct ar8327_port_cfg {
59         int force_link:1;
60         enum ar8327_port_speed speed;
61         int txpause:1;
62         int rxpause:1;
63         int duplex:1;
64 };
65
66 struct ar8327_sgmii_cfg {
67         u32 sgmii_ctrl;
68         bool serdes_aen;
69 };
70
71 struct ar8327_led_cfg {
72         u32 led_ctrl0;
73         u32 led_ctrl1;
74         u32 led_ctrl2;
75         u32 led_ctrl3;
76         bool open_drain;
77 };
78
79 enum ar8327_led_num {
80         AR8327_LED_PHY0_0 = 0,
81         AR8327_LED_PHY0_1,
82         AR8327_LED_PHY0_2,
83         AR8327_LED_PHY1_0,
84         AR8327_LED_PHY1_1,
85         AR8327_LED_PHY1_2,
86         AR8327_LED_PHY2_0,
87         AR8327_LED_PHY2_1,
88         AR8327_LED_PHY2_2,
89         AR8327_LED_PHY3_0,
90         AR8327_LED_PHY3_1,
91         AR8327_LED_PHY3_2,
92         AR8327_LED_PHY4_0,
93         AR8327_LED_PHY4_1,
94         AR8327_LED_PHY4_2,
95 };
96
97 enum ar8327_led_mode {
98         AR8327_LED_MODE_HW = 0,
99         AR8327_LED_MODE_SW,
100 };
101
102 struct ar8327_led_info {
103         const char *name;
104         const char *default_trigger;
105         bool active_low;
106         enum ar8327_led_num led_num;
107         enum ar8327_led_mode mode;
108 };
109
110 #define AR8327_LED_INFO(_led, _mode, _name) {   \
111         .name = (_name),                        \
112         .led_num = AR8327_LED_ ## _led,         \
113         .mode = AR8327_LED_MODE_ ## _mode       \
114 }
115
116 struct ar8327_platform_data {
117         struct ar8327_pad_cfg *pad0_cfg;
118         struct ar8327_pad_cfg *pad5_cfg;
119         struct ar8327_pad_cfg *pad6_cfg;
120         struct ar8327_sgmii_cfg *sgmii_cfg;
121         struct ar8327_port_cfg port0_cfg;
122         struct ar8327_port_cfg port6_cfg;
123         struct ar8327_led_cfg *led_cfg;
124
125         int (*get_port_link)(unsigned port);
126
127         unsigned num_leds;
128         const struct ar8327_led_info *leds;
129 };
130
131 #endif /* AR8216_PLATFORM_H */