Skip to content

Commit 9a8da60

Browse files
linuswgregkh
authored andcommitted
tty: serial: ifx6x60: Convert to GPIO descriptors
This driver for the Intel MID never seems to have been properly integrated upstream: the platform data in <linux/spi/ifx_modem.h> is not used anywhere in the kernel and haven't been since it was merged into the kernel in 2010. There might be out-of-tree users, so I don't want to delete the driver, but I will refactor it to use GPIO descriptors, which means that out-of-tree users will need to adapt. There are several examples in the kernel of how to provide the resources necessary for using GPIO descriptors to pass in the GPIO lines, for the MID platform in particular, it will suffice to inspect the code in files like: arch/x86/platform/intel-mid/device_libs/platform_bt.c This refactoring transfers all GPIOs in the driver, including a hard-coded "PMU reset" in the driver to use GPIO descriptors instead. The following named GPIO descriptors need to be supplied: - reset - power - mrdy - srdy - rst_out - pmu_reset Cc: Russ Gorby <[email protected]> Signed-off-by: Linus Walleij <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b685e6f commit 9a8da60

File tree

3 files changed

+65
-123
lines changed

3 files changed

+65
-123
lines changed

drivers/tty/serial/ifx6x60.c

Lines changed: 57 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -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 @@ static struct notifier_block ifx_modem_reboot_notifier_block = {
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 @@ static int ifx_modem_reboot_callback(struct notifier_block *nfb,
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 @@ static inline void mrdy_set_high(struct ifx_spi_device *ifx)
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 @@ static inline void swap_buf_32(unsigned char *buf, int len, void *end)
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)) {
@@ -691,7 +690,7 @@ static void ifx_spi_complete(void *ctx)
691690
clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, &(ifx_dev->flags));
692691

693692
queue_length = kfifo_len(&ifx_dev->tx_fifo);
694-
srdy = gpio_get_value(ifx_dev->gpio.srdy);
693+
srdy = gpiod_get_value(ifx_dev->gpio.srdy);
695694
if (!srdy)
696695
ifx_spi_power_state_clear(ifx_dev, IFX_SPI_POWER_SRDY);
697696

@@ -898,7 +897,7 @@ static irqreturn_t ifx_spi_srdy_interrupt(int irq, void *dev)
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 @@ static int ifx_spi_reset(struct ifx_spi_device *ifx_dev)
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),
@@ -1080,107 +1079,68 @@ static int ifx_spi_spi_probe(struct spi_device *spi)
10801079
goto error_ret;
10811080
}
10821081

1083-
ifx_dev->gpio.reset = pl_data->rst_pmu;
1084-
ifx_dev->gpio.po = pl_data->pwr_on;
1085-
ifx_dev->gpio.mrdy = pl_data->mrdy;
1086-
ifx_dev->gpio.srdy = pl_data->srdy;
1087-
ifx_dev->gpio.reset_out = pl_data->rst_out;
1088-
1089-
dev_info(dev, "gpios %d, %d, %d, %d, %d",
1090-
ifx_dev->gpio.reset, ifx_dev->gpio.po, ifx_dev->gpio.mrdy,
1091-
ifx_dev->gpio.srdy, ifx_dev->gpio.reset_out);
1092-
1093-
/* Configure gpios */
1094-
ret = gpio_request(ifx_dev->gpio.reset, "ifxModem");
1095-
if (ret < 0) {
1096-
dev_err(dev, "Unable to allocate GPIO%d (RESET)",
1097-
ifx_dev->gpio.reset);
1082+
ifx_dev->gpio.reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
1083+
if (IS_ERR(ifx_dev->gpio.reset)) {
1084+
dev_err(dev, "could not obtain reset GPIO\n");
1085+
ret = PTR_ERR(ifx_dev->gpio.reset);
10981086
goto error_ret;
10991087
}
1100-
ret += gpio_direction_output(ifx_dev->gpio.reset, 0);
1101-
ret += gpio_export(ifx_dev->gpio.reset, 1);
1102-
if (ret) {
1103-
dev_err(dev, "Unable to configure GPIO%d (RESET)",
1104-
ifx_dev->gpio.reset);
1105-
ret = -EBUSY;
1106-
goto error_ret2;
1107-
}
1108-
1109-
ret = gpio_request(ifx_dev->gpio.po, "ifxModem");
1110-
ret += gpio_direction_output(ifx_dev->gpio.po, 0);
1111-
ret += gpio_export(ifx_dev->gpio.po, 1);
1112-
if (ret) {
1113-
dev_err(dev, "Unable to configure GPIO%d (ON)",
1114-
ifx_dev->gpio.po);
1115-
ret = -EBUSY;
1116-
goto error_ret3;
1117-
}
1118-
1119-
ret = gpio_request(ifx_dev->gpio.mrdy, "ifxModem");
1120-
if (ret < 0) {
1121-
dev_err(dev, "Unable to allocate GPIO%d (MRDY)",
1122-
ifx_dev->gpio.mrdy);
1123-
goto error_ret3;
1124-
}
1125-
ret += gpio_export(ifx_dev->gpio.mrdy, 1);
1126-
ret += gpio_direction_output(ifx_dev->gpio.mrdy, 0);
1127-
if (ret) {
1128-
dev_err(dev, "Unable to configure GPIO%d (MRDY)",
1129-
ifx_dev->gpio.mrdy);
1130-
ret = -EBUSY;
1131-
goto error_ret4;
1088+
gpiod_set_consumer_name(ifx_dev->gpio.reset, "ifxModem reset");
1089+
ifx_dev->gpio.po = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
1090+
if (IS_ERR(ifx_dev->gpio.po)) {
1091+
dev_err(dev, "could not obtain power GPIO\n");
1092+
ret = PTR_ERR(ifx_dev->gpio.po);
1093+
goto error_ret;
11321094
}
1133-
1134-
ret = gpio_request(ifx_dev->gpio.srdy, "ifxModem");
1135-
if (ret < 0) {
1136-
dev_err(dev, "Unable to allocate GPIO%d (SRDY)",
1137-
ifx_dev->gpio.srdy);
1138-
ret = -EBUSY;
1139-
goto error_ret4;
1095+
gpiod_set_consumer_name(ifx_dev->gpio.po, "ifxModem power");
1096+
ifx_dev->gpio.mrdy = devm_gpiod_get(dev, "mrdy", GPIOD_OUT_LOW);
1097+
if (IS_ERR(ifx_dev->gpio.mrdy)) {
1098+
dev_err(dev, "could not obtain mrdy GPIO\n");
1099+
ret = PTR_ERR(ifx_dev->gpio.mrdy);
1100+
goto error_ret;
11401101
}
1141-
ret += gpio_export(ifx_dev->gpio.srdy, 1);
1142-
ret += gpio_direction_input(ifx_dev->gpio.srdy);
1143-
if (ret) {
1144-
dev_err(dev, "Unable to configure GPIO%d (SRDY)",
1145-
ifx_dev->gpio.srdy);
1146-
ret = -EBUSY;
1147-
goto error_ret5;
1102+
gpiod_set_consumer_name(ifx_dev->gpio.mrdy, "ifxModem mrdy");
1103+
ifx_dev->gpio.srdy = devm_gpiod_get(dev, "srdy", GPIOD_IN);
1104+
if (IS_ERR(ifx_dev->gpio.srdy)) {
1105+
dev_err(dev, "could not obtain srdy GPIO\n");
1106+
ret = PTR_ERR(ifx_dev->gpio.srdy);
1107+
goto error_ret;
11481108
}
1149-
1150-
ret = gpio_request(ifx_dev->gpio.reset_out, "ifxModem");
1151-
if (ret < 0) {
1152-
dev_err(dev, "Unable to allocate GPIO%d (RESET_OUT)",
1153-
ifx_dev->gpio.reset_out);
1154-
goto error_ret5;
1109+
gpiod_set_consumer_name(ifx_dev->gpio.srdy, "ifxModem srdy");
1110+
ifx_dev->gpio.reset_out = devm_gpiod_get(dev, "rst_out", GPIOD_IN);
1111+
if (IS_ERR(ifx_dev->gpio.reset_out)) {
1112+
dev_err(dev, "could not obtain rst_out GPIO\n");
1113+
ret = PTR_ERR(ifx_dev->gpio.reset_out);
1114+
goto error_ret;
11551115
}
1156-
ret += gpio_export(ifx_dev->gpio.reset_out, 1);
1157-
ret += gpio_direction_input(ifx_dev->gpio.reset_out);
1158-
if (ret) {
1159-
dev_err(dev, "Unable to configure GPIO%d (RESET_OUT)",
1160-
ifx_dev->gpio.reset_out);
1161-
ret = -EBUSY;
1162-
goto error_ret6;
1116+
gpiod_set_consumer_name(ifx_dev->gpio.reset_out, "ifxModem reset out");
1117+
ifx_dev->gpio.pmu_reset = devm_gpiod_get(dev, "pmu_reset", GPIOD_ASIS);
1118+
if (IS_ERR(ifx_dev->gpio.pmu_reset)) {
1119+
dev_err(dev, "could not obtain pmu_reset GPIO\n");
1120+
ret = PTR_ERR(ifx_dev->gpio.pmu_reset);
1121+
goto error_ret;
11631122
}
1123+
gpiod_set_consumer_name(ifx_dev->gpio.pmu_reset, "ifxModem PMU reset");
11641124

1165-
ret = request_irq(gpio_to_irq(ifx_dev->gpio.reset_out),
1125+
ret = request_irq(gpiod_to_irq(ifx_dev->gpio.reset_out),
11661126
ifx_spi_reset_interrupt,
11671127
IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, DRVNAME,
11681128
ifx_dev);
11691129
if (ret) {
11701130
dev_err(dev, "Unable to get irq %x\n",
1171-
gpio_to_irq(ifx_dev->gpio.reset_out));
1172-
goto error_ret6;
1131+
gpiod_to_irq(ifx_dev->gpio.reset_out));
1132+
goto error_ret;
11731133
}
11741134

11751135
ret = ifx_spi_reset(ifx_dev);
11761136

1177-
ret = request_irq(gpio_to_irq(ifx_dev->gpio.srdy),
1137+
ret = request_irq(gpiod_to_irq(ifx_dev->gpio.srdy),
11781138
ifx_spi_srdy_interrupt, IRQF_TRIGGER_RISING, DRVNAME,
11791139
ifx_dev);
11801140
if (ret) {
11811141
dev_err(dev, "Unable to get irq %x",
1182-
gpio_to_irq(ifx_dev->gpio.srdy));
1183-
goto error_ret7;
1142+
gpiod_to_irq(ifx_dev->gpio.srdy));
1143+
goto error_ret2;
11841144
}
11851145

11861146
/* set pm runtime power state and register with power system */
@@ -1191,7 +1151,7 @@ static int ifx_spi_spi_probe(struct spi_device *spi)
11911151
/* no outgoing tty open at this point, this just satisfies the
11921152
* modem's read and should reset communication properly
11931153
*/
1194-
srdy = gpio_get_value(ifx_dev->gpio.srdy);
1154+
srdy = gpiod_get_value(ifx_dev->gpio.srdy);
11951155

11961156
if (srdy) {
11971157
mrdy_assert(ifx_dev);
@@ -1200,18 +1160,8 @@ static int ifx_spi_spi_probe(struct spi_device *spi)
12001160
mrdy_set_low(ifx_dev);
12011161
return 0;
12021162

1203-
error_ret7:
1204-
free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1205-
error_ret6:
1206-
gpio_free(ifx_dev->gpio.srdy);
1207-
error_ret5:
1208-
gpio_free(ifx_dev->gpio.mrdy);
1209-
error_ret4:
1210-
gpio_free(ifx_dev->gpio.reset);
1211-
error_ret3:
1212-
gpio_free(ifx_dev->gpio.po);
12131163
error_ret2:
1214-
gpio_free(ifx_dev->gpio.reset_out);
1164+
free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
12151165
error_ret:
12161166
ifx_spi_free_device(ifx_dev);
12171167
saved_ifx_dev = NULL;
@@ -1235,14 +1185,8 @@ static int ifx_spi_spi_remove(struct spi_device *spi)
12351185
pm_runtime_disable(&spi->dev);
12361186

12371187
/* free irq */
1238-
free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1239-
free_irq(gpio_to_irq(ifx_dev->gpio.srdy), ifx_dev);
1240-
1241-
gpio_free(ifx_dev->gpio.srdy);
1242-
gpio_free(ifx_dev->gpio.mrdy);
1243-
gpio_free(ifx_dev->gpio.reset);
1244-
gpio_free(ifx_dev->gpio.po);
1245-
gpio_free(ifx_dev->gpio.reset_out);
1188+
free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
1189+
free_irq(gpiod_to_irq(ifx_dev->gpio.srdy), ifx_dev);
12461190

12471191
/* free allocations */
12481192
ifx_spi_free_device(ifx_dev);

drivers/tty/serial/ifx6x60.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#ifndef _IFX6X60_H
1111
#define _IFX6X60_H
1212

13+
struct gpio_desc;
14+
1315
#define DRVNAME "ifx6x60"
1416
#define TTYNAME "ttyIFX"
1517

@@ -94,11 +96,12 @@ struct ifx_spi_device {
9496

9597
struct {
9698
/* gpio lines */
97-
unsigned short srdy; /* slave-ready gpio */
98-
unsigned short mrdy; /* master-ready gpio */
99-
unsigned short reset; /* modem-reset gpio */
100-
unsigned short po; /* modem-on gpio */
101-
unsigned short reset_out; /* modem-in-reset gpio */
99+
struct gpio_desc *srdy; /* slave-ready gpio */
100+
struct gpio_desc *mrdy; /* master-ready gpio */
101+
struct gpio_desc *reset; /* modem-reset gpio */
102+
struct gpio_desc *po; /* modem-on gpio */
103+
struct gpio_desc *reset_out; /* modem-in-reset gpio */
104+
struct gpio_desc *pmu_reset; /* PMU reset gpio */
102105
/* state/stats */
103106
int unack_srdy_int_nb;
104107
} gpio;

include/linux/spi/ifx_modem.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
#define LINUX_IFX_MODEM_H
44

55
struct ifx_modem_platform_data {
6-
unsigned short rst_out; /* modem reset out */
7-
unsigned short pwr_on; /* power on */
8-
unsigned short rst_pmu; /* reset modem */
96
unsigned short tx_pwr; /* modem power threshold */
10-
unsigned short srdy; /* SRDY */
11-
unsigned short mrdy; /* MRDY */
127
unsigned char modem_type; /* Modem type */
138
unsigned long max_hz; /* max SPI frequency */
149
unsigned short use_dma:1; /* spi protocol driver supplies

0 commit comments

Comments
 (0)