static int lm3554_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err; struct lm3554 *flash; #ifndef CONFIG_GMIN_INTEL_MID if (client->dev.platform_data == NULL) { dev_err(&client->dev, "no platform data\n"); return -ENODEV; } #endif flash = kzalloc(sizeof(*flash), GFP_KERNEL); if (!flash) { dev_err(&client->dev, "out of memory\n"); return -ENOMEM; } flash->pdata = client->dev.platform_data; #ifdef CONFIG_GMIN_INTEL_MID if (!flash->pdata || ACPI_COMPANION(&client->dev)) flash->pdata = lm3554_platform_data_func(client); #endif v4l2_i2c_subdev_init(&flash->sd, client, &lm3554_ops); flash->sd.internal_ops = &lm3554_internal_ops; flash->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; flash->mode = ATOMISP_FLASH_MODE_OFF; flash->timeout = LM3554_MAX_TIMEOUT / LM3554_TIMEOUT_STEPSIZE - 1; err = media_entity_init(&flash->sd.entity, 0, NULL, 0); if (err) { dev_err(&client->dev, "error initialize a media entity.\n"); goto fail1; } flash->sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_FLASH; mutex_init(&flash->power_lock); setup_timer(&flash->flash_off_delay, lm3554_flash_off_delay, (unsigned long)client); err = lm3554_gpio_init(client); if (err) { dev_err(&client->dev, "gpio request/direction_output fail"); goto fail2; } #ifdef CONFIG_GMIN_INTEL_MID if (ACPI_HANDLE(&client->dev)) err = atomisp_register_i2c_module(&flash->sd, NULL, LED_FLASH); #endif return 0; fail2: media_entity_cleanup(&flash->sd.entity); fail1: v4l2_device_unregister_subdev(&flash->sd); kfree(flash); return err; }
static int ov2680_probe(struct i2c_client *client) { struct ov2680_device *dev; int ret; void *pdata; unsigned int i; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; mutex_init(&dev->input_lock); dev->fmt_idx = 0; v4l2_i2c_subdev_init(&(dev->sd), client, &ov2680_ops); pdata = gmin_camera_platform_data(&dev->sd, ATOMISP_INPUT_FORMAT_RAW_10, atomisp_bayer_order_bggr); if (!pdata) { ret = -EINVAL; goto out_free; } ret = ov2680_s_config(&dev->sd, client->irq, pdata); if (ret) goto out_free; ret = atomisp_register_i2c_module(&dev->sd, pdata, RAW_CAMERA); if (ret) goto out_free; dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; dev->pad.flags = MEDIA_PAD_FL_SOURCE; dev->format.code = MEDIA_BUS_FMT_SBGGR10_1X10; dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; ret = v4l2_ctrl_handler_init(&dev->ctrl_handler, ARRAY_SIZE(ov2680_controls)); if (ret) { ov2680_remove(client); return ret; } for (i = 0; i < ARRAY_SIZE(ov2680_controls); i++) v4l2_ctrl_new_custom(&dev->ctrl_handler, &ov2680_controls[i], NULL); if (dev->ctrl_handler.error) { ov2680_remove(client); return dev->ctrl_handler.error; } /* Use same lock for controls as for everything else. */ dev->ctrl_handler.lock = &dev->input_lock; dev->sd.ctrl_handler = &dev->ctrl_handler; ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad); if (ret) { ov2680_remove(client); dev_dbg(&client->dev, "+++ remove ov2680 \n"); } return ret; out_free: dev_dbg(&client->dev, "+++ out free \n"); v4l2_device_unregister_subdev(&dev->sd); kfree(dev); return ret; }
static int lm3554_probe(struct i2c_client *client) { int err = 0; struct lm3554 *flash; unsigned int i; int ret; flash = kzalloc(sizeof(*flash), GFP_KERNEL); if (!flash) return -ENOMEM; flash->pdata = lm3554_platform_data_func(client); v4l2_i2c_subdev_init(&flash->sd, client, &lm3554_ops); flash->sd.internal_ops = &lm3554_internal_ops; flash->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; flash->mode = ATOMISP_FLASH_MODE_OFF; flash->timeout = LM3554_MAX_TIMEOUT / LM3554_TIMEOUT_STEPSIZE - 1; ret = v4l2_ctrl_handler_init(&flash->ctrl_handler, ARRAY_SIZE(lm3554_controls)); if (ret) { dev_err(&client->dev, "error initialize a ctrl_handler.\n"); goto fail2; } for (i = 0; i < ARRAY_SIZE(lm3554_controls); i++) v4l2_ctrl_new_custom(&flash->ctrl_handler, &lm3554_controls[i], NULL); if (flash->ctrl_handler.error) { dev_err(&client->dev, "ctrl_handler error.\n"); goto fail2; } flash->sd.ctrl_handler = &flash->ctrl_handler; err = media_entity_pads_init(&flash->sd.entity, 0, NULL); if (err) { dev_err(&client->dev, "error initialize a media entity.\n"); goto fail1; } flash->sd.entity.function = MEDIA_ENT_F_FLASH; mutex_init(&flash->power_lock); timer_setup(&flash->flash_off_delay, lm3554_flash_off_delay, 0); err = lm3554_gpio_init(client); if (err) { dev_err(&client->dev, "gpio request/direction_output fail"); goto fail2; } return atomisp_register_i2c_module(&flash->sd, NULL, LED_FLASH); fail2: media_entity_cleanup(&flash->sd.entity); v4l2_ctrl_handler_free(&flash->ctrl_handler); fail1: v4l2_device_unregister_subdev(&flash->sd); kfree(flash); return err; }