Lines Matching +full:ab8500 +full:- +full:charger
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2010
21 #include <linux/mfd/abx500/ab8500.h>
22 #include <linux/mfd/dbx500-prcmu.h>
129 * defined in linux/mfd/ab8500.h
134 /* AB8500 support */
146 0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22,
151 [AB8500_VERSION_AB8500] = "AB8500",
157 static int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)
163 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
167 static int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
175 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
179 static int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr)
186 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
194 struct ab8500 *ab8500;
197 return -EINVAL;
198 ab8500 = dev_get_drvdata(dev->parent);
199 return ab8500 ? (int)ab8500->chip_id : -EINVAL;
202 static int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
212 dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
214 mutex_lock(&ab8500->lock);
216 ret = ab8500->write(ab8500, addr, data);
218 dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
220 mutex_unlock(&ab8500->lock);
229 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
231 atomic_inc(&ab8500->transfer_ongoing);
232 ret = set_register_interruptible(ab8500, bank, reg, value);
233 atomic_dec(&ab8500->transfer_ongoing);
237 static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
243 mutex_lock(&ab8500->lock);
245 ret = ab8500->read(ab8500, addr);
247 dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
252 mutex_unlock(&ab8500->lock);
253 dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
262 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
264 atomic_inc(&ab8500->transfer_ongoing);
265 ret = get_register_interruptible(ab8500, bank, reg, value);
266 atomic_dec(&ab8500->transfer_ongoing);
270 static int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
276 mutex_lock(&ab8500->lock);
278 if (ab8500->write_masked == NULL) {
281 ret = ab8500->read(ab8500, addr);
283 dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
291 ret = ab8500->write(ab8500, addr, data);
293 dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
296 dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr,
300 ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues);
302 dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr,
305 mutex_unlock(&ab8500->lock);
313 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
315 atomic_inc(&ab8500->transfer_ongoing);
316 ret = mask_and_set_register_interruptible(ab8500, bank, reg,
318 atomic_dec(&ab8500->transfer_ongoing);
336 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
338 mutex_lock(&ab8500->irq_lock);
339 atomic_inc(&ab8500->transfer_ongoing);
344 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
347 for (i = 0; i < ab8500->mask_size; i++) {
348 u8 old = ab8500->oldmask[i];
349 u8 new = ab8500->mask[i];
356 * Interrupt register 12 doesn't exist prior to AB8500 version
359 if (ab8500->irq_reg_offset[i] == 11 &&
360 is_ab8500_1p1_or_earlier(ab8500))
363 if (ab8500->irq_reg_offset[i] < 0)
366 ab8500->oldmask[i] = new;
368 reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i];
369 set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
371 atomic_dec(&ab8500->transfer_ongoing);
372 mutex_unlock(&ab8500->irq_lock);
377 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
378 int offset = data->hwirq;
382 ab8500->mask[index] |= mask;
384 /* The AB8500 GPIOs have two interrupts each (rising & falling). */
386 ab8500->mask[index + 2] |= mask;
388 ab8500->mask[index + 1] |= mask;
391 ab8500->mask[index] |= (mask << 1);
396 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
398 int offset = data->hwirq;
403 ab8500->mask[index] &= ~mask;
405 /* The AB8500 GPIOs have two interrupts each (rising & falling). */
408 ab8500->mask[index + 2] &= ~mask;
411 ab8500->mask[index + 1] &= ~mask;
415 ab8500->mask[index] &= ~(mask << 1);
417 ab8500->mask[index] &= ~mask;
420 ab8500->mask[index] &= ~mask;
430 .name = "ab8500",
451 static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
456 for (i = 0; i < ab8500->mask_size; i++)
457 if (ab8500->irq_reg_offset[i] == latch_offset)
460 if (i >= ab8500->mask_size) {
461 dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
463 return -ENXIO;
467 latch_val &= ~ab8500->mask[i];
481 line -= 16;
483 line -= 8;
487 handle_nested_irq(irq_find_mapping(ab8500->domain, line));
493 static int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500,
505 status = get_register_interruptible(ab8500,
512 status = ab8500_handle_hierarchical_line(ab8500,
525 struct ab8500 *ab8500 = dev;
528 dev_vdbg(ab8500->dev, "interrupt\n");
531 for (i = 0; i < (ab8500->it_latchhier_num); i++) {
535 status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
540 status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val);
550 struct ab8500 *ab8500 = d->host_data;
552 if (!ab8500)
553 return -EINVAL;
555 irq_set_chip_data(virq, ab8500);
569 static int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
573 if (is_ab8540(ab8500))
575 else if (is_ab9540(ab8500))
577 else if (is_ab8505(ab8500))
582 /* If ->irq_base is zero this will give a linear mapping */
583 ab8500->domain = irq_domain_create_simple(dev_fwnode(ab8500->dev), num_irqs, 0,
584 &ab8500_irq_ops, ab8500);
586 if (!ab8500->domain) {
587 dev_err(ab8500->dev, "Failed to create irqdomain\n");
588 return -ENODEV;
594 int ab8500_suspend(struct ab8500 *ab8500)
596 if (atomic_read(&ab8500->transfer_ongoing))
597 return -EINVAL;
603 MFD_CELL_OF("ab8500-charger", NULL, NULL, 0, 0,
604 "stericsson,ab8500-charger"),
605 MFD_CELL_OF("ab8500-btemp", NULL, NULL, 0, 0,
606 "stericsson,ab8500-btemp"),
607 MFD_CELL_OF("ab8500-fg", NULL, NULL, 0, 0,
608 "stericsson,ab8500-fg"),
609 MFD_CELL_OF("ab8500-chargalg", NULL, NULL, 0, 0,
610 "stericsson,ab8500-chargalg"),
614 MFD_CELL_OF("ab8500-sysctrl",
615 NULL, NULL, 0, 0, "stericsson,ab8500-sysctrl"),
616 MFD_CELL_OF("ab8500-ext-regulator",
617 NULL, NULL, 0, 0, "stericsson,ab8500-ext-regulator"),
618 MFD_CELL_OF("ab8500-regulator",
619 NULL, NULL, 0, 0, "stericsson,ab8500-regulator"),
620 MFD_CELL_OF("ab8500-clk",
621 NULL, NULL, 0, 0, "stericsson,ab8500-clk"),
622 MFD_CELL_OF("ab8500-gpadc",
623 NULL, NULL, 0, 0, "stericsson,ab8500-gpadc"),
624 MFD_CELL_OF("ab8500-rtc",
625 NULL, NULL, 0, 0, "stericsson,ab8500-rtc"),
626 MFD_CELL_OF("ab8500-acc-det",
627 NULL, NULL, 0, 0, "stericsson,ab8500-acc-det"),
628 MFD_CELL_OF("ab8500-poweron-key",
629 NULL, NULL, 0, 0, "stericsson,ab8500-poweron-key"),
630 MFD_CELL_OF("ab8500-pwm",
631 NULL, NULL, 0, 1, "stericsson,ab8500-pwm"),
632 MFD_CELL_OF("ab8500-pwm",
633 NULL, NULL, 0, 2, "stericsson,ab8500-pwm"),
634 MFD_CELL_OF("ab8500-pwm",
635 NULL, NULL, 0, 3, "stericsson,ab8500-pwm"),
636 MFD_CELL_OF("ab8500-denc",
637 NULL, NULL, 0, 0, "stericsson,ab8500-denc"),
638 MFD_CELL_OF("pinctrl-ab8500",
639 NULL, NULL, 0, 0, "stericsson,ab8500-gpio"),
640 MFD_CELL_OF("abx500-temp",
641 NULL, NULL, 0, 0, "stericsson,abx500-temp"),
642 MFD_CELL_OF("ab8500-usb",
643 NULL, NULL, 0, 0, "stericsson,ab8500-usb"),
644 MFD_CELL_OF("ab8500-codec",
645 NULL, NULL, 0, 0, "stericsson,ab8500-codec"),
650 .name = "ab8500-sysctrl",
653 .name = "ab8500-ext-regulator",
656 .name = "ab8500-regulator",
659 .name = "abx500-clk",
660 .of_compatible = "stericsson,abx500-clk",
663 .name = "ab8500-gpadc",
664 .of_compatible = "stericsson,ab8500-gpadc",
667 .name = "ab8500-rtc",
670 .name = "ab8500-acc-det",
673 .name = "ab8500-poweron-key",
676 .name = "ab8500-pwm",
680 .name = "abx500-temp",
683 .name = "pinctrl-ab9540",
684 .of_compatible = "stericsson,ab9540-gpio",
687 .name = "ab9540-usb",
690 .name = "ab9540-codec",
693 .name = "ab-iddet",
700 .name = "ab8500-sysctrl",
701 .of_compatible = "stericsson,ab8500-sysctrl",
704 .name = "ab8500-regulator",
705 .of_compatible = "stericsson,ab8505-regulator",
708 .name = "abx500-clk",
709 .of_compatible = "stericsson,ab8500-clk",
712 .name = "ab8500-gpadc",
713 .of_compatible = "stericsson,ab8500-gpadc",
716 .name = "ab8500-rtc",
717 .of_compatible = "stericsson,ab8500-rtc",
720 .name = "ab8500-acc-det",
721 .of_compatible = "stericsson,ab8500-acc-det",
724 .name = "ab8500-poweron-key",
725 .of_compatible = "stericsson,ab8500-poweron-key",
728 .name = "ab8500-pwm",
729 .of_compatible = "stericsson,ab8500-pwm",
733 .name = "pinctrl-ab8505",
734 .of_compatible = "stericsson,ab8505-gpio",
737 .name = "ab8500-usb",
738 .of_compatible = "stericsson,ab8500-usb",
741 .name = "ab8500-codec",
742 .of_compatible = "stericsson,ab8500-codec",
745 .name = "ab-iddet",
751 .name = "ab8500-sysctrl",
754 .name = "ab8500-ext-regulator",
757 .name = "ab8500-regulator",
760 .name = "abx500-clk",
761 .of_compatible = "stericsson,abx500-clk",
764 .name = "ab8500-gpadc",
765 .of_compatible = "stericsson,ab8500-gpadc",
768 .name = "ab8500-acc-det",
771 .name = "ab8500-poweron-key",
774 .name = "ab8500-pwm",
778 .name = "abx500-temp",
781 .name = "pinctrl-ab8540",
784 .name = "ab8540-usb",
787 .name = "ab8540-codec",
790 .name = "ab-iddet",
796 .name = "ab8500-rtc",
797 .of_compatible = "stericsson,ab8500-rtc",
803 .name = "ab8540-rtc",
804 .of_compatible = "stericsson,ab8540-rtc",
811 struct ab8500 *ab8500;
813 ab8500 = dev_get_drvdata(dev);
815 return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
819 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
834 struct ab8500 *ab8500;
836 ab8500 = dev_get_drvdata(dev);
837 ret = get_register_interruptible(ab8500, AB8500_RTC,
854 * ab8500 has turned on due to (TURN_ON_STATUS):
869 struct ab8500 *ab8500;
871 ab8500 = dev_get_drvdata(dev);
872 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
879 * the device is rebooted with AC/USB charger connected. Due to
881 * only mode. Read the AC/USB status register to detect the charger
884 if (is_ab9540(ab8500)) {
898 struct ab8500 *ab8500;
900 ab8500 = dev_get_drvdata(dev);
901 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
911 struct ab8500 *ab8500;
915 ab8500 = dev_get_drvdata(dev);
917 ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
929 struct ab8500 *ab8500;
934 ab8500 = dev_get_drvdata(dev);
948 err = mask_and_set_register_interruptible(ab8500,
952 dev_info(ab8500->dev,
1015 "Main Charger Detect",
1021 struct device_node *np = pdev->dev.of_node;
1022 struct ab8500 *ab8500;
1028 ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL);
1029 if (!ab8500)
1030 return -ENOMEM;
1032 ab8500->dev = &pdev->dev;
1038 ab8500->irq = irq;
1040 ab8500->read = ab8500_prcmu_read;
1041 ab8500->write = ab8500_prcmu_write;
1042 ab8500->write_masked = ab8500_prcmu_write_masked;
1044 mutex_init(&ab8500->lock);
1045 mutex_init(&ab8500->irq_lock);
1046 atomic_set(&ab8500->transfer_ongoing, 0);
1048 platform_set_drvdata(pdev, ab8500);
1051 version = platid->driver_data;
1054 ab8500->version = version;
1056 ret = get_register_interruptible(ab8500, AB8500_MISC,
1059 dev_err(&pdev->dev, "could not probe HW\n");
1063 ab8500->version = value;
1066 ret = get_register_interruptible(ab8500, AB8500_MISC,
1071 ab8500->chip_id = value;
1073 dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
1074 ab8500_version_str[ab8500->version],
1075 ab8500->chip_id >> 4,
1076 ab8500->chip_id & 0x0F);
1079 if (is_ab8540(ab8500)) {
1080 ab8500->mask_size = AB8540_NUM_IRQ_REGS;
1081 ab8500->irq_reg_offset = ab8540_irq_regoffset;
1082 ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM;
1083 } /* Configure AB8500 or AB9540 IRQ */
1084 else if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1085 ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1086 ab8500->irq_reg_offset = ab9540_irq_regoffset;
1087 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1089 ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1090 ab8500->irq_reg_offset = ab8500_irq_regoffset;
1091 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1093 ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
1095 if (!ab8500->mask)
1096 return -ENOMEM;
1097 ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
1099 if (!ab8500->oldmask)
1100 return -ENOMEM;
1103 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1114 ret = get_register_interruptible(ab8500, AB8500_RTC,
1118 dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value);
1131 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1135 dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value);
1148 if (is_ab9540(ab8500)) {
1149 ret = get_register_interruptible(ab8500, AB8500_CHARGER,
1159 for (i = 0; i < ab8500->mask_size; i++) {
1161 * Interrupt register 12 doesn't exist prior to AB8500 version
1164 if (ab8500->irq_reg_offset[i] == 11 &&
1165 is_ab8500_1p1_or_earlier(ab8500))
1168 if (ab8500->irq_reg_offset[i] < 0)
1171 get_register_interruptible(ab8500, AB8500_INTERRUPT,
1172 AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
1174 set_register_interruptible(ab8500, AB8500_INTERRUPT,
1175 AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
1178 ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
1182 for (i = 0; i < ab8500->mask_size; i++)
1183 ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
1185 ret = ab8500_irq_init(ab8500, np);
1189 ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL,
1192 "ab8500", ab8500);
1196 if (is_ab9540(ab8500))
1197 ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
1199 0, ab8500->domain);
1200 else if (is_ab8540(ab8500)) {
1201 ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs,
1203 0, ab8500->domain);
1207 if (is_ab8540_1p2_or_earlier(ab8500))
1208 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs,
1210 0, ab8500->domain);
1212 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs,
1214 0, ab8500->domain);
1215 } else if (is_ab8505(ab8500))
1216 ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs,
1218 0, ab8500->domain);
1220 ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
1222 0, ab8500->domain);
1227 ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
1229 0, ab8500->domain);
1231 dev_err(ab8500->dev, "error adding bm devices\n");
1233 if (((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1234 ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500))
1235 ret = sysfs_create_group(&ab8500->dev->kobj,
1238 ret = sysfs_create_group(&ab8500->dev->kobj,
1241 if ((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1242 ab8500->chip_id >= AB8500_CUT2P0)
1243 ret = sysfs_create_group(&ab8500->dev->kobj,
1247 dev_err(ab8500->dev, "error creating sysfs entries\n");
1253 { "ab8500-core", AB8500_VERSION_AB8500 },
1254 { "ab8505-core", AB8500_VERSION_AB8505 },
1255 { "ab9540-i2c", AB8500_VERSION_AB9540 },
1256 { "ab8540-i2c", AB8500_VERSION_AB8540 },
1262 .name = "ab8500-core",