Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb

* 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb:
  V4L/DVB (5691): Ov7670: reset clkrc in rgb565 mode
  V4L/DVB (5690): Cafe_ccic: Properly power down the sensor
  V4L/DVB (5680): Tuner-simple.c fix suport for SECAM with FI1216MF
  V4L/DVB (5630): Dvb-core: Handle failures to create devices
  V4L/DVB (5639a): Fix dst usage count
  V4L/DVB (5670): Adding new fields to v4l2_pix_format broke the ABI, reverted that change
  V4L/DVB (5640): Fix: em28xx shouldn't be selecting VIDEO_BUF
  V4L/DVB (5639): Fix Kconfig dependencies for ivtv
This commit is contained in:
Linus Torvalds 2007-05-22 16:47:51 -07:00
commit 7992018d97
11 changed files with 63 additions and 37 deletions

View file

@ -1721,9 +1721,6 @@ static void dst_release(struct dvb_frontend *fe)
symbol_put(dst_ca_attach); symbol_put(dst_ca_attach);
#endif #endif
} }
#ifdef CONFIG_DVB_CORE_ATTACH
symbol_put(dst_attach);
#endif
kfree(state); kfree(state);
} }

View file

@ -200,7 +200,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
{ {
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
struct file_operations *dvbdevfops; struct file_operations *dvbdevfops;
struct class_device *clsdev;
int id; int id;
mutex_lock(&dvbdev_register_lock); mutex_lock(&dvbdev_register_lock);
@ -242,8 +242,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
mutex_unlock(&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), clsdev = class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR,
adap->device, "dvb%d.%s%d", adap->num, dnames[type], id); nums2minor(adap->num, type, id)),
adap->device, "dvb%d.%s%d", adap->num,
dnames[type], id);
if (IS_ERR(clsdev)) {
printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
__FUNCTION__, adap->num, dnames[type], id, PTR_ERR(clsdev));
return PTR_ERR(clsdev);
}
dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
adap->num, dnames[type], id, nums2minor(adap->num, type, id), adap->num, dnames[type], id, nums2minor(adap->num, type, id),
@ -431,7 +438,7 @@ static void __exit exit_dvbdev(void)
unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS); unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
} }
module_init(init_dvbdev); subsys_initcall(init_dvbdev);
module_exit(exit_dvbdev); module_exit(exit_dvbdev);
MODULE_DESCRIPTION("DVB Core Driver"); MODULE_DESCRIPTION("DVB Core Driver");

View file

@ -150,6 +150,12 @@
#define REG_GL_IMASK 0x300c /* Interrupt mask register */ #define REG_GL_IMASK 0x300c /* Interrupt mask register */
#define GIMSK_CCIC_EN 0x00000004 /* CCIC Interrupt enable */ #define GIMSK_CCIC_EN 0x00000004 /* CCIC Interrupt enable */
#define REG_GL_FCR 0x3038 /* GPIO functional control register */
#define GFCR_GPIO_ON 0x08 /* Camera GPIO enabled */
#define REG_GL_GPIOR 0x315c /* GPIO register */
#define GGPIO_OUT 0x80000 /* GPIO output */
#define GGPIO_VAL 0x00008 /* Output pin value */
#define REG_LEN REG_GL_IMASK + 4 #define REG_LEN REG_GL_IMASK + 4

View file

@ -774,6 +774,12 @@ static void cafe_ctlr_power_up(struct cafe_camera *cam)
spin_lock_irqsave(&cam->dev_lock, flags); spin_lock_irqsave(&cam->dev_lock, flags);
cafe_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN); cafe_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN);
/*
* Part one of the sensor dance: turn the global
* GPIO signal on.
*/
cafe_reg_write(cam, REG_GL_FCR, GFCR_GPIO_ON);
cafe_reg_write(cam, REG_GL_GPIOR, GGPIO_OUT|GGPIO_VAL);
/* /*
* Put the sensor into operational mode (assumes OLPC-style * Put the sensor into operational mode (assumes OLPC-style
* wiring). Control 0 is reset - set to 1 to operate. * wiring). Control 0 is reset - set to 1 to operate.
@ -784,6 +790,7 @@ static void cafe_ctlr_power_up(struct cafe_camera *cam)
cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C0); cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C0);
// mdelay(1); /* Enough? */ // mdelay(1); /* Enough? */
spin_unlock_irqrestore(&cam->dev_lock, flags); spin_unlock_irqrestore(&cam->dev_lock, flags);
msleep(5); /* Just to be sure */
} }
static void cafe_ctlr_power_down(struct cafe_camera *cam) static void cafe_ctlr_power_down(struct cafe_camera *cam)
@ -792,6 +799,8 @@ static void cafe_ctlr_power_down(struct cafe_camera *cam)
spin_lock_irqsave(&cam->dev_lock, flags); spin_lock_irqsave(&cam->dev_lock, flags);
cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C1); cafe_reg_write(cam, REG_GPR, GPR_C1EN|GPR_C0EN|GPR_C1);
cafe_reg_write(cam, REG_GL_FCR, GFCR_GPIO_ON);
cafe_reg_write(cam, REG_GL_GPIOR, GGPIO_OUT);
cafe_reg_set_bit(cam, REG_CTRL1, C1_PWRDWN); cafe_reg_set_bit(cam, REG_CTRL1, C1_PWRDWN);
spin_unlock_irqrestore(&cam->dev_lock, flags); spin_unlock_irqrestore(&cam->dev_lock, flags);
} }
@ -851,6 +860,7 @@ static int cafe_cam_init(struct cafe_camera *cam)
ret = 0; ret = 0;
cam->state = S_IDLE; cam->state = S_IDLE;
out: out:
cafe_ctlr_power_down(cam);
mutex_unlock(&cam->s_mutex); mutex_unlock(&cam->s_mutex);
return ret; return ret;
} }
@ -2103,10 +2113,16 @@ static int cafe_pci_probe(struct pci_dev *pdev,
ret = request_irq(pdev->irq, cafe_irq, IRQF_SHARED, "cafe-ccic", cam); ret = request_irq(pdev->irq, cafe_irq, IRQF_SHARED, "cafe-ccic", cam);
if (ret) if (ret)
goto out_iounmap; goto out_iounmap;
/*
* Initialize the controller and leave it powered up. It will
* stay that way until the sensor driver shows up.
*/
cafe_ctlr_init(cam); cafe_ctlr_init(cam);
cafe_ctlr_power_up(cam); cafe_ctlr_power_up(cam);
/* /*
* Set up I2C/SMBUS communications * Set up I2C/SMBUS communications. We have to drop the mutex here
* because the sensor could attach in this call chain, leading to
* unsightly deadlocks.
*/ */
mutex_unlock(&cam->s_mutex); /* attach can deadlock */ mutex_unlock(&cam->s_mutex); /* attach can deadlock */
ret = cafe_smbus_setup(cam); ret = cafe_smbus_setup(cam);

View file

@ -1,7 +1,6 @@
config VIDEO_EM28XX config VIDEO_EM28XX
tristate "Empia EM2800/2820/2840 USB video capture support" tristate "Empia EM2800/2820/2840 USB video capture support"
depends on VIDEO_V4L1 && I2C && PCI depends on VIDEO_V4L1 && I2C
select VIDEO_BUF
select VIDEO_TUNER select VIDEO_TUNER
select VIDEO_TVEEPROM select VIDEO_TVEEPROM
select VIDEO_IR select VIDEO_IR

View file

@ -1,6 +1,6 @@
config VIDEO_IVTV config VIDEO_IVTV
tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support"
depends on VIDEO_V4L1 && VIDEO_V4L2 && USB && I2C && EXPERIMENTAL && PCI depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL
select FW_LOADER select FW_LOADER
select VIDEO_TUNER select VIDEO_TUNER
select VIDEO_TVEEPROM select VIDEO_TVEEPROM

View file

@ -67,14 +67,6 @@
#include <media/ivtv.h> #include <media/ivtv.h>
#ifdef CONFIG_LIRC_I2C
# error "This driver is not compatible with the LIRC I2C kernel configuration option."
#endif /* CONFIG_LIRC_I2C */
#ifndef CONFIG_PCI
# error "This driver requires kernel PCI support."
#endif /* CONFIG_PCI */
#define IVTV_ENCODER_OFFSET 0x00000000 #define IVTV_ENCODER_OFFSET 0x00000000
#define IVTV_ENCODER_SIZE 0x00800000 /* Last half isn't needed 0x01000000 */ #define IVTV_ENCODER_SIZE 0x00800000 /* Last half isn't needed 0x01000000 */

View file

@ -362,8 +362,6 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm
case V4L2_BUF_TYPE_VIDEO_OUTPUT: case V4L2_BUF_TYPE_VIDEO_OUTPUT:
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
return -EINVAL; return -EINVAL;
fmt->fmt.pix.left = itv->main_rect.left;
fmt->fmt.pix.top = itv->main_rect.top;
fmt->fmt.pix.width = itv->main_rect.width; fmt->fmt.pix.width = itv->main_rect.width;
fmt->fmt.pix.height = itv->main_rect.height; fmt->fmt.pix.height = itv->main_rect.height;
fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
@ -402,8 +400,6 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm
break; break;
case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_CAPTURE:
fmt->fmt.pix.left = 0;
fmt->fmt.pix.top = 0;
fmt->fmt.pix.width = itv->params.width; fmt->fmt.pix.width = itv->params.width;
fmt->fmt.pix.height = itv->params.height; fmt->fmt.pix.height = itv->params.height;
fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
@ -498,15 +494,13 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
return -EINVAL; return -EINVAL;
field = fmt->fmt.pix.field; field = fmt->fmt.pix.field;
r.top = fmt->fmt.pix.top; r.top = 0;
r.left = fmt->fmt.pix.left; r.left = 0;
r.width = fmt->fmt.pix.width; r.width = fmt->fmt.pix.width;
r.height = fmt->fmt.pix.height; r.height = fmt->fmt.pix.height;
ivtv_get_fmt(itv, streamtype, fmt); ivtv_get_fmt(itv, streamtype, fmt);
if (itv->output_mode != OUT_UDMA_YUV) { if (itv->output_mode != OUT_UDMA_YUV) {
/* TODO: would setting the rect also be valid for this mode? */ /* TODO: would setting the rect also be valid for this mode? */
fmt->fmt.pix.top = r.top;
fmt->fmt.pix.left = r.left;
fmt->fmt.pix.width = r.width; fmt->fmt.pix.width = r.width;
fmt->fmt.pix.height = r.height; fmt->fmt.pix.height = r.height;
} }
@ -1141,8 +1135,6 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
fb->fmt.pixelformat = itv->osd_pixelformat; fb->fmt.pixelformat = itv->osd_pixelformat;
fb->fmt.width = itv->osd_rect.width; fb->fmt.width = itv->osd_rect.width;
fb->fmt.height = itv->osd_rect.height; fb->fmt.height = itv->osd_rect.height;
fb->fmt.left = itv->osd_rect.left;
fb->fmt.top = itv->osd_rect.top;
fb->base = (void *)itv->osd_video_pbase; fb->base = (void *)itv->osd_video_pbase;
if (itv->osd_global_alpha_state) if (itv->osd_global_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA; fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;

View file

@ -720,11 +720,21 @@ static int ov7670_s_fmt(struct i2c_client *c, struct v4l2_format *fmt)
struct ov7670_format_struct *ovfmt; struct ov7670_format_struct *ovfmt;
struct ov7670_win_size *wsize; struct ov7670_win_size *wsize;
struct ov7670_info *info = i2c_get_clientdata(c); struct ov7670_info *info = i2c_get_clientdata(c);
unsigned char com7; unsigned char com7, clkrc;
ret = ov7670_try_fmt(c, fmt, &ovfmt, &wsize); ret = ov7670_try_fmt(c, fmt, &ovfmt, &wsize);
if (ret) if (ret)
return ret; return ret;
/*
* HACK: if we're running rgb565 we need to grab then rewrite
* CLKRC. If we're *not*, however, then rewriting clkrc hoses
* the colors.
*/
if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_RGB565) {
ret = ov7670_read(c, REG_CLKRC, &clkrc);
if (ret)
return ret;
}
/* /*
* COM7 is a pain in the ass, it doesn't like to be read then * COM7 is a pain in the ass, it doesn't like to be read then
* quickly written afterward. But we have everything we need * quickly written afterward. But we have everything we need
@ -744,7 +754,10 @@ static int ov7670_s_fmt(struct i2c_client *c, struct v4l2_format *fmt)
if (wsize->regs) if (wsize->regs)
ret = ov7670_write_array(c, wsize->regs); ret = ov7670_write_array(c, wsize->regs);
info->fmt = ovfmt; info->fmt = ovfmt;
return 0;
if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_RGB565 && ret == 0)
ret = ov7670_write(c, REG_CLKRC, clkrc);
return ret;
} }
/* /*
@ -1267,7 +1280,9 @@ static int ov7670_attach(struct i2c_adapter *adapter)
ret = ov7670_detect(client); ret = ov7670_detect(client);
if (ret) if (ret)
goto out_free_info; goto out_free_info;
i2c_attach_client(client); ret = i2c_attach_client(client);
if (ret)
goto out_free_info;
return 0; return 0;
out_free_info: out_free_info:

View file

@ -205,9 +205,13 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
/* 0x01 -> ??? no change ??? */ /* 0x01 -> ??? no change ??? */
/* 0x02 -> PAL BDGHI / SECAM L */ /* 0x02 -> PAL BDGHI / SECAM L */
/* 0x04 -> ??? PAL others / SECAM others ??? */ /* 0x04 -> ??? PAL others / SECAM others ??? */
cb &= ~0x02; cb &= ~0x03;
if (t->std & V4L2_STD_SECAM) if (t->std & V4L2_STD_SECAM_L) //also valid for V4L2_STD_SECAM
cb |= 0x02; cb |= PHILIPS_MF_SET_PAL_L;
else if (t->std & V4L2_STD_SECAM_LC)
cb |= PHILIPS_MF_SET_PAL_L2;
else /* V4L2_STD_B|V4L2_STD_GH */
cb |= PHILIPS_MF_SET_BG;
break; break;
case TUNER_TEMIC_4046FM5: case TUNER_TEMIC_4046FM5:

View file

@ -267,8 +267,6 @@ struct v4l2_pix_format
__u32 sizeimage; __u32 sizeimage;
enum v4l2_colorspace colorspace; enum v4l2_colorspace colorspace;
__u32 priv; /* private data, depends on pixelformat */ __u32 priv; /* private data, depends on pixelformat */
__u32 left; /* only valid if V4L2_CAP_VIDEO_OUTPUT_POS is set */
__u32 top; /* only valid if V4L2_CAP_VIDEO_OUTPUT_POS is set */
}; };
/* Pixel format FOURCC depth Description */ /* Pixel format FOURCC depth Description */