0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef __PLAT_SAMSUNG_GPIO_CORE_H
0011 #define __PLAT_SAMSUNG_GPIO_CORE_H
0012
0013
0014 #include "gpio-samsung.h"
0015 #include <linux/gpio/driver.h>
0016
0017 #define GPIOCON_OFF (0x00)
0018 #define GPIODAT_OFF (0x04)
0019
0020 #define con_4bit_shift(__off) ((__off) * 4)
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 struct samsung_gpio_chip;
0032
0033
0034
0035
0036
0037
0038 struct samsung_gpio_pm {
0039 void (*save)(struct samsung_gpio_chip *chip);
0040 void (*resume)(struct samsung_gpio_chip *chip);
0041 };
0042
0043 struct samsung_gpio_cfg;
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 struct samsung_gpio_chip {
0068 struct gpio_chip chip;
0069 struct samsung_gpio_cfg *config;
0070 struct samsung_gpio_pm *pm;
0071 void __iomem *base;
0072 int irq_base;
0073 int group;
0074 spinlock_t lock;
0075 #ifdef CONFIG_PM
0076 u32 pm_save[4];
0077 #endif
0078 u32 bitmap_gpio_int;
0079 };
0080
0081 static inline struct samsung_gpio_chip *to_samsung_gpio(struct gpio_chip *gpc)
0082 {
0083 return container_of(gpc, struct samsung_gpio_chip, chip);
0084 }
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 extern int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset);
0095
0096
0097 extern struct samsung_gpio_cfg s3c24xx_gpiocfg_default;
0098
0099 #ifdef CONFIG_S3C_GPIO_TRACK
0100 extern struct samsung_gpio_chip *s3c_gpios[S3C_GPIO_END];
0101
0102 static inline struct samsung_gpio_chip *samsung_gpiolib_getchip(unsigned int chip)
0103 {
0104 return (chip < S3C_GPIO_END) ? s3c_gpios[chip] : NULL;
0105 }
0106 #else
0107
0108
0109 extern struct samsung_gpio_chip s3c24xx_gpios[];
0110
0111 static inline struct samsung_gpio_chip *samsung_gpiolib_getchip(unsigned int pin)
0112 {
0113 struct samsung_gpio_chip *chip;
0114
0115 if (pin > S3C_GPIO_END)
0116 return NULL;
0117
0118 chip = &s3c24xx_gpios[pin/32];
0119 return ((pin - chip->chip.base) < chip->chip.ngpio) ? chip : NULL;
0120 }
0121
0122 static inline void s3c_gpiolib_track(struct samsung_gpio_chip *chip) { }
0123 #endif
0124
0125 #ifdef CONFIG_PM
0126 extern struct samsung_gpio_pm samsung_gpio_pm_1bit;
0127 extern struct samsung_gpio_pm samsung_gpio_pm_2bit;
0128 extern struct samsung_gpio_pm samsung_gpio_pm_4bit;
0129 #define __gpio_pm(x) x
0130 #else
0131 #define samsung_gpio_pm_1bit NULL
0132 #define samsung_gpio_pm_2bit NULL
0133 #define samsung_gpio_pm_4bit NULL
0134 #define __gpio_pm(x) NULL
0135
0136 #endif
0137
0138
0139 #define samsung_gpio_lock(_oc, _fl) spin_lock_irqsave(&(_oc)->lock, _fl)
0140 #define samsung_gpio_unlock(_oc, _fl) spin_unlock_irqrestore(&(_oc)->lock, _fl)
0141
0142 #endif