static int axp20x_rsb_probe(struct sunxi_rsb_device *rdev) { struct axp20x_dev *axp20x; int ret; axp20x = devm_kzalloc(&rdev->dev, sizeof(*axp20x), GFP_KERNEL); if (!axp20x) return -ENOMEM; axp20x->dev = &rdev->dev; axp20x->irq = rdev->irq; dev_set_drvdata(&rdev->dev, axp20x); ret = axp20x_match_device(axp20x); if (ret) return ret; axp20x->regmap = devm_regmap_init_sunxi_rsb(rdev, axp20x->regmap_cfg); if (IS_ERR(axp20x->regmap)) { ret = PTR_ERR(axp20x->regmap); dev_err(&rdev->dev, "regmap init failed: %d\n", ret); return ret; } return axp20x_device_probe(axp20x); }
static int axp20x_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct axp20x_dev *axp20x; int ret; axp20x = devm_kzalloc(&i2c->dev, sizeof(*axp20x), GFP_KERNEL); if (!axp20x) return -ENOMEM; axp20x->dev = &i2c->dev; axp20x->irq = i2c->irq; dev_set_drvdata(axp20x->dev, axp20x); ret = axp20x_match_device(axp20x); if (ret) return ret; axp20x->regmap = devm_regmap_init_i2c(i2c, axp20x->regmap_cfg); if (IS_ERR(axp20x->regmap)) { ret = PTR_ERR(axp20x->regmap); dev_err(&i2c->dev, "regmap init failed: %d\n", ret); return ret; } return axp20x_device_probe(axp20x); }
static int axp20x_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct axp20x_dev *axp20x; int ret; axp20x = devm_kzalloc(&i2c->dev, sizeof(*axp20x), GFP_KERNEL); if (!axp20x) return -ENOMEM; ret = axp20x_match_device(axp20x, &i2c->dev); if (ret) return ret; axp20x->i2c_client = i2c; axp20x->dev = &i2c->dev; dev_set_drvdata(axp20x->dev, axp20x); axp20x->regmap = devm_regmap_init_i2c(i2c, axp20x->regmap_cfg); if (IS_ERR(axp20x->regmap)) { ret = PTR_ERR(axp20x->regmap); dev_err(&i2c->dev, "regmap init failed: %d\n", ret); return ret; } ret = regmap_add_irq_chip(axp20x->regmap, i2c->irq, IRQF_ONESHOT | IRQF_SHARED, -1, axp20x->regmap_irq_chip, &axp20x->regmap_irqc); if (ret) { dev_err(&i2c->dev, "failed to add irq chip: %d\n", ret); return ret; } ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells, axp20x->nr_cells, NULL, 0, NULL); if (ret) { dev_err(&i2c->dev, "failed to add MFD devices: %d\n", ret); regmap_del_irq_chip(i2c->irq, axp20x->regmap_irqc); return ret; } if (!pm_power_off) { axp20x_pm_power_off = axp20x; pm_power_off = axp20x_power_off; } dev_info(&i2c->dev, "AXP20X driver loaded\n"); return 0; }