Lines Matching +full:reg +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
33 #define SPRD_PMIC_EIC_BIT(x) ((x) & (SPRD_PMIC_EIC_PER_BANK_NR - 1))
48 * struct sprd_pmic_eic - PMIC EIC controller
52 * @offset: the EIC controller's offset address of the PMIC.
53 * @reg: the array to cache the EIC registers.
61 u32 offset; member
62 u8 reg[CACHE_NR_REGS]; member
67 static void sprd_pmic_eic_update(struct gpio_chip *chip, unsigned int offset, in sprd_pmic_eic_update() argument
68 u16 reg, unsigned int val) in sprd_pmic_eic_update() argument
71 u32 shift = SPRD_PMIC_EIC_BIT(offset); in sprd_pmic_eic_update()
73 regmap_update_bits(pmic_eic->map, pmic_eic->offset + reg, in sprd_pmic_eic_update()
77 static int sprd_pmic_eic_read(struct gpio_chip *chip, unsigned int offset, in sprd_pmic_eic_read() argument
78 u16 reg) in sprd_pmic_eic_read() argument
84 ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value); in sprd_pmic_eic_read()
88 return !!(value & BIT(SPRD_PMIC_EIC_BIT(offset))); in sprd_pmic_eic_read()
91 static int sprd_pmic_eic_request(struct gpio_chip *chip, unsigned int offset) in sprd_pmic_eic_request() argument
93 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 1); in sprd_pmic_eic_request()
97 static void sprd_pmic_eic_free(struct gpio_chip *chip, unsigned int offset) in sprd_pmic_eic_free() argument
99 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 0); in sprd_pmic_eic_free()
102 static int sprd_pmic_eic_get(struct gpio_chip *chip, unsigned int offset) in sprd_pmic_eic_get() argument
104 return sprd_pmic_eic_read(chip, offset, SPRD_PMIC_EIC_DATA); in sprd_pmic_eic_get()
108 unsigned int offset) in sprd_pmic_eic_direction_input() argument
114 static void sprd_pmic_eic_set(struct gpio_chip *chip, unsigned int offset, in sprd_pmic_eic_set() argument
121 unsigned int offset, in sprd_pmic_eic_set_debounce() argument
125 u32 reg, value; in sprd_pmic_eic_set_debounce() local
128 reg = SPRD_PMIC_EIC_CTRL0 + SPRD_PMIC_EIC_BIT(offset) * 0x4; in sprd_pmic_eic_set_debounce()
129 ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value); in sprd_pmic_eic_set_debounce()
135 return regmap_write(pmic_eic->map, pmic_eic->offset + reg, value); in sprd_pmic_eic_set_debounce()
138 static int sprd_pmic_eic_set_config(struct gpio_chip *chip, unsigned int offset, in sprd_pmic_eic_set_config() argument
145 return sprd_pmic_eic_set_debounce(chip, offset, arg); in sprd_pmic_eic_set_config()
147 return -ENOTSUPP; in sprd_pmic_eic_set_config()
155 pmic_eic->reg[REG_IE] = 0; in sprd_pmic_eic_irq_mask()
156 pmic_eic->reg[REG_TRIG] = 0; in sprd_pmic_eic_irq_mask()
164 pmic_eic->reg[REG_IE] = 1; in sprd_pmic_eic_irq_unmask()
165 pmic_eic->reg[REG_TRIG] = 1; in sprd_pmic_eic_irq_unmask()
176 pmic_eic->reg[REG_IEV] = 1; in sprd_pmic_eic_irq_set_type()
179 pmic_eic->reg[REG_IEV] = 0; in sprd_pmic_eic_irq_set_type()
190 return -ENOTSUPP; in sprd_pmic_eic_irq_set_type()
201 mutex_lock(&pmic_eic->buslock); in sprd_pmic_eic_bus_lock()
209 u32 offset = irqd_to_hwirq(data); in sprd_pmic_eic_bus_sync_unlock() local
214 state = sprd_pmic_eic_get(chip, offset); in sprd_pmic_eic_bus_sync_unlock()
216 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0); in sprd_pmic_eic_bus_sync_unlock()
218 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1); in sprd_pmic_eic_bus_sync_unlock()
220 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, in sprd_pmic_eic_bus_sync_unlock()
221 pmic_eic->reg[REG_IEV]); in sprd_pmic_eic_bus_sync_unlock()
225 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE, in sprd_pmic_eic_bus_sync_unlock()
226 pmic_eic->reg[REG_IE]); in sprd_pmic_eic_bus_sync_unlock()
228 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG, in sprd_pmic_eic_bus_sync_unlock()
229 pmic_eic->reg[REG_TRIG]); in sprd_pmic_eic_bus_sync_unlock()
231 mutex_unlock(&pmic_eic->buslock); in sprd_pmic_eic_bus_sync_unlock()
235 unsigned int irq, unsigned int offset) in sprd_pmic_eic_toggle_trigger() argument
243 state = sprd_pmic_eic_get(chip, offset); in sprd_pmic_eic_toggle_trigger()
246 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0); in sprd_pmic_eic_toggle_trigger()
248 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1); in sprd_pmic_eic_toggle_trigger()
250 post_state = sprd_pmic_eic_get(chip, offset); in sprd_pmic_eic_toggle_trigger()
252 dev_warn(chip->parent, "PMIC EIC level was changed.\n"); in sprd_pmic_eic_toggle_trigger()
258 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE, 1); in sprd_pmic_eic_toggle_trigger()
260 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG, 1); in sprd_pmic_eic_toggle_trigger()
266 struct gpio_chip *chip = &pmic_eic->chip; in sprd_pmic_eic_irq_handler()
271 ret = regmap_read(pmic_eic->map, pmic_eic->offset + SPRD_PMIC_EIC_MIS, in sprd_pmic_eic_irq_handler()
278 for_each_set_bit(n, &status, chip->ngpio) { in sprd_pmic_eic_irq_handler()
282 girq = irq_find_mapping(chip->irq.domain, n); in sprd_pmic_eic_irq_handler()
301 pmic_eic = devm_kzalloc(&pdev->dev, sizeof(*pmic_eic), GFP_KERNEL); in sprd_pmic_eic_probe()
303 return -ENOMEM; in sprd_pmic_eic_probe()
305 mutex_init(&pmic_eic->buslock); in sprd_pmic_eic_probe()
307 pmic_eic->irq = platform_get_irq(pdev, 0); in sprd_pmic_eic_probe()
308 if (pmic_eic->irq < 0) in sprd_pmic_eic_probe()
309 return pmic_eic->irq; in sprd_pmic_eic_probe()
311 pmic_eic->map = dev_get_regmap(pdev->dev.parent, NULL); in sprd_pmic_eic_probe()
312 if (!pmic_eic->map) in sprd_pmic_eic_probe()
313 return -ENODEV; in sprd_pmic_eic_probe()
315 ret = of_property_read_u32(pdev->dev.of_node, "reg", &pmic_eic->offset); in sprd_pmic_eic_probe()
317 dev_err(&pdev->dev, "Failed to get PMIC EIC base address.\n"); in sprd_pmic_eic_probe()
321 ret = devm_request_threaded_irq(&pdev->dev, pmic_eic->irq, NULL, in sprd_pmic_eic_probe()
324 dev_name(&pdev->dev), pmic_eic); in sprd_pmic_eic_probe()
326 dev_err(&pdev->dev, "Failed to request PMIC EIC IRQ.\n"); in sprd_pmic_eic_probe()
330 pmic_eic->chip.label = dev_name(&pdev->dev); in sprd_pmic_eic_probe()
331 pmic_eic->chip.ngpio = SPRD_PMIC_EIC_NR; in sprd_pmic_eic_probe()
332 pmic_eic->chip.base = -1; in sprd_pmic_eic_probe()
333 pmic_eic->chip.parent = &pdev->dev; in sprd_pmic_eic_probe()
334 pmic_eic->chip.of_node = pdev->dev.of_node; in sprd_pmic_eic_probe()
335 pmic_eic->chip.direction_input = sprd_pmic_eic_direction_input; in sprd_pmic_eic_probe()
336 pmic_eic->chip.request = sprd_pmic_eic_request; in sprd_pmic_eic_probe()
337 pmic_eic->chip.free = sprd_pmic_eic_free; in sprd_pmic_eic_probe()
338 pmic_eic->chip.set_config = sprd_pmic_eic_set_config; in sprd_pmic_eic_probe()
339 pmic_eic->chip.set = sprd_pmic_eic_set; in sprd_pmic_eic_probe()
340 pmic_eic->chip.get = sprd_pmic_eic_get; in sprd_pmic_eic_probe()
342 pmic_eic->intc.name = dev_name(&pdev->dev); in sprd_pmic_eic_probe()
343 pmic_eic->intc.irq_mask = sprd_pmic_eic_irq_mask; in sprd_pmic_eic_probe()
344 pmic_eic->intc.irq_unmask = sprd_pmic_eic_irq_unmask; in sprd_pmic_eic_probe()
345 pmic_eic->intc.irq_set_type = sprd_pmic_eic_irq_set_type; in sprd_pmic_eic_probe()
346 pmic_eic->intc.irq_bus_lock = sprd_pmic_eic_bus_lock; in sprd_pmic_eic_probe()
347 pmic_eic->intc.irq_bus_sync_unlock = sprd_pmic_eic_bus_sync_unlock; in sprd_pmic_eic_probe()
348 pmic_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE; in sprd_pmic_eic_probe()
350 irq = &pmic_eic->chip.irq; in sprd_pmic_eic_probe()
351 irq->chip = &pmic_eic->intc; in sprd_pmic_eic_probe()
352 irq->threaded = true; in sprd_pmic_eic_probe()
354 ret = devm_gpiochip_add_data(&pdev->dev, &pmic_eic->chip, pmic_eic); in sprd_pmic_eic_probe()
356 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret); in sprd_pmic_eic_probe()
365 { .compatible = "sprd,sc2731-eic", },
373 .name = "sprd-pmic-eic",