Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2018 Spreadtrum Communications Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 2018 Linaro Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/gpio/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) /* EIC registers definition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #define SPRD_PMIC_EIC_DATA		0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define SPRD_PMIC_EIC_DMSK		0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #define SPRD_PMIC_EIC_IEV		0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define SPRD_PMIC_EIC_IE		0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define SPRD_PMIC_EIC_RIS		0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define SPRD_PMIC_EIC_MIS		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define SPRD_PMIC_EIC_IC		0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define SPRD_PMIC_EIC_TRIG		0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define SPRD_PMIC_EIC_CTRL0		0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * The PMIC EIC controller only has one bank, and each bank now can contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * 16 EICs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define SPRD_PMIC_EIC_PER_BANK_NR	16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define SPRD_PMIC_EIC_NR		SPRD_PMIC_EIC_PER_BANK_NR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define SPRD_PMIC_EIC_DATA_MASK		GENMASK(15, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define SPRD_PMIC_EIC_BIT(x)		((x) & (SPRD_PMIC_EIC_PER_BANK_NR - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define SPRD_PMIC_EIC_DBNC_MASK		GENMASK(11, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * These registers are modified under the irq bus lock and cached to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * unnecessary writes in bus_sync_unlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	REG_IEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	REG_IE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	REG_TRIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	CACHE_NR_REGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * struct sprd_pmic_eic - PMIC EIC controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  * @chip: the gpio_chip structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * @intc: the irq_chip structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * @map:  the regmap from the parent device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * @offset: the EIC controller's offset address of the PMIC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * @reg: the array to cache the EIC registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  * @buslock: for bus lock/sync and unlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * @irq: the interrupt number of the PMIC EIC conteroller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) struct sprd_pmic_eic {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	struct gpio_chip chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	struct irq_chip intc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	struct regmap *map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	u32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	u8 reg[CACHE_NR_REGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	struct mutex buslock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) static void sprd_pmic_eic_update(struct gpio_chip *chip, unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 				 u16 reg, unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	u32 shift = SPRD_PMIC_EIC_BIT(offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	regmap_update_bits(pmic_eic->map, pmic_eic->offset + reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 			   BIT(shift), val << shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) static int sprd_pmic_eic_read(struct gpio_chip *chip, unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			      u16 reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	u32 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	return !!(value & BIT(SPRD_PMIC_EIC_BIT(offset)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) static int sprd_pmic_eic_request(struct gpio_chip *chip, unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) static void sprd_pmic_eic_free(struct gpio_chip *chip, unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static int sprd_pmic_eic_get(struct gpio_chip *chip, unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	return sprd_pmic_eic_read(chip, offset, SPRD_PMIC_EIC_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static int sprd_pmic_eic_direction_input(struct gpio_chip *chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 					 unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	/* EICs are always input, nothing need to do here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static void sprd_pmic_eic_set(struct gpio_chip *chip, unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 			      int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	/* EICs are always input, nothing need to do here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static int sprd_pmic_eic_set_debounce(struct gpio_chip *chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 				      unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 				      unsigned int debounce)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	u32 reg, value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	reg = SPRD_PMIC_EIC_CTRL0 + SPRD_PMIC_EIC_BIT(offset) * 0x4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	value &= ~SPRD_PMIC_EIC_DBNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	value |= (debounce / 1000) & SPRD_PMIC_EIC_DBNC_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	return regmap_write(pmic_eic->map, pmic_eic->offset + reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static int sprd_pmic_eic_set_config(struct gpio_chip *chip, unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 				    unsigned long config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	unsigned long param = pinconf_to_config_param(config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	u32 arg = pinconf_to_config_argument(config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	if (param == PIN_CONFIG_INPUT_DEBOUNCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		return sprd_pmic_eic_set_debounce(chip, offset, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	return -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static void sprd_pmic_eic_irq_mask(struct irq_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	pmic_eic->reg[REG_IE] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	pmic_eic->reg[REG_TRIG] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static void sprd_pmic_eic_irq_unmask(struct irq_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	pmic_eic->reg[REG_IE] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	pmic_eic->reg[REG_TRIG] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static int sprd_pmic_eic_irq_set_type(struct irq_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 				      unsigned int flow_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	switch (flow_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	case IRQ_TYPE_LEVEL_HIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		pmic_eic->reg[REG_IEV] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	case IRQ_TYPE_LEVEL_LOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		pmic_eic->reg[REG_IEV] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	case IRQ_TYPE_EDGE_RISING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	case IRQ_TYPE_EDGE_FALLING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	case IRQ_TYPE_EDGE_BOTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		 * Will set the trigger level according to current EIC level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		 * in irq_bus_sync_unlock() interface, so here nothing to do.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		return -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static void sprd_pmic_eic_bus_lock(struct irq_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	mutex_lock(&pmic_eic->buslock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) static void sprd_pmic_eic_bus_sync_unlock(struct irq_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	u32 trigger = irqd_get_trigger_type(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	u32 offset = irqd_to_hwirq(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	int state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	/* Set irq type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	if (trigger & IRQ_TYPE_EDGE_BOTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 		state = sprd_pmic_eic_get(chip, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		if (state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 			sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 			sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 				     pmic_eic->reg[REG_IEV]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	/* Set irq unmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 			     pmic_eic->reg[REG_IE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	/* Generate trigger start pulse for debounce EIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 			     pmic_eic->reg[REG_TRIG]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	mutex_unlock(&pmic_eic->buslock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static void sprd_pmic_eic_toggle_trigger(struct gpio_chip *chip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 					 unsigned int irq, unsigned int offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	u32 trigger = irq_get_trigger_type(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	int state, post_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	if (!(trigger & IRQ_TYPE_EDGE_BOTH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	state = sprd_pmic_eic_get(chip, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	if (state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	post_state = sprd_pmic_eic_get(chip, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	if (state != post_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		dev_warn(chip->parent, "PMIC EIC level was changed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		state = post_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 		goto retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	/* Set irq unmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	/* Generate trigger start pulse for debounce EIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) static irqreturn_t sprd_pmic_eic_irq_handler(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	struct sprd_pmic_eic *pmic_eic = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	struct gpio_chip *chip = &pmic_eic->chip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	unsigned long status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	u32 n, girq, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	ret = regmap_read(pmic_eic->map, pmic_eic->offset + SPRD_PMIC_EIC_MIS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 			  &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		return IRQ_RETVAL(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	status = val & SPRD_PMIC_EIC_DATA_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	for_each_set_bit(n, &status, chip->ngpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		/* Clear the interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		sprd_pmic_eic_update(chip, n, SPRD_PMIC_EIC_IC, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 		girq = irq_find_mapping(chip->irq.domain, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 		handle_nested_irq(girq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 		 * The PMIC EIC can only support level trigger, so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		 * toggle the level trigger to emulate the edge trigger.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		sprd_pmic_eic_toggle_trigger(chip, girq, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static int sprd_pmic_eic_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	struct gpio_irq_chip *irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	struct sprd_pmic_eic *pmic_eic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	pmic_eic = devm_kzalloc(&pdev->dev, sizeof(*pmic_eic), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	if (!pmic_eic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	mutex_init(&pmic_eic->buslock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	pmic_eic->irq = platform_get_irq(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	if (pmic_eic->irq < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 		return pmic_eic->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	pmic_eic->map = dev_get_regmap(pdev->dev.parent, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	if (!pmic_eic->map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	ret = of_property_read_u32(pdev->dev.of_node, "reg", &pmic_eic->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 		dev_err(&pdev->dev, "Failed to get PMIC EIC base address.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	ret = devm_request_threaded_irq(&pdev->dev, pmic_eic->irq, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 					sprd_pmic_eic_irq_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 					IRQF_ONESHOT | IRQF_NO_SUSPEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 					dev_name(&pdev->dev), pmic_eic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 		dev_err(&pdev->dev, "Failed to request PMIC EIC IRQ.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	pmic_eic->chip.label = dev_name(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	pmic_eic->chip.ngpio = SPRD_PMIC_EIC_NR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	pmic_eic->chip.base = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	pmic_eic->chip.parent = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	pmic_eic->chip.of_node = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	pmic_eic->chip.direction_input = sprd_pmic_eic_direction_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	pmic_eic->chip.request = sprd_pmic_eic_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	pmic_eic->chip.free = sprd_pmic_eic_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	pmic_eic->chip.set_config = sprd_pmic_eic_set_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	pmic_eic->chip.set = sprd_pmic_eic_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	pmic_eic->chip.get = sprd_pmic_eic_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	pmic_eic->intc.name = dev_name(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	pmic_eic->intc.irq_mask = sprd_pmic_eic_irq_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	pmic_eic->intc.irq_unmask = sprd_pmic_eic_irq_unmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	pmic_eic->intc.irq_set_type = sprd_pmic_eic_irq_set_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	pmic_eic->intc.irq_bus_lock = sprd_pmic_eic_bus_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	pmic_eic->intc.irq_bus_sync_unlock = sprd_pmic_eic_bus_sync_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	pmic_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	irq = &pmic_eic->chip.irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	irq->chip = &pmic_eic->intc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	irq->threaded = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	ret = devm_gpiochip_add_data(&pdev->dev, &pmic_eic->chip, pmic_eic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 		dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	platform_set_drvdata(pdev, pmic_eic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) static const struct of_device_id sprd_pmic_eic_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	{ .compatible = "sprd,sc2731-eic", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	{ /* end of list */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) MODULE_DEVICE_TABLE(of, sprd_pmic_eic_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) static struct platform_driver sprd_pmic_eic_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	.probe = sprd_pmic_eic_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		.name = "sprd-pmic-eic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		.of_match_table	= sprd_pmic_eic_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) module_platform_driver(sprd_pmic_eic_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) MODULE_DESCRIPTION("Spreadtrum PMIC EIC driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) MODULE_LICENSE("GPL v2");