if (enable)
ret = mrfld_extcon_set(data, BCOVE_CHGRCTRL0, mask); else
ret = mrfld_extcon_clear(data, BCOVE_CHGRCTRL0, mask); if (ret)
dev_err(dev, "can't set SW control: %d\n", ret); return ret;
}
/* * It seems SCU firmware clears the content of BCOVE_CHGRIRQ1 * and makes it useless for OS. Instead we compare a previously * stored status to the current one, provided by BCOVE_SCHGRIRQ1.
*/
ret = regmap_read(regmap, BCOVE_SCHGRIRQ1, &status); if (ret) return ret;
change = status ^ data->status; if (!change) return -ENODATA;
if (change & BCOVE_CHGRIRQ_USBIDDET) {
ret = mrfld_extcon_role_detect(data); if (ret) return ret;
}
irq = platform_get_irq(pdev, 0); if (irq < 0) return irq;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM;
data->dev = dev;
data->regmap = regmap;
data->edev = devm_extcon_dev_allocate(dev, mrfld_extcon_cable); if (IS_ERR(data->edev)) return PTR_ERR(data->edev);
ret = devm_extcon_dev_register(dev, data->edev); if (ret < 0) return dev_err_probe(dev, ret, "can't register extcon device\n");
ret = devm_request_threaded_irq(dev, irq, NULL, mrfld_extcon_interrupt,
IRQF_ONESHOT | IRQF_SHARED, pdev->name,
data); if (ret) return dev_err_probe(dev, ret, "can't register IRQ handler\n");
ret = regmap_read(regmap, BCOVE_ID, &id); if (ret) return dev_err_probe(dev, ret, "can't read PMIC ID\n");
data->id = id;
ret = mrfld_extcon_sw_control(data, true); if (ret) return ret;
/* Get initial state */
mrfld_extcon_role_detect(data);
/* * Cached status value is used for cable detection, see comments * in mrfld_extcon_cable_detect(), we need to sync cached value * with a real state of the hardware.
*/
regmap_read(regmap, BCOVE_SCHGRIRQ1, &status);
data->status = status;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.