static int as3645a_remove(struct i2c_client *client) { struct v4l2_subdev *subdev = i2c_get_clientdata(client); struct as3645a *flash = to_as3645a(subdev); v4l2_device_unregister_subdev(subdev); v4l2_ctrl_handler_free(&flash->ctrls); media_entity_cleanup(&flash->subdev.entity); mutex_destroy(&flash->power_lock); return 0; }
static int as3645a_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *subdev = i2c_get_clientdata(client); struct as3645a *flash = to_as3645a(subdev); int rval; if (flash->power_count == 0) return 0; rval = __as3645a_set_power(flash, 1); dev_dbg(&client->dev, "Resume %s\n", rval < 0 ? "fail" : "ok"); return rval; }
static int as3645a_set_power(struct v4l2_subdev *sd, int on) { struct as3645a *flash = to_as3645a(sd); int ret = 0; mutex_lock(&flash->power_lock); if (flash->power_count == !on) { ret = __as3645a_set_power(flash, !!on); if (ret < 0) goto done; } flash->power_count += on ? 1 : -1; WARN_ON(flash->power_count < 0); done: mutex_unlock(&flash->power_lock); return ret; }
static int as3645a_registered(struct v4l2_subdev *sd) { struct as3645a *flash = to_as3645a(sd); struct i2c_client *client = v4l2_get_subdevdata(sd); int rval, man, model, rfu, version; const char *vendor; /* Power up the flash driver and read manufacturer ID, model ID, RFU * and version. */ rval = as3645a_set_power(&flash->subdev, 1); if (rval < 0) return rval; rval = as3645a_read(flash, AS_DESIGN_INFO_REG); if (rval < 0) goto power_off; man = AS_DESIGN_INFO_FACTORY(rval); model = AS_DESIGN_INFO_MODEL(rval); rval = as3645a_read(flash, AS_VERSION_CONTROL_REG); if (rval < 0) goto power_off; rfu = AS_VERSION_CONTROL_RFU(rval); version = AS_VERSION_CONTROL_VERSION(rval); /* Verify the chip model and version. */ if (model != 0x01 || rfu != 0x00) { dev_err(&client->dev, "AS3645A not detected " "(model %d rfu %d)\n", model, rfu); rval = -ENODEV; goto power_off; } switch (man) { case 1: vendor = "AMS, Austria Micro Systems"; break; case 2: vendor = "ADI, Analog Devices Inc."; break; case 3: vendor = "NSC, National Semiconductor"; break; case 4: vendor = "NXP"; break; case 5: vendor = "TI, Texas Instrument"; break; default: vendor = "Unknown"; } dev_info(&client->dev, "Chip vendor: %s (%d) Version: %d\n", vendor, man, version); rval = as3645a_write(flash, AS_PASSWORD_REG, AS_PASSWORD_UNLOCK_VALUE); if (rval < 0) goto power_off; rval = as3645a_write(flash, AS_BOOST_REG, AS_BOOST_CURRENT_DISABLE); if (rval < 0) goto power_off; /* Setup default values. This makes sure that the chip is in a known * state, in case the power rail can't be controlled. */ rval = as3645a_setup(flash); power_off: as3645a_set_power(&flash->subdev, 0); return rval; }