Lines Matching +full:off +full:- +full:chip

1 // SPDX-License-Identifier: GPL-2.0-only
33 #define HISI_GPIO_DRIVER_NAME "gpio-hisi"
36 struct gpio_chip chip; member
44 static inline u32 hisi_gpio_read_reg(struct gpio_chip *chip, in hisi_gpio_read_reg() argument
45 unsigned int off) in hisi_gpio_read_reg() argument
48 container_of(chip, struct hisi_gpio, chip); in hisi_gpio_read_reg()
49 void __iomem *reg = hisi_gpio->reg_base + off; in hisi_gpio_read_reg()
54 static inline void hisi_gpio_write_reg(struct gpio_chip *chip, in hisi_gpio_write_reg() argument
55 unsigned int off, u32 val) in hisi_gpio_write_reg() argument
58 container_of(chip, struct hisi_gpio, chip); in hisi_gpio_write_reg()
59 void __iomem *reg = hisi_gpio->reg_base + off; in hisi_gpio_write_reg()
64 static void hisi_gpio_set_debounce(struct gpio_chip *chip, unsigned int off, in hisi_gpio_set_debounce() argument
68 hisi_gpio_write_reg(chip, HISI_GPIO_DEBOUNCE_SET_WX, BIT(off)); in hisi_gpio_set_debounce()
70 hisi_gpio_write_reg(chip, HISI_GPIO_DEBOUNCE_CLR_WX, BIT(off)); in hisi_gpio_set_debounce()
73 static int hisi_gpio_set_config(struct gpio_chip *chip, unsigned int offset, in hisi_gpio_set_config() argument
82 hisi_gpio_set_debounce(chip, offset, config_arg); in hisi_gpio_set_config()
85 return -ENOTSUPP; in hisi_gpio_set_config()
93 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_set_ack() local
95 hisi_gpio_write_reg(chip, HISI_GPIO_PORTA_EOI_WX, BIT(irqd_to_hwirq(d))); in hisi_gpio_set_ack()
100 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_irq_set_mask() local
102 hisi_gpio_write_reg(chip, HISI_GPIO_INTMASK_SET_WX, BIT(irqd_to_hwirq(d))); in hisi_gpio_irq_set_mask()
107 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_irq_clr_mask() local
109 hisi_gpio_write_reg(chip, HISI_GPIO_INTMASK_CLR_WX, BIT(irqd_to_hwirq(d))); in hisi_gpio_irq_clr_mask()
114 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_irq_set_type() local
119 hisi_gpio_write_reg(chip, HISI_GPIO_INT_DEDGE_SET, mask); in hisi_gpio_irq_set_type()
122 hisi_gpio_write_reg(chip, HISI_GPIO_INTTYPE_EDGE_SET_WX, mask); in hisi_gpio_irq_set_type()
123 hisi_gpio_write_reg(chip, HISI_GPIO_INT_POLARITY_SET_WX, mask); in hisi_gpio_irq_set_type()
126 hisi_gpio_write_reg(chip, HISI_GPIO_INTTYPE_EDGE_SET_WX, mask); in hisi_gpio_irq_set_type()
127 hisi_gpio_write_reg(chip, HISI_GPIO_INT_POLARITY_CLR_WX, mask); in hisi_gpio_irq_set_type()
130 hisi_gpio_write_reg(chip, HISI_GPIO_INTTYPE_EDGE_CLR_WX, mask); in hisi_gpio_irq_set_type()
131 hisi_gpio_write_reg(chip, HISI_GPIO_INT_POLARITY_SET_WX, mask); in hisi_gpio_irq_set_type()
134 hisi_gpio_write_reg(chip, HISI_GPIO_INTTYPE_EDGE_CLR_WX, mask); in hisi_gpio_irq_set_type()
135 hisi_gpio_write_reg(chip, HISI_GPIO_INT_POLARITY_CLR_WX, mask); in hisi_gpio_irq_set_type()
138 return -EINVAL; in hisi_gpio_irq_set_type()
142 * The dual-edge interrupt and other interrupt's registers do not in hisi_gpio_irq_set_type()
143 * take effect at the same time. The registers of the two-edge in hisi_gpio_irq_set_type()
145 * the dual-edge interrupts must be disabled before the configuration in hisi_gpio_irq_set_type()
149 unsigned int both = hisi_gpio_read_reg(chip, HISI_GPIO_INT_DEDGE_ST); in hisi_gpio_irq_set_type()
152 hisi_gpio_write_reg(chip, HISI_GPIO_INT_DEDGE_CLR, mask); in hisi_gpio_irq_set_type()
165 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_irq_enable() local
168 hisi_gpio_write_reg(chip, HISI_GPIO_INTEN_SET_WX, BIT(irqd_to_hwirq(d))); in hisi_gpio_irq_enable()
173 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in hisi_gpio_irq_disable() local
176 hisi_gpio_write_reg(chip, HISI_GPIO_INTEN_CLR_WX, BIT(irqd_to_hwirq(d))); in hisi_gpio_irq_disable()
182 unsigned long irq_msk = hisi_gpio_read_reg(&hisi_gpio->chip, in hisi_gpio_irq_handler()
189 generic_handle_domain_irq(hisi_gpio->chip.irq.domain, in hisi_gpio_irq_handler()
196 struct gpio_chip *chip = &hisi_gpio->chip; in hisi_gpio_init_irq() local
197 struct gpio_irq_chip *girq_chip = &chip->irq; in hisi_gpio_init_irq()
200 hisi_gpio->irq_chip.irq_ack = hisi_gpio_set_ack; in hisi_gpio_init_irq()
201 hisi_gpio->irq_chip.irq_mask = hisi_gpio_irq_set_mask; in hisi_gpio_init_irq()
202 hisi_gpio->irq_chip.irq_unmask = hisi_gpio_irq_clr_mask; in hisi_gpio_init_irq()
203 hisi_gpio->irq_chip.irq_set_type = hisi_gpio_irq_set_type; in hisi_gpio_init_irq()
204 hisi_gpio->irq_chip.irq_enable = hisi_gpio_irq_enable; in hisi_gpio_init_irq()
205 hisi_gpio->irq_chip.irq_disable = hisi_gpio_irq_disable; in hisi_gpio_init_irq()
207 girq_chip->chip = &hisi_gpio->irq_chip; in hisi_gpio_init_irq()
208 girq_chip->default_type = IRQ_TYPE_NONE; in hisi_gpio_init_irq()
209 girq_chip->num_parents = 1; in hisi_gpio_init_irq()
210 girq_chip->parents = &hisi_gpio->irq; in hisi_gpio_init_irq()
211 girq_chip->parent_handler = hisi_gpio_irq_handler; in hisi_gpio_init_irq()
212 girq_chip->parent_handler_data = hisi_gpio; in hisi_gpio_init_irq()
215 hisi_gpio_write_reg(chip, HISI_GPIO_INTCOMB_MASK_WX, 1); in hisi_gpio_init_irq()
234 &hisi_gpio->line_num)) { in hisi_gpio_get_pdata()
238 hisi_gpio->line_num = HISI_GPIO_LINE_NUM_MAX; in hisi_gpio_get_pdata()
241 if (WARN_ON(hisi_gpio->line_num > HISI_GPIO_LINE_NUM_MAX)) in hisi_gpio_get_pdata()
242 hisi_gpio->line_num = HISI_GPIO_LINE_NUM_MAX; in hisi_gpio_get_pdata()
244 hisi_gpio->irq = platform_get_irq(pdev, idx); in hisi_gpio_get_pdata()
248 hisi_gpio->line_num); in hisi_gpio_get_pdata()
256 struct device *dev = &pdev->dev; in hisi_gpio_probe()
267 return -ENODEV; in hisi_gpio_probe()
271 return -ENOMEM; in hisi_gpio_probe()
273 hisi_gpio->reg_base = devm_platform_ioremap_resource(pdev, 0); in hisi_gpio_probe()
274 if (IS_ERR(hisi_gpio->reg_base)) in hisi_gpio_probe()
275 return PTR_ERR(hisi_gpio->reg_base); in hisi_gpio_probe()
279 hisi_gpio->dev = dev; in hisi_gpio_probe()
281 ret = bgpio_init(&hisi_gpio->chip, hisi_gpio->dev, 0x4, in hisi_gpio_probe()
282 hisi_gpio->reg_base + HISI_GPIO_EXT_PORT_WX, in hisi_gpio_probe()
283 hisi_gpio->reg_base + HISI_GPIO_SWPORT_DR_SET_WX, in hisi_gpio_probe()
284 hisi_gpio->reg_base + HISI_GPIO_SWPORT_DR_CLR_WX, in hisi_gpio_probe()
285 hisi_gpio->reg_base + HISI_GPIO_SWPORT_DDR_SET_WX, in hisi_gpio_probe()
286 hisi_gpio->reg_base + HISI_GPIO_SWPORT_DDR_CLR_WX, in hisi_gpio_probe()
293 hisi_gpio->chip.set_config = hisi_gpio_set_config; in hisi_gpio_probe()
294 hisi_gpio->chip.ngpio = hisi_gpio->line_num; in hisi_gpio_probe()
295 hisi_gpio->chip.bgpio_dir_unreadable = 1; in hisi_gpio_probe()
296 hisi_gpio->chip.base = -1; in hisi_gpio_probe()
298 if (hisi_gpio->irq > 0) in hisi_gpio_probe()
301 ret = devm_gpiochip_add_data(dev, &hisi_gpio->chip, hisi_gpio); in hisi_gpio_probe()