static int lm3554_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *subdev = i2c_get_clientdata(client); struct lm3554 *flash = to_lm3554(subdev); int rval; if (flash->power_count == 0) return 0; rval = __lm3554_s_power(flash, 1); dev_dbg(&client->dev, "Resume %s\n", rval < 0 ? "fail" : "ok"); return rval; }
static int lm3554_s_power(struct v4l2_subdev *sd, int power) { struct lm3554 *flash = to_lm3554(sd); int ret = 0; mutex_lock(&flash->power_lock); if (flash->power_count == !power) { ret = __lm3554_s_power(flash, !!power); if (ret < 0) goto done; } flash->power_count += power ? 1 : -1; WARN_ON(flash->power_count < 0); done: mutex_unlock(&flash->power_lock); return ret; }
static int __lm3554_s_power(struct lm3554 *flash, int power) { struct lm3554_platform_data *pdata = flash->pdata; int ret; /*initialize flash driver*/ gpio_set_value(pdata->gpio_reset, power); usleep_range(100, 100 + 1); if (power) { /* Setup default values. This makes sure that the chip * is in a known state. */ ret = lm3554_setup(flash); if (ret < 0) { __lm3554_s_power(flash, 0); return ret; } } return 0; }