forked from Minki/linux
70c8f01a35
On non-DT platforms IRQ controllers associated with the GPIOs have a fixed IRQ base value known at compile time. The sh-pfc driver translates GPIO number to IRQ numbers using a hardcoded table. This mechanism breaks on DT platforms, as the IRQ base values are dynamic in that case. Fix this by specifying IRQs associated with GPIOs in IRQ resources, populated automatically from the device tree. When IRQ resources are specified the driver requires one IRQ resource per GPIO able to generate an interrupt, and uses the translation table to compute the IRQ resource offset instead of the IRQ number. Cc: devicetree@vger.kernel.org Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Acked-by: Magnus Damm <damm@opensource.se> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
91 lines
2.6 KiB
C
91 lines
2.6 KiB
C
/*
|
|
* SuperH Pin Function Controller support.
|
|
*
|
|
* Copyright (C) 2012 Renesas Solutions Corp.
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
#ifndef __SH_PFC_CORE_H__
|
|
#define __SH_PFC_CORE_H__
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "sh_pfc.h"
|
|
|
|
struct sh_pfc_window {
|
|
phys_addr_t phys;
|
|
void __iomem *virt;
|
|
unsigned long size;
|
|
};
|
|
|
|
struct sh_pfc_chip;
|
|
struct sh_pfc_pinctrl;
|
|
|
|
struct sh_pfc_pin_range {
|
|
u16 start;
|
|
u16 end;
|
|
};
|
|
|
|
struct sh_pfc {
|
|
struct device *dev;
|
|
const struct sh_pfc_soc_info *info;
|
|
void *soc_data;
|
|
spinlock_t lock;
|
|
|
|
unsigned int num_windows;
|
|
struct sh_pfc_window *windows;
|
|
unsigned int num_irqs;
|
|
unsigned int *irqs;
|
|
|
|
struct sh_pfc_pin_range *ranges;
|
|
unsigned int nr_ranges;
|
|
|
|
unsigned int nr_gpio_pins;
|
|
|
|
struct sh_pfc_chip *gpio;
|
|
struct sh_pfc_chip *func;
|
|
|
|
struct sh_pfc_pinctrl *pinctrl;
|
|
};
|
|
|
|
int sh_pfc_register_gpiochip(struct sh_pfc *pfc);
|
|
int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc);
|
|
|
|
int sh_pfc_register_pinctrl(struct sh_pfc *pfc);
|
|
int sh_pfc_unregister_pinctrl(struct sh_pfc *pfc);
|
|
|
|
unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
|
|
unsigned long reg_width);
|
|
void sh_pfc_write_raw_reg(void __iomem *mapped_reg, unsigned long reg_width,
|
|
unsigned long data);
|
|
|
|
int sh_pfc_get_pin_index(struct sh_pfc *pfc, unsigned int pin);
|
|
int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type);
|
|
|
|
extern const struct sh_pfc_soc_info r8a73a4_pinmux_info;
|
|
extern const struct sh_pfc_soc_info r8a7740_pinmux_info;
|
|
extern const struct sh_pfc_soc_info r8a7778_pinmux_info;
|
|
extern const struct sh_pfc_soc_info r8a7779_pinmux_info;
|
|
extern const struct sh_pfc_soc_info r8a7790_pinmux_info;
|
|
extern const struct sh_pfc_soc_info r8a7791_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7203_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7264_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7269_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7372_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh73a0_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7720_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7722_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7723_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7724_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7734_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7757_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7785_pinmux_info;
|
|
extern const struct sh_pfc_soc_info sh7786_pinmux_info;
|
|
extern const struct sh_pfc_soc_info shx3_pinmux_info;
|
|
|
|
#endif /* __SH_PFC_CORE_H__ */
|