/* * i2c_driver function */ static int aksensor_probe(struct i2c_client *client, const struct i2c_device_id *did) { struct aksensor_priv *priv; struct soc_camera_link *icl = soc_camera_i2c_to_link(client); struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); int i, ret; SENDBG("entry %s\n", __func__); if (!icl || !icl->priv) { dev_err(&client->dev, "AKSENSOR: missing platform data!\n"); return -EINVAL; } if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { dev_err(&adapter->dev, "I2C-Adapter doesn't support " "I2C_FUNC_SMBUS_BYTE_DATA\n"); return -EIO; } priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { return -ENOMEM; } priv->info = icl->priv; v4l2_i2c_subdev_init(&priv->subdev, client, &aksensor_subdev_ops); ret = aksensor_video_probe(client); if (ret) { kfree(priv); return ret; } v4l2_ctrl_handler_init(&priv->hdl, cur_sensor_info->nr_ctrls); for (i = 0; i < cur_sensor_info->nr_ctrls; i++) v4l2_ctrl_new_custom(&priv->hdl, &cur_sensor_info->ctrls[i], NULL); priv->subdev.ctrl_handler = &priv->hdl; if (priv->hdl.error) { int err = priv->hdl.error; v4l2_ctrl_handler_free(&priv->hdl); kfree(priv); return err; } // init sensor resolution, default VGA for (i = 0; i < cur_sensor_info->num_resolution; i++) if (!strcmp(cur_sensor_info->resolution[i].name, "VGA")) { priv->win.width = cur_sensor_info->resolution[i].width; priv->win.height = cur_sensor_info->resolution[i].height; } sensor_dbg("%s: priv->win.width=%d priv->win.height=%d\n", __func__, priv->win.width, priv->win.height); return ret; }
/* Request bus settings on camera side */ static int ov9640_g_mbus_config(struct v4l2_subdev *sd, struct v4l2_mbus_config *cfg) { struct i2c_client *client = v4l2_get_subdevdata(sd); struct soc_camera_link *icl = soc_camera_i2c_to_link(client); cfg->flags = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER | V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_DATA_ACTIVE_HIGH; cfg->type = V4L2_MBUS_PARALLEL; cfg->flags = soc_camera_apply_board_flags(icl, cfg); return 0; }
/* * i2c_driver function */ static int ov9640_probe(struct i2c_client *client, const struct i2c_device_id *did) { struct ov9640_priv *priv; struct soc_camera_link *icl = soc_camera_i2c_to_link(client); int ret; if (!icl) { dev_err(&client->dev, "Missing platform_data for driver\n"); return -EINVAL; } priv = kzalloc(sizeof(struct ov9640_priv), GFP_KERNEL); if (!priv) { dev_err(&client->dev, "Failed to allocate memory for private data!\n"); return -ENOMEM; } v4l2_i2c_subdev_init(&priv->subdev, client, &ov9640_subdev_ops); v4l2_ctrl_handler_init(&priv->hdl, 2); v4l2_ctrl_new_std(&priv->hdl, &ov9640_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0); v4l2_ctrl_new_std(&priv->hdl, &ov9640_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0); priv->subdev.ctrl_handler = &priv->hdl; if (priv->hdl.error) { int err = priv->hdl.error; kfree(priv); return err; } ret = ov9640_video_probe(client); if (ret) { v4l2_ctrl_handler_free(&priv->hdl); kfree(priv); } return ret; }