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

gpio.c (15534B)


      1/*
      2 * arch/arm/plat-orion/gpio.c
      3 *
      4 * Marvell Orion SoC GPIO handling.
      5 *
      6 * This file is licensed under the terms of the GNU General Public
      7 * License version 2.  This program is licensed "as is" without any
      8 * warranty of any kind, whether express or implied.
      9 */
     10
     11#define DEBUG
     12
     13#include <linux/kernel.h>
     14#include <linux/init.h>
     15#include <linux/irq.h>
     16#include <linux/irqdomain.h>
     17#include <linux/module.h>
     18#include <linux/spinlock.h>
     19#include <linux/bitops.h>
     20#include <linux/io.h>
     21#include <linux/gpio.h>
     22#include <linux/leds.h>
     23#include <linux/of.h>
     24#include <linux/of_irq.h>
     25#include <linux/of_address.h>
     26#include <plat/orion-gpio.h>
     27
     28/*
     29 * GPIO unit register offsets.
     30 */
     31#define GPIO_OUT_OFF		0x0000
     32#define GPIO_IO_CONF_OFF	0x0004
     33#define GPIO_BLINK_EN_OFF	0x0008
     34#define GPIO_IN_POL_OFF		0x000c
     35#define GPIO_DATA_IN_OFF	0x0010
     36#define GPIO_EDGE_CAUSE_OFF	0x0014
     37#define GPIO_EDGE_MASK_OFF	0x0018
     38#define GPIO_LEVEL_MASK_OFF	0x001c
     39
     40struct orion_gpio_chip {
     41	struct gpio_chip	chip;
     42	spinlock_t		lock;
     43	void __iomem		*base;
     44	unsigned long		valid_input;
     45	unsigned long		valid_output;
     46	int			mask_offset;
     47	int			secondary_irq_base;
     48	struct irq_domain       *domain;
     49};
     50
     51static void __iomem *GPIO_OUT(struct orion_gpio_chip *ochip)
     52{
     53	return ochip->base + GPIO_OUT_OFF;
     54}
     55
     56static void __iomem *GPIO_IO_CONF(struct orion_gpio_chip *ochip)
     57{
     58	return ochip->base + GPIO_IO_CONF_OFF;
     59}
     60
     61static void __iomem *GPIO_BLINK_EN(struct orion_gpio_chip *ochip)
     62{
     63	return ochip->base + GPIO_BLINK_EN_OFF;
     64}
     65
     66static void __iomem *GPIO_IN_POL(struct orion_gpio_chip *ochip)
     67{
     68	return ochip->base + GPIO_IN_POL_OFF;
     69}
     70
     71static void __iomem *GPIO_DATA_IN(struct orion_gpio_chip *ochip)
     72{
     73	return ochip->base + GPIO_DATA_IN_OFF;
     74}
     75
     76static void __iomem *GPIO_EDGE_CAUSE(struct orion_gpio_chip *ochip)
     77{
     78	return ochip->base + GPIO_EDGE_CAUSE_OFF;
     79}
     80
     81static void __iomem *GPIO_EDGE_MASK(struct orion_gpio_chip *ochip)
     82{
     83	return ochip->base + ochip->mask_offset + GPIO_EDGE_MASK_OFF;
     84}
     85
     86static void __iomem *GPIO_LEVEL_MASK(struct orion_gpio_chip *ochip)
     87{
     88	return ochip->base + ochip->mask_offset + GPIO_LEVEL_MASK_OFF;
     89}
     90
     91
     92static struct orion_gpio_chip orion_gpio_chips[2];
     93static int orion_gpio_chip_count;
     94
     95static inline void
     96__set_direction(struct orion_gpio_chip *ochip, unsigned pin, int input)
     97{
     98	u32 u;
     99
    100	u = readl(GPIO_IO_CONF(ochip));
    101	if (input)
    102		u |= 1 << pin;
    103	else
    104		u &= ~(1 << pin);
    105	writel(u, GPIO_IO_CONF(ochip));
    106}
    107
    108static void __set_level(struct orion_gpio_chip *ochip, unsigned pin, int high)
    109{
    110	u32 u;
    111
    112	u = readl(GPIO_OUT(ochip));
    113	if (high)
    114		u |= 1 << pin;
    115	else
    116		u &= ~(1 << pin);
    117	writel(u, GPIO_OUT(ochip));
    118}
    119
    120static inline void
    121__set_blinking(struct orion_gpio_chip *ochip, unsigned pin, int blink)
    122{
    123	u32 u;
    124
    125	u = readl(GPIO_BLINK_EN(ochip));
    126	if (blink)
    127		u |= 1 << pin;
    128	else
    129		u &= ~(1 << pin);
    130	writel(u, GPIO_BLINK_EN(ochip));
    131}
    132
    133static inline int
    134orion_gpio_is_valid(struct orion_gpio_chip *ochip, unsigned pin, int mode)
    135{
    136	if (pin >= ochip->chip.ngpio)
    137		goto err_out;
    138
    139	if ((mode & GPIO_INPUT_OK) && !test_bit(pin, &ochip->valid_input))
    140		goto err_out;
    141
    142	if ((mode & GPIO_OUTPUT_OK) && !test_bit(pin, &ochip->valid_output))
    143		goto err_out;
    144
    145	return 1;
    146
    147err_out:
    148	pr_debug("%s: invalid GPIO %d\n", __func__, pin);
    149	return false;
    150}
    151
    152/*
    153 * GPIO primitives.
    154 */
    155static int orion_gpio_request(struct gpio_chip *chip, unsigned pin)
    156{
    157	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    158
    159	if (orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK) ||
    160	    orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK))
    161		return 0;
    162
    163	return -EINVAL;
    164}
    165
    166static int orion_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
    167{
    168	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    169	unsigned long flags;
    170
    171	if (!orion_gpio_is_valid(ochip, pin, GPIO_INPUT_OK))
    172		return -EINVAL;
    173
    174	spin_lock_irqsave(&ochip->lock, flags);
    175	__set_direction(ochip, pin, 1);
    176	spin_unlock_irqrestore(&ochip->lock, flags);
    177
    178	return 0;
    179}
    180
    181static int orion_gpio_get(struct gpio_chip *chip, unsigned pin)
    182{
    183	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    184	int val;
    185
    186	if (readl(GPIO_IO_CONF(ochip)) & (1 << pin)) {
    187		val = readl(GPIO_DATA_IN(ochip)) ^ readl(GPIO_IN_POL(ochip));
    188	} else {
    189		val = readl(GPIO_OUT(ochip));
    190	}
    191
    192	return (val >> pin) & 1;
    193}
    194
    195static int
    196orion_gpio_direction_output(struct gpio_chip *chip, unsigned pin, int value)
    197{
    198	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    199	unsigned long flags;
    200
    201	if (!orion_gpio_is_valid(ochip, pin, GPIO_OUTPUT_OK))
    202		return -EINVAL;
    203
    204	spin_lock_irqsave(&ochip->lock, flags);
    205	__set_blinking(ochip, pin, 0);
    206	__set_level(ochip, pin, value);
    207	__set_direction(ochip, pin, 0);
    208	spin_unlock_irqrestore(&ochip->lock, flags);
    209
    210	return 0;
    211}
    212
    213static void orion_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
    214{
    215	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    216	unsigned long flags;
    217
    218	spin_lock_irqsave(&ochip->lock, flags);
    219	__set_level(ochip, pin, value);
    220	spin_unlock_irqrestore(&ochip->lock, flags);
    221}
    222
    223static int orion_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
    224{
    225	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    226
    227	return irq_create_mapping(ochip->domain,
    228				  ochip->secondary_irq_base + pin);
    229}
    230
    231/*
    232 * Orion-specific GPIO API extensions.
    233 */
    234static struct orion_gpio_chip *orion_gpio_chip_find(int pin)
    235{
    236	int i;
    237
    238	for (i = 0; i < orion_gpio_chip_count; i++) {
    239		struct orion_gpio_chip *ochip = orion_gpio_chips + i;
    240		struct gpio_chip *chip = &ochip->chip;
    241
    242		if (pin >= chip->base && pin < chip->base + chip->ngpio)
    243			return ochip;
    244	}
    245
    246	return NULL;
    247}
    248
    249void __init orion_gpio_set_unused(unsigned pin)
    250{
    251	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);
    252
    253	if (ochip == NULL)
    254		return;
    255
    256	pin -= ochip->chip.base;
    257
    258	/* Configure as output, drive low. */
    259	__set_level(ochip, pin, 0);
    260	__set_direction(ochip, pin, 0);
    261}
    262
    263void __init orion_gpio_set_valid(unsigned pin, int mode)
    264{
    265	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);
    266
    267	if (ochip == NULL)
    268		return;
    269
    270	pin -= ochip->chip.base;
    271
    272	if (mode == 1)
    273		mode = GPIO_INPUT_OK | GPIO_OUTPUT_OK;
    274
    275	if (mode & GPIO_INPUT_OK)
    276		__set_bit(pin, &ochip->valid_input);
    277	else
    278		__clear_bit(pin, &ochip->valid_input);
    279
    280	if (mode & GPIO_OUTPUT_OK)
    281		__set_bit(pin, &ochip->valid_output);
    282	else
    283		__clear_bit(pin, &ochip->valid_output);
    284}
    285
    286void orion_gpio_set_blink(unsigned pin, int blink)
    287{
    288	struct orion_gpio_chip *ochip = orion_gpio_chip_find(pin);
    289	unsigned long flags;
    290
    291	if (ochip == NULL)
    292		return;
    293
    294	spin_lock_irqsave(&ochip->lock, flags);
    295	__set_level(ochip, pin & 31, 0);
    296	__set_blinking(ochip, pin & 31, blink);
    297	spin_unlock_irqrestore(&ochip->lock, flags);
    298}
    299EXPORT_SYMBOL(orion_gpio_set_blink);
    300
    301#define ORION_BLINK_HALF_PERIOD 100 /* ms */
    302
    303int orion_gpio_led_blink_set(struct gpio_desc *desc, int state,
    304	unsigned long *delay_on, unsigned long *delay_off)
    305{
    306	unsigned gpio = desc_to_gpio(desc);
    307
    308	if (delay_on && delay_off && !*delay_on && !*delay_off)
    309		*delay_on = *delay_off = ORION_BLINK_HALF_PERIOD;
    310
    311	switch (state) {
    312	case GPIO_LED_NO_BLINK_LOW:
    313	case GPIO_LED_NO_BLINK_HIGH:
    314		orion_gpio_set_blink(gpio, 0);
    315		gpio_set_value(gpio, state);
    316		break;
    317	case GPIO_LED_BLINK:
    318		orion_gpio_set_blink(gpio, 1);
    319	}
    320	return 0;
    321}
    322EXPORT_SYMBOL_GPL(orion_gpio_led_blink_set);
    323
    324
    325/*****************************************************************************
    326 * Orion GPIO IRQ
    327 *
    328 * GPIO_IN_POL register controls whether GPIO_DATA_IN will hold the same
    329 * value of the line or the opposite value.
    330 *
    331 * Level IRQ handlers: DATA_IN is used directly as cause register.
    332 *                     Interrupt are masked by LEVEL_MASK registers.
    333 * Edge IRQ handlers:  Change in DATA_IN are latched in EDGE_CAUSE.
    334 *                     Interrupt are masked by EDGE_MASK registers.
    335 * Both-edge handlers: Similar to regular Edge handlers, but also swaps
    336 *                     the polarity to catch the next line transaction.
    337 *                     This is a race condition that might not perfectly
    338 *                     work on some use cases.
    339 *
    340 * Every eight GPIO lines are grouped (OR'ed) before going up to main
    341 * cause register.
    342 *
    343 *                    EDGE  cause    mask
    344 *        data-in   /--------| |-----| |----\
    345 *     -----| |-----                         ---- to main cause reg
    346 *           X      \----------------| |----/
    347 *        polarity    LEVEL          mask
    348 *
    349 ****************************************************************************/
    350
    351static int gpio_irq_set_type(struct irq_data *d, u32 type)
    352{
    353	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
    354	struct irq_chip_type *ct = irq_data_get_chip_type(d);
    355	struct orion_gpio_chip *ochip = gc->private;
    356	int pin;
    357	u32 u;
    358
    359	pin = d->hwirq - ochip->secondary_irq_base;
    360
    361	u = readl(GPIO_IO_CONF(ochip)) & (1 << pin);
    362	if (!u) {
    363		return -EINVAL;
    364	}
    365
    366	type &= IRQ_TYPE_SENSE_MASK;
    367	if (type == IRQ_TYPE_NONE)
    368		return -EINVAL;
    369
    370	/* Check if we need to change chip and handler */
    371	if (!(ct->type & type))
    372		if (irq_setup_alt_chip(d, type))
    373			return -EINVAL;
    374
    375	/*
    376	 * Configure interrupt polarity.
    377	 */
    378	if (type == IRQ_TYPE_EDGE_RISING || type == IRQ_TYPE_LEVEL_HIGH) {
    379		u = readl(GPIO_IN_POL(ochip));
    380		u &= ~(1 << pin);
    381		writel(u, GPIO_IN_POL(ochip));
    382	} else if (type == IRQ_TYPE_EDGE_FALLING || type == IRQ_TYPE_LEVEL_LOW) {
    383		u = readl(GPIO_IN_POL(ochip));
    384		u |= 1 << pin;
    385		writel(u, GPIO_IN_POL(ochip));
    386	} else if (type == IRQ_TYPE_EDGE_BOTH) {
    387		u32 v;
    388
    389		v = readl(GPIO_IN_POL(ochip)) ^ readl(GPIO_DATA_IN(ochip));
    390
    391		/*
    392		 * set initial polarity based on current input level
    393		 */
    394		u = readl(GPIO_IN_POL(ochip));
    395		if (v & (1 << pin))
    396			u |= 1 << pin;		/* falling */
    397		else
    398			u &= ~(1 << pin);	/* rising */
    399		writel(u, GPIO_IN_POL(ochip));
    400	}
    401	return 0;
    402}
    403
    404static void gpio_irq_handler(struct irq_desc *desc)
    405{
    406	struct orion_gpio_chip *ochip = irq_desc_get_handler_data(desc);
    407	u32 cause, type;
    408	int i;
    409
    410	if (ochip == NULL)
    411		return;
    412
    413	cause = readl(GPIO_DATA_IN(ochip)) & readl(GPIO_LEVEL_MASK(ochip));
    414	cause |= readl(GPIO_EDGE_CAUSE(ochip)) & readl(GPIO_EDGE_MASK(ochip));
    415
    416	for (i = 0; i < ochip->chip.ngpio; i++) {
    417		int irq;
    418
    419		irq = ochip->secondary_irq_base + i;
    420
    421		if (!(cause & (1 << i)))
    422			continue;
    423
    424		type = irq_get_trigger_type(irq);
    425		if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
    426			/* Swap polarity (race with GPIO line) */
    427			u32 polarity;
    428
    429			polarity = readl(GPIO_IN_POL(ochip));
    430			polarity ^= 1 << i;
    431			writel(polarity, GPIO_IN_POL(ochip));
    432		}
    433		generic_handle_irq(irq);
    434	}
    435}
    436
    437#ifdef CONFIG_DEBUG_FS
    438#include <linux/seq_file.h>
    439
    440static void orion_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
    441{
    442
    443	struct orion_gpio_chip *ochip = gpiochip_get_data(chip);
    444	u32 out, io_conf, blink, in_pol, data_in, cause, edg_msk, lvl_msk;
    445	const char *label;
    446	int i;
    447
    448	out	= readl_relaxed(GPIO_OUT(ochip));
    449	io_conf	= readl_relaxed(GPIO_IO_CONF(ochip));
    450	blink	= readl_relaxed(GPIO_BLINK_EN(ochip));
    451	in_pol	= readl_relaxed(GPIO_IN_POL(ochip));
    452	data_in	= readl_relaxed(GPIO_DATA_IN(ochip));
    453	cause	= readl_relaxed(GPIO_EDGE_CAUSE(ochip));
    454	edg_msk	= readl_relaxed(GPIO_EDGE_MASK(ochip));
    455	lvl_msk	= readl_relaxed(GPIO_LEVEL_MASK(ochip));
    456
    457	for_each_requested_gpio(chip, i, label) {
    458		u32 msk;
    459		bool is_out;
    460
    461		msk = 1 << i;
    462		is_out = !(io_conf & msk);
    463
    464		seq_printf(s, " gpio-%-3d (%-20.20s)", chip->base + i, label);
    465
    466		if (is_out) {
    467			seq_printf(s, " out %s %s\n",
    468				   out & msk ? "hi" : "lo",
    469				   blink & msk ? "(blink )" : "");
    470			continue;
    471		}
    472
    473		seq_printf(s, " in  %s (act %s) - IRQ",
    474			   (data_in ^ in_pol) & msk  ? "hi" : "lo",
    475			   in_pol & msk ? "lo" : "hi");
    476		if (!((edg_msk | lvl_msk) & msk)) {
    477			seq_puts(s, " disabled\n");
    478			continue;
    479		}
    480		if (edg_msk & msk)
    481			seq_puts(s, " edge ");
    482		if (lvl_msk & msk)
    483			seq_puts(s, " level");
    484		seq_printf(s, " (%s)\n", cause & msk ? "pending" : "clear  ");
    485	}
    486}
    487#else
    488#define orion_gpio_dbg_show NULL
    489#endif
    490
    491static void orion_gpio_unmask_irq(struct irq_data *d)
    492{
    493	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
    494	struct irq_chip_type *ct = irq_data_get_chip_type(d);
    495	u32 reg_val;
    496	u32 mask = d->mask;
    497
    498	irq_gc_lock(gc);
    499	reg_val = irq_reg_readl(gc, ct->regs.mask);
    500	reg_val |= mask;
    501	irq_reg_writel(gc, reg_val, ct->regs.mask);
    502	irq_gc_unlock(gc);
    503}
    504
    505static void orion_gpio_mask_irq(struct irq_data *d)
    506{
    507	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
    508	struct irq_chip_type *ct = irq_data_get_chip_type(d);
    509	u32 mask = d->mask;
    510	u32 reg_val;
    511
    512	irq_gc_lock(gc);
    513	reg_val = irq_reg_readl(gc, ct->regs.mask);
    514	reg_val &= ~mask;
    515	irq_reg_writel(gc, reg_val, ct->regs.mask);
    516	irq_gc_unlock(gc);
    517}
    518
    519void __init orion_gpio_init(int gpio_base, int ngpio,
    520			    void __iomem *base, int mask_offset,
    521			    int secondary_irq_base,
    522			    int irqs[4])
    523{
    524	struct orion_gpio_chip *ochip;
    525	struct irq_chip_generic *gc;
    526	struct irq_chip_type *ct;
    527	char gc_label[16];
    528	int i;
    529
    530	if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips))
    531		return;
    532
    533	snprintf(gc_label, sizeof(gc_label), "orion_gpio%d",
    534		orion_gpio_chip_count);
    535
    536	ochip = orion_gpio_chips + orion_gpio_chip_count;
    537	ochip->chip.label = kstrdup(gc_label, GFP_KERNEL);
    538	ochip->chip.request = orion_gpio_request;
    539	ochip->chip.direction_input = orion_gpio_direction_input;
    540	ochip->chip.get = orion_gpio_get;
    541	ochip->chip.direction_output = orion_gpio_direction_output;
    542	ochip->chip.set = orion_gpio_set;
    543	ochip->chip.to_irq = orion_gpio_to_irq;
    544	ochip->chip.base = gpio_base;
    545	ochip->chip.ngpio = ngpio;
    546	ochip->chip.can_sleep = 0;
    547	ochip->chip.dbg_show = orion_gpio_dbg_show;
    548
    549	spin_lock_init(&ochip->lock);
    550	ochip->base = (void __iomem *)base;
    551	ochip->valid_input = 0;
    552	ochip->valid_output = 0;
    553	ochip->mask_offset = mask_offset;
    554	ochip->secondary_irq_base = secondary_irq_base;
    555
    556	gpiochip_add_data(&ochip->chip, ochip);
    557
    558	/*
    559	 * Mask and clear GPIO interrupts.
    560	 */
    561	writel(0, GPIO_EDGE_CAUSE(ochip));
    562	writel(0, GPIO_EDGE_MASK(ochip));
    563	writel(0, GPIO_LEVEL_MASK(ochip));
    564
    565	/* Setup the interrupt handlers. Each chip can have up to 4
    566	 * interrupt handlers, with each handler dealing with 8 GPIO
    567	 * pins. */
    568
    569	for (i = 0; i < 4; i++) {
    570		if (irqs[i]) {
    571			irq_set_chained_handler_and_data(irqs[i],
    572							 gpio_irq_handler,
    573							 ochip);
    574		}
    575	}
    576
    577	gc = irq_alloc_generic_chip("orion_gpio_irq", 2,
    578				    secondary_irq_base,
    579				    ochip->base, handle_level_irq);
    580	gc->private = ochip;
    581	ct = gc->chip_types;
    582	ct->regs.mask = ochip->mask_offset + GPIO_LEVEL_MASK_OFF;
    583	ct->type = IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW;
    584	ct->chip.irq_mask = orion_gpio_mask_irq;
    585	ct->chip.irq_unmask = orion_gpio_unmask_irq;
    586	ct->chip.irq_set_type = gpio_irq_set_type;
    587	ct->chip.name = ochip->chip.label;
    588
    589	ct++;
    590	ct->regs.mask = ochip->mask_offset + GPIO_EDGE_MASK_OFF;
    591	ct->regs.ack = GPIO_EDGE_CAUSE_OFF;
    592	ct->type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
    593	ct->chip.irq_ack = irq_gc_ack_clr_bit;
    594	ct->chip.irq_mask = orion_gpio_mask_irq;
    595	ct->chip.irq_unmask = orion_gpio_unmask_irq;
    596	ct->chip.irq_set_type = gpio_irq_set_type;
    597	ct->handler = handle_edge_irq;
    598	ct->chip.name = ochip->chip.label;
    599
    600	irq_setup_generic_chip(gc, IRQ_MSK(ngpio), IRQ_GC_INIT_MASK_CACHE,
    601			       IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE);
    602
    603	/* Setup irq domain on top of the generic chip. */
    604	ochip->domain = irq_domain_add_legacy(NULL,
    605					      ochip->chip.ngpio,
    606					      ochip->secondary_irq_base,
    607					      ochip->secondary_irq_base,
    608					      &irq_domain_simple_ops,
    609					      ochip);
    610	if (!ochip->domain)
    611		panic("%s: couldn't allocate irq domain (DT).\n",
    612		      ochip->chip.label);
    613
    614	orion_gpio_chip_count++;
    615}