blob: de0c3512c6d26c57300066a1a1d015799d2d317f [file] [log] [blame]
/*
* include/linux/amlogic/gpio-amlogic.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __LINUX_AMLOGIC_GPIO_AMLOGIC_H
#define __LINUX_AMLOGIC_GPIO_AMLOGIC_H
#include <linux/types.h>
#include <linux/io.h>
#define GPIO_REG_BIT(reg, bit) ((reg<<5)|bit)
#define GPIO_REG(value) ((value>>5))
#define GPIO_BIT(value) ((value&0x1F))
struct amlogic_gpio_desc {
unsigned int num;
char *name;
unsigned int out_en_reg_bit;
unsigned int out_value_reg_bit;
unsigned int input_value_reg_bit;
unsigned int map_to_irq;
unsigned int pull_up_reg_bit;
const char *gpio_owner;
};
extern struct amlogic_gpio_desc amlogic_pins[];
extern int gpio_max;
extern int (*gpio_amlogic_name_to_num)(const char *name);
extern int m8_pin_to_pullup(unsigned int pin, unsigned int *reg,
unsigned int *bit, unsigned int *bit_en);
extern struct amlogic_set_pullup pullup_ops;
extern void __iomem *p_pull_up_addr[6];
extern void __iomem *p_pin_mux_reg_addr[11];
extern void __iomem *p_pull_upen_addr[6];
extern int gpio_irq;
extern int gpio_flag;
extern int m8_pin_map_to_direction(unsigned int pin,
unsigned int *reg, unsigned int *bit);
extern void __iomem *p_pin_mux_reg_addr[11];
extern void __iomem *p_pull_up_addr[6];
extern void __iomem *p_gpio_oen_addr[5];
extern struct amlogic_gpio_desc amlogic_pins[];
struct amlogic_set_pullup {
int (*meson_set_pullup)(unsigned int, unsigned int, unsigned int);
};
static inline uint32_t aml_read_reg32(void __iomem *_reg)
{
return readl_relaxed(_reg);
};
static inline void aml_write_reg32(void __iomem *_reg,
const uint32_t _value)
{
writel_relaxed(_value, _reg);
};
static inline void aml_set_reg32_bits(void __iomem *_reg,
const uint32_t _value,
const uint32_t _start,
const uint32_t _len)
{
writel_relaxed(((readl_relaxed(_reg) &
~(((1L << (_len))-1) << (_start))) |
(((_value)&((1L<<(_len))-1)) << (_start))),
_reg);
}
static inline void aml_clrset_reg32_bits(void __iomem *_reg,
const uint32_t clr, const uint32_t set)
{
writel_relaxed((readl_relaxed(_reg) & ~(clr)) | (set), _reg);
}
static inline uint32_t aml_get_reg32_bits(void __iomem *_reg,
const uint32_t _start, const uint32_t _len)
{
return (readl_relaxed(_reg) >> (_start)) &
((1L << (_len)) - 1);
}
static inline void aml_set_reg32_mask(void __iomem *_reg,
const uint32_t _mask)
{
writel_relaxed((readl_relaxed(_reg) | (_mask)), _reg);
}
static inline void aml_clr_reg32_mask(void __iomem *_reg,
const uint32_t _mask)
{
writel_relaxed((readl_relaxed(_reg) & (~(_mask))), _reg);
}
#endif /* __LINUX_AMLOGIC_GPIO_AMLOGIC_H */