On Wed, 11 Mar 2009, Sascha Hauer wrote: > This patch removes the phytec specific setting of the bus width > and switches to the more generic query_bus_param/set_bus_param > hooks > > Signed-off-by: Sascha Hauer <s.ha...@pengutronix.de> > --- > drivers/media/video/Kconfig | 7 --- > drivers/media/video/mt9v022.c | 97 > +++++------------------------------------ > 2 files changed, 11 insertions(+), 93 deletions(-) > > diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig > index 5fc1531..071d66f 100644 > --- a/drivers/media/video/Kconfig > +++ b/drivers/media/video/Kconfig > @@ -747,13 +747,6 @@ config SOC_CAMERA_MT9V022 > help > This driver supports MT9V022 cameras from Micron > > -config MT9V022_PCA9536_SWITCH > - bool "pca9536 datawidth switch for mt9v022" > - depends on SOC_CAMERA_MT9V022 && GENERIC_GPIO > - help > - Select this if your MT9V022 camera uses a PCA9536 I2C GPIO > - extender to switch between 8 and 10 bit datawidth modes > - > config SOC_CAMERA_TW9910 > tristate "tw9910 support" > depends on SOC_CAMERA && I2C > diff --git a/drivers/media/video/mt9v022.c b/drivers/media/video/mt9v022.c > index b04c8cb..26f97eb 100644 > --- a/drivers/media/video/mt9v022.c > +++ b/drivers/media/video/mt9v022.c > @@ -209,66 +209,6 @@ static int mt9v022_stop_capture(struct soc_camera_device > *icd) > return 0; > } > > -static int bus_switch_request(struct mt9v022 *mt9v022, struct > soc_camera_link *icl) > -{ > -#ifdef CONFIG_MT9V022_PCA9536_SWITCH > - int ret; > - unsigned int gpio = icl->gpio; > - > - if (gpio_is_valid(gpio)) { > - /* We have a data bus switch. */ > - ret = gpio_request(gpio, "mt9v022"); > - if (ret < 0) { > - dev_err(&mt9v022->client->dev, "Cannot get GPIO %u\n", > gpio); > - return ret; > - } > - > - ret = gpio_direction_output(gpio, 0); > - if (ret < 0) { > - dev_err(&mt9v022->client->dev, > - "Cannot set GPIO %u to output\n", gpio); > - gpio_free(gpio); > - return ret; > - } > - } > - > - mt9v022->switch_gpio = gpio; > -#else > - mt9v022->switch_gpio = -EINVAL; > -#endif > - return 0; > -} > - > -static void bus_switch_release(struct mt9v022 *mt9v022) > -{ > -#ifdef CONFIG_MT9V022_PCA9536_SWITCH > - if (gpio_is_valid(mt9v022->switch_gpio)) > - gpio_free(mt9v022->switch_gpio); > -#endif > -} > - > -static int bus_switch_act(struct mt9v022 *mt9v022, int go8bit) > -{ > -#ifdef CONFIG_MT9V022_PCA9536_SWITCH > - if (!gpio_is_valid(mt9v022->switch_gpio)) > - return -ENODEV; > - > - gpio_set_value_cansleep(mt9v022->switch_gpio, go8bit); > - return 0; > -#else > - return -ENODEV; > -#endif > -} > - > -static int bus_switch_possible(struct mt9v022 *mt9v022) > -{ > -#ifdef CONFIG_MT9V022_PCA9536_SWITCH > - return gpio_is_valid(mt9v022->switch_gpio); > -#else > - return 0; > -#endif > -} > - > static int mt9v022_set_bus_param(struct soc_camera_device *icd, > unsigned long flags) > { > @@ -282,19 +222,10 @@ static int mt9v022_set_bus_param(struct > soc_camera_device *icd, > if (!is_power_of_2(width_flag)) > return -EINVAL; > > - if ((mt9v022->datawidth != 10 && (width_flag == SOCAM_DATAWIDTH_10)) || > - (mt9v022->datawidth != 9 && (width_flag == SOCAM_DATAWIDTH_9)) || > - (mt9v022->datawidth != 8 && (width_flag == SOCAM_DATAWIDTH_8))) { > - /* Well, we actually only can do 10 or 8 bits... */ > - if (width_flag == SOCAM_DATAWIDTH_9) > - return -EINVAL; > - > - ret = bus_switch_act(mt9v022, > - width_flag == SOCAM_DATAWIDTH_8); > - if (ret < 0) > + if (icl->set_bus_param) { > + ret = icl->set_bus_param(&mt9v022->client->dev, width_flag); > + if (ret) > return ret; > - > - mt9v022->datawidth = width_flag == SOCAM_DATAWIDTH_8 ? 8 : 10; > } > > flags = soc_camera_apply_sensor_flags(icl, flags); > @@ -328,10 +259,14 @@ static int mt9v022_set_bus_param(struct > soc_camera_device *icd, > static unsigned long mt9v022_query_bus_param(struct soc_camera_device *icd) > { > struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd); > - unsigned int width_flag = SOCAM_DATAWIDTH_10; > + struct soc_camera_link *icl = mt9v022->client->dev.platform_data; > + unsigned int width_flag; > > - if (bus_switch_possible(mt9v022)) > - width_flag |= SOCAM_DATAWIDTH_8; > + if (icl->query_bus_param) > + width_flag = icl->query_bus_param(&mt9v022->client->dev) & > + SOCAM_DATAWIDTH_MASK; > + else > + width_flag = SOCAM_DATAWIDTH_10; > > return SOCAM_PCLK_SAMPLE_RISING | SOCAM_PCLK_SAMPLE_FALLING | > SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_HSYNC_ACTIVE_LOW | > @@ -729,6 +664,7 @@ static int mt9v022_video_probe(struct soc_camera_device > *icd) > /* Set monochrome or colour sensor type */ > if (sensor_type && (!strcmp("colour", sensor_type) || > !strcmp("color", sensor_type))) { > + if (1) {
Already pointed out by Hans. > ret = reg_write(icd, MT9V022_PIXEL_OPERATION_MODE, 4 | 0x11); > mt9v022->model = V4L2_IDENT_MT9V022IX7ATC; > icd->formats = mt9v022_colour_formats; > @@ -812,14 +748,6 @@ static int mt9v022_probe(struct i2c_client *client, > icd->height_max = 480; > icd->y_skip_top = 1; > icd->iface = icl->bus_id; > - /* Default datawidth - this is the only width this camera (normally) > - * supports. It is only with extra logic that it can support > - * other widths. Therefore it seems to be a sensible default. */ > - mt9v022->datawidth = 10; > - > - ret = bus_switch_request(mt9v022, icl); > - if (ret) > - goto eswinit; > > ret = soc_camera_device_register(icd); > if (ret) As you remove ->gpio from struct soc_camera_link, you'll have to change if (gpio_is_valid(icl->gpio)) tests here too. Maybe make the format-selection in mt9v022 similar to mt9m001, even though I am not quite sure, that hard-coding the knowledge of the internal layout of the two format arrays (mt9m001_colour_formats and mt9m001_monochrome_formats) was a very good idea, but, well, I had already some assumptions about that in the code. But at least, maybe it is better to keep mt9m001 and mt9v022 look similar. > @@ -828,8 +756,6 @@ static int mt9v022_probe(struct i2c_client *client, > return 0; > > eisdr: > - bus_switch_release(mt9v022); > -eswinit: > kfree(mt9v022); > return ret; > } > @@ -839,7 +765,6 @@ static int mt9v022_remove(struct i2c_client *client) > struct mt9v022 *mt9v022 = i2c_get_clientdata(client); > > soc_camera_device_unregister(&mt9v022->icd); > - bus_switch_release(mt9v022); > kfree(mt9v022); > > return 0; > -- > 1.5.6.5 > Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html