[PATCH v2] staging: olpc_dcon: olpc_dcon_xo_1.c: Switch to the gpio descriptor interface
Use the gpiod interface instead of the deprecated old non-descriptor interface in olpc_dcon_xo_1.c. --- Changes in v2: - Resolve a few compilation errors. - Add a level of indirection to read and write gpios. Signed-off-by: Nishad Kamdar --- drivers/staging/olpc_dcon/olpc_dcon_xo_1.c | 89 +++--- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c index ff145d493e1b..29b93897ccae 100644 --- a/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c +++ b/drivers/staging/olpc_dcon/olpc_dcon_xo_1.c @@ -11,35 +11,50 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include -#include +#include #include #include #include "olpc_dcon.h" +enum dcon_gpios { + DCON_STAT0, + DCON_STAT1, + DCON_IRQ, + DCON_LOAD, + DCON_BLANK, +}; + +struct dcon_gpio { + const char *name; + unsigned long flags; +}; + +static const struct dcon_gpio gpios_asis[] = { + [DCON_STAT0] = { .name = "dcon_stat0", .flags = GPIO_ASIS }, + [DCON_STAT1] = { .name = "dcon_stat1", .flags = GPIO_ASIS }, + [DCON_IRQ] = { .name = "dcon_irq", .flags = GPIO_ASIS }, + [DCON_LOAD] = { .name = "dcon_load", .flags = GPIO_ASIS }, + [DCON_BLANK] = { .name = "dcon_blank", .flag = GPIO_ASIS }, +}; + +struct gpio_desc *gpios[5]; + static int dcon_init_xo_1(struct dcon_priv *dcon) { unsigned char lob; - - if (gpio_request(OLPC_GPIO_DCON_STAT0, "OLPC-DCON")) { - pr_err("failed to request STAT0 GPIO\n"); - return -EIO; - } - if (gpio_request(OLPC_GPIO_DCON_STAT1, "OLPC-DCON")) { - pr_err("failed to request STAT1 GPIO\n"); - goto err_gp_stat1; - } - if (gpio_request(OLPC_GPIO_DCON_IRQ, "OLPC-DCON")) { - pr_err("failed to request IRQ GPIO\n"); - goto err_gp_irq; - } - if (gpio_request(OLPC_GPIO_DCON_LOAD, "OLPC-DCON")) { - pr_err("failed to request LOAD GPIO\n"); - goto err_gp_load; - } - if (gpio_request(OLPC_GPIO_DCON_BLANK, "OLPC-DCON")) { - pr_err("failed to request BLANK GPIO\n"); - goto err_gp_blank; + int ret, i; + struct dcon_gpio *pin = &gpios_asis[0]; + + for (i = 0; i < ARRAY_SIZE(gpios_asis); i++) { + gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, + pin[i]->flags); + if (IS_ERR(gpios[i])) { + ret = PTR_ERR(gpios[i]); + pr_err("failed to request %s GPIO: %d\n", pin[i]->name, + ret); + return ret; + } } /* Turn off the event enable for GPIO7 just to be safe */ @@ -61,12 +76,12 @@ static int dcon_init_xo_1(struct dcon_priv *dcon) dcon->pending_src = dcon->curr_src; /* Set the directions for the GPIO pins */ - gpio_direction_input(OLPC_GPIO_DCON_STAT0); - gpio_direction_input(OLPC_GPIO_DCON_STAT1); - gpio_direction_input(OLPC_GPIO_DCON_IRQ); - gpio_direction_input(OLPC_GPIO_DCON_BLANK); - gpio_direction_output(OLPC_GPIO_DCON_LOAD, - dcon->curr_src == DCON_SOURCE_CPU); + gpiod_direction_input(gpios[DCON_STAT0]); + gpiod_direction_input(gpios[DCON_STAT1]); + gpiod_direction_input(gpios[DCON_IRQ]); + gpiod_direction_input(gpios[DCON_BLANK]); + gpiod_direction_output(gpios[DCON_LOAD], + dcon->curr_src == DCON_SOURCE_CPU); /* Set up the interrupt mappings */ @@ -84,7 +99,7 @@ static int dcon_init_xo_1(struct dcon_priv *dcon) /* Register the interrupt handler */ if (request_irq(DCON_IRQ, &dcon_interrupt, 0, "DCON", dcon)) { pr_err("failed to request DCON's irq\n"); - goto err_req_irq; + return -EIO; } /* Clear INV_EN for GPIO7 (DCONIRQ) */ @@ -125,18 +140,6 @@ static int dcon_init_xo_1(struct dcon_priv *dcon) cs5535_gpio_set(OLPC_GPIO_DCON_BLANK, GPIO_EVENTS_ENABLE); return 0; - -err_req_irq: - gpio_free(OLPC_GPIO_DCON_BLANK); -err_gp_blank: - gpio_free(OLPC_GPIO_DCON_LOAD); -err_gp_load: - gpio_free(OLPC_GPIO_DCON_IRQ); -err_gp_irq: - gpio_free(OLPC_GPIO_DCON_STAT1); -err_gp_stat1: - gpio_free(OLPC_GPIO_DCON_STAT0); - return -EIO; } static void dcon_wiggle_xo_1(void) @@ -180,13 +183,13 @@ static void dcon_wiggle_xo_1(void) static void dcon_set_dconload_1(int val) { - gpio_set_value(OLPC_GPIO_DCON_LOAD, val); + gpiod_set_value(gpios[DCON_LOAD], val); } static int dcon_read_status_xo_1(u8 *status) { - *status = gpio_get_value(OLPC_GPIO_DCON_STAT0); - *status |= gpio_get_value(OLPC_GPIO_DCON_STAT1) << 1; + *status = gpiod_get_value(gpios[DCON
Re: [PATCH v2] staging: olpc_dcon: olpc_dcon_xo_1.c: Switch to the gpio descriptor interface
Hi Nishad, Thank you for the patch! Yet something to improve: [auto build test ERROR on staging/staging-testing] [also build test ERROR on v4.19 next-20181102] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Nishad-Kamdar/staging-olpc_dcon-olpc_dcon_xo_1-c-Switch-to-the-gpio-descriptor-interface/20181104-041335 config: i386-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All error/warnings (new ones prefixed by >>): In file included from drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:18:0: >> drivers/staging/olpc_dcon/olpc_dcon.h:58:33: error: expected identifier >> before numeric constant #define DCON_IRQ6 ^ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:23:2: note: in expansion of macro >> 'DCON_IRQ' DCON_IRQ, ^~~~ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:34:50: error: 'GPIO_ASIS' >> undeclared here (not in a function); did you mean 'GPIOD_ASIS'? [DCON_STAT0] = { .name = "dcon_stat0", .flags = GPIO_ASIS }, ^ GPIOD_ASIS >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:37:3: error: 'DCON_LOAD' >> undeclared here (not in a function); did you mean 'DCON_STAT1'? [DCON_LOAD] = { .name = "dcon_load", .flags = GPIO_ASIS }, ^ DCON_STAT1 >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:37:3: error: array index in >> initializer not of integer type drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:37:3: note: (near initialization for 'gpios_asis') >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:38:3: error: 'DCON_BLANK' >> undeclared here (not in a function); did you mean 'DCON_LOAD'? [DCON_BLANK] = { .name = "dcon_blank", .flag = GPIO_ASIS }, ^~ DCON_LOAD drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:38:3: error: array index in initializer not of integer type drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:38:3: note: (near initialization for 'gpios_asis') >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:38:42: error: 'const struct >> dcon_gpio' has no member named 'flag'; did you mean 'flags'? [DCON_BLANK] = { .name = "dcon_blank", .flag = GPIO_ASIS }, ^~~~ flags drivers/staging/olpc_dcon/olpc_dcon_xo_1.c: In function 'dcon_init_xo_1': >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:47:26: warning: initialization >> discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] struct dcon_gpio *pin = &gpios_asis[0]; ^ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:42: error: dereferencing >> pointer to incomplete type 'struct i2c_client' gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:42: error: request for member >> 'dev' in something not a structure or union >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:55: error: invalid type >> argument of '->' (have 'struct dcon_gpio') gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:55: error: request for member >> 'name' in something not a structure or union drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:51:14: error: invalid type argument of '->' (have 'struct dcon_gpio') pin[i]->flags); ^~ >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:51:14: error: request for member >> 'flags' in something not a structure or union >> drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:29: error: passing argument 1 >> of 'devm_gpiod_get' from incompatible pointer type >> [-Werror=incompatible-pointer-types] gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^ In file included from drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:14:0: include/linux/gpio/consumer.h:87:32: note: expected 'struct device *' but argument is of type 'const struct dcon_gpio (*)[1]' struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, ^~ drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:50:49: error: passing argument 2 of 'devm_gpiod_get' from incompatible pointer type [-Werror=incompatible-pointer-types] gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~~ In file included from drivers/staging/olpc_dcon/olpc_dcon_xo_1.c:14:0: include/linux/gpio/consumer.h:87:32: note: expected 'const char *' but argument is of type 'const struct dcon_gpio *' struct gpio_desc *_
Re: [PATCH v2] staging: olpc_dcon: olpc_dcon_xo_1.c: Switch to the gpio descriptor interface
Hi Nishad, Thank you for the patch! Yet something to improve: [auto build test ERROR on staging/staging-testing] [also build test ERROR on v4.19 next-20181102] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Nishad-Kamdar/staging-olpc_dcon-olpc_dcon_xo_1-c-Switch-to-the-gpio-descriptor-interface/20181104-041335 config: i386-allyesconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All error/warnings (new ones prefixed by >>): >> drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:23:2: error: expected identifier >> before numeric constant DCON_IRQ, ^ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:34:50: error: 'GPIO_ASIS' undeclared here (not in a function); did you mean 'GPIOD_ASIS'? [DCON_STAT0] = { .name = "dcon_stat0", .flags = GPIO_ASIS }, ^ GPIOD_ASIS drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:37:3: error: 'DCON_LOAD' undeclared here (not in a function); did you mean 'DCON_STAT1'? [DCON_LOAD] = { .name = "dcon_load", .flags = GPIO_ASIS }, ^ DCON_STAT1 drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:37:3: error: array index in initializer not of integer type drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:37:3: note: (near initialization for 'gpios_asis') drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:38:3: error: 'DCON_BLANK' undeclared here (not in a function); did you mean 'DCON_LOAD'? [DCON_BLANK] = { .name = "dcon_blank", .flag = GPIO_ASIS }, ^~ DCON_LOAD drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:38:3: error: array index in initializer not of integer type drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:38:3: note: (near initialization for 'gpios_asis') drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:38:42: error: 'const struct dcon_gpio' has no member named 'flag'; did you mean 'flags'? [DCON_BLANK] = { .name = "dcon_blank", .flag = GPIO_ASIS }, ^~~~ flags drivers/staging//olpc_dcon/olpc_dcon_xo_1.c: In function 'dcon_init_xo_1': drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:47:26: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] struct dcon_gpio *pin = &gpios_asis[0]; ^ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:42: error: dereferencing pointer to incomplete type 'struct i2c_client' gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:42: error: request for member 'dev' in something not a structure or union drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:55: error: invalid type argument of '->' (have 'struct dcon_gpio') gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:55: error: request for member 'name' in something not a structure or union drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:51:14: error: invalid type argument of '->' (have 'struct dcon_gpio') pin[i]->flags); ^~ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:51:14: error: request for member 'flags' in something not a structure or union drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:29: error: passing argument 1 of 'devm_gpiod_get' from incompatible pointer type [-Werror=incompatible-pointer-types] gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^ In file included from drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:14:0: include/linux/gpio/consumer.h:87:55: note: expected 'struct device *' but argument is of type 'const struct dcon_gpio (*)[1]' struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, ^~~ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:50:49: error: passing argument 2 of 'devm_gpiod_get' from incompatible pointer type [-Werror=incompatible-pointer-types] gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i]->name, ^~~ In file included from drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:14:0: include/linux/gpio/consumer.h:87:55: note: expected 'const char *' but argument is of type 'const struct dcon_gpio *' struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, ^~~ drivers/staging//olpc_dcon/olpc_dcon_xo_1.c:51:8: error: incompatible type for argument 3 of 'devm_gpiod_get'