gpiolib: split of_mm_gpio_chip out of linux/of_gpio.h

This is a rarely used feature that has nothing to do with the
client-side of_gpio.h.

Split it out with a separate header file and Kconfig option
so it can be removed on its own timeline aside from removing
the of_gpio consumer interfaces.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
Arnd Bergmann 2023-02-07 16:29:47 +02:00 committed by Andy Shevchenko
parent a8e59744e1
commit a99cc66807
15 changed files with 71 additions and 33 deletions

View file

@ -230,6 +230,7 @@ config PPC4xx_GPIO
bool "PPC4xx GPIO support" bool "PPC4xx GPIO support"
depends on 44x depends on 44x
select GPIOLIB select GPIOLIB
select OF_GPIO_MM_GPIOCHIP
help help
Enable gpiolib support for ppc440 based boards Enable gpiolib support for ppc440 based boards

View file

@ -14,7 +14,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_gpio.h> #include <linux/gpio/legacy-of-mm-gpiochip.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/slab.h> #include <linux/slab.h>

View file

@ -101,6 +101,7 @@ comment "Generic MPC8xx Options"
config 8xx_GPIO config 8xx_GPIO
bool "GPIO API Support" bool "GPIO API Support"
select GPIOLIB select GPIOLIB
select OF_GPIO_MM_GPIOCHIP
help help
Saying Y here will cause the ports on an MPC8xx processor to be used Saying Y here will cause the ports on an MPC8xx processor to be used
with the GPIO API. If you say N here, the kernel needs less memory. with the GPIO API. If you say N here, the kernel needs less memory.

View file

@ -44,7 +44,7 @@
#include <asm/fs_pd.h> #include <asm/fs_pd.h>
#ifdef CONFIG_8xx_GPIO #ifdef CONFIG_8xx_GPIO
#include <linux/of_gpio.h> #include <linux/gpio/legacy-of-mm-gpiochip.h>
#endif #endif
#define CPM_MAP_SIZE (0x4000) #define CPM_MAP_SIZE (0x4000)

View file

@ -244,6 +244,7 @@ config QE_GPIO
bool "QE GPIO support" bool "QE GPIO support"
depends on QUICC_ENGINE depends on QUICC_ENGINE
select GPIOLIB select GPIOLIB
select OF_GPIO_MM_GPIOCHIP
help help
Say Y here if you're going to use hardware that connects to the Say Y here if you're going to use hardware that connects to the
QE GPIOs. QE GPIOs.
@ -254,6 +255,7 @@ config CPM2
select CPM select CPM
select HAVE_PCI select HAVE_PCI
select GPIOLIB select GPIOLIB
select OF_GPIO_MM_GPIOCHIP
help help
The CPM2 (Communications Processor Module) is a coprocessor on The CPM2 (Communications Processor Module) is a coprocessor on
embedded CPUs made by Freescale. Selecting this option means that embedded CPUs made by Freescale. Selecting this option means that

View file

@ -31,7 +31,7 @@
#include <mm/mmu_decl.h> #include <mm/mmu_decl.h>
#if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO) #if defined(CONFIG_CPM2) || defined(CONFIG_8xx_GPIO)
#include <linux/of_gpio.h> #include <linux/gpio/legacy-of-mm-gpiochip.h>
#endif #endif
static int __init cpm_init(void) static int __init cpm_init(void)

View file

@ -39,6 +39,14 @@ config GPIOLIB_IRQCHIP
select IRQ_DOMAIN select IRQ_DOMAIN
bool bool
config OF_GPIO_MM_GPIOCHIP
bool
help
This adds support for the legacy 'struct of_mm_gpio_chip' interface
from PowerPC. Existing drivers using this interface need to select
this symbol, but new drivers should use the generic gpio-regmap
infrastructure instead.
config DEBUG_GPIO config DEBUG_GPIO
bool "Debug GPIO calls" bool "Debug GPIO calls"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
@ -131,6 +139,7 @@ config GPIO_ALTERA
tristate "Altera GPIO" tristate "Altera GPIO"
depends on OF_GPIO depends on OF_GPIO
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
select OF_GPIO_MM_GPIOCHIP
help help
Say Y or M here to build support for the Altera PIO device. Say Y or M here to build support for the Altera PIO device.
@ -403,6 +412,7 @@ config GPIO_MENZ127
config GPIO_MM_LANTIQ config GPIO_MM_LANTIQ
bool "Lantiq Memory mapped GPIOs" bool "Lantiq Memory mapped GPIOs"
depends on LANTIQ && SOC_XWAY depends on LANTIQ && SOC_XWAY
select OF_GPIO_MM_GPIOCHIP
help help
This enables support for memory mapped GPIOs on the External Bus Unit This enables support for memory mapped GPIOs on the External Bus Unit
(EBU) found on Lantiq SoCs. The GPIOs are output only as they are (EBU) found on Lantiq SoCs. The GPIOs are output only as they are
@ -411,6 +421,7 @@ config GPIO_MM_LANTIQ
config GPIO_MPC5200 config GPIO_MPC5200
def_bool y def_bool y
depends on PPC_MPC52xx depends on PPC_MPC52xx
select OF_GPIO_MM_GPIOCHIP
config GPIO_MPC8XXX config GPIO_MPC8XXX
bool "MPC512x/MPC8xxx/QorIQ GPIO support" bool "MPC512x/MPC8xxx/QorIQ GPIO support"

View file

@ -59,11 +59,6 @@ the device tree back-end. It is legacy and should not be used in new code.
Work items: Work items:
- Get rid of struct of_mm_gpio_chip altogether: use the generic MMIO
GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove()
from the kernel.
- Change all consumer drivers that #include <linux/of_gpio.h> to - Change all consumer drivers that #include <linux/of_gpio.h> to
#include <linux/gpio/consumer.h> and stop doing custom parsing of the #include <linux/gpio/consumer.h> and stop doing custom parsing of the
GPIO lines from the device tree. This can be tricky and often ivolves GPIO lines from the device tree. This can be tricky and often ivolves
@ -81,6 +76,16 @@ Work items:
uses <linux/gpio/consumer.h> or <linux/gpio/driver.h> instead. uses <linux/gpio/consumer.h> or <linux/gpio/driver.h> instead.
Get rid of <linux/gpio/legacy-of-mm-gpiochip.h>
Work items:
- Get rid of struct of_mm_gpio_chip altogether: use the generic MMIO
GPIO for all current users (see below). Delete struct of_mm_gpio_chip,
to_of_mm_gpio_chip(), of_mm_gpiochip_add_data(), of_mm_gpiochip_remove(),
CONFIG_OF_GPIO_MM_GPIOCHIP from the kernel.
Get rid of <linux/gpio.h> Get rid of <linux/gpio.h>
This legacy header is a one stop shop for anything GPIO is closely tied This legacy header is a one stop shop for anything GPIO is closely tied

View file

@ -7,7 +7,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/of_gpio.h> /* For of_mm_gpio_chip */ #include <linux/gpio/legacy-of-mm-gpiochip.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#define ALTERA_GPIO_MAX_NGPIO 32 #define ALTERA_GPIO_MAX_NGPIO 32

View file

@ -10,8 +10,8 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/gpio/legacy-of-mm-gpiochip.h.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/slab.h> #include <linux/slab.h>

View file

@ -8,7 +8,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of_gpio.h> #include <linux/gpio/legacy-of-mm-gpiochip.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/module.h> #include <linux/module.h>

View file

@ -892,6 +892,8 @@ static int of_gpio_simple_xlate(struct gpio_chip *gc,
return gpiospec->args[0]; return gpiospec->args[0];
} }
#if IS_ENABLED(CONFIG_OF_GPIO_MM_GPIOCHIP)
#include <linux/gpio/legacy-of-mm-gpiochip.h>
/** /**
* of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank) * of_mm_gpiochip_add_data - Add memory mapped GPIO chip (bank)
* @np: device node of the GPIO chip * @np: device node of the GPIO chip
@ -964,6 +966,7 @@ void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)
kfree(gc->label); kfree(gc->label);
} }
EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove); EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove);
#endif
#ifdef CONFIG_PINCTRL #ifdef CONFIG_PINCTRL
static int of_gpiochip_add_pin_range(struct gpio_chip *chip) static int of_gpiochip_add_pin_range(struct gpio_chip *chip)

View file

@ -13,7 +13,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_gpio.h> /* for of_mm_gpio_chip */ #include <linux/gpio/legacy-of-mm-gpiochip.h>
#include <linux/gpio/consumer.h> #include <linux/gpio/consumer.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/slab.h> #include <linux/slab.h>

View file

@ -0,0 +1,36 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* OF helpers for the old of_mm_gpio_chip, used on ppc32 and nios2,
* do not use in new code.
*
* Copyright (c) 2007-2008 MontaVista Software, Inc.
*
* Author: Anton Vorontsov <avorontsov@ru.mvista.com>
*/
#ifndef __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
#define __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H
#include <linux/gpio/driver.h>
#include <linux/of.h>
/*
* OF GPIO chip for memory mapped banks
*/
struct of_mm_gpio_chip {
struct gpio_chip gc;
void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
void __iomem *regs;
};
static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
{
return container_of(gc, struct of_mm_gpio_chip, gc);
}
extern int of_mm_gpiochip_add_data(struct device_node *np,
struct of_mm_gpio_chip *mm_gc,
void *data);
extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
#endif /* __LINUX_GPIO_LEGACY_OF_MM_GPIO_CHIP_H */

View file

@ -19,30 +19,9 @@ struct device_node;
#ifdef CONFIG_OF_GPIO #ifdef CONFIG_OF_GPIO
#include <linux/container_of.h>
/*
* OF GPIO chip for memory mapped banks
*/
struct of_mm_gpio_chip {
struct gpio_chip gc;
void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
void __iomem *regs;
};
static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
{
return container_of(gc, struct of_mm_gpio_chip, gc);
}
extern int of_get_named_gpio(const struct device_node *np, extern int of_get_named_gpio(const struct device_node *np,
const char *list_name, int index); const char *list_name, int index);
extern int of_mm_gpiochip_add_data(struct device_node *np,
struct of_mm_gpio_chip *mm_gc,
void *data);
extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
#else /* CONFIG_OF_GPIO */ #else /* CONFIG_OF_GPIO */
#include <linux/errno.h> #include <linux/errno.h>