Lines Matching defs:ab8500

21 #include <linux/mfd/abx500/ab8500.h>
22 #include <linux/mfd/abx500/ab8500-bm.h>
24 #include <linux/regulator/ab8500.h>
138 * defined in linux/mfd/ab8500.h
166 static int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)
172 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
176 static int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
184 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
188 static int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr)
195 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
203 struct ab8500 *ab8500;
207 ab8500 = dev_get_drvdata(dev->parent);
208 return ab8500 ? (int)ab8500->chip_id : -EINVAL;
211 static int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
221 dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
223 mutex_lock(&ab8500->lock);
225 ret = ab8500->write(ab8500, addr, data);
227 dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
229 mutex_unlock(&ab8500->lock);
238 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
240 atomic_inc(&ab8500->transfer_ongoing);
241 ret = set_register_interruptible(ab8500, bank, reg, value);
242 atomic_dec(&ab8500->transfer_ongoing);
246 static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
252 mutex_lock(&ab8500->lock);
254 ret = ab8500->read(ab8500, addr);
256 dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
261 mutex_unlock(&ab8500->lock);
262 dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
271 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
273 atomic_inc(&ab8500->transfer_ongoing);
274 ret = get_register_interruptible(ab8500, bank, reg, value);
275 atomic_dec(&ab8500->transfer_ongoing);
279 static int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
285 mutex_lock(&ab8500->lock);
287 if (ab8500->write_masked == NULL) {
290 ret = ab8500->read(ab8500, addr);
292 dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
300 ret = ab8500->write(ab8500, addr, data);
302 dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
305 dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr,
309 ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues);
311 dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr,
314 mutex_unlock(&ab8500->lock);
322 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
324 atomic_inc(&ab8500->transfer_ongoing);
325 ret = mask_and_set_register_interruptible(ab8500, bank, reg,
327 atomic_dec(&ab8500->transfer_ongoing);
345 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
347 mutex_lock(&ab8500->irq_lock);
348 atomic_inc(&ab8500->transfer_ongoing);
353 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
356 for (i = 0; i < ab8500->mask_size; i++) {
357 u8 old = ab8500->oldmask[i];
358 u8 new = ab8500->mask[i];
368 if (ab8500->irq_reg_offset[i] == 11 &&
369 is_ab8500_1p1_or_earlier(ab8500))
372 if (ab8500->irq_reg_offset[i] < 0)
375 ab8500->oldmask[i] = new;
377 reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i];
378 set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
380 atomic_dec(&ab8500->transfer_ongoing);
381 mutex_unlock(&ab8500->irq_lock);
386 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
391 ab8500->mask[index] |= mask;
395 ab8500->mask[index + 2] |= mask;
397 ab8500->mask[index + 1] |= mask;
400 ab8500->mask[index] |= (mask << 1);
405 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
412 ab8500->mask[index] &= ~mask;
417 ab8500->mask[index + 2] &= ~mask;
420 ab8500->mask[index + 1] &= ~mask;
424 ab8500->mask[index] &= ~(mask << 1);
426 ab8500->mask[index] &= ~mask;
429 ab8500->mask[index] &= ~mask;
439 .name = "ab8500",
460 static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
465 for (i = 0; i < ab8500->mask_size; i++)
466 if (ab8500->irq_reg_offset[i] == latch_offset)
469 if (i >= ab8500->mask_size) {
470 dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
476 latch_val &= ~ab8500->mask[i];
496 handle_nested_irq(irq_find_mapping(ab8500->domain, line));
502 static int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500,
514 status = get_register_interruptible(ab8500,
521 status = ab8500_handle_hierarchical_line(ab8500,
534 struct ab8500 *ab8500 = dev;
537 dev_vdbg(ab8500->dev, "interrupt\n");
540 for (i = 0; i < (ab8500->it_latchhier_num); i++) {
544 status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
549 status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val);
559 struct ab8500 *ab8500 = d->host_data;
561 if (!ab8500)
564 irq_set_chip_data(virq, ab8500);
578 static int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
582 if (is_ab8540(ab8500))
584 else if (is_ab9540(ab8500))
586 else if (is_ab8505(ab8500))
592 ab8500->domain = irq_domain_add_simple(ab8500->dev->of_node,
594 &ab8500_irq_ops, ab8500);
596 if (!ab8500->domain) {
597 dev_err(ab8500->dev, "Failed to create irqdomain\n");
604 int ab8500_suspend(struct ab8500 *ab8500)
606 if (atomic_read(&ab8500->transfer_ongoing))
613 OF_MFD_CELL("ab8500-charger", NULL, &ab8500_bm_data,
614 sizeof(ab8500_bm_data), 0, "stericsson,ab8500-charger"),
615 OF_MFD_CELL("ab8500-btemp", NULL, &ab8500_bm_data,
616 sizeof(ab8500_bm_data), 0, "stericsson,ab8500-btemp"),
617 OF_MFD_CELL("ab8500-fg", NULL, &ab8500_bm_data,
618 sizeof(ab8500_bm_data), 0, "stericsson,ab8500-fg"),
619 OF_MFD_CELL("ab8500-chargalg", NULL, &ab8500_bm_data,
620 sizeof(ab8500_bm_data), 0, "stericsson,ab8500-chargalg"),
625 OF_MFD_CELL("ab8500-debug",
626 NULL, NULL, 0, 0, "stericsson,ab8500-debug"),
628 OF_MFD_CELL("ab8500-sysctrl",
629 NULL, NULL, 0, 0, "stericsson,ab8500-sysctrl"),
630 OF_MFD_CELL("ab8500-ext-regulator",
631 NULL, NULL, 0, 0, "stericsson,ab8500-ext-regulator"),
632 OF_MFD_CELL("ab8500-regulator",
633 NULL, NULL, 0, 0, "stericsson,ab8500-regulator"),
634 OF_MFD_CELL("ab8500-clk",
635 NULL, NULL, 0, 0, "stericsson,ab8500-clk"),
636 OF_MFD_CELL("ab8500-gpadc",
637 NULL, NULL, 0, 0, "stericsson,ab8500-gpadc"),
638 OF_MFD_CELL("ab8500-rtc",
639 NULL, NULL, 0, 0, "stericsson,ab8500-rtc"),
640 OF_MFD_CELL("ab8500-acc-det",
641 NULL, NULL, 0, 0, "stericsson,ab8500-acc-det"),
642 OF_MFD_CELL("ab8500-poweron-key",
643 NULL, NULL, 0, 0, "stericsson,ab8500-poweron-key"),
644 OF_MFD_CELL("ab8500-pwm",
645 NULL, NULL, 0, 1, "stericsson,ab8500-pwm"),
646 OF_MFD_CELL("ab8500-pwm",
647 NULL, NULL, 0, 2, "stericsson,ab8500-pwm"),
648 OF_MFD_CELL("ab8500-pwm",
649 NULL, NULL, 0, 3, "stericsson,ab8500-pwm"),
650 OF_MFD_CELL("ab8500-denc",
651 NULL, NULL, 0, 0, "stericsson,ab8500-denc"),
652 OF_MFD_CELL("pinctrl-ab8500",
653 NULL, NULL, 0, 0, "stericsson,ab8500-gpio"),
656 OF_MFD_CELL("ab8500-usb",
657 NULL, NULL, 0, 0, "stericsson,ab8500-usb"),
658 OF_MFD_CELL("ab8500-codec",
659 NULL, NULL, 0, 0, "stericsson,ab8500-codec"),
665 .name = "ab8500-debug",
669 .name = "ab8500-sysctrl",
672 .name = "ab8500-ext-regulator",
675 .name = "ab8500-regulator",
682 .name = "ab8500-gpadc",
683 .of_compatible = "stericsson,ab8500-gpadc",
686 .name = "ab8500-rtc",
689 .name = "ab8500-acc-det",
692 .name = "ab8500-poweron-key",
695 .name = "ab8500-pwm",
720 .name = "ab8500-debug",
721 .of_compatible = "stericsson,ab8500-debug",
725 .name = "ab8500-sysctrl",
726 .of_compatible = "stericsson,ab8500-sysctrl",
729 .name = "ab8500-regulator",
734 .of_compatible = "stericsson,ab8500-clk",
737 .name = "ab8500-gpadc",
738 .of_compatible = "stericsson,ab8500-gpadc",
741 .name = "ab8500-rtc",
742 .of_compatible = "stericsson,ab8500-rtc",
745 .name = "ab8500-acc-det",
746 .of_compatible = "stericsson,ab8500-acc-det",
749 .name = "ab8500-poweron-key",
750 .of_compatible = "stericsson,ab8500-poweron-key",
753 .name = "ab8500-pwm",
754 .of_compatible = "stericsson,ab8500-pwm",
762 .name = "ab8500-usb",
763 .of_compatible = "stericsson,ab8500-usb",
766 .name = "ab8500-codec",
767 .of_compatible = "stericsson,ab8500-codec",
777 .name = "ab8500-debug",
781 .name = "ab8500-sysctrl",
784 .name = "ab8500-ext-regulator",
787 .name = "ab8500-regulator",
794 .name = "ab8500-gpadc",
795 .of_compatible = "stericsson,ab8500-gpadc",
798 .name = "ab8500-acc-det",
801 .name = "ab8500-poweron-key",
804 .name = "ab8500-pwm",
826 .name = "ab8500-rtc",
827 .of_compatible = "stericsson,ab8500-rtc",
841 struct ab8500 *ab8500;
843 ab8500 = dev_get_drvdata(dev);
845 return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
849 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
864 struct ab8500 *ab8500;
866 ab8500 = dev_get_drvdata(dev);
867 ret = get_register_interruptible(ab8500, AB8500_RTC,
884 * ab8500 has turned on due to (TURN_ON_STATUS):
899 struct ab8500 *ab8500;
901 ab8500 = dev_get_drvdata(dev);
902 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
914 if (is_ab9540(ab8500)) {
928 struct ab8500 *ab8500;
930 ab8500 = dev_get_drvdata(dev);
931 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
941 struct ab8500 *ab8500;
945 ab8500 = dev_get_drvdata(dev);
947 ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
959 struct ab8500 *ab8500;
964 ab8500 = dev_get_drvdata(dev);
978 err = mask_and_set_register_interruptible(ab8500,
982 dev_info(ab8500->dev,
1053 struct ab8500 *ab8500;
1059 ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL);
1060 if (!ab8500)
1063 ab8500->dev = &pdev->dev;
1071 ab8500->irq = resource->start;
1073 ab8500->read = ab8500_prcmu_read;
1074 ab8500->write = ab8500_prcmu_write;
1075 ab8500->write_masked = ab8500_prcmu_write_masked;
1077 mutex_init(&ab8500->lock);
1078 mutex_init(&ab8500->irq_lock);
1079 atomic_set(&ab8500->transfer_ongoing, 0);
1081 platform_set_drvdata(pdev, ab8500);
1087 ab8500->version = version;
1089 ret = get_register_interruptible(ab8500, AB8500_MISC,
1096 ab8500->version = value;
1099 ret = get_register_interruptible(ab8500, AB8500_MISC,
1104 ab8500->chip_id = value;
1106 dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
1107 ab8500_version_str[ab8500->version],
1108 ab8500->chip_id >> 4,
1109 ab8500->chip_id & 0x0F);
1112 if (is_ab8540(ab8500)) {
1113 ab8500->mask_size = AB8540_NUM_IRQ_REGS;
1114 ab8500->irq_reg_offset = ab8540_irq_regoffset;
1115 ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM;
1117 else if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1118 ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1119 ab8500->irq_reg_offset = ab9540_irq_regoffset;
1120 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1122 ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1123 ab8500->irq_reg_offset = ab8500_irq_regoffset;
1124 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1126 ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
1128 if (!ab8500->mask)
1130 ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
1132 if (!ab8500->oldmask)
1136 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1147 ret = get_register_interruptible(ab8500, AB8500_RTC,
1151 dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value);
1164 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1168 dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value);
1181 if (is_ab9540(ab8500)) {
1182 ret = get_register_interruptible(ab8500, AB8500_CHARGER,
1192 for (i = 0; i < ab8500->mask_size; i++) {
1197 if (ab8500->irq_reg_offset[i] == 11 &&
1198 is_ab8500_1p1_or_earlier(ab8500))
1201 if (ab8500->irq_reg_offset[i] < 0)
1204 get_register_interruptible(ab8500, AB8500_INTERRUPT,
1205 AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
1207 set_register_interruptible(ab8500, AB8500_INTERRUPT,
1208 AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
1211 ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
1215 for (i = 0; i < ab8500->mask_size; i++)
1216 ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
1218 ret = ab8500_irq_init(ab8500, np);
1222 ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL,
1225 "ab8500", ab8500);
1229 if (is_ab9540(ab8500))
1230 ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
1232 0, ab8500->domain);
1233 else if (is_ab8540(ab8500)) {
1234 ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs,
1236 0, ab8500->domain);
1240 if (is_ab8540_1p2_or_earlier(ab8500))
1241 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs,
1243 0, ab8500->domain);
1245 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs,
1247 0, ab8500->domain);
1248 } else if (is_ab8505(ab8500))
1249 ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs,
1251 0, ab8500->domain);
1253 ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
1255 0, ab8500->domain);
1261 ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
1263 0, ab8500->domain);
1265 dev_err(ab8500->dev, "error adding bm devices\n");
1268 if (((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1269 ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500))
1270 ret = sysfs_create_group(&ab8500->dev->kobj,
1273 ret = sysfs_create_group(&ab8500->dev->kobj,
1276 if ((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1277 ab8500->chip_id >= AB8500_CUT2P0)
1278 ret = sysfs_create_group(&ab8500->dev->kobj,
1282 dev_err(ab8500->dev, "error creating sysfs entries\n");
1288 { "ab8500-core", AB8500_VERSION_AB8500 },
1297 .name = "ab8500-core",