bcm590xx
bcm590xx->dev = &i2c_pri->dev;
bcm590xx->i2c_pri = i2c_pri;
bcm590xx->pmu_id = (uintptr_t) of_device_get_match_data(bcm590xx->dev);
bcm590xx->regmap_pri = devm_regmap_init_i2c(i2c_pri,
if (IS_ERR(bcm590xx->regmap_pri)) {
ret = PTR_ERR(bcm590xx->regmap_pri);
bcm590xx->i2c_sec = i2c_new_dummy_device(i2c_pri->adapter,
if (IS_ERR(bcm590xx->i2c_sec)) {
return PTR_ERR(bcm590xx->i2c_sec);
i2c_set_clientdata(bcm590xx->i2c_sec, bcm590xx);
bcm590xx->regmap_sec = devm_regmap_init_i2c(bcm590xx->i2c_sec,
if (IS_ERR(bcm590xx->regmap_sec)) {
ret = PTR_ERR(bcm590xx->regmap_sec);
dev_err(&bcm590xx->i2c_sec->dev,
ret = bcm590xx_parse_version(bcm590xx);
i2c_unregister_device(bcm590xx->i2c_sec);
static int bcm590xx_parse_version(struct bcm590xx *bcm590xx)
ret = regmap_read(bcm590xx->regmap_pri, BCM590XX_REG_PMUID, &id);
dev_err(bcm590xx->dev, "failed to read PMU ID: %d\n", ret);
if (id != bcm590xx->pmu_id) {
dev_err(bcm590xx->dev, "Incorrect ID for %s: expected %x, got %x.\n",
bcm590xx_names[bcm590xx->pmu_id], bcm590xx->pmu_id, id);
ret = regmap_read(bcm590xx->regmap_pri, BCM590XX_REG_PMUREV, &rev);
dev_err(bcm590xx->dev, "failed to read PMU revision: %d\n", ret);
bcm590xx->rev_digital = (rev & BCM590XX_PMUREV_DIG_MASK) >> BCM590XX_PMUREV_DIG_SHIFT;
bcm590xx->rev_analog = (rev & BCM590XX_PMUREV_ANA_MASK) >> BCM590XX_PMUREV_ANA_SHIFT;
dev_dbg(bcm590xx->dev, "PMU ID 0x%x (%s), revision: digital %d, analog %d",
id, bcm590xx_names[id], bcm590xx->rev_digital, bcm590xx->rev_analog);
struct bcm590xx *bcm590xx;
bcm590xx = devm_kzalloc(&i2c_pri->dev, sizeof(*bcm590xx), GFP_KERNEL);
if (!bcm590xx)
i2c_set_clientdata(i2c_pri, bcm590xx);
struct bcm590xx *bcm590xx = dev_get_drvdata(pdev->dev.parent);
pmu->mfd = bcm590xx;
dev_err(bcm590xx->dev,
config.dev = bcm590xx->dev;
config.regmap = bcm590xx->regmap_pri;
config.regmap = bcm590xx->regmap_sec;
dev_err(bcm590xx->dev,
return dev_err_probe(bcm590xx->dev, PTR_ERR(rdev),
struct bcm590xx *mfd;