Lines Matching +full:i2c +full:- +full:int +full:- +full:falling

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
22 #include <linux/mfd/dbx500-prcmu.h>
136 static const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = {
141 static const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = {
146 static const int ab8540_irq_regoffset[AB8540_NUM_IRQ_REGS] = {
147 0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22,
158 static int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data) in ab8500_prcmu_write()
160 int ret; in ab8500_prcmu_write()
164 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); in ab8500_prcmu_write()
168 static int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask, in ab8500_prcmu_write_masked()
171 int ret; in ab8500_prcmu_write_masked()
176 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); in ab8500_prcmu_write_masked()
180 static int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr) in ab8500_prcmu_read()
182 int ret; in ab8500_prcmu_read()
187 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); in ab8500_prcmu_read()
190 return (int)data; in ab8500_prcmu_read()
193 static int ab8500_get_chip_id(struct device *dev) in ab8500_get_chip_id()
198 return -EINVAL; in ab8500_get_chip_id()
199 ab8500 = dev_get_drvdata(dev->parent); in ab8500_get_chip_id()
200 return ab8500 ? (int)ab8500->chip_id : -EINVAL; in ab8500_get_chip_id()
203 static int set_register_interruptible(struct ab8500 *ab8500, u8 bank, in set_register_interruptible()
206 int ret; in set_register_interruptible()
213 dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data); in set_register_interruptible()
215 mutex_lock(&ab8500->lock); in set_register_interruptible()
217 ret = ab8500->write(ab8500, addr, data); in set_register_interruptible()
219 dev_err(ab8500->dev, "failed to write reg %#x: %d\n", in set_register_interruptible()
221 mutex_unlock(&ab8500->lock); in set_register_interruptible()
226 static int ab8500_set_register(struct device *dev, u8 bank, in ab8500_set_register()
229 int ret; in ab8500_set_register()
230 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_set_register()
232 atomic_inc(&ab8500->transfer_ongoing); in ab8500_set_register()
234 atomic_dec(&ab8500->transfer_ongoing); in ab8500_set_register()
238 static int get_register_interruptible(struct ab8500 *ab8500, u8 bank, in get_register_interruptible()
241 int ret; in get_register_interruptible()
244 mutex_lock(&ab8500->lock); in get_register_interruptible()
246 ret = ab8500->read(ab8500, addr); in get_register_interruptible()
248 dev_err(ab8500->dev, "failed to read reg %#x: %d\n", in get_register_interruptible()
253 mutex_unlock(&ab8500->lock); in get_register_interruptible()
254 dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret); in get_register_interruptible()
259 static int ab8500_get_register(struct device *dev, u8 bank, in ab8500_get_register()
262 int ret; in ab8500_get_register()
263 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_get_register()
265 atomic_inc(&ab8500->transfer_ongoing); in ab8500_get_register()
267 atomic_dec(&ab8500->transfer_ongoing); in ab8500_get_register()
271 static int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank, in mask_and_set_register_interruptible()
274 int ret; in mask_and_set_register_interruptible()
277 mutex_lock(&ab8500->lock); in mask_and_set_register_interruptible()
279 if (ab8500->write_masked == NULL) { in mask_and_set_register_interruptible()
282 ret = ab8500->read(ab8500, addr); in mask_and_set_register_interruptible()
284 dev_err(ab8500->dev, "failed to read reg %#x: %d\n", in mask_and_set_register_interruptible()
292 ret = ab8500->write(ab8500, addr, data); in mask_and_set_register_interruptible()
294 dev_err(ab8500->dev, "failed to write reg %#x: %d\n", in mask_and_set_register_interruptible()
297 dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr, in mask_and_set_register_interruptible()
301 ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues); in mask_and_set_register_interruptible()
303 dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr, in mask_and_set_register_interruptible()
306 mutex_unlock(&ab8500->lock); in mask_and_set_register_interruptible()
310 static int ab8500_mask_and_set_register(struct device *dev, in ab8500_mask_and_set_register()
313 int ret; in ab8500_mask_and_set_register()
314 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_mask_and_set_register()
316 atomic_inc(&ab8500->transfer_ongoing); in ab8500_mask_and_set_register()
319 atomic_dec(&ab8500->transfer_ongoing); in ab8500_mask_and_set_register()
339 mutex_lock(&ab8500->irq_lock); in ab8500_irq_lock()
340 atomic_inc(&ab8500->transfer_ongoing); in ab8500_irq_lock()
346 int i; in ab8500_irq_sync_unlock()
348 for (i = 0; i < ab8500->mask_size; i++) { in ab8500_irq_sync_unlock()
349 u8 old = ab8500->oldmask[i]; in ab8500_irq_sync_unlock()
350 u8 new = ab8500->mask[i]; in ab8500_irq_sync_unlock()
351 int reg; in ab8500_irq_sync_unlock()
360 if (ab8500->irq_reg_offset[i] == 11 && in ab8500_irq_sync_unlock()
364 if (ab8500->irq_reg_offset[i] < 0) in ab8500_irq_sync_unlock()
367 ab8500->oldmask[i] = new; in ab8500_irq_sync_unlock()
369 reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i]; in ab8500_irq_sync_unlock()
372 atomic_dec(&ab8500->transfer_ongoing); in ab8500_irq_sync_unlock()
373 mutex_unlock(&ab8500->irq_lock); in ab8500_irq_sync_unlock()
379 int offset = data->hwirq; in ab8500_irq_mask()
380 int index = offset / 8; in ab8500_irq_mask()
381 int mask = 1 << (offset % 8); in ab8500_irq_mask()
383 ab8500->mask[index] |= mask; in ab8500_irq_mask()
385 /* The AB8500 GPIOs have two interrupts each (rising & falling). */ in ab8500_irq_mask()
387 ab8500->mask[index + 2] |= mask; in ab8500_irq_mask()
389 ab8500->mask[index + 1] |= mask; in ab8500_irq_mask()
391 /* Here the falling IRQ is one bit lower */ in ab8500_irq_mask()
392 ab8500->mask[index] |= (mask << 1); in ab8500_irq_mask()
398 unsigned int type = irqd_get_trigger_type(data); in ab8500_irq_unmask()
399 int offset = data->hwirq; in ab8500_irq_unmask()
400 int index = offset / 8; in ab8500_irq_unmask()
401 int mask = 1 << (offset % 8); in ab8500_irq_unmask()
404 ab8500->mask[index] &= ~mask; in ab8500_irq_unmask()
406 /* The AB8500 GPIOs have two interrupts each (rising & falling). */ in ab8500_irq_unmask()
409 ab8500->mask[index + 2] &= ~mask; in ab8500_irq_unmask()
412 ab8500->mask[index + 1] &= ~mask; in ab8500_irq_unmask()
415 /* Here the falling IRQ is one bit lower */ in ab8500_irq_unmask()
416 ab8500->mask[index] &= ~(mask << 1); in ab8500_irq_unmask()
418 ab8500->mask[index] &= ~mask; in ab8500_irq_unmask()
421 ab8500->mask[index] &= ~mask; in ab8500_irq_unmask()
425 static int ab8500_irq_set_type(struct irq_data *data, unsigned int type) in ab8500_irq_set_type()
440 static void update_latch_offset(u8 *offset, int i) in update_latch_offset()
452 static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500, in ab8500_handle_hierarchical_line()
453 int latch_offset, u8 latch_val) in ab8500_handle_hierarchical_line()
455 int int_bit, line, i; in ab8500_handle_hierarchical_line()
457 for (i = 0; i < ab8500->mask_size; i++) in ab8500_handle_hierarchical_line()
458 if (ab8500->irq_reg_offset[i] == latch_offset) in ab8500_handle_hierarchical_line()
461 if (i >= ab8500->mask_size) { in ab8500_handle_hierarchical_line()
462 dev_err(ab8500->dev, "Register offset 0x%2x not declared\n", in ab8500_handle_hierarchical_line()
464 return -ENXIO; in ab8500_handle_hierarchical_line()
468 latch_val &= ~ab8500->mask[i]; in ab8500_handle_hierarchical_line()
476 * This handles the falling edge hwirqs from the GPIO in ab8500_handle_hierarchical_line()
482 line -= 16; in ab8500_handle_hierarchical_line()
484 line -= 8; in ab8500_handle_hierarchical_line()
488 handle_nested_irq(irq_find_mapping(ab8500->domain, line)); in ab8500_handle_hierarchical_line()
494 static int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500, in ab8500_handle_hierarchical_latch()
495 int hier_offset, u8 hier_val) in ab8500_handle_hierarchical_latch()
497 int latch_bit, status; in ab8500_handle_hierarchical_latch()
524 static irqreturn_t ab8500_hierarchical_irq(int irq, void *dev) in ab8500_hierarchical_irq()
529 dev_vdbg(ab8500->dev, "interrupt\n"); in ab8500_hierarchical_irq()
532 for (i = 0; i < (ab8500->it_latchhier_num); i++) { in ab8500_hierarchical_irq()
533 int status; in ab8500_hierarchical_irq()
548 static int ab8500_irq_map(struct irq_domain *d, unsigned int virq, in ab8500_irq_map()
551 struct ab8500 *ab8500 = d->host_data; in ab8500_irq_map()
554 return -EINVAL; in ab8500_irq_map()
570 static int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np) in ab8500_irq_init()
572 int num_irqs; in ab8500_irq_init()
583 /* If ->irq_base is zero this will give a linear mapping */ in ab8500_irq_init()
584 ab8500->domain = irq_domain_add_simple(ab8500->dev->of_node, in ab8500_irq_init()
588 if (!ab8500->domain) { in ab8500_irq_init()
589 dev_err(ab8500->dev, "Failed to create irqdomain\n"); in ab8500_irq_init()
590 return -ENODEV; in ab8500_irq_init()
596 int ab8500_suspend(struct ab8500 *ab8500) in ab8500_suspend()
598 if (atomic_read(&ab8500->transfer_ongoing)) in ab8500_suspend()
599 return -EINVAL; in ab8500_suspend()
605 MFD_CELL_OF("ab8500-charger", NULL, NULL, 0, 0,
606 "stericsson,ab8500-charger"),
607 MFD_CELL_OF("ab8500-btemp", NULL, NULL, 0, 0,
608 "stericsson,ab8500-btemp"),
609 MFD_CELL_OF("ab8500-fg", NULL, NULL, 0, 0,
610 "stericsson,ab8500-fg"),
611 MFD_CELL_OF("ab8500-chargalg", NULL, NULL, 0, 0,
612 "stericsson,ab8500-chargalg"),
616 MFD_CELL_OF("ab8500-sysctrl",
617 NULL, NULL, 0, 0, "stericsson,ab8500-sysctrl"),
618 MFD_CELL_OF("ab8500-ext-regulator",
619 NULL, NULL, 0, 0, "stericsson,ab8500-ext-regulator"),
620 MFD_CELL_OF("ab8500-regulator",
621 NULL, NULL, 0, 0, "stericsson,ab8500-regulator"),
622 MFD_CELL_OF("ab8500-clk",
623 NULL, NULL, 0, 0, "stericsson,ab8500-clk"),
624 MFD_CELL_OF("ab8500-gpadc",
625 NULL, NULL, 0, 0, "stericsson,ab8500-gpadc"),
626 MFD_CELL_OF("ab8500-rtc",
627 NULL, NULL, 0, 0, "stericsson,ab8500-rtc"),
628 MFD_CELL_OF("ab8500-acc-det",
629 NULL, NULL, 0, 0, "stericsson,ab8500-acc-det"),
630 MFD_CELL_OF("ab8500-poweron-key",
631 NULL, NULL, 0, 0, "stericsson,ab8500-poweron-key"),
632 MFD_CELL_OF("ab8500-pwm",
633 NULL, NULL, 0, 1, "stericsson,ab8500-pwm"),
634 MFD_CELL_OF("ab8500-pwm",
635 NULL, NULL, 0, 2, "stericsson,ab8500-pwm"),
636 MFD_CELL_OF("ab8500-pwm",
637 NULL, NULL, 0, 3, "stericsson,ab8500-pwm"),
638 MFD_CELL_OF("ab8500-denc",
639 NULL, NULL, 0, 0, "stericsson,ab8500-denc"),
640 MFD_CELL_OF("pinctrl-ab8500",
641 NULL, NULL, 0, 0, "stericsson,ab8500-gpio"),
642 MFD_CELL_OF("abx500-temp",
643 NULL, NULL, 0, 0, "stericsson,abx500-temp"),
644 MFD_CELL_OF("ab8500-usb",
645 NULL, NULL, 0, 0, "stericsson,ab8500-usb"),
646 MFD_CELL_OF("ab8500-codec",
647 NULL, NULL, 0, 0, "stericsson,ab8500-codec"),
652 .name = "ab8500-sysctrl",
655 .name = "ab8500-ext-regulator",
658 .name = "ab8500-regulator",
661 .name = "abx500-clk",
662 .of_compatible = "stericsson,abx500-clk",
665 .name = "ab8500-gpadc",
666 .of_compatible = "stericsson,ab8500-gpadc",
669 .name = "ab8500-rtc",
672 .name = "ab8500-acc-det",
675 .name = "ab8500-poweron-key",
678 .name = "ab8500-pwm",
682 .name = "abx500-temp",
685 .name = "pinctrl-ab9540",
686 .of_compatible = "stericsson,ab9540-gpio",
689 .name = "ab9540-usb",
692 .name = "ab9540-codec",
695 .name = "ab-iddet",
702 .name = "ab8500-sysctrl",
703 .of_compatible = "stericsson,ab8500-sysctrl",
706 .name = "ab8500-regulator",
707 .of_compatible = "stericsson,ab8505-regulator",
710 .name = "abx500-clk",
711 .of_compatible = "stericsson,ab8500-clk",
714 .name = "ab8500-gpadc",
715 .of_compatible = "stericsson,ab8500-gpadc",
718 .name = "ab8500-rtc",
719 .of_compatible = "stericsson,ab8500-rtc",
722 .name = "ab8500-acc-det",
723 .of_compatible = "stericsson,ab8500-acc-det",
726 .name = "ab8500-poweron-key",
727 .of_compatible = "stericsson,ab8500-poweron-key",
730 .name = "ab8500-pwm",
731 .of_compatible = "stericsson,ab8500-pwm",
735 .name = "pinctrl-ab8505",
736 .of_compatible = "stericsson,ab8505-gpio",
739 .name = "ab8500-usb",
740 .of_compatible = "stericsson,ab8500-usb",
743 .name = "ab8500-codec",
744 .of_compatible = "stericsson,ab8500-codec",
747 .name = "ab-iddet",
753 .name = "ab8500-sysctrl",
756 .name = "ab8500-ext-regulator",
759 .name = "ab8500-regulator",
762 .name = "abx500-clk",
763 .of_compatible = "stericsson,abx500-clk",
766 .name = "ab8500-gpadc",
767 .of_compatible = "stericsson,ab8500-gpadc",
770 .name = "ab8500-acc-det",
773 .name = "ab8500-poweron-key",
776 .name = "ab8500-pwm",
780 .name = "abx500-temp",
783 .name = "pinctrl-ab8540",
786 .name = "ab8540-usb",
789 .name = "ab8540-codec",
792 .name = "ab-iddet",
798 .name = "ab8500-rtc",
799 .of_compatible = "stericsson,ab8500-rtc",
805 .name = "ab8540-rtc",
806 .of_compatible = "stericsson,ab8540-rtc",
817 return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); in chip_id_show()
824 * 0x04 Vbat lower then BattOk falling threshold
834 int ret; in switch_off_status_show()
869 int ret; in turn_on_status_show()
898 int ret; in turn_on_status_2_show()
914 int ret; in dbbrstn_show()
932 int ret = count; in dbbrstn_store()
933 int err; in dbbrstn_store()
954 dev_info(ab8500->dev, in dbbrstn_store()
1001 static int ab8500_probe(struct platform_device *pdev) in ab8500_probe()
1006 "Vbat lower then BattOk falling threshold", in ab8500_probe()
1023 struct device_node *np = pdev->dev.of_node; in ab8500_probe()
1025 int ret; in ab8500_probe()
1026 int i; in ab8500_probe()
1027 int irq; in ab8500_probe()
1030 ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL); in ab8500_probe()
1032 return -ENOMEM; in ab8500_probe()
1034 ab8500->dev = &pdev->dev; in ab8500_probe()
1040 ab8500->irq = irq; in ab8500_probe()
1042 ab8500->read = ab8500_prcmu_read; in ab8500_probe()
1043 ab8500->write = ab8500_prcmu_write; in ab8500_probe()
1044 ab8500->write_masked = ab8500_prcmu_write_masked; in ab8500_probe()
1046 mutex_init(&ab8500->lock); in ab8500_probe()
1047 mutex_init(&ab8500->irq_lock); in ab8500_probe()
1048 atomic_set(&ab8500->transfer_ongoing, 0); in ab8500_probe()
1053 version = platid->driver_data; in ab8500_probe()
1056 ab8500->version = version; in ab8500_probe()
1061 dev_err(&pdev->dev, "could not probe HW\n"); in ab8500_probe()
1065 ab8500->version = value; in ab8500_probe()
1073 ab8500->chip_id = value; in ab8500_probe()
1075 dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", in ab8500_probe()
1076 ab8500_version_str[ab8500->version], in ab8500_probe()
1077 ab8500->chip_id >> 4, in ab8500_probe()
1078 ab8500->chip_id & 0x0F); in ab8500_probe()
1082 ab8500->mask_size = AB8540_NUM_IRQ_REGS; in ab8500_probe()
1083 ab8500->irq_reg_offset = ab8540_irq_regoffset; in ab8500_probe()
1084 ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM; in ab8500_probe()
1087 ab8500->mask_size = AB9540_NUM_IRQ_REGS; in ab8500_probe()
1088 ab8500->irq_reg_offset = ab9540_irq_regoffset; in ab8500_probe()
1089 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; in ab8500_probe()
1091 ab8500->mask_size = AB8500_NUM_IRQ_REGS; in ab8500_probe()
1092 ab8500->irq_reg_offset = ab8500_irq_regoffset; in ab8500_probe()
1093 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; in ab8500_probe()
1095 ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, in ab8500_probe()
1097 if (!ab8500->mask) in ab8500_probe()
1098 return -ENOMEM; in ab8500_probe()
1099 ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, in ab8500_probe()
1101 if (!ab8500->oldmask) in ab8500_probe()
1102 return -ENOMEM; in ab8500_probe()
1108 * 0x04 Vbat lower then BattOk falling threshold in ab8500_probe()
1120 dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value); in ab8500_probe()
1137 dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value); in ab8500_probe()
1161 for (i = 0; i < ab8500->mask_size; i++) { in ab8500_probe()
1166 if (ab8500->irq_reg_offset[i] == 11 && in ab8500_probe()
1170 if (ab8500->irq_reg_offset[i] < 0) in ab8500_probe()
1174 AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], in ab8500_probe()
1177 AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); in ab8500_probe()
1180 ret = abx500_register_ops(ab8500->dev, &ab8500_ops); in ab8500_probe()
1184 for (i = 0; i < ab8500->mask_size; i++) in ab8500_probe()
1185 ab8500->mask[i] = ab8500->oldmask[i] = 0xff; in ab8500_probe()
1191 ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL, in ab8500_probe()
1199 ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, in ab8500_probe()
1201 0, ab8500->domain); in ab8500_probe()
1203 ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs, in ab8500_probe()
1205 0, ab8500->domain); in ab8500_probe()
1210 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs, in ab8500_probe()
1212 0, ab8500->domain); in ab8500_probe()
1214 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs, in ab8500_probe()
1216 0, ab8500->domain); in ab8500_probe()
1218 ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs, in ab8500_probe()
1220 0, ab8500->domain); in ab8500_probe()
1222 ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, in ab8500_probe()
1224 0, ab8500->domain); in ab8500_probe()
1229 ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, in ab8500_probe()
1231 0, ab8500->domain); in ab8500_probe()
1233 dev_err(ab8500->dev, "error adding bm devices\n"); in ab8500_probe()
1236 ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500)) in ab8500_probe()
1237 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1240 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1244 ab8500->chip_id >= AB8500_CUT2P0) in ab8500_probe()
1245 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1249 dev_err(ab8500->dev, "error creating sysfs entries\n"); in ab8500_probe()
1255 { "ab8500-core", AB8500_VERSION_AB8500 },
1256 { "ab8505-core", AB8500_VERSION_AB8505 },
1257 { "ab9540-i2c", AB8500_VERSION_AB9540 },
1258 { "ab8540-i2c", AB8500_VERSION_AB8540 },
1264 .name = "ab8500-core",
1271 static int __init ab8500_core_init(void) in ab8500_core_init()