Lines Matching full:sch

3  * GPIO interface for Intel Poulsbo SCH
50 static unsigned int sch_gpio_offset(struct sch_gpio *sch, unsigned int gpio, in sch_gpio_offset() argument
55 if (gpio >= sch->resume_base) { in sch_gpio_offset()
56 gpio -= sch->resume_base; in sch_gpio_offset()
63 static unsigned int sch_gpio_bit(struct sch_gpio *sch, unsigned int gpio) in sch_gpio_bit() argument
65 if (gpio >= sch->resume_base) in sch_gpio_bit()
66 gpio -= sch->resume_base; in sch_gpio_bit()
70 static int sch_gpio_reg_get(struct sch_gpio *sch, unsigned int gpio, unsigned int reg) in sch_gpio_reg_get() argument
75 offset = sch_gpio_offset(sch, gpio, reg); in sch_gpio_reg_get()
76 bit = sch_gpio_bit(sch, gpio); in sch_gpio_reg_get()
78 reg_val = !!(ioread8(sch->regs + offset) & BIT(bit)); in sch_gpio_reg_get()
83 static void sch_gpio_reg_set(struct sch_gpio *sch, unsigned int gpio, unsigned int reg, in sch_gpio_reg_set() argument
89 offset = sch_gpio_offset(sch, gpio, reg); in sch_gpio_reg_set()
90 bit = sch_gpio_bit(sch, gpio); in sch_gpio_reg_set()
92 reg_val = ioread8(sch->regs + offset); in sch_gpio_reg_set()
99 iowrite8(reg_val, sch->regs + offset); in sch_gpio_reg_set()
104 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_gpio_direction_in() local
107 spin_lock_irqsave(&sch->lock, flags); in sch_gpio_direction_in()
108 sch_gpio_reg_set(sch, gpio_num, GIO, 1); in sch_gpio_direction_in()
109 spin_unlock_irqrestore(&sch->lock, flags); in sch_gpio_direction_in()
115 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_gpio_get() local
117 return sch_gpio_reg_get(sch, gpio_num, GLV); in sch_gpio_get()
122 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_gpio_set() local
125 spin_lock_irqsave(&sch->lock, flags); in sch_gpio_set()
126 sch_gpio_reg_set(sch, gpio_num, GLV, val); in sch_gpio_set()
127 spin_unlock_irqrestore(&sch->lock, flags); in sch_gpio_set()
135 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_gpio_direction_out() local
138 spin_lock_irqsave(&sch->lock, flags); in sch_gpio_direction_out()
139 sch_gpio_reg_set(sch, gpio_num, GIO, 0); in sch_gpio_direction_out()
140 spin_unlock_irqrestore(&sch->lock, flags); in sch_gpio_direction_out()
156 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_gpio_get_direction() local
158 if (sch_gpio_reg_get(sch, gpio_num, GIO)) in sch_gpio_get_direction()
177 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_irq_type() local
199 spin_lock_irqsave(&sch->lock, flags); in sch_irq_type()
201 sch_gpio_reg_set(sch, gpio_num, GTPE, rising); in sch_irq_type()
202 sch_gpio_reg_set(sch, gpio_num, GTNE, falling); in sch_irq_type()
206 spin_unlock_irqrestore(&sch->lock, flags); in sch_irq_type()
214 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_irq_ack() local
218 spin_lock_irqsave(&sch->lock, flags); in sch_irq_ack()
219 sch_gpio_reg_set(sch, gpio_num, GTS, 1); in sch_irq_ack()
220 spin_unlock_irqrestore(&sch->lock, flags); in sch_irq_ack()
225 struct sch_gpio *sch = gpiochip_get_data(gc); in sch_irq_mask_unmask() local
228 spin_lock_irqsave(&sch->lock, flags); in sch_irq_mask_unmask()
229 sch_gpio_reg_set(sch, gpio_num, GGPE, val); in sch_irq_mask_unmask()
230 spin_unlock_irqrestore(&sch->lock, flags); in sch_irq_mask_unmask()
263 struct sch_gpio *sch = context; in sch_gpio_gpe_handler() local
264 struct gpio_chip *gc = &sch->chip; in sch_gpio_gpe_handler()
271 spin_lock_irqsave(&sch->lock, flags); in sch_gpio_gpe_handler()
273 core_status = ioread32(sch->regs + CORE_BANK_OFFSET + GTS); in sch_gpio_gpe_handler()
274 resume_status = ioread32(sch->regs + RESUME_BANK_OFFSET + GTS); in sch_gpio_gpe_handler()
276 spin_unlock_irqrestore(&sch->lock, flags); in sch_gpio_gpe_handler()
278 pending = (resume_status << sch->resume_base) | core_status; in sch_gpio_gpe_handler()
279 for_each_set_bit(offset, &pending, sch->chip.ngpio) in sch_gpio_gpe_handler()
293 struct sch_gpio *sch = data; in sch_gpio_remove_gpe_handler() local
295 acpi_disable_gpe(NULL, sch->gpe); in sch_gpio_remove_gpe_handler()
296 acpi_remove_gpe_handler(NULL, sch->gpe, sch->gpe_handler); in sch_gpio_remove_gpe_handler()
299 static int sch_gpio_install_gpe_handler(struct sch_gpio *sch) in sch_gpio_install_gpe_handler() argument
301 struct device *dev = sch->chip.parent; in sch_gpio_install_gpe_handler()
304 status = acpi_install_gpe_handler(NULL, sch->gpe, ACPI_GPE_LEVEL_TRIGGERED, in sch_gpio_install_gpe_handler()
305 sch->gpe_handler, sch); in sch_gpio_install_gpe_handler()
308 sch->gpe, acpi_format_exception(status)); in sch_gpio_install_gpe_handler()
312 status = acpi_enable_gpe(NULL, sch->gpe); in sch_gpio_install_gpe_handler()
315 sch->gpe, acpi_format_exception(status)); in sch_gpio_install_gpe_handler()
316 acpi_remove_gpe_handler(NULL, sch->gpe, sch->gpe_handler); in sch_gpio_install_gpe_handler()
320 return devm_add_action_or_reset(dev, sch_gpio_remove_gpe_handler, sch); in sch_gpio_install_gpe_handler()
327 struct sch_gpio *sch; in sch_gpio_probe() local
332 sch = devm_kzalloc(dev, sizeof(*sch), GFP_KERNEL); in sch_gpio_probe()
333 if (!sch) in sch_gpio_probe()
344 sch->regs = regs; in sch_gpio_probe()
346 spin_lock_init(&sch->lock); in sch_gpio_probe()
347 sch->chip = sch_gpio_chip; in sch_gpio_probe()
348 sch->chip.label = dev_name(dev); in sch_gpio_probe()
349 sch->chip.parent = dev; in sch_gpio_probe()
353 sch->resume_base = 10; in sch_gpio_probe()
354 sch->chip.ngpio = 14; in sch_gpio_probe()
361 sch_gpio_reg_set(sch, 8, GEN, 1); in sch_gpio_probe()
362 sch_gpio_reg_set(sch, 9, GEN, 1); in sch_gpio_probe()
367 sch_gpio_reg_set(sch, 13, GEN, 1); in sch_gpio_probe()
371 sch->resume_base = 5; in sch_gpio_probe()
372 sch->chip.ngpio = 14; in sch_gpio_probe()
376 sch->resume_base = 21; in sch_gpio_probe()
377 sch->chip.ngpio = 30; in sch_gpio_probe()
381 sch->resume_base = 2; in sch_gpio_probe()
382 sch->chip.ngpio = 8; in sch_gpio_probe()
389 girq = &sch->chip.irq; in sch_gpio_probe()
398 sch->gpe = GPE0E_GPIO; in sch_gpio_probe()
399 sch->gpe_handler = sch_gpio_gpe_handler; in sch_gpio_probe()
401 ret = sch_gpio_install_gpe_handler(sch); in sch_gpio_probe()
405 return devm_gpiochip_add_data(dev, &sch->chip, sch); in sch_gpio_probe()
418 MODULE_DESCRIPTION("GPIO interface for Intel Poulsbo SCH");