#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/gpio/driver.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>
#define PT_DIRECTION_REG 0x00
#define PT_INPUTDATA_REG 0x04
#define PT_OUTPUTDATA_REG 0x08
#define PT_CLOCKRATE_REG 0x0C
static int pt_gpio_request(struct gpio_chip *gc, unsigned offset)
struct pt_gpio_chip *pt_gpio = gpiochip_get_data(gc);
dev_dbg(gc->parent, "pt_gpio_request offset=%x\n", offset);
spin_lock_irqsave(&gc->bgpio_lock, flags);
using_pins = readl(pt_gpio->reg_base + PT_SYNC_REG);
if (using_pins & BIT(offset)) {
dev_warn(gc->parent, "PT GPIO pin %x reconfigured\n",
spin_unlock_irqrestore(&gc->bgpio_lock, flags);
writel(using_pins | BIT(offset), pt_gpio->reg_base + PT_SYNC_REG);
spin_unlock_irqrestore(&gc->bgpio_lock, flags);
static void pt_gpio_free(struct gpio_chip *gc, unsigned offset)
struct pt_gpio_chip *pt_gpio = gpiochip_get_data(gc);