Lines Matching refs:sc89890

319 static int sc89890_field_read(struct sc89890_device *sc89890,  in sc89890_field_read()  argument
325 ret = regmap_field_read(sc89890->rmap_fields[field_id], &val); in sc89890_field_read()
332 static int sc89890_field_write(struct sc89890_device *sc89890, in sc89890_field_write() argument
335 return regmap_field_write(sc89890->rmap_fields[field_id], val); in sc89890_field_write()
389 static int sc89890_get_chip_state(struct sc89890_device *sc89890, in sc89890_get_chip_state() argument
407 ret = sc89890_field_read(sc89890, state_fields[i].id); in sc89890_get_chip_state()
421 static irqreturn_t __sc89890_handle_irq(struct sc89890_device *sc89890) in __sc89890_handle_irq() argument
426 ret = sc89890_get_chip_state(sc89890, &new_state); in __sc89890_handle_irq()
430 if (!memcmp(&sc89890->state, &new_state, sizeof(new_state))) in __sc89890_handle_irq()
433 if (!new_state.online && sc89890->state.online) { /* power removed */ in __sc89890_handle_irq()
435 ret = sc89890_field_write(sc89890, F_CONV_START, 0); in __sc89890_handle_irq()
438 } else if (new_state.online && !sc89890->state.online) { /* power inserted */ in __sc89890_handle_irq()
441 ret = sc89890_field_write(sc89890, F_CONV_START, 1); in __sc89890_handle_irq()
446 sc89890->state = new_state; in __sc89890_handle_irq()
447 power_supply_changed(sc89890->charger); in __sc89890_handle_irq()
451 dev_err(sc89890->dev, "Error communicating with the chip: %pe\n", in __sc89890_handle_irq()
460 struct sc89890_device *sc89890 = power_supply_get_drvdata(psy); in sc89890_power_supply_get_property() local
465 mutex_lock(&sc89890->lock); in sc89890_power_supply_get_property()
467 __sc89890_handle_irq(sc89890); in sc89890_power_supply_get_property()
468 state = sc89890->state; in sc89890_power_supply_get_property()
471 sc89890_field_write(sc89890, F_CONV_START, 1); in sc89890_power_supply_get_property()
472 mutex_unlock(&sc89890->lock); in sc89890_power_supply_get_property()
475 regmap_field_read_poll_timeout(sc89890->rmap_fields[F_CONV_START], in sc89890_power_supply_get_property()
532 val->intval = sc89890_find_val(sc89890->init_data.ichg, TBL_ICHG); in sc89890_power_supply_get_property()
541 ret = sc89890_field_read(sc89890, F_BATV); /* read measured value */ in sc89890_power_supply_get_property()
550 val->intval = sc89890_find_val(sc89890->init_data.vreg, TBL_VREG); in sc89890_power_supply_get_property()
554 val->intval = sc89890_find_val(sc89890->init_data.iprechg, TBL_ITERM); in sc89890_power_supply_get_property()
558 val->intval = sc89890_find_val(sc89890->init_data.iterm, TBL_ITERM); in sc89890_power_supply_get_property()
562 ret = sc89890_field_read(sc89890, F_IILIM); in sc89890_power_supply_get_property()
572 ret = sc89890_field_read(sc89890, F_SYSV); /* read measured value */ in sc89890_power_supply_get_property()
581 ret = sc89890_field_read(sc89890, F_ICHGR); /* read measured value */ in sc89890_power_supply_get_property()
600 struct sc89890_device *sc89890 = power_supply_get_drvdata(psy); in sc89890_power_supply_set_property() local
606 ret = sc89890_field_write(sc89890, F_ICHG, index); in sc89890_power_supply_set_property()
608 dev_err(sc89890->dev, "set input voltage limit failed\n"); in sc89890_power_supply_set_property()
613 ret = sc89890_field_write(sc89890, F_IILIM, index); in sc89890_power_supply_set_property()
615 dev_err(sc89890->dev, "set input current limit failed\n"); in sc89890_power_supply_set_property()
627 struct sc89890_device *sc89890 = private; in sc89890_irq_handler_thread() local
630 mutex_lock(&sc89890->lock); in sc89890_irq_handler_thread()
631 ret = __sc89890_handle_irq(sc89890); in sc89890_irq_handler_thread()
632 mutex_unlock(&sc89890->lock); in sc89890_irq_handler_thread()
637 static int sc89890_chip_reset(struct sc89890_device *sc89890) in sc89890_chip_reset() argument
642 ret = sc89890_field_write(sc89890, F_REG_RST, 1); in sc89890_chip_reset()
647 ret = sc89890_field_read(sc89890, F_REG_RST); in sc89890_chip_reset()
660 static int sc89890_hw_init(struct sc89890_device *sc89890) in sc89890_hw_init() argument
669 {F_ICHG, sc89890->init_data.ichg}, in sc89890_hw_init()
670 {F_VREG, sc89890->init_data.vreg}, in sc89890_hw_init()
671 {F_ITERM, sc89890->init_data.iterm}, in sc89890_hw_init()
672 {F_IPRECHG, sc89890->init_data.iprechg}, in sc89890_hw_init()
673 {F_SYSVMIN, sc89890->init_data.sysvmin}, in sc89890_hw_init()
674 {F_BOOSTV, sc89890->init_data.boostv}, in sc89890_hw_init()
675 {F_BOOSTI, sc89890->init_data.boosti}, in sc89890_hw_init()
676 {F_BOOSTF, sc89890->init_data.boostf}, in sc89890_hw_init()
677 {F_EN_ILIM, sc89890->init_data.ilim_en}, in sc89890_hw_init()
678 {F_TREG, sc89890->init_data.treg}, in sc89890_hw_init()
679 {F_BATCMP, sc89890->init_data.rbatcomp}, in sc89890_hw_init()
680 {F_VCLAMP, sc89890->init_data.vclamp}, in sc89890_hw_init()
683 ret = sc89890_chip_reset(sc89890); in sc89890_hw_init()
685 dev_dbg(sc89890->dev, "Reset failed %d\n", ret); in sc89890_hw_init()
690 ret = sc89890_field_write(sc89890, F_WD, 0); in sc89890_hw_init()
692 dev_dbg(sc89890->dev, "Disabling watchdog failed %d\n", ret); in sc89890_hw_init()
698 ret = sc89890_field_write(sc89890, init_data[i].id, in sc89890_hw_init()
701 dev_dbg(sc89890->dev, "Writing init data failed %d\n", ret); in sc89890_hw_init()
707 ret = sc89890_field_write(sc89890, F_CONV_RATE, !!sc89890->state.online); in sc89890_hw_init()
709 dev_err(sc89890->dev, "Config ADC failed %d\n", ret); in sc89890_hw_init()
713 ret = sc89890_field_write(sc89890, F_AUTO_DPDM_EN, 0); in sc89890_hw_init()
715 dev_err(sc89890->dev, "Config F_AUTO_DPDM_EN failed %d\n", ret); in sc89890_hw_init()
719 ret = sc89890_field_write(sc89890, F_HVDCP_EN, 0); in sc89890_hw_init()
721 dev_err(sc89890->dev, "Config F_HVDCP_EN failed %d\n", ret); in sc89890_hw_init()
725 ret = sc89890_get_chip_state(sc89890, &sc89890->state); in sc89890_hw_init()
727 dev_err(sc89890->dev, "Get state failed %d\n", ret); in sc89890_hw_init()
765 static int sc89890_power_supply_init(struct sc89890_device *sc89890) in sc89890_power_supply_init() argument
767 struct power_supply_config psy_cfg = { .drv_data = sc89890, }; in sc89890_power_supply_init()
769 psy_cfg.of_node = sc89890->dev->of_node; in sc89890_power_supply_init()
773 sc89890->charger = devm_power_supply_register(sc89890->dev, in sc89890_power_supply_init()
777 if (PTR_ERR_OR_ZERO(sc89890->charger)) { in sc89890_power_supply_init()
778 dev_err(sc89890->dev, "failed to register power supply\n"); in sc89890_power_supply_init()
779 return PTR_ERR(sc89890->charger); in sc89890_power_supply_init()
785 static int sc89890_get_chip_version(struct sc89890_device *sc89890) in sc89890_get_chip_version() argument
789 id = sc89890_field_read(sc89890, F_PN); in sc89890_get_chip_version()
791 dev_err(sc89890->dev, "Cannot read chip ID.\n"); in sc89890_get_chip_version()
794 dev_err(sc89890->dev, "Unknown chip ID %d\n", id); in sc89890_get_chip_version()
880 struct sc89890_device *sc89890 = dev_get_drvdata(dev); in registers_show() local
888 sc89890_field_write(sc89890, F_CONV_START, 1); in registers_show()
890 regmap_field_read_poll_timeout(sc89890->rmap_fields[F_CONV_START], in registers_show()
894 ret = regmap_read(sc89890->rmap, addr, &val); in registers_show()
903 val = sc89890_find_val(sc89890->init_data.vreg, TBL_VREG); in registers_show()
906 val = sc89890_find_val(sc89890->init_data.iprechg, TBL_ITERM); in registers_show()
909 val = sc89890_find_val(sc89890->init_data.iterm, TBL_ITERM); in registers_show()
912 ret = sc89890_field_read(sc89890, F_BATV); /* read measured value */ in registers_show()
921 ret = sc89890_field_read(sc89890, F_IILIM); in registers_show()
928 ret = sc89890_field_read(sc89890, F_SYSV); /* read measured value */ in registers_show()
936 ret = sc89890_field_read(sc89890, F_ICHGR); /* read measured value */ in registers_show()
951 struct sc89890_device *sc89890 = dev_get_drvdata(dev); in registers_store() local
958 regmap_write(sc89890->rmap, (unsigned char)reg, val); in registers_store()
970 static int sc89890_fw_read_u32_props(struct sc89890_device *sc89890) in sc89890_fw_read_u32_props() argument
972 struct sc89890_init_data *init = &sc89890->init_data; in sc89890_fw_read_u32_props()
1003 ret = device_property_read_u32(sc89890->dev, in sc89890_fw_read_u32_props()
1010 dev_err(sc89890->dev, "Unable to read property %d %s\n", ret, in sc89890_fw_read_u32_props()
1023 static int sc89890_fw_probe(struct sc89890_device *sc89890) in sc89890_fw_probe() argument
1026 struct sc89890_init_data *init = &sc89890->init_data; in sc89890_fw_probe()
1028 ret = sc89890_fw_read_u32_props(sc89890); in sc89890_fw_probe()
1032 init->ilim_en = device_property_read_bool(sc89890->dev, "sc,use-ilim-pin"); in sc89890_fw_probe()
1033 init->boostf = device_property_read_bool(sc89890->dev, "sc,boost-low-freq"); in sc89890_fw_probe()
1042 struct sc89890_device *sc89890; in sc89890_probe() local
1046 sc89890 = devm_kzalloc(dev, sizeof(*sc89890), GFP_KERNEL); in sc89890_probe()
1047 if (!sc89890) in sc89890_probe()
1050 sc89890->client = client; in sc89890_probe()
1051 sc89890->dev = dev; in sc89890_probe()
1053 mutex_init(&sc89890->lock); in sc89890_probe()
1054 sc89890->rmap = devm_regmap_init_i2c(client, &sc89890_regmap_config); in sc89890_probe()
1055 if (IS_ERR(sc89890->rmap)) { in sc89890_probe()
1057 return PTR_ERR(sc89890->rmap); in sc89890_probe()
1063 sc89890->rmap_fields[i] = devm_regmap_field_alloc(dev, in sc89890_probe()
1064 sc89890->rmap, in sc89890_probe()
1066 if (IS_ERR(sc89890->rmap_fields[i])) { in sc89890_probe()
1068 return PTR_ERR(sc89890->rmap_fields[i]); in sc89890_probe()
1072 i2c_set_clientdata(client, sc89890); in sc89890_probe()
1074 ret = sc89890_get_chip_version(sc89890); in sc89890_probe()
1080 ret = sc89890_power_supply_init(sc89890); in sc89890_probe()
1087 ret = sc89890_fw_probe(sc89890); in sc89890_probe()
1096 ret = sc89890_hw_init(sc89890); in sc89890_probe()
1111 SC89890_IRQ, sc89890); in sc89890_probe()
1115 sc89890_register_otg_vbus_regulator(sc89890); in sc89890_probe()
1116 sc89890_create_device_node(sc89890->dev); in sc89890_probe()
1127 struct sc89890_device *sc89890 = i2c_get_clientdata(client); in sc89890_remove() local
1130 sc89890_chip_reset(sc89890); in sc89890_remove()
1138 struct sc89890_device *sc89890 = dev_get_drvdata(dev); in sc89890_suspend() local
1144 return sc89890_field_write(sc89890, F_CONV_RATE, 0); in sc89890_suspend()
1150 struct sc89890_device *sc89890 = dev_get_drvdata(dev); in sc89890_resume() local
1152 mutex_lock(&sc89890->lock); in sc89890_resume()
1154 ret = sc89890_get_chip_state(sc89890, &sc89890->state); in sc89890_resume()
1159 if (sc89890->state.online) { in sc89890_resume()
1160 ret = sc89890_field_write(sc89890, F_CONV_RATE, 1); in sc89890_resume()
1166 power_supply_changed(sc89890->charger); in sc89890_resume()
1169 mutex_unlock(&sc89890->lock); in sc89890_resume()