forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/tty/serial/ifx6x60.c
....@@ -39,7 +39,7 @@
3939 #include <linux/fs.h>
4040 #include <linux/ip.h>
4141 #include <linux/dmapool.h>
42
-#include <linux/gpio.h>
42
+#include <linux/gpio/consumer.h>
4343 #include <linux/sched.h>
4444 #include <linux/time.h>
4545 #include <linux/wait.h>
....@@ -61,7 +61,6 @@
6161 #define IFX_SPI_HEADER_F (-2)
6262
6363 #define PO_POST_DELAY 200
64
-#define IFX_MDM_RST_PMU 4
6564
6665 /* forward reference */
6766 static void ifx_spi_handle_srdy(struct ifx_spi_device *ifx_dev);
....@@ -81,7 +80,7 @@
8180
8281 static int ifx_modem_power_off(struct ifx_spi_device *ifx_dev)
8382 {
84
- gpio_set_value(IFX_MDM_RST_PMU, 1);
83
+ gpiod_set_value(ifx_dev->gpio.pmu_reset, 1);
8584 msleep(PO_POST_DELAY);
8685
8786 return 0;
....@@ -107,7 +106,7 @@
107106 */
108107 static inline void mrdy_set_high(struct ifx_spi_device *ifx)
109108 {
110
- gpio_set_value(ifx->gpio.mrdy, 1);
109
+ gpiod_set_value(ifx->gpio.mrdy, 1);
111110 }
112111
113112 /**
....@@ -117,7 +116,7 @@
117116 */
118117 static inline void mrdy_set_low(struct ifx_spi_device *ifx)
119118 {
120
- gpio_set_value(ifx->gpio.mrdy, 0);
119
+ gpiod_set_value(ifx->gpio.mrdy, 0);
121120 }
122121
123122 /**
....@@ -244,7 +243,7 @@
244243 */
245244 static void mrdy_assert(struct ifx_spi_device *ifx_dev)
246245 {
247
- int val = gpio_get_value(ifx_dev->gpio.srdy);
246
+ int val = gpiod_get_value(ifx_dev->gpio.srdy);
248247 if (!val) {
249248 if (!test_and_set_bit(IFX_SPI_STATE_TIMER_PENDING,
250249 &ifx_dev->flags)) {
....@@ -258,7 +257,7 @@
258257
259258 /**
260259 * ifx_spi_timeout - SPI timeout
261
- * @arg: our SPI device
260
+ * @t: timer in our SPI device
262261 *
263262 * The SPI has timed out: hang up the tty. Users will then see a hangup
264263 * and error events.
....@@ -278,7 +277,6 @@
278277 /**
279278 * ifx_spi_tiocmget - get modem lines
280279 * @tty: our tty device
281
- * @filp: file handle issuing the request
282280 *
283281 * Map the signal state into Linux modem flags and report the value
284282 * in Linux terms
....@@ -532,7 +530,7 @@
532530
533531 /**
534532 * ifx_port_hangup
535
- * @port: our tty port
533
+ * @tty: our tty
536534 *
537535 * tty port hang up. Called when tty_hangup processing is invoked either
538536 * by loss of carrier, or by software (eg vhangup). Serialized against
....@@ -612,7 +610,7 @@
612610
613611 /**
614612 * ifx_spi_insert_fip_string - queue received data
615
- * @ifx_ser: our SPI device
613
+ * @ifx_dev: our SPI device
616614 * @chars: buffer we have received
617615 * @size: number of chars reeived
618616 *
....@@ -691,7 +689,7 @@
691689 clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, &(ifx_dev->flags));
692690
693691 queue_length = kfifo_len(&ifx_dev->tx_fifo);
694
- srdy = gpio_get_value(ifx_dev->gpio.srdy);
692
+ srdy = gpiod_get_value(ifx_dev->gpio.srdy);
695693 if (!srdy)
696694 ifx_spi_power_state_clear(ifx_dev, IFX_SPI_POWER_SRDY);
697695
....@@ -726,10 +724,11 @@
726724 * Queue data for transmission if possible and then kick off the
727725 * transfer.
728726 */
729
-static void ifx_spi_io(unsigned long data)
727
+static void ifx_spi_io(struct tasklet_struct *t)
730728 {
731729 int retval;
732
- struct ifx_spi_device *ifx_dev = (struct ifx_spi_device *) data;
730
+ struct ifx_spi_device *ifx_dev = from_tasklet(ifx_dev, t,
731
+ io_work_tasklet);
733732
734733 if (!test_and_set_bit(IFX_SPI_STATE_IO_IN_PROGRESS, &ifx_dev->flags) &&
735734 test_bit(IFX_SPI_STATE_IO_AVAILABLE, &ifx_dev->flags)) {
....@@ -898,7 +897,7 @@
898897 static irqreturn_t ifx_spi_reset_interrupt(int irq, void *dev)
899898 {
900899 struct ifx_spi_device *ifx_dev = dev;
901
- int val = gpio_get_value(ifx_dev->gpio.reset_out);
900
+ int val = gpiod_get_value(ifx_dev->gpio.reset_out);
902901 int solreset = test_bit(MR_START, &ifx_dev->mdm_reset_state);
903902
904903 if (val == 0) {
....@@ -954,14 +953,14 @@
954953 * to reset properly
955954 */
956955 set_bit(MR_START, &ifx_dev->mdm_reset_state);
957
- gpio_set_value(ifx_dev->gpio.po, 0);
958
- gpio_set_value(ifx_dev->gpio.reset, 0);
956
+ gpiod_set_value(ifx_dev->gpio.po, 0);
957
+ gpiod_set_value(ifx_dev->gpio.reset, 0);
959958 msleep(25);
960
- gpio_set_value(ifx_dev->gpio.reset, 1);
959
+ gpiod_set_value(ifx_dev->gpio.reset, 1);
961960 msleep(1);
962
- gpio_set_value(ifx_dev->gpio.po, 1);
961
+ gpiod_set_value(ifx_dev->gpio.po, 1);
963962 msleep(1);
964
- gpio_set_value(ifx_dev->gpio.po, 0);
963
+ gpiod_set_value(ifx_dev->gpio.po, 0);
965964 ret = wait_event_timeout(ifx_dev->mdm_reset_wait,
966965 test_bit(MR_COMPLETE,
967966 &ifx_dev->mdm_reset_state),
....@@ -992,22 +991,23 @@
992991 int srdy;
993992 struct ifx_modem_platform_data *pl_data;
994993 struct ifx_spi_device *ifx_dev;
994
+ struct device *dev = &spi->dev;
995995
996996 if (saved_ifx_dev) {
997
- dev_dbg(&spi->dev, "ignoring subsequent detection");
997
+ dev_dbg(dev, "ignoring subsequent detection");
998998 return -ENODEV;
999999 }
10001000
1001
- pl_data = dev_get_platdata(&spi->dev);
1001
+ pl_data = dev_get_platdata(dev);
10021002 if (!pl_data) {
1003
- dev_err(&spi->dev, "missing platform data!");
1003
+ dev_err(dev, "missing platform data!");
10041004 return -ENODEV;
10051005 }
10061006
10071007 /* initialize structure to hold our device variables */
10081008 ifx_dev = kzalloc(sizeof(struct ifx_spi_device), GFP_KERNEL);
10091009 if (!ifx_dev) {
1010
- dev_err(&spi->dev, "spi device allocation failed");
1010
+ dev_err(dev, "spi device allocation failed");
10111011 return -ENOMEM;
10121012 }
10131013 saved_ifx_dev = ifx_dev;
....@@ -1026,7 +1026,7 @@
10261026 spi->bits_per_word = spi_bpw;
10271027 ret = spi_setup(spi);
10281028 if (ret) {
1029
- dev_err(&spi->dev, "SPI setup wasn't successful %d", ret);
1029
+ dev_err(dev, "SPI setup wasn't successful %d", ret);
10301030 kfree(ifx_dev);
10311031 return -ENODEV;
10321032 }
....@@ -1049,7 +1049,7 @@
10491049 &ifx_dev->tx_bus,
10501050 GFP_KERNEL);
10511051 if (!ifx_dev->tx_buffer) {
1052
- dev_err(&spi->dev, "DMA-TX buffer allocation failed");
1052
+ dev_err(dev, "DMA-TX buffer allocation failed");
10531053 ret = -ENOMEM;
10541054 goto error_ret;
10551055 }
....@@ -1058,7 +1058,7 @@
10581058 &ifx_dev->rx_bus,
10591059 GFP_KERNEL);
10601060 if (!ifx_dev->rx_buffer) {
1061
- dev_err(&spi->dev, "DMA-RX buffer allocation failed");
1061
+ dev_err(dev, "DMA-RX buffer allocation failed");
10621062 ret = -ENOMEM;
10631063 goto error_ret;
10641064 }
....@@ -1067,130 +1067,90 @@
10671067 init_waitqueue_head(&ifx_dev->mdm_reset_wait);
10681068
10691069 spi_set_drvdata(spi, ifx_dev);
1070
- tasklet_init(&ifx_dev->io_work_tasklet, ifx_spi_io,
1071
- (unsigned long)ifx_dev);
1070
+ tasklet_setup(&ifx_dev->io_work_tasklet, ifx_spi_io);
10721071
10731072 set_bit(IFX_SPI_STATE_PRESENT, &ifx_dev->flags);
10741073
10751074 /* create our tty port */
10761075 ret = ifx_spi_create_port(ifx_dev);
10771076 if (ret != 0) {
1078
- dev_err(&spi->dev, "create default tty port failed");
1077
+ dev_err(dev, "create default tty port failed");
10791078 goto error_ret;
10801079 }
10811080
1082
- ifx_dev->gpio.reset = pl_data->rst_pmu;
1083
- ifx_dev->gpio.po = pl_data->pwr_on;
1084
- ifx_dev->gpio.mrdy = pl_data->mrdy;
1085
- ifx_dev->gpio.srdy = pl_data->srdy;
1086
- ifx_dev->gpio.reset_out = pl_data->rst_out;
1087
-
1088
- dev_info(&spi->dev, "gpios %d, %d, %d, %d, %d",
1089
- ifx_dev->gpio.reset, ifx_dev->gpio.po, ifx_dev->gpio.mrdy,
1090
- ifx_dev->gpio.srdy, ifx_dev->gpio.reset_out);
1091
-
1092
- /* Configure gpios */
1093
- ret = gpio_request(ifx_dev->gpio.reset, "ifxModem");
1094
- if (ret < 0) {
1095
- dev_err(&spi->dev, "Unable to allocate GPIO%d (RESET)",
1096
- ifx_dev->gpio.reset);
1081
+ ifx_dev->gpio.reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
1082
+ if (IS_ERR(ifx_dev->gpio.reset)) {
1083
+ dev_err(dev, "could not obtain reset GPIO\n");
1084
+ ret = PTR_ERR(ifx_dev->gpio.reset);
10971085 goto error_ret;
10981086 }
1099
- ret += gpio_direction_output(ifx_dev->gpio.reset, 0);
1100
- ret += gpio_export(ifx_dev->gpio.reset, 1);
1101
- if (ret) {
1102
- dev_err(&spi->dev, "Unable to configure GPIO%d (RESET)",
1103
- ifx_dev->gpio.reset);
1104
- ret = -EBUSY;
1105
- goto error_ret2;
1087
+ gpiod_set_consumer_name(ifx_dev->gpio.reset, "ifxModem reset");
1088
+ ifx_dev->gpio.po = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
1089
+ if (IS_ERR(ifx_dev->gpio.po)) {
1090
+ dev_err(dev, "could not obtain power GPIO\n");
1091
+ ret = PTR_ERR(ifx_dev->gpio.po);
1092
+ goto error_ret;
11061093 }
1094
+ gpiod_set_consumer_name(ifx_dev->gpio.po, "ifxModem power");
1095
+ ifx_dev->gpio.mrdy = devm_gpiod_get(dev, "mrdy", GPIOD_OUT_LOW);
1096
+ if (IS_ERR(ifx_dev->gpio.mrdy)) {
1097
+ dev_err(dev, "could not obtain mrdy GPIO\n");
1098
+ ret = PTR_ERR(ifx_dev->gpio.mrdy);
1099
+ goto error_ret;
1100
+ }
1101
+ gpiod_set_consumer_name(ifx_dev->gpio.mrdy, "ifxModem mrdy");
1102
+ ifx_dev->gpio.srdy = devm_gpiod_get(dev, "srdy", GPIOD_IN);
1103
+ if (IS_ERR(ifx_dev->gpio.srdy)) {
1104
+ dev_err(dev, "could not obtain srdy GPIO\n");
1105
+ ret = PTR_ERR(ifx_dev->gpio.srdy);
1106
+ goto error_ret;
1107
+ }
1108
+ gpiod_set_consumer_name(ifx_dev->gpio.srdy, "ifxModem srdy");
1109
+ ifx_dev->gpio.reset_out = devm_gpiod_get(dev, "rst_out", GPIOD_IN);
1110
+ if (IS_ERR(ifx_dev->gpio.reset_out)) {
1111
+ dev_err(dev, "could not obtain rst_out GPIO\n");
1112
+ ret = PTR_ERR(ifx_dev->gpio.reset_out);
1113
+ goto error_ret;
1114
+ }
1115
+ gpiod_set_consumer_name(ifx_dev->gpio.reset_out, "ifxModem reset out");
1116
+ ifx_dev->gpio.pmu_reset = devm_gpiod_get(dev, "pmu_reset", GPIOD_ASIS);
1117
+ if (IS_ERR(ifx_dev->gpio.pmu_reset)) {
1118
+ dev_err(dev, "could not obtain pmu_reset GPIO\n");
1119
+ ret = PTR_ERR(ifx_dev->gpio.pmu_reset);
1120
+ goto error_ret;
1121
+ }
1122
+ gpiod_set_consumer_name(ifx_dev->gpio.pmu_reset, "ifxModem PMU reset");
11071123
1108
- ret = gpio_request(ifx_dev->gpio.po, "ifxModem");
1109
- ret += gpio_direction_output(ifx_dev->gpio.po, 0);
1110
- ret += gpio_export(ifx_dev->gpio.po, 1);
1111
- if (ret) {
1112
- dev_err(&spi->dev, "Unable to configure GPIO%d (ON)",
1113
- ifx_dev->gpio.po);
1114
- ret = -EBUSY;
1115
- goto error_ret3;
1116
- }
1117
-
1118
- ret = gpio_request(ifx_dev->gpio.mrdy, "ifxModem");
1119
- if (ret < 0) {
1120
- dev_err(&spi->dev, "Unable to allocate GPIO%d (MRDY)",
1121
- ifx_dev->gpio.mrdy);
1122
- goto error_ret3;
1123
- }
1124
- ret += gpio_export(ifx_dev->gpio.mrdy, 1);
1125
- ret += gpio_direction_output(ifx_dev->gpio.mrdy, 0);
1126
- if (ret) {
1127
- dev_err(&spi->dev, "Unable to configure GPIO%d (MRDY)",
1128
- ifx_dev->gpio.mrdy);
1129
- ret = -EBUSY;
1130
- goto error_ret4;
1131
- }
1132
-
1133
- ret = gpio_request(ifx_dev->gpio.srdy, "ifxModem");
1134
- if (ret < 0) {
1135
- dev_err(&spi->dev, "Unable to allocate GPIO%d (SRDY)",
1136
- ifx_dev->gpio.srdy);
1137
- ret = -EBUSY;
1138
- goto error_ret4;
1139
- }
1140
- ret += gpio_export(ifx_dev->gpio.srdy, 1);
1141
- ret += gpio_direction_input(ifx_dev->gpio.srdy);
1142
- if (ret) {
1143
- dev_err(&spi->dev, "Unable to configure GPIO%d (SRDY)",
1144
- ifx_dev->gpio.srdy);
1145
- ret = -EBUSY;
1146
- goto error_ret5;
1147
- }
1148
-
1149
- ret = gpio_request(ifx_dev->gpio.reset_out, "ifxModem");
1150
- if (ret < 0) {
1151
- dev_err(&spi->dev, "Unable to allocate GPIO%d (RESET_OUT)",
1152
- ifx_dev->gpio.reset_out);
1153
- goto error_ret5;
1154
- }
1155
- ret += gpio_export(ifx_dev->gpio.reset_out, 1);
1156
- ret += gpio_direction_input(ifx_dev->gpio.reset_out);
1157
- if (ret) {
1158
- dev_err(&spi->dev, "Unable to configure GPIO%d (RESET_OUT)",
1159
- ifx_dev->gpio.reset_out);
1160
- ret = -EBUSY;
1161
- goto error_ret6;
1162
- }
1163
-
1164
- ret = request_irq(gpio_to_irq(ifx_dev->gpio.reset_out),
1124
+ ret = request_irq(gpiod_to_irq(ifx_dev->gpio.reset_out),
11651125 ifx_spi_reset_interrupt,
11661126 IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, DRVNAME,
11671127 ifx_dev);
11681128 if (ret) {
1169
- dev_err(&spi->dev, "Unable to get irq %x\n",
1170
- gpio_to_irq(ifx_dev->gpio.reset_out));
1171
- goto error_ret6;
1129
+ dev_err(dev, "Unable to get irq %x\n",
1130
+ gpiod_to_irq(ifx_dev->gpio.reset_out));
1131
+ goto error_ret;
11721132 }
11731133
11741134 ret = ifx_spi_reset(ifx_dev);
11751135
1176
- ret = request_irq(gpio_to_irq(ifx_dev->gpio.srdy),
1136
+ ret = request_irq(gpiod_to_irq(ifx_dev->gpio.srdy),
11771137 ifx_spi_srdy_interrupt, IRQF_TRIGGER_RISING, DRVNAME,
11781138 ifx_dev);
11791139 if (ret) {
1180
- dev_err(&spi->dev, "Unable to get irq %x",
1181
- gpio_to_irq(ifx_dev->gpio.srdy));
1182
- goto error_ret7;
1140
+ dev_err(dev, "Unable to get irq %x",
1141
+ gpiod_to_irq(ifx_dev->gpio.srdy));
1142
+ goto error_ret2;
11831143 }
11841144
11851145 /* set pm runtime power state and register with power system */
1186
- pm_runtime_set_active(&spi->dev);
1187
- pm_runtime_enable(&spi->dev);
1146
+ pm_runtime_set_active(dev);
1147
+ pm_runtime_enable(dev);
11881148
11891149 /* handle case that modem is already signaling SRDY */
11901150 /* no outgoing tty open at this point, this just satisfies the
11911151 * modem's read and should reset communication properly
11921152 */
1193
- srdy = gpio_get_value(ifx_dev->gpio.srdy);
1153
+ srdy = gpiod_get_value(ifx_dev->gpio.srdy);
11941154
11951155 if (srdy) {
11961156 mrdy_assert(ifx_dev);
....@@ -1199,18 +1159,8 @@
11991159 mrdy_set_low(ifx_dev);
12001160 return 0;
12011161
1202
-error_ret7:
1203
- free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1204
-error_ret6:
1205
- gpio_free(ifx_dev->gpio.srdy);
1206
-error_ret5:
1207
- gpio_free(ifx_dev->gpio.mrdy);
1208
-error_ret4:
1209
- gpio_free(ifx_dev->gpio.reset);
1210
-error_ret3:
1211
- gpio_free(ifx_dev->gpio.po);
12121162 error_ret2:
1213
- gpio_free(ifx_dev->gpio.reset_out);
1163
+ free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
12141164 error_ret:
12151165 ifx_spi_free_device(ifx_dev);
12161166 saved_ifx_dev = NULL;
....@@ -1234,14 +1184,8 @@
12341184 pm_runtime_disable(&spi->dev);
12351185
12361186 /* free irq */
1237
- free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1238
- free_irq(gpio_to_irq(ifx_dev->gpio.srdy), ifx_dev);
1239
-
1240
- gpio_free(ifx_dev->gpio.srdy);
1241
- gpio_free(ifx_dev->gpio.mrdy);
1242
- gpio_free(ifx_dev->gpio.reset);
1243
- gpio_free(ifx_dev->gpio.po);
1244
- gpio_free(ifx_dev->gpio.reset_out);
1187
+ free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1188
+ free_irq(gpiod_to_irq(ifx_dev->gpio.srdy), ifx_dev);
12451189
12461190 /* free allocations */
12471191 ifx_spi_free_device(ifx_dev);