static unsigned long adv7180_query_bus_param(struct soc_camera_device *icd) { struct soc_camera_link *icl = to_soc_camera_link(icd); unsigned long flags = SENSOR_BUS_PARAM; return soc_camera_apply_sensor_flags(icl, flags); }
/* Request bus settings on camera side */ static unsigned long gc0329_query_bus_param(struct soc_camera_device *icd) { struct soc_camera_link *icl = to_soc_camera_link(icd); unsigned long flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_MASTER | SOCAM_VSYNC_ACTIVE_LOW | SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8; return soc_camera_apply_sensor_flags(icl, flags); }
static int mt9v022_set_bus_param(struct soc_camera_device *icd, unsigned long flags) { struct i2c_client *client = to_i2c_client(icd->control); struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd); struct soc_camera_link *icl = client->dev.platform_data; unsigned int width_flag = flags & SOCAM_DATAWIDTH_MASK; int ret; u16 pixclk = 0; /* Only one width bit may be set */ if (!is_power_of_2(width_flag)) return -EINVAL; if (icl->set_bus_param) { ret = icl->set_bus_param(icl, width_flag); if (ret) return ret; } else { /* * Without board specific bus width settings we only support the * sensors native bus width */ if (width_flag != SOCAM_DATAWIDTH_10) return -EINVAL; } flags = soc_camera_apply_sensor_flags(icl, flags); if (flags & SOCAM_PCLK_SAMPLE_RISING) pixclk |= 0x10; if (!(flags & SOCAM_HSYNC_ACTIVE_HIGH)) pixclk |= 0x1; if (!(flags & SOCAM_VSYNC_ACTIVE_HIGH)) pixclk |= 0x2; ret = reg_write(client, MT9V022_PIXCLK_FV_LV, pixclk); if (ret < 0) return ret; if (!(flags & SOCAM_MASTER)) mt9v022->chip_control &= ~0x8; ret = reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control); if (ret < 0) return ret; dev_dbg(&icd->dev, "Calculated pixclk 0x%x, chip control 0x%x\n", pixclk, mt9v022->chip_control); return 0; }