cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mfp-pxa2xx.c (9948B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  linux/arch/arm/mach-pxa/mfp-pxa2xx.c
      4 *
      5 *  PXA2xx pin mux configuration support
      6 *
      7 *  The GPIOs on PXA2xx can be configured as one of many alternate
      8 *  functions, this is by concept samilar to the MFP configuration
      9 *  on PXA3xx,  what's more important, the low power pin state and
     10 *  wakeup detection are also supported by the same framework.
     11 */
     12#include <linux/gpio.h>
     13#include <linux/gpio-pxa.h>
     14#include <linux/module.h>
     15#include <linux/kernel.h>
     16#include <linux/init.h>
     17#include <linux/io.h>
     18#include <linux/syscore_ops.h>
     19#include <linux/soc/pxa/cpu.h>
     20
     21#include "pxa2xx-regs.h"
     22#include "mfp-pxa2xx.h"
     23
     24#include "generic.h"
     25
     26#define PGSR(x)		__REG2(0x40F00020, (x) << 2)
     27#define __GAFR(u, x)	__REG2((u) ? 0x40E00058 : 0x40E00054, (x) << 3)
     28#define GAFR_L(x)	__GAFR(0, x)
     29#define GAFR_U(x)	__GAFR(1, x)
     30
     31#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
     32#define GPLR(x)		__REG2(0x40E00000, BANK_OFF((x) >> 5))
     33#define GPDR(x)		__REG2(0x40E00000, BANK_OFF((x) >> 5) + 0x0c)
     34#define GPSR(x)		__REG2(0x40E00000, BANK_OFF((x) >> 5) + 0x18)
     35#define GPCR(x)		__REG2(0x40E00000, BANK_OFF((x) >> 5) + 0x24)
     36
     37#define PWER_WE35	(1 << 24)
     38
     39struct gpio_desc {
     40	unsigned	valid		: 1;
     41	unsigned	can_wakeup	: 1;
     42	unsigned	keypad_gpio	: 1;
     43	unsigned	dir_inverted	: 1;
     44	unsigned int	mask; /* bit mask in PWER or PKWR */
     45	unsigned int	mux_mask; /* bit mask of muxed gpio bits, 0 if no mux */
     46	unsigned long	config;
     47};
     48
     49static struct gpio_desc gpio_desc[MFP_PIN_GPIO127 + 1];
     50
     51static unsigned long gpdr_lpm[4];
     52
     53static int __mfp_config_gpio(unsigned gpio, unsigned long c)
     54{
     55	unsigned long gafr, mask = GPIO_bit(gpio);
     56	int bank = gpio_to_bank(gpio);
     57	int uorl = !!(gpio & 0x10); /* GAFRx_U or GAFRx_L ? */
     58	int shft = (gpio & 0xf) << 1;
     59	int fn = MFP_AF(c);
     60	int is_out = (c & MFP_DIR_OUT) ? 1 : 0;
     61
     62	if (fn > 3)
     63		return -EINVAL;
     64
     65	/* alternate function and direction at run-time */
     66	gafr = (uorl == 0) ? GAFR_L(bank) : GAFR_U(bank);
     67	gafr = (gafr & ~(0x3 << shft)) | (fn << shft);
     68
     69	if (uorl == 0)
     70		GAFR_L(bank) = gafr;
     71	else
     72		GAFR_U(bank) = gafr;
     73
     74	if (is_out ^ gpio_desc[gpio].dir_inverted)
     75		GPDR(gpio) |= mask;
     76	else
     77		GPDR(gpio) &= ~mask;
     78
     79	/* alternate function and direction at low power mode */
     80	switch (c & MFP_LPM_STATE_MASK) {
     81	case MFP_LPM_DRIVE_HIGH:
     82		PGSR(bank) |= mask;
     83		is_out = 1;
     84		break;
     85	case MFP_LPM_DRIVE_LOW:
     86		PGSR(bank) &= ~mask;
     87		is_out = 1;
     88		break;
     89	case MFP_LPM_INPUT:
     90	case MFP_LPM_DEFAULT:
     91		break;
     92	default:
     93		/* warning and fall through, treat as MFP_LPM_DEFAULT */
     94		pr_warn("%s: GPIO%d: unsupported low power mode\n",
     95			__func__, gpio);
     96		break;
     97	}
     98
     99	if (is_out ^ gpio_desc[gpio].dir_inverted)
    100		gpdr_lpm[bank] |= mask;
    101	else
    102		gpdr_lpm[bank] &= ~mask;
    103
    104	/* give early warning if MFP_LPM_CAN_WAKEUP is set on the
    105	 * configurations of those pins not able to wakeup
    106	 */
    107	if ((c & MFP_LPM_CAN_WAKEUP) && !gpio_desc[gpio].can_wakeup) {
    108		pr_warn("%s: GPIO%d unable to wakeup\n", __func__, gpio);
    109		return -EINVAL;
    110	}
    111
    112	if ((c & MFP_LPM_CAN_WAKEUP) && is_out) {
    113		pr_warn("%s: output GPIO%d unable to wakeup\n", __func__, gpio);
    114		return -EINVAL;
    115	}
    116
    117	return 0;
    118}
    119
    120static inline int __mfp_validate(int mfp)
    121{
    122	int gpio = mfp_to_gpio(mfp);
    123
    124	if ((mfp > MFP_PIN_GPIO127) || !gpio_desc[gpio].valid) {
    125		pr_warn("%s: GPIO%d is invalid pin\n", __func__, gpio);
    126		return -1;
    127	}
    128
    129	return gpio;
    130}
    131
    132void pxa2xx_mfp_config(unsigned long *mfp_cfgs, int num)
    133{
    134	unsigned long flags;
    135	unsigned long *c;
    136	int i, gpio;
    137
    138	for (i = 0, c = mfp_cfgs; i < num; i++, c++) {
    139
    140		gpio = __mfp_validate(MFP_PIN(*c));
    141		if (gpio < 0)
    142			continue;
    143
    144		local_irq_save(flags);
    145
    146		gpio_desc[gpio].config = *c;
    147		__mfp_config_gpio(gpio, *c);
    148
    149		local_irq_restore(flags);
    150	}
    151}
    152
    153void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
    154{
    155	unsigned long flags, c;
    156	int gpio;
    157
    158	gpio = __mfp_validate(mfp);
    159	if (gpio < 0)
    160		return;
    161
    162	local_irq_save(flags);
    163
    164	c = gpio_desc[gpio].config;
    165	c = (c & ~MFP_LPM_STATE_MASK) | lpm;
    166	__mfp_config_gpio(gpio, c);
    167
    168	local_irq_restore(flags);
    169}
    170
    171int gpio_set_wake(unsigned int gpio, unsigned int on)
    172{
    173	struct gpio_desc *d;
    174	unsigned long c, mux_taken;
    175
    176	if (gpio > mfp_to_gpio(MFP_PIN_GPIO127))
    177		return -EINVAL;
    178
    179	d = &gpio_desc[gpio];
    180	c = d->config;
    181
    182	if (!d->valid)
    183		return -EINVAL;
    184
    185	/* Allow keypad GPIOs to wakeup system when
    186	 * configured as generic GPIOs.
    187	 */
    188	if (d->keypad_gpio && (MFP_AF(d->config) == 0) &&
    189	    (d->config & MFP_LPM_CAN_WAKEUP)) {
    190		if (on)
    191			PKWR |= d->mask;
    192		else
    193			PKWR &= ~d->mask;
    194		return 0;
    195	}
    196
    197	mux_taken = (PWER & d->mux_mask) & (~d->mask);
    198	if (on && mux_taken)
    199		return -EBUSY;
    200
    201	if (d->can_wakeup && (c & MFP_LPM_CAN_WAKEUP)) {
    202		if (on) {
    203			PWER = (PWER & ~d->mux_mask) | d->mask;
    204
    205			if (c & MFP_LPM_EDGE_RISE)
    206				PRER |= d->mask;
    207			else
    208				PRER &= ~d->mask;
    209
    210			if (c & MFP_LPM_EDGE_FALL)
    211				PFER |= d->mask;
    212			else
    213				PFER &= ~d->mask;
    214		} else {
    215			PWER &= ~d->mask;
    216			PRER &= ~d->mask;
    217			PFER &= ~d->mask;
    218		}
    219	}
    220	return 0;
    221}
    222
    223#ifdef CONFIG_PXA25x
    224static void __init pxa25x_mfp_init(void)
    225{
    226	int i;
    227
    228	/* running before pxa_gpio_probe() */
    229#ifdef CONFIG_CPU_PXA26x
    230	pxa_last_gpio = 89;
    231#else
    232	pxa_last_gpio = 84;
    233#endif
    234	for (i = 0; i <= pxa_last_gpio; i++)
    235		gpio_desc[i].valid = 1;
    236
    237	for (i = 0; i <= 15; i++) {
    238		gpio_desc[i].can_wakeup = 1;
    239		gpio_desc[i].mask = GPIO_bit(i);
    240	}
    241
    242	/* PXA26x has additional 4 GPIOs (86/87/88/89) which has the
    243	 * direction bit inverted in GPDR2. See PXA26x DM 4.1.1.
    244	 */
    245	for (i = 86; i <= pxa_last_gpio; i++)
    246		gpio_desc[i].dir_inverted = 1;
    247}
    248#else
    249static inline void pxa25x_mfp_init(void) {}
    250#endif /* CONFIG_PXA25x */
    251
    252#ifdef CONFIG_PXA27x
    253static int pxa27x_pkwr_gpio[] = {
    254	13, 16, 17, 34, 36, 37, 38, 39, 90, 91, 93, 94,
    255	95, 96, 97, 98, 99, 100, 101, 102
    256};
    257
    258int keypad_set_wake(unsigned int on)
    259{
    260	unsigned int i, gpio, mask = 0;
    261	struct gpio_desc *d;
    262
    263	for (i = 0; i < ARRAY_SIZE(pxa27x_pkwr_gpio); i++) {
    264
    265		gpio = pxa27x_pkwr_gpio[i];
    266		d = &gpio_desc[gpio];
    267
    268		/* skip if configured as generic GPIO */
    269		if (MFP_AF(d->config) == 0)
    270			continue;
    271
    272		if (d->config & MFP_LPM_CAN_WAKEUP)
    273			mask |= gpio_desc[gpio].mask;
    274	}
    275
    276	if (on)
    277		PKWR |= mask;
    278	else
    279		PKWR &= ~mask;
    280	return 0;
    281}
    282
    283#define PWER_WEMUX2_GPIO38	(1 << 16)
    284#define PWER_WEMUX2_GPIO53	(2 << 16)
    285#define PWER_WEMUX2_GPIO40	(3 << 16)
    286#define PWER_WEMUX2_GPIO36	(4 << 16)
    287#define PWER_WEMUX2_MASK	(7 << 16)
    288#define PWER_WEMUX3_GPIO31	(1 << 19)
    289#define PWER_WEMUX3_GPIO113	(2 << 19)
    290#define PWER_WEMUX3_MASK	(3 << 19)
    291
    292#define INIT_GPIO_DESC_MUXED(mux, gpio)				\
    293do {								\
    294	gpio_desc[(gpio)].can_wakeup = 1;			\
    295	gpio_desc[(gpio)].mask = PWER_ ## mux ## _GPIO ##gpio;	\
    296	gpio_desc[(gpio)].mux_mask = PWER_ ## mux ## _MASK;	\
    297} while (0)
    298
    299static void __init pxa27x_mfp_init(void)
    300{
    301	int i, gpio;
    302
    303	pxa_last_gpio = 120;	/* running before pxa_gpio_probe() */
    304	for (i = 0; i <= pxa_last_gpio; i++) {
    305		/* skip GPIO2, 5, 6, 7, 8, they are not
    306		 * valid pins allow configuration
    307		 */
    308		if (i == 2 || i == 5 || i == 6 || i == 7 || i == 8)
    309			continue;
    310
    311		gpio_desc[i].valid = 1;
    312	}
    313
    314	/* Keypad GPIOs */
    315	for (i = 0; i < ARRAY_SIZE(pxa27x_pkwr_gpio); i++) {
    316		gpio = pxa27x_pkwr_gpio[i];
    317		gpio_desc[gpio].can_wakeup = 1;
    318		gpio_desc[gpio].keypad_gpio = 1;
    319		gpio_desc[gpio].mask = 1 << i;
    320	}
    321
    322	/* Overwrite GPIO13 as a PWER wakeup source */
    323	for (i = 0; i <= 15; i++) {
    324		/* skip GPIO2, 5, 6, 7, 8 */
    325		if (GPIO_bit(i) & 0x1e4)
    326			continue;
    327
    328		gpio_desc[i].can_wakeup = 1;
    329		gpio_desc[i].mask = GPIO_bit(i);
    330	}
    331
    332	gpio_desc[35].can_wakeup = 1;
    333	gpio_desc[35].mask = PWER_WE35;
    334
    335	INIT_GPIO_DESC_MUXED(WEMUX3, 31);
    336	INIT_GPIO_DESC_MUXED(WEMUX3, 113);
    337	INIT_GPIO_DESC_MUXED(WEMUX2, 38);
    338	INIT_GPIO_DESC_MUXED(WEMUX2, 53);
    339	INIT_GPIO_DESC_MUXED(WEMUX2, 40);
    340	INIT_GPIO_DESC_MUXED(WEMUX2, 36);
    341}
    342#else
    343static inline void pxa27x_mfp_init(void) {}
    344#endif /* CONFIG_PXA27x */
    345
    346#ifdef CONFIG_PM
    347static unsigned long saved_gafr[2][4];
    348static unsigned long saved_gpdr[4];
    349static unsigned long saved_gplr[4];
    350static unsigned long saved_pgsr[4];
    351
    352static int pxa2xx_mfp_suspend(void)
    353{
    354	int i;
    355
    356	/* set corresponding PGSR bit of those marked MFP_LPM_KEEP_OUTPUT */
    357	for (i = 0; i < pxa_last_gpio; i++) {
    358		if ((gpio_desc[i].config & MFP_LPM_KEEP_OUTPUT) &&
    359		    (GPDR(i) & GPIO_bit(i))) {
    360			if (GPLR(i) & GPIO_bit(i))
    361				PGSR(gpio_to_bank(i)) |= GPIO_bit(i);
    362			else
    363				PGSR(gpio_to_bank(i)) &= ~GPIO_bit(i);
    364		}
    365	}
    366
    367	for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++) {
    368		saved_gafr[0][i] = GAFR_L(i);
    369		saved_gafr[1][i] = GAFR_U(i);
    370		saved_gpdr[i] = GPDR(i * 32);
    371		saved_gplr[i] = GPLR(i * 32);
    372		saved_pgsr[i] = PGSR(i);
    373
    374		GPSR(i * 32) = PGSR(i);
    375		GPCR(i * 32) = ~PGSR(i);
    376	}
    377
    378	/* set GPDR bits taking into account MFP_LPM_KEEP_OUTPUT */
    379	for (i = 0; i < pxa_last_gpio; i++) {
    380		if ((gpdr_lpm[gpio_to_bank(i)] & GPIO_bit(i)) ||
    381		    ((gpio_desc[i].config & MFP_LPM_KEEP_OUTPUT) &&
    382		     (saved_gpdr[gpio_to_bank(i)] & GPIO_bit(i))))
    383			GPDR(i) |= GPIO_bit(i);
    384		else
    385			GPDR(i) &= ~GPIO_bit(i);
    386	}
    387
    388	return 0;
    389}
    390
    391static void pxa2xx_mfp_resume(void)
    392{
    393	int i;
    394
    395	for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++) {
    396		GAFR_L(i) = saved_gafr[0][i];
    397		GAFR_U(i) = saved_gafr[1][i];
    398		GPSR(i * 32) = saved_gplr[i];
    399		GPCR(i * 32) = ~saved_gplr[i];
    400		GPDR(i * 32) = saved_gpdr[i];
    401		PGSR(i) = saved_pgsr[i];
    402	}
    403	PSSR = PSSR_RDH | PSSR_PH;
    404}
    405#else
    406#define pxa2xx_mfp_suspend	NULL
    407#define pxa2xx_mfp_resume	NULL
    408#endif
    409
    410struct syscore_ops pxa2xx_mfp_syscore_ops = {
    411	.suspend	= pxa2xx_mfp_suspend,
    412	.resume		= pxa2xx_mfp_resume,
    413};
    414
    415static int __init pxa2xx_mfp_init(void)
    416{
    417	int i;
    418
    419	if (!cpu_is_pxa2xx())
    420		return 0;
    421
    422	if (cpu_is_pxa25x())
    423		pxa25x_mfp_init();
    424
    425	if (cpu_is_pxa27x())
    426		pxa27x_mfp_init();
    427
    428	/* clear RDH bit to enable GPIO receivers after reset/sleep exit */
    429	PSSR = PSSR_RDH;
    430
    431	/* initialize gafr_run[], pgsr_lpm[] from existing values */
    432	for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
    433		gpdr_lpm[i] = GPDR(i * 32);
    434
    435	return 0;
    436}
    437postcore_initcall(pxa2xx_mfp_init);