static irqreturn_t lp8755_irq_handler(int irq, void *data) { int ret, icnt; unsigned int flag0, flag1; struct lp8755_chip *pchip = data; /* read flag0 register */ ret = lp8755_read(pchip, 0x0D, &flag0); if (ret < 0) goto err_i2c; /* clear flag register to pull up int. pin */ ret = lp8755_write(pchip, 0x0D, 0x00); if (ret < 0) goto err_i2c; /* sent power fault detection event to specific regulator */ for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) if ((flag0 & (0x4 << icnt)) && (pchip->irqmask & (0x04 << icnt)) && (pchip->rdev[icnt] != NULL)) regulator_notifier_call_chain(pchip->rdev[icnt], LP8755_EVENT_PWR_FAULT, NULL); /* read flag1 register */ ret = lp8755_read(pchip, 0x0E, &flag1); if (ret < 0) goto err_i2c; /* clear flag register to pull up int. pin */ ret = lp8755_write(pchip, 0x0E, 0x00); if (ret < 0) goto err_i2c; /* send OCP event to all regualtor devices */ if ((flag1 & 0x01) && (pchip->irqmask & 0x01)) for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) if (pchip->rdev[icnt] != NULL) regulator_notifier_call_chain(pchip->rdev[icnt], LP8755_EVENT_OCP, NULL); /* send OVP event to all regualtor devices */ if ((flag1 & 0x02) && (pchip->irqmask & 0x02)) for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) if (pchip->rdev[icnt] != NULL) regulator_notifier_call_chain(pchip->rdev[icnt], LP8755_EVENT_OVP, NULL); return IRQ_HANDLED; err_i2c: dev_err(pchip->dev, "i2c acceess error %s\n", __func__); return IRQ_NONE; }
static int lp8755_remove(struct i2c_client *client) { int icnt; struct lp8755_chip *pchip = i2c_get_clientdata(client); for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); return 0; }
static int lp8755_remove(struct i2c_client *client) { int icnt; struct lp8755_chip *pchip = i2c_get_clientdata(client); for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) regulator_unregister(pchip->rdev[icnt]); for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); if (pchip->irq != 0) free_irq(pchip->irq, pchip); return 0; }
static int lp8755_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret, icnt; struct lp8755_chip *pchip; struct lp8755_platform_data *pdata = client->dev.platform_data; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "i2c functionality check fail.\n"); return -EOPNOTSUPP; } pchip = devm_kzalloc(&client->dev, sizeof(struct lp8755_chip), GFP_KERNEL); if (!pchip) return -ENOMEM; pchip->dev = &client->dev; pchip->regmap = devm_regmap_init_i2c(client, &lp8755_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail to allocate regmap %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); if (pdata != NULL) { pchip->pdata = pdata; pchip->mphase = pdata->mphase; } else { pchip->pdata = devm_kzalloc(pchip->dev, sizeof(struct lp8755_platform_data), GFP_KERNEL); if (!pchip->pdata) return -ENOMEM; ret = lp8755_init_data(pchip); if (ret < 0) { dev_err(&client->dev, "fail to initialize chip\n"); return ret; } } ret = lp8755_regulator_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail to initialize regulators\n"); goto err_regulator; } pchip->irq = client->irq; ret = lp8755_int_config(pchip); if (ret < 0) { dev_err(&client->dev, "fail to irq config\n"); goto err_irq; } return ret; err_irq: for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) regulator_unregister(pchip->rdev[icnt]); err_regulator: /* output disable */ for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++) lp8755_write(pchip, icnt, 0x00); return ret; }