static int max14577_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct max14577_dev *max14577; struct max14577_platform_data *pdata = i2c->dev.platform_data; u8 reg_data; int ret = 0; max14577 = kzalloc(sizeof(struct max14577_dev), GFP_KERNEL); if (max14577 == NULL) return -ENOMEM; i2c_set_clientdata(i2c, max14577); max14577->dev = &i2c->dev; max14577->i2c = i2c; max14577->irq = i2c->irq; if (pdata) { max14577->pdata = pdata; } else { ret = -EIO; goto err; } pdata->set_cdetctrl1_reg = max14577_set_cdetctrl1_reg; pdata->get_cdetctrl1_reg = max14577_get_cdetctrl1_reg; pdata->set_control2_reg = max14577_set_control2_reg; pdata->get_control2_reg = max14577_get_control2_reg; mutex_init(&max14577->i2c_lock); ret = max14577_read_reg(i2c, MAX14577_REG_DEVICEID, ®_data); if (ret < 0) { pr_err("%s:%s device not found on this channel(%d)\n", MFD_DEV_NAME, __func__, ret); goto err; } else { /* print Device Id */ max14577->vendor_id = (reg_data & 0x7); max14577->device_id = ((reg_data & 0xF8) >> 0x3); pr_info("%s:%s device found: vendor=0x%x, device_id=0x%x\n", MFD_DEV_NAME, __func__, max14577->vendor_id, max14577->device_id); } ret = max14577_irq_init(max14577); if (ret < 0) goto err; ret = mfd_add_devices(max14577->dev, -1, max14577_devs, ARRAY_SIZE(max14577_devs), NULL, 0); if (ret < 0) goto err_mfd; device_init_wakeup(max14577->dev, pdata->wakeup); return ret; err_mfd: mfd_remove_devices(max14577->dev); err: kfree(max14577); return ret; }
static int max14577_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct max14577_dev *max14577; struct max14577_platform_data *pdata = NULL; u8 reg_data; int ret = 0; max14577 = kzalloc(sizeof(struct max14577_dev), GFP_KERNEL); if (max14577 == NULL) return -ENOMEM; if (i2c->dev.of_node) { pdata = devm_kzalloc(&i2c->dev, sizeof(struct max14577_platform_data), GFP_KERNEL); if (!pdata) { dev_err(&i2c->dev, "Failed to allocate memory\n"); ret = -ENOMEM; goto err; } ret = of_max14577_dt(&i2c->dev, pdata); if (ret < 0) { dev_err(&i2c->dev, "Failed to get device of_node\n"); kfree(pdata); goto err; } /*pdata update to other modules*/ i2c->dev.platform_data = pdata; } else pdata = i2c->dev.platform_data; i2c_set_clientdata(i2c, max14577); max14577->dev = &i2c->dev; max14577->i2c = i2c; max14577->irq = i2c->irq; if (pdata) { max14577->pdata = pdata; } else { ret = -EIO; goto err; } pdata->set_cdetctrl1_reg = max14577_set_cdetctrl1_reg; pdata->get_cdetctrl1_reg = max14577_get_cdetctrl1_reg; pdata->set_control2_reg = max14577_set_control2_reg; pdata->get_control2_reg = max14577_get_control2_reg; #ifdef CONFIG_REGULATOR_MAX77836 pdata->regulators = max77836_reglator_pdata; pdata->num_regulators = MAX77836_LDO_MAX; #endif #ifdef CONFIG_CHARGER_MAX14577 pdata->charger_data = &sec_battery_pdata; #endif mutex_init(&max14577->i2c_lock); ret = max14577_read_reg(i2c, MAX14577_REG_DEVICEID, ®_data); if (ret < 0) { pr_err("%s:%s device not found on this channel(%d)\n", MFD_DEV_NAME, __func__, ret); goto err; } else { /* print Device Id */ max14577->vendor_id = (reg_data & 0x7); max14577->device_id = ((reg_data & 0xF8) >> 0x3); pr_info("%s:%s device found: vendor=0x%x, device_id=0x%x\n", MFD_DEV_NAME, __func__, max14577->vendor_id, max14577->device_id); } max14577->i2c_pmic = i2c_new_dummy(i2c->adapter, MAX77836_PMIC_ADDR); i2c_set_clientdata(max14577->i2c_pmic, max14577); ret = max14577_irq_init(max14577); if (ret < 0) goto err_irq_init; ret = mfd_add_devices(max14577->dev, -1, max14577_devs, ARRAY_SIZE(max14577_devs), NULL, 0); if (ret < 0) goto err_mfd; device_init_wakeup(max14577->dev, pdata->wakeup); return ret; err_mfd: mfd_remove_devices(max14577->dev); err_irq_init: if (max14577->i2c_pmic) i2c_unregister_device(max14577->i2c_pmic); err: kfree(max14577); return ret; }