162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Exynos specific definitions for Samsung pinctrl and gpiolib driver. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2012 Samsung Electronics Co., Ltd. 662306a36Sopenharmony_ci * http://www.samsung.com 762306a36Sopenharmony_ci * Copyright (c) 2012 Linaro Ltd 862306a36Sopenharmony_ci * http://www.linaro.org 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * This file contains the Exynos specific definitions for the Samsung 1162306a36Sopenharmony_ci * pinctrl/gpiolib interface drivers. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Author: Thomas Abraham <thomas.ab@samsung.com> 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifndef __PINCTRL_SAMSUNG_EXYNOS_H 1762306a36Sopenharmony_ci#define __PINCTRL_SAMSUNG_EXYNOS_H 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* Values for the pin CON register */ 2062306a36Sopenharmony_ci#define EXYNOS_PIN_CON_FUNC_EINT 0xf 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* External GPIO and wakeup interrupt related definitions */ 2362306a36Sopenharmony_ci#define EXYNOS_GPIO_ECON_OFFSET 0x700 2462306a36Sopenharmony_ci#define EXYNOS_GPIO_EFLTCON_OFFSET 0x800 2562306a36Sopenharmony_ci#define EXYNOS_GPIO_EMASK_OFFSET 0x900 2662306a36Sopenharmony_ci#define EXYNOS_GPIO_EPEND_OFFSET 0xA00 2762306a36Sopenharmony_ci#define EXYNOS_WKUP_ECON_OFFSET 0xE00 2862306a36Sopenharmony_ci#define EXYNOS_WKUP_EMASK_OFFSET 0xF00 2962306a36Sopenharmony_ci#define EXYNOS_WKUP_EPEND_OFFSET 0xF40 3062306a36Sopenharmony_ci#define EXYNOS7_WKUP_ECON_OFFSET 0x700 3162306a36Sopenharmony_ci#define EXYNOS7_WKUP_EMASK_OFFSET 0x900 3262306a36Sopenharmony_ci#define EXYNOS7_WKUP_EPEND_OFFSET 0xA00 3362306a36Sopenharmony_ci#define EXYNOS_SVC_OFFSET 0xB08 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* helpers to access interrupt service register */ 3662306a36Sopenharmony_ci#define EXYNOS_SVC_GROUP_SHIFT 3 3762306a36Sopenharmony_ci#define EXYNOS_SVC_GROUP_MASK 0x1f 3862306a36Sopenharmony_ci#define EXYNOS_SVC_NUM_MASK 7 3962306a36Sopenharmony_ci#define EXYNOS_SVC_GROUP(x) ((x >> EXYNOS_SVC_GROUP_SHIFT) & \ 4062306a36Sopenharmony_ci EXYNOS_SVC_GROUP_MASK) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* Exynos specific external interrupt trigger types */ 4362306a36Sopenharmony_ci#define EXYNOS_EINT_LEVEL_LOW 0 4462306a36Sopenharmony_ci#define EXYNOS_EINT_LEVEL_HIGH 1 4562306a36Sopenharmony_ci#define EXYNOS_EINT_EDGE_FALLING 2 4662306a36Sopenharmony_ci#define EXYNOS_EINT_EDGE_RISING 3 4762306a36Sopenharmony_ci#define EXYNOS_EINT_EDGE_BOTH 4 4862306a36Sopenharmony_ci#define EXYNOS_EINT_CON_MASK 0xF 4962306a36Sopenharmony_ci#define EXYNOS_EINT_CON_LEN 4 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define EXYNOS_EINT_MAX_PER_BANK 8 5262306a36Sopenharmony_ci#define EXYNOS_EINT_NR_WKUP_EINT 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define EXYNOS_PIN_BANK_EINTN(pins, reg, id) \ 5562306a36Sopenharmony_ci { \ 5662306a36Sopenharmony_ci .type = &bank_type_off, \ 5762306a36Sopenharmony_ci .pctl_offset = reg, \ 5862306a36Sopenharmony_ci .nr_pins = pins, \ 5962306a36Sopenharmony_ci .eint_type = EINT_TYPE_NONE, \ 6062306a36Sopenharmony_ci .name = id \ 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define EXYNOS_PIN_BANK_EINTG(pins, reg, id, offs) \ 6462306a36Sopenharmony_ci { \ 6562306a36Sopenharmony_ci .type = &bank_type_off, \ 6662306a36Sopenharmony_ci .pctl_offset = reg, \ 6762306a36Sopenharmony_ci .nr_pins = pins, \ 6862306a36Sopenharmony_ci .eint_type = EINT_TYPE_GPIO, \ 6962306a36Sopenharmony_ci .eint_offset = offs, \ 7062306a36Sopenharmony_ci .name = id \ 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define EXYNOS_PIN_BANK_EINTW(pins, reg, id, offs) \ 7462306a36Sopenharmony_ci { \ 7562306a36Sopenharmony_ci .type = &bank_type_alive, \ 7662306a36Sopenharmony_ci .pctl_offset = reg, \ 7762306a36Sopenharmony_ci .nr_pins = pins, \ 7862306a36Sopenharmony_ci .eint_type = EINT_TYPE_WKUP, \ 7962306a36Sopenharmony_ci .eint_offset = offs, \ 8062306a36Sopenharmony_ci .name = id \ 8162306a36Sopenharmony_ci } 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define EXYNOS5433_PIN_BANK_EINTG(pins, reg, id, offs) \ 8462306a36Sopenharmony_ci { \ 8562306a36Sopenharmony_ci .type = &exynos5433_bank_type_off, \ 8662306a36Sopenharmony_ci .pctl_offset = reg, \ 8762306a36Sopenharmony_ci .nr_pins = pins, \ 8862306a36Sopenharmony_ci .eint_type = EINT_TYPE_GPIO, \ 8962306a36Sopenharmony_ci .eint_offset = offs, \ 9062306a36Sopenharmony_ci .name = id \ 9162306a36Sopenharmony_ci } 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define EXYNOS5433_PIN_BANK_EINTW(pins, reg, id, offs) \ 9462306a36Sopenharmony_ci { \ 9562306a36Sopenharmony_ci .type = &exynos5433_bank_type_alive, \ 9662306a36Sopenharmony_ci .pctl_offset = reg, \ 9762306a36Sopenharmony_ci .nr_pins = pins, \ 9862306a36Sopenharmony_ci .eint_type = EINT_TYPE_WKUP, \ 9962306a36Sopenharmony_ci .eint_offset = offs, \ 10062306a36Sopenharmony_ci .name = id \ 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define EXYNOS5433_PIN_BANK_EINTW_EXT(pins, reg, id, offs, pctl_idx) \ 10462306a36Sopenharmony_ci { \ 10562306a36Sopenharmony_ci .type = &exynos5433_bank_type_off, \ 10662306a36Sopenharmony_ci .pctl_offset = reg, \ 10762306a36Sopenharmony_ci .nr_pins = pins, \ 10862306a36Sopenharmony_ci .eint_type = EINT_TYPE_WKUP, \ 10962306a36Sopenharmony_ci .eint_offset = offs, \ 11062306a36Sopenharmony_ci .name = id, \ 11162306a36Sopenharmony_ci .pctl_res_idx = pctl_idx, \ 11262306a36Sopenharmony_ci } \ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define EXYNOS850_PIN_BANK_EINTN(pins, reg, id) \ 11562306a36Sopenharmony_ci { \ 11662306a36Sopenharmony_ci .type = &exynos850_bank_type_alive, \ 11762306a36Sopenharmony_ci .pctl_offset = reg, \ 11862306a36Sopenharmony_ci .nr_pins = pins, \ 11962306a36Sopenharmony_ci .eint_type = EINT_TYPE_NONE, \ 12062306a36Sopenharmony_ci .name = id \ 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define EXYNOS850_PIN_BANK_EINTG(pins, reg, id, offs) \ 12462306a36Sopenharmony_ci { \ 12562306a36Sopenharmony_ci .type = &exynos850_bank_type_off, \ 12662306a36Sopenharmony_ci .pctl_offset = reg, \ 12762306a36Sopenharmony_ci .nr_pins = pins, \ 12862306a36Sopenharmony_ci .eint_type = EINT_TYPE_GPIO, \ 12962306a36Sopenharmony_ci .eint_offset = offs, \ 13062306a36Sopenharmony_ci .name = id \ 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define EXYNOS850_PIN_BANK_EINTW(pins, reg, id, offs) \ 13462306a36Sopenharmony_ci { \ 13562306a36Sopenharmony_ci .type = &exynos850_bank_type_alive, \ 13662306a36Sopenharmony_ci .pctl_offset = reg, \ 13762306a36Sopenharmony_ci .nr_pins = pins, \ 13862306a36Sopenharmony_ci .eint_type = EINT_TYPE_WKUP, \ 13962306a36Sopenharmony_ci .eint_offset = offs, \ 14062306a36Sopenharmony_ci .name = id \ 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/** 14462306a36Sopenharmony_ci * struct exynos_weint_data: irq specific data for all the wakeup interrupts 14562306a36Sopenharmony_ci * generated by the external wakeup interrupt controller. 14662306a36Sopenharmony_ci * @irq: interrupt number within the domain. 14762306a36Sopenharmony_ci * @bank: bank responsible for this interrupt 14862306a36Sopenharmony_ci */ 14962306a36Sopenharmony_cistruct exynos_weint_data { 15062306a36Sopenharmony_ci unsigned int irq; 15162306a36Sopenharmony_ci struct samsung_pin_bank *bank; 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/** 15562306a36Sopenharmony_ci * struct exynos_muxed_weint_data: irq specific data for muxed wakeup interrupts 15662306a36Sopenharmony_ci * generated by the external wakeup interrupt controller. 15762306a36Sopenharmony_ci * @nr_banks: count of banks being part of the mux 15862306a36Sopenharmony_ci * @banks: array of banks being part of the mux 15962306a36Sopenharmony_ci */ 16062306a36Sopenharmony_cistruct exynos_muxed_weint_data { 16162306a36Sopenharmony_ci unsigned int nr_banks; 16262306a36Sopenharmony_ci struct samsung_pin_bank *banks[]; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ciint exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d); 16662306a36Sopenharmony_ciint exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d); 16762306a36Sopenharmony_civoid exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata); 16862306a36Sopenharmony_civoid exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata); 16962306a36Sopenharmony_cistruct samsung_retention_ctrl * 17062306a36Sopenharmony_ciexynos_retention_init(struct samsung_pinctrl_drv_data *drvdata, 17162306a36Sopenharmony_ci const struct samsung_retention_data *data); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#endif /* __PINCTRL_SAMSUNG_EXYNOS_H */ 174