Lines Matching refs:ab8500

158 static int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)  in ab8500_prcmu_write()  argument
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() argument
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() argument
187 dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); in ab8500_prcmu_read()
195 struct ab8500 *ab8500; in ab8500_get_chip_id() local
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() argument
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()
230 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_set_register() local
232 atomic_inc(&ab8500->transfer_ongoing); in ab8500_set_register()
233 ret = set_register_interruptible(ab8500, bank, reg, value); 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() argument
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()
263 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_get_register() local
265 atomic_inc(&ab8500->transfer_ongoing); in ab8500_get_register()
266 ret = get_register_interruptible(ab8500, bank, reg, value); 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() argument
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()
314 struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); in ab8500_mask_and_set_register() local
316 atomic_inc(&ab8500->transfer_ongoing); in ab8500_mask_and_set_register()
317 ret = mask_and_set_register_interruptible(ab8500, bank, reg, in ab8500_mask_and_set_register()
319 atomic_dec(&ab8500->transfer_ongoing); in ab8500_mask_and_set_register()
337 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); in ab8500_irq_lock() local
339 mutex_lock(&ab8500->irq_lock); in ab8500_irq_lock()
340 atomic_inc(&ab8500->transfer_ongoing); in ab8500_irq_lock()
345 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); in ab8500_irq_sync_unlock() local
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()
360 if (ab8500->irq_reg_offset[i] == 11 && in ab8500_irq_sync_unlock()
361 is_ab8500_1p1_or_earlier(ab8500)) 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()
370 set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new); 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()
378 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); in ab8500_irq_mask() local
383 ab8500->mask[index] |= mask; in ab8500_irq_mask()
387 ab8500->mask[index + 2] |= mask; in ab8500_irq_mask()
389 ab8500->mask[index + 1] |= mask; in ab8500_irq_mask()
392 ab8500->mask[index] |= (mask << 1); in ab8500_irq_mask()
397 struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); in ab8500_irq_unmask() local
404 ab8500->mask[index] &= ~mask; in ab8500_irq_unmask()
409 ab8500->mask[index + 2] &= ~mask; in ab8500_irq_unmask()
412 ab8500->mask[index + 1] &= ~mask; 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()
452 static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500, in ab8500_handle_hierarchical_line() argument
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()
468 latch_val &= ~ab8500->mask[i]; 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() argument
506 status = get_register_interruptible(ab8500, in ab8500_handle_hierarchical_latch()
513 status = ab8500_handle_hierarchical_line(ab8500, in ab8500_handle_hierarchical_latch()
526 struct ab8500 *ab8500 = dev; in ab8500_hierarchical_irq() local
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()
536 status = get_register_interruptible(ab8500, AB8500_INTERRUPT, in ab8500_hierarchical_irq()
541 status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val); in ab8500_hierarchical_irq()
551 struct ab8500 *ab8500 = d->host_data; in ab8500_irq_map() local
553 if (!ab8500) in ab8500_irq_map()
556 irq_set_chip_data(virq, ab8500); in ab8500_irq_map()
570 static int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np) in ab8500_irq_init() argument
574 if (is_ab8540(ab8500)) in ab8500_irq_init()
576 else if (is_ab9540(ab8500)) in ab8500_irq_init()
578 else if (is_ab8505(ab8500)) in ab8500_irq_init()
584 ab8500->domain = irq_domain_add_simple(ab8500->dev->of_node, in ab8500_irq_init()
586 &ab8500_irq_ops, ab8500); 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()
596 int ab8500_suspend(struct ab8500 *ab8500) in ab8500_suspend() argument
598 if (atomic_read(&ab8500->transfer_ongoing)) in ab8500_suspend()
833 struct ab8500 *ab8500; in chip_id_show() local
835 ab8500 = dev_get_drvdata(dev); in chip_id_show()
837 return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); in chip_id_show()
856 struct ab8500 *ab8500; in switch_off_status_show() local
858 ab8500 = dev_get_drvdata(dev); in switch_off_status_show()
859 ret = get_register_interruptible(ab8500, AB8500_RTC, in switch_off_status_show()
891 struct ab8500 *ab8500; in turn_on_status_show() local
893 ab8500 = dev_get_drvdata(dev); in turn_on_status_show()
894 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, in turn_on_status_show()
906 if (is_ab9540(ab8500)) { in turn_on_status_show()
920 struct ab8500 *ab8500; in turn_on_status_2_show() local
922 ab8500 = dev_get_drvdata(dev); in turn_on_status_2_show()
923 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, in turn_on_status_2_show()
933 struct ab8500 *ab8500; in dbbrstn_show() local
937 ab8500 = dev_get_drvdata(dev); in dbbrstn_show()
939 ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2, in dbbrstn_show()
951 struct ab8500 *ab8500; in dbbrstn_store() local
956 ab8500 = dev_get_drvdata(dev); in dbbrstn_store()
970 err = mask_and_set_register_interruptible(ab8500, in dbbrstn_store()
974 dev_info(ab8500->dev, in dbbrstn_store()
1044 struct ab8500 *ab8500; in ab8500_probe() local
1050 ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL); in ab8500_probe()
1051 if (!ab8500) in ab8500_probe()
1054 ab8500->dev = &pdev->dev; in ab8500_probe()
1062 ab8500->irq = resource->start; in ab8500_probe()
1064 ab8500->read = ab8500_prcmu_read; in ab8500_probe()
1065 ab8500->write = ab8500_prcmu_write; in ab8500_probe()
1066 ab8500->write_masked = ab8500_prcmu_write_masked; in ab8500_probe()
1068 mutex_init(&ab8500->lock); in ab8500_probe()
1069 mutex_init(&ab8500->irq_lock); in ab8500_probe()
1070 atomic_set(&ab8500->transfer_ongoing, 0); in ab8500_probe()
1072 platform_set_drvdata(pdev, ab8500); in ab8500_probe()
1078 ab8500->version = version; in ab8500_probe()
1080 ret = get_register_interruptible(ab8500, AB8500_MISC, in ab8500_probe()
1087 ab8500->version = value; in ab8500_probe()
1090 ret = get_register_interruptible(ab8500, AB8500_MISC, in ab8500_probe()
1095 ab8500->chip_id = value; in ab8500_probe()
1097 dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", in ab8500_probe()
1098 ab8500_version_str[ab8500->version], in ab8500_probe()
1099 ab8500->chip_id >> 4, in ab8500_probe()
1100 ab8500->chip_id & 0x0F); in ab8500_probe()
1103 if (is_ab8540(ab8500)) { in ab8500_probe()
1104 ab8500->mask_size = AB8540_NUM_IRQ_REGS; in ab8500_probe()
1105 ab8500->irq_reg_offset = ab8540_irq_regoffset; in ab8500_probe()
1106 ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM; in ab8500_probe()
1108 else if (is_ab9540(ab8500) || is_ab8505(ab8500)) { in ab8500_probe()
1109 ab8500->mask_size = AB9540_NUM_IRQ_REGS; in ab8500_probe()
1110 ab8500->irq_reg_offset = ab9540_irq_regoffset; in ab8500_probe()
1111 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; in ab8500_probe()
1113 ab8500->mask_size = AB8500_NUM_IRQ_REGS; in ab8500_probe()
1114 ab8500->irq_reg_offset = ab8500_irq_regoffset; in ab8500_probe()
1115 ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; in ab8500_probe()
1117 ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, in ab8500_probe()
1119 if (!ab8500->mask) in ab8500_probe()
1121 ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, in ab8500_probe()
1123 if (!ab8500->oldmask) in ab8500_probe()
1138 ret = get_register_interruptible(ab8500, AB8500_RTC, in ab8500_probe()
1142 dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value); in ab8500_probe()
1155 ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, in ab8500_probe()
1159 dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value); in ab8500_probe()
1172 if (is_ab9540(ab8500)) { in ab8500_probe()
1173 ret = get_register_interruptible(ab8500, AB8500_CHARGER, in ab8500_probe()
1183 for (i = 0; i < ab8500->mask_size; i++) { in ab8500_probe()
1188 if (ab8500->irq_reg_offset[i] == 11 && in ab8500_probe()
1189 is_ab8500_1p1_or_earlier(ab8500)) in ab8500_probe()
1192 if (ab8500->irq_reg_offset[i] < 0) in ab8500_probe()
1195 get_register_interruptible(ab8500, AB8500_INTERRUPT, in ab8500_probe()
1196 AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], in ab8500_probe()
1198 set_register_interruptible(ab8500, AB8500_INTERRUPT, in ab8500_probe()
1199 AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); in ab8500_probe()
1202 ret = abx500_register_ops(ab8500->dev, &ab8500_ops); in ab8500_probe()
1206 for (i = 0; i < ab8500->mask_size; i++) in ab8500_probe()
1207 ab8500->mask[i] = ab8500->oldmask[i] = 0xff; in ab8500_probe()
1209 ret = ab8500_irq_init(ab8500, np); in ab8500_probe()
1213 ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL, in ab8500_probe()
1216 "ab8500", ab8500); in ab8500_probe()
1220 if (is_ab9540(ab8500)) in ab8500_probe()
1221 ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, in ab8500_probe()
1223 0, ab8500->domain); in ab8500_probe()
1224 else if (is_ab8540(ab8500)) { in ab8500_probe()
1225 ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs, in ab8500_probe()
1227 0, ab8500->domain); in ab8500_probe()
1231 if (is_ab8540_1p2_or_earlier(ab8500)) in ab8500_probe()
1232 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs, in ab8500_probe()
1234 0, ab8500->domain); in ab8500_probe()
1236 ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs, in ab8500_probe()
1238 0, ab8500->domain); in ab8500_probe()
1239 } else if (is_ab8505(ab8500)) in ab8500_probe()
1240 ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs, in ab8500_probe()
1242 0, ab8500->domain); in ab8500_probe()
1244 ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, in ab8500_probe()
1246 0, ab8500->domain); in ab8500_probe()
1251 ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, in ab8500_probe()
1253 0, ab8500->domain); in ab8500_probe()
1255 dev_err(ab8500->dev, "error adding bm devices\n"); in ab8500_probe()
1257 if (((is_ab8505(ab8500) || is_ab9540(ab8500)) && in ab8500_probe()
1258 ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500)) in ab8500_probe()
1259 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1262 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1265 if ((is_ab8505(ab8500) || is_ab9540(ab8500)) && in ab8500_probe()
1266 ab8500->chip_id >= AB8500_CUT2P0) in ab8500_probe()
1267 ret = sysfs_create_group(&ab8500->dev->kobj, in ab8500_probe()
1271 dev_err(ab8500->dev, "error creating sysfs entries\n"); in ab8500_probe()