mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 15:04:27 +08:00
73317712d9
Add a pincontrol driver for pxa2xx architecture, encompassing all pxa25x and pxa27x variants. This is only the pin muxing part of the driver. One specific consideration is also the memory space (MMIO), which is intertwined with the GPIO registers. To make things worse, the GPIO direction register also affect pin muxing, as it chooses the "kind" of pin, ie. the 4 output functions or 4 input functions. The mapping between pinctrl notions and PXA Technical Reference Manual is as follows : - a pin is obviously a pin - a group is also a pin, ie. group P101 is the pin 101 - a mux function is an alternate function (ie. gpio-in, gpio-out, MMCLK, BTRTS, etc ...) The individual architecture (pxa27x, pxa25x) instantiate a pin control by providing a table of pins, each pin being provided a list of PXA_FUNCTION (alternate functions). Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
/*
|
|
* Marvell PXA2xx family pin control
|
|
*
|
|
* Copyright (C) 2015 Robert Jarzmik
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
*/
|
|
|
|
#ifndef __PINCTRL_PXA_H
|
|
#define __PINCTRL_PXA_H
|
|
|
|
#define PXA_FUNCTION(_dir, _af, _name) \
|
|
{ \
|
|
.name = _name, \
|
|
.muxval = (_dir | (_af << 1)), \
|
|
}
|
|
|
|
#define PXA_PIN(_pin, funcs...) \
|
|
{ \
|
|
.pin = _pin, \
|
|
.functions = (struct pxa_desc_function[]){ \
|
|
funcs, { } }, \
|
|
}
|
|
|
|
#define PXA_GPIO_PIN(_pin, funcs...) \
|
|
{ \
|
|
.pin = _pin, \
|
|
.functions = (struct pxa_desc_function[]){ \
|
|
PXA_FUNCTION(0, 0, "gpio_in"), \
|
|
PXA_FUNCTION(1, 0, "gpio_out"), \
|
|
funcs, { } }, \
|
|
}
|
|
|
|
#define PXA_GPIO_ONLY_PIN(_pin) \
|
|
{ \
|
|
.pin = _pin, \
|
|
.functions = (struct pxa_desc_function[]){ \
|
|
PXA_FUNCTION(0, 0, "gpio_in"), \
|
|
PXA_FUNCTION(1, 0, "gpio_out"), \
|
|
{ } }, \
|
|
}
|
|
|
|
#define PXA_PINCTRL_PIN(pin) \
|
|
PINCTRL_PIN(pin, "P" #pin)
|
|
|
|
struct pxa_desc_function {
|
|
const char *name;
|
|
u8 muxval;
|
|
};
|
|
|
|
struct pxa_desc_pin {
|
|
struct pinctrl_pin_desc pin;
|
|
struct pxa_desc_function *functions;
|
|
};
|
|
|
|
struct pxa_pinctrl_group {
|
|
const char *name;
|
|
unsigned pin;
|
|
};
|
|
|
|
struct pxa_pinctrl_function {
|
|
const char *name;
|
|
const char **groups;
|
|
unsigned ngroups;
|
|
};
|
|
|
|
struct pxa_pinctrl {
|
|
spinlock_t lock;
|
|
void __iomem **base_gafr;
|
|
void __iomem **base_gpdr;
|
|
void __iomem **base_pgsr;
|
|
struct device *dev;
|
|
struct pinctrl_desc desc;
|
|
struct pinctrl_dev *pctl_dev;
|
|
unsigned npins;
|
|
const struct pxa_desc_pin *ppins;
|
|
unsigned ngroups;
|
|
struct pxa_pinctrl_group *groups;
|
|
unsigned nfuncs;
|
|
struct pxa_pinctrl_function *functions;
|
|
char *name;
|
|
};
|
|
|
|
int pxa2xx_pinctrl_init(struct platform_device *pdev,
|
|
const struct pxa_desc_pin *ppins, int npins,
|
|
void __iomem *base_gafr[], void __iomem *base_gpdr[],
|
|
void __iomem *base_gpsr[]);
|
|
|
|
#endif /* __PINCTRL_PXA_H */
|