@@ -237,14 +237,12 @@ struct exar8250_platform {
237
237
* struct exar8250_board - board information
238
238
* @num_ports: number of serial ports
239
239
* @reg_shift: describes UART register mapping in PCI memory
240
- * @board_init: quirk run once at ->probe() stage before setting up ports
241
240
* @setup: quirk run at ->probe() stage for each port
242
241
* @exit: quirk run at ->remove() stage
243
242
*/
244
243
struct exar8250_board {
245
244
unsigned int num_ports ;
246
245
unsigned int reg_shift ;
247
- int (* board_init )(struct exar8250 * priv , struct pci_dev * pcidev );
248
246
int (* setup )(struct exar8250 * priv , struct pci_dev * pcidev ,
249
247
struct uart_8250_port * port , int idx );
250
248
void (* exit )(struct pci_dev * pcidev );
@@ -907,9 +905,6 @@ static int cti_port_setup_common(struct exar8250 *priv,
907
905
{
908
906
int ret ;
909
907
910
- if (priv -> osc_freq == 0 )
911
- return - EINVAL ;
912
-
913
908
port -> port .port_id = idx ;
914
909
port -> port .uartclk = priv -> osc_freq ;
915
910
@@ -927,13 +922,44 @@ static int cti_port_setup_common(struct exar8250 *priv,
927
922
return 0 ;
928
923
}
929
924
925
+ static int cti_board_init_fpga (struct exar8250 * priv , struct pci_dev * pcidev )
926
+ {
927
+ int ret ;
928
+ u16 cfg_val ;
929
+
930
+ // FPGA OSC is fixed to the 33MHz PCI clock
931
+ priv -> osc_freq = CTI_DEFAULT_FPGA_OSC_FREQ ;
932
+
933
+ // Enable external interrupts in special cfg space register
934
+ ret = pci_read_config_word (pcidev , CTI_FPGA_CFG_INT_EN_REG , & cfg_val );
935
+ if (ret )
936
+ return pcibios_err_to_errno (ret );
937
+
938
+ cfg_val |= CTI_FPGA_CFG_INT_EN_EXT_BIT ;
939
+ ret = pci_write_config_word (pcidev , CTI_FPGA_CFG_INT_EN_REG , cfg_val );
940
+ if (ret )
941
+ return pcibios_err_to_errno (ret );
942
+
943
+ // RS485 gate needs to be enabled; otherwise RTS/CTS will not work
944
+ exar_write_reg (priv , CTI_FPGA_RS485_IO_REG , 0x01 );
945
+
946
+ return 0 ;
947
+ }
948
+
930
949
static int cti_port_setup_fpga (struct exar8250 * priv ,
931
950
struct pci_dev * pcidev ,
932
951
struct uart_8250_port * port ,
933
952
int idx )
934
953
{
935
954
enum cti_port_type port_type ;
936
955
unsigned int offset ;
956
+ int ret ;
957
+
958
+ if (idx == 0 ) {
959
+ ret = cti_board_init_fpga (priv , pcidev );
960
+ if (ret )
961
+ return ret ;
962
+ }
937
963
938
964
port_type = cti_get_port_type_fpga (priv , pcidev , idx );
939
965
@@ -953,6 +979,12 @@ static int cti_port_setup_fpga(struct exar8250 *priv,
953
979
return cti_port_setup_common (priv , pcidev , idx , offset , port );
954
980
}
955
981
982
+ static void cti_board_init_xr17v35x (struct exar8250 * priv , struct pci_dev * pcidev )
983
+ {
984
+ // XR17V35X uses the PCIe clock rather than an oscillator
985
+ priv -> osc_freq = CTI_DEFAULT_PCIE_OSC_FREQ ;
986
+ }
987
+
956
988
static int cti_port_setup_xr17v35x (struct exar8250 * priv ,
957
989
struct pci_dev * pcidev ,
958
990
struct uart_8250_port * port ,
@@ -962,6 +994,9 @@ static int cti_port_setup_xr17v35x(struct exar8250 *priv,
962
994
unsigned int offset ;
963
995
int ret ;
964
996
997
+ if (idx == 0 )
998
+ cti_board_init_xr17v35x (priv , pcidev );
999
+
965
1000
port_type = cti_get_port_type_xr17v35x (priv , pcidev , idx );
966
1001
967
1002
offset = idx * UART_EXAR_XR17V35X_PORT_OFFSET ;
@@ -999,6 +1034,22 @@ static int cti_port_setup_xr17v35x(struct exar8250 *priv,
999
1034
return 0 ;
1000
1035
}
1001
1036
1037
+ static void cti_board_init_xr17v25x (struct exar8250 * priv , struct pci_dev * pcidev )
1038
+ {
1039
+ cti_board_init_osc_freq (priv , pcidev , CTI_EE_OFF_XR17V25X_OSC_FREQ );
1040
+
1041
+ /* enable interrupts on cards that need the "PLX fix" */
1042
+ switch (pcidev -> subsystem_device ) {
1043
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS :
1044
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_A :
1045
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_B :
1046
+ cti_plx_int_enable (priv );
1047
+ break ;
1048
+ default :
1049
+ break ;
1050
+ }
1051
+ }
1052
+
1002
1053
static int cti_port_setup_xr17v25x (struct exar8250 * priv ,
1003
1054
struct pci_dev * pcidev ,
1004
1055
struct uart_8250_port * port ,
@@ -1008,6 +1059,9 @@ static int cti_port_setup_xr17v25x(struct exar8250 *priv,
1008
1059
unsigned int offset ;
1009
1060
int ret ;
1010
1061
1062
+ if (idx == 0 )
1063
+ cti_board_init_xr17v25x (priv , pcidev );
1064
+
1011
1065
port_type = cti_get_port_type_xr17c15x_xr17v25x (priv , pcidev , idx );
1012
1066
1013
1067
offset = idx * UART_EXAR_XR17V25X_PORT_OFFSET ;
@@ -1055,6 +1109,25 @@ static int cti_port_setup_xr17v25x(struct exar8250 *priv,
1055
1109
return 0 ;
1056
1110
}
1057
1111
1112
+ static void cti_board_init_xr17c15x (struct exar8250 * priv , struct pci_dev * pcidev )
1113
+ {
1114
+ cti_board_init_osc_freq (priv , pcidev , CTI_EE_OFF_XR17C15X_OSC_FREQ );
1115
+
1116
+ /* enable interrupts on cards that need the "PLX fix" */
1117
+ switch (pcidev -> subsystem_device ) {
1118
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS :
1119
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_A :
1120
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_B :
1121
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS_OPTO :
1122
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_A :
1123
+ case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_B :
1124
+ cti_plx_int_enable (priv );
1125
+ break ;
1126
+ default :
1127
+ break ;
1128
+ }
1129
+ }
1130
+
1058
1131
static int cti_port_setup_xr17c15x (struct exar8250 * priv ,
1059
1132
struct pci_dev * pcidev ,
1060
1133
struct uart_8250_port * port ,
@@ -1063,6 +1136,9 @@ static int cti_port_setup_xr17c15x(struct exar8250 *priv,
1063
1136
enum cti_port_type port_type ;
1064
1137
unsigned int offset ;
1065
1138
1139
+ if (idx == 0 )
1140
+ cti_board_init_xr17c15x (priv , pcidev );
1141
+
1066
1142
port_type = cti_get_port_type_xr17c15x_xr17v25x (priv , pcidev , idx );
1067
1143
1068
1144
offset = idx * UART_EXAR_XR17C15X_PORT_OFFSET ;
@@ -1096,78 +1172,6 @@ static int cti_port_setup_xr17c15x(struct exar8250 *priv,
1096
1172
return cti_port_setup_common (priv , pcidev , idx , offset , port );
1097
1173
}
1098
1174
1099
- static int cti_board_init_xr17v35x (struct exar8250 * priv ,
1100
- struct pci_dev * pcidev )
1101
- {
1102
- // XR17V35X uses the PCIe clock rather than an oscillator
1103
- priv -> osc_freq = CTI_DEFAULT_PCIE_OSC_FREQ ;
1104
-
1105
- return 0 ;
1106
- }
1107
-
1108
- static int cti_board_init_xr17v25x (struct exar8250 * priv , struct pci_dev * pcidev )
1109
- {
1110
- cti_board_init_osc_freq (priv , pcidev , CTI_EE_OFF_XR17V25X_OSC_FREQ );
1111
-
1112
- /* enable interrupts on cards that need the "PLX fix" */
1113
- switch (pcidev -> subsystem_device ) {
1114
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_XPRS :
1115
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_A :
1116
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_16_XPRS_B :
1117
- cti_plx_int_enable (priv );
1118
- break ;
1119
- default :
1120
- break ;
1121
- }
1122
-
1123
- return 0 ;
1124
- }
1125
-
1126
- static int cti_board_init_xr17c15x (struct exar8250 * priv , struct pci_dev * pcidev )
1127
- {
1128
- cti_board_init_osc_freq (priv , pcidev , CTI_EE_OFF_XR17C15X_OSC_FREQ );
1129
-
1130
- /* enable interrupts on cards that need the "PLX fix" */
1131
- switch (pcidev -> subsystem_device ) {
1132
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS :
1133
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_A :
1134
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_B :
1135
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_XPRS_OPTO :
1136
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_A :
1137
- case PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_XPRS_OPTO_B :
1138
- cti_plx_int_enable (priv );
1139
- break ;
1140
- default :
1141
- break ;
1142
- }
1143
-
1144
- return 0 ;
1145
- }
1146
-
1147
- static int cti_board_init_fpga (struct exar8250 * priv , struct pci_dev * pcidev )
1148
- {
1149
- int ret ;
1150
- u16 cfg_val ;
1151
-
1152
- // FPGA OSC is fixed to the 33MHz PCI clock
1153
- priv -> osc_freq = CTI_DEFAULT_FPGA_OSC_FREQ ;
1154
-
1155
- // Enable external interrupts in special cfg space register
1156
- ret = pci_read_config_word (pcidev , CTI_FPGA_CFG_INT_EN_REG , & cfg_val );
1157
- if (ret )
1158
- return pcibios_err_to_errno (ret );
1159
-
1160
- cfg_val |= CTI_FPGA_CFG_INT_EN_EXT_BIT ;
1161
- ret = pci_write_config_word (pcidev , CTI_FPGA_CFG_INT_EN_REG , cfg_val );
1162
- if (ret )
1163
- return pcibios_err_to_errno (ret );
1164
-
1165
- // RS485 gate needs to be enabled; otherwise RTS/CTS will not work
1166
- exar_write_reg (priv , CTI_FPGA_RS485_IO_REG , 0x01 );
1167
-
1168
- return 0 ;
1169
- }
1170
-
1171
1175
static int
1172
1176
pci_xr17c154_setup (struct exar8250 * priv , struct pci_dev * pcidev ,
1173
1177
struct uart_8250_port * port , int idx )
@@ -1574,15 +1578,6 @@ exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
1574
1578
if (rc )
1575
1579
return rc ;
1576
1580
1577
- if (board -> board_init ) {
1578
- rc = board -> board_init (priv , pcidev );
1579
- if (rc ) {
1580
- dev_err_probe (& pcidev -> dev , rc ,
1581
- "failed to init serial board\n" );
1582
- return rc ;
1583
- }
1584
- }
1585
-
1586
1581
for (i = 0 ; i < nr_ports && i < maxnr ; i ++ ) {
1587
1582
rc = board -> setup (priv , pcidev , & uart , i );
1588
1583
if (rc ) {
@@ -1664,22 +1659,18 @@ static const struct exar8250_board pbn_fastcom335_8 = {
1664
1659
};
1665
1660
1666
1661
static const struct exar8250_board pbn_cti_xr17c15x = {
1667
- .board_init = cti_board_init_xr17c15x ,
1668
1662
.setup = cti_port_setup_xr17c15x ,
1669
1663
};
1670
1664
1671
1665
static const struct exar8250_board pbn_cti_xr17v25x = {
1672
- .board_init = cti_board_init_xr17v25x ,
1673
1666
.setup = cti_port_setup_xr17v25x ,
1674
1667
};
1675
1668
1676
1669
static const struct exar8250_board pbn_cti_xr17v35x = {
1677
- .board_init = cti_board_init_xr17v35x ,
1678
1670
.setup = cti_port_setup_xr17v35x ,
1679
1671
};
1680
1672
1681
1673
static const struct exar8250_board pbn_cti_fpga = {
1682
- .board_init = cti_board_init_fpga ,
1683
1674
.setup = cti_port_setup_fpga ,
1684
1675
};
1685
1676
0 commit comments