162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * SDK7786 FPGA USRGPIR Support.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2010  Paul Mundt
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <linux/init.h>
862306a36Sopenharmony_ci#include <linux/interrupt.h>
962306a36Sopenharmony_ci#include <linux/gpio/driver.h>
1062306a36Sopenharmony_ci#include <linux/irq.h>
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/spinlock.h>
1362306a36Sopenharmony_ci#include <linux/io.h>
1462306a36Sopenharmony_ci#include <mach/fpga.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define NR_FPGA_GPIOS	8
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic const char *usrgpir_gpio_names[NR_FPGA_GPIOS] = {
1962306a36Sopenharmony_ci	"in0", "in1", "in2", "in3", "in4", "in5", "in6", "in7",
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic int usrgpir_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	/* always in */
2562306a36Sopenharmony_ci	return 0;
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic int usrgpir_gpio_get(struct gpio_chip *chip, unsigned gpio)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	return !!(fpga_read_reg(USRGPIR) & (1 << gpio));
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic struct gpio_chip usrgpir_gpio_chip = {
3462306a36Sopenharmony_ci	.label			= "sdk7786-fpga",
3562306a36Sopenharmony_ci	.names			= usrgpir_gpio_names,
3662306a36Sopenharmony_ci	.direction_input	= usrgpir_gpio_direction_input,
3762306a36Sopenharmony_ci	.get			= usrgpir_gpio_get,
3862306a36Sopenharmony_ci	.base			= -1, /* don't care */
3962306a36Sopenharmony_ci	.ngpio			= NR_FPGA_GPIOS,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic int __init usrgpir_gpio_setup(void)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	return gpiochip_add_data(&usrgpir_gpio_chip, NULL);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_cidevice_initcall(usrgpir_gpio_setup);
47