diff --git a/drivers/media/common/tuners/tda18212.c b/drivers/media/common/tuners/tda18212.c index e29cc2b..439b900 100644 --- a/drivers/media/common/tuners/tda18212.c +++ b/drivers/media/common/tuners/tda18212.c @@ -27,7 +27,7 @@ struct tda18212_priv { struct i2c_adapter *i2c; }; -#define dbg(fmt, arg...) \ +#define dib_dbg(fmt, arg...) \ do { \ if (debug) \ pr_info("%s: " fmt, __func__, ##arg); \ @@ -144,7 +144,7 @@ static int tda18212_set_params(struct dvb_frontend *fe, { 0x92, 0x53, 0x03 }, /* DVB-C */ }; - dbg("delsys=%d RF=%d BW=%d\n", + dib_dbg("delsys=%d RF=%d BW=%d\n", c->delivery_system, c->frequency, c->bandwidth_hz); if (fe->ops.i2c_gate_ctrl) @@ -211,7 +211,7 @@ exit: return ret; error: - dbg("failed:%d\n", ret); + dib_dbg("failed:%d\n", ret); goto exit; } @@ -260,7 +260,7 @@ struct dvb_frontend *tda18212_attach(struct dvb_frontend *fe, if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ - dbg("ret:%d chip ID:%02x\n", ret, val); + dib_dbg("ret:%d chip ID:%02x\n", ret, val); if (ret || val != 0xc7) { kfree(priv); return NULL; diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 2c0acdb..d6e503e 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -1535,7 +1535,8 @@ static int dvb_frontend_ioctl(struct file *file, if (down_interruptible (&fepriv->sem)) return -ERESTARTSYS; - if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY)) + if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY) || + (cmd == FE_GET_PROPERTY_OLD)) err = dvb_frontend_ioctl_properties(file, cmd, parg); else { c->state = DTV_UNDEFINED; diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index c6c275b..c8614c1 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c @@ -1443,6 +1443,9 @@ static struct dvb_usb_device_properties af9015_properties[] = { .num_frontends = 1, .fe = {{ .caps = DVB_USB_ADAP_HAS_PID_FILTER | +#if 1 + DVB_USB_ADAP_NEED_PID_FILTERING | +#endif DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, .pid_filter_count = 32, diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c index d62ee0f..4e99b5d 100644 --- a/drivers/media/dvb/dvb-usb/usb-urb.c +++ b/drivers/media/dvb/dvb-usb/usb-urb.c @@ -225,8 +225,23 @@ int usb_urb_init(struct usb_data_stream *stream, struct usb_data_stream_properti switch (stream->props.type) { case USB_BULK: + /* XXX override driver parameters */ + stream->props.count = 2; + stream->props.u.bulk.buffersize = 16384; return usb_bulk_urb_init(stream); case USB_ISOC: + /* XXX override driver parameters */ + switch (stream->udev->speed) { + case USB_SPEED_FULL: + case USB_SPEED_LOW: + stream->props.count = 2; + stream->props.u.isoc.framesperurb = 24; + break; + default: + stream->props.count = 2; + stream->props.u.isoc.framesperurb = 24 * 8; + break; + } return usb_isoc_urb_init(stream); default: err("unknown URB-type for data transfer."); diff --git a/drivers/media/dvb/frontends/cx24123.c b/drivers/media/dvb/frontends/cx24123.c index b1dd8ac..b73fb90 100644 --- a/drivers/media/dvb/frontends/cx24123.c +++ b/drivers/media/dvb/frontends/cx24123.c @@ -41,8 +41,8 @@ static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); -#define info(args...) do { printk(KERN_INFO "CX24123: " args); } while (0) -#define err(args...) do { printk(KERN_ERR "CX24123: " args); } while (0) +#define cx_info(args...) do { printk(KERN_INFO "CX24123: " args); } while (0) +#define cx_err(args...) do { printk(KERN_ERR "CX24123: " args); } while (0) #define dprintk(args...) \ do { \ @@ -274,7 +274,7 @@ static int cx24123_i2c_readreg(struct cx24123_state *state, u8 i2c_addr, u8 reg) ret = i2c_transfer(state->i2c, msg, 2); if (ret != 2) { - err("%s: reg=0x%x (error=%d)\n", __func__, reg, ret); + cx_err("%s: reg=0x%x (error=%d)\n", __func__, reg, ret); return ret; } @@ -620,7 +620,7 @@ static int cx24123_pll_writereg(struct dvb_frontend *fe, cx24123_writereg(state, 0x22, (data >> 16) & 0xff); while ((cx24123_readreg(state, 0x20) & 0x40) == 0) { if (time_after(jiffies, timeout)) { - err("%s: demodulator is not responding, "\ + cx_err("%s: demodulator is not responding, "\ "possibly hung, aborting.\n", __func__); return -EREMOTEIO; } @@ -632,7 +632,7 @@ static int cx24123_pll_writereg(struct dvb_frontend *fe, cx24123_writereg(state, 0x22, (data >> 8) & 0xff); while ((cx24123_readreg(state, 0x20) & 0x40) == 0) { if (time_after(jiffies, timeout)) { - err("%s: demodulator is not responding, "\ + cx_err("%s: demodulator is not responding, "\ "possibly hung, aborting.\n", __func__); return -EREMOTEIO; } @@ -645,7 +645,7 @@ static int cx24123_pll_writereg(struct dvb_frontend *fe, cx24123_writereg(state, 0x22, (data) & 0xff); while ((cx24123_readreg(state, 0x20) & 0x80)) { if (time_after(jiffies, timeout)) { - err("%s: demodulator is not responding," \ + cx_err("%s: demodulator is not responding," \ "possibly hung, aborting.\n", __func__); return -EREMOTEIO; } @@ -668,7 +668,7 @@ static int cx24123_pll_tune(struct dvb_frontend *fe, dprintk("frequency=%i\n", p->frequency); if (cx24123_pll_calculate(fe, p) != 0) { - err("%s: cx24123_pll_calcutate failed\n", __func__); + cx_err("%s: cx24123_pll_calcutate failed\n", __func__); return -EINVAL; } @@ -765,7 +765,7 @@ static void cx24123_wait_for_diseqc(struct cx24123_state *state) unsigned long timeout = jiffies + msecs_to_jiffies(200); while (!(cx24123_readreg(state, 0x29) & 0x40)) { if (time_after(jiffies, timeout)) { - err("%s: diseqc queue not ready, " \ + cx_err("%s: diseqc queue not ready, " \ "command may be lost.\n", __func__); break; } @@ -947,7 +947,7 @@ static int cx24123_set_frontend(struct dvb_frontend *fe, else if (fe->ops.tuner_ops.set_params) fe->ops.tuner_ops.set_params(fe, p); else - err("it seems I don't have a tuner..."); + cx_err("it seems I don't have a tuner..."); /* Enable automatic acquisition and reset cycle */ cx24123_writereg(state, 0x03, (cx24123_readreg(state, 0x03) | 0x07)); @@ -968,11 +968,11 @@ static int cx24123_get_frontend(struct dvb_frontend *fe, dprintk("\n"); if (cx24123_get_inversion(state, &p->inversion) != 0) { - err("%s: Failed to get inversion status\n", __func__); + cx_err("%s: Failed to get inversion status\n", __func__); return -EREMOTEIO; } if (cx24123_get_fec(state, &p->u.qpsk.fec_inner) != 0) { - err("%s: Failed to get fec status\n", __func__); + cx_err("%s: Failed to get fec status\n", __func__); return -EREMOTEIO; } p->frequency = state->currentfreq; @@ -999,7 +999,7 @@ static int cx24123_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) dprintk("setting tone off\n"); return cx24123_writereg(state, 0x29, val & 0xef); default: - err("CASE reached default with tone=%d\n", tone); + cx_err("CASE reached default with tone=%d\n", tone); return -EINVAL; } @@ -1075,7 +1075,7 @@ struct dvb_frontend *cx24123_attach(const struct cx24123_config *config, dprintk("\n"); if (state == NULL) { - err("Unable to kzalloc\n"); + cx_err("Unable to kzalloc\n"); goto error; } @@ -1087,13 +1087,13 @@ struct dvb_frontend *cx24123_attach(const struct cx24123_config *config, state->demod_rev = cx24123_readreg(state, 0x00); switch (state->demod_rev) { case 0xe1: - info("detected CX24123C\n"); + cx_info("detected CX24123C\n"); break; case 0xd1: - info("detected CX24123\n"); + cx_info("detected CX24123\n"); break; default: - err("wrong demod revision: %x\n", state->demod_rev); + cx_err("wrong demod revision: %x\n", state->demod_rev); goto error; } @@ -1112,7 +1112,7 @@ struct dvb_frontend *cx24123_attach(const struct cx24123_config *config, state->tuner_i2c_adapter.algo_data = NULL; i2c_set_adapdata(&state->tuner_i2c_adapter, state); if (i2c_add_adapter(&state->tuner_i2c_adapter) < 0) { - err("tuner i2c bus could not be initialized\n"); + cx_err("tuner i2c bus could not be initialized\n"); goto error; } diff --git a/drivers/media/dvb/frontends/dib3000mb.c b/drivers/media/dvb/frontends/dib3000mb.c index e80c597..b0a795a 100644 --- a/drivers/media/dvb/frontends/dib3000mb.c +++ b/drivers/media/dvb/frontends/dib3000mb.c @@ -147,7 +147,7 @@ static int dib3000mb_set_frontend(struct dvb_frontend* fe, case BANDWIDTH_AUTO: return -EOPNOTSUPP; default: - err("unknown bandwidth value."); + dib_err("unknown bandwidth value."); return -EINVAL; } } @@ -505,7 +505,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe, ofdm->constellation = QAM_64; break; default: - err("Unexpected constellation returned by TPS (%d)", tps_val); + dib_err("Unexpected constellation returned by TPS (%d)", tps_val); break; } deb_getf("TPS: %d\n", tps_val); @@ -532,7 +532,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe, ofdm->hierarchy_information = HIERARCHY_4; break; default: - err("Unexpected ALPHA value returned by TPS (%d)", tps_val); + dib_err("Unexpected ALPHA value returned by TPS (%d)", tps_val); break; } deb_getf("TPS: %d\n", tps_val); @@ -569,7 +569,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe, *cr = FEC_7_8; break; default: - err("Unexpected FEC returned by TPS (%d)", tps_val); + dib_err("Unexpected FEC returned by TPS (%d)", tps_val); break; } deb_getf("TPS: %d\n",tps_val); @@ -592,7 +592,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe, ofdm->guard_interval = GUARD_INTERVAL_1_4; break; default: - err("Unexpected Guard Time returned by TPS (%d)", tps_val); + dib_err("Unexpected Guard Time returned by TPS (%d)", tps_val); break; } deb_getf("TPS: %d\n", tps_val); @@ -607,7 +607,7 @@ static int dib3000mb_get_frontend(struct dvb_frontend* fe, ofdm->transmission_mode = TRANSMISSION_MODE_8K; break; default: - err("unexpected transmission mode return by TPS (%d)", tps_val); + dib_err("unexpected transmission mode return by TPS (%d)", tps_val); break; } deb_getf("TPS: %d\n", tps_val); diff --git a/drivers/media/dvb/frontends/dib3000mb_priv.h b/drivers/media/dvb/frontends/dib3000mb_priv.h index 16c5265..7f9a373 100644 --- a/drivers/media/dvb/frontends/dib3000mb_priv.h +++ b/drivers/media/dvb/frontends/dib3000mb_priv.h @@ -14,19 +14,19 @@ #define __DIB3000MB_PRIV_H_INCLUDED__ /* info and err, taken from usb.h, if there is anything available like by default. */ -#define err(format, arg...) printk(KERN_ERR "dib3000: " format "\n" , ## arg) -#define info(format, arg...) printk(KERN_INFO "dib3000: " format "\n" , ## arg) -#define warn(format, arg...) printk(KERN_WARNING "dib3000: " format "\n" , ## arg) +#define dib_err(format, arg...) printk(KERN_ERR "dib3000: " format "\n" , ## arg) +#define dib_info(format, arg...) printk(KERN_INFO "dib3000: " format "\n" , ## arg) +#define dib_warn(format, arg...) printk(KERN_WARNING "dib3000: " format "\n" , ## arg) /* handy shortcuts */ #define rd(reg) dib3000_read_reg(state,reg) #define wr(reg,val) if (dib3000_write_reg(state,reg,val)) \ - { err("while sending 0x%04x to 0x%04x.",val,reg); return -EREMOTEIO; } + { dib_err("while sending 0x%04x to 0x%04x.",val,reg); return -EREMOTEIO; } #define wr_foreach(a,v) { int i; \ if (sizeof(a) != sizeof(v)) \ - err("sizeof: %zu %zu is different",sizeof(a),sizeof(v));\ + dib_err("sizeof: %zu %zu is different",sizeof(a),sizeof(v));\ for (i=0; i < sizeof(a)/sizeof(u16); i++) \ wr(a[i],v[i]); \ } diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c index c92b3ec..cfb420c 100644 --- a/drivers/media/dvb/frontends/it913x-fe.c +++ b/drivers/media/dvb/frontends/it913x-fe.c @@ -41,7 +41,7 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."); printk(KERN_DEBUG "it913x-fe: " args); \ } while (0) -#define deb_info(args...) dprintk(0x01, args) +#define deb_itx_info(args...) dprintk(0x01, args) #define debug_data_snipet(level, name, p) \ dprintk(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \ *p, *(p+1), *(p+2), *(p+3), *(p+4), \ @@ -172,7 +172,7 @@ static int it9137_set_tuner(struct it913x_fe_state *state, u8 lna_band; u8 bw; - deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth); + deb_itx_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth); if (frequency >= 51000 && frequency <= 440000) { l_band = 0; @@ -265,7 +265,7 @@ static int it9137_set_tuner(struct it913x_fe_state *state, set_tuner[2].reg[3] = freq & 0xff; set_tuner[2].reg[4] = (freq >> 8) & 0xff; - deb_info("Frequency = %08x, Bandwidth = %02x, ", freq, bw); + deb_itx_info("Frequency = %08x, Bandwidth = %02x, ", freq, bw); ret = it913x_fe_script_loader(state, set_tuner); @@ -285,7 +285,7 @@ static int it913x_fe_select_bw(struct it913x_fe_state *state, u8 bw; u8 adcmultiplier; - deb_info("Bandwidth %d Adc %d", bandwidth, adcFrequency); + deb_itx_info("Bandwidth %d Adc %d", bandwidth, adcFrequency); if (bandwidth == BANDWIDTH_5_MHZ) bw = 3; @@ -489,7 +489,7 @@ static int it913x_fe_set_frontend(struct dvb_frontend *fe, ret = it913x_write_reg(state, PRO_DMOD, FREE_BAND, i); - deb_info("Frontend Set Tuner Type %02x", state->tuner_type); + deb_itx_info("Frontend Set Tuner Type %02x", state->tuner_type); switch (state->tuner_type) { case IT9137: /* Tuner type 0x38 */ ret = it9137_set_tuner(state, @@ -604,7 +604,7 @@ static int it913x_fe_start(struct it913x_fe_state *state) } else return -EINVAL; - deb_info("Xtal Freq :%d Adc Freq :%d Adc %08x Xtal %08x", + deb_itx_info("Xtal Freq :%d Adc Freq :%d Adc %08x Xtal %08x", state->crystalFrequency, state->adcFrequency, adc, xtal); /* Set LED indicator on GPIOH3 */ diff --git a/drivers/media/dvb/frontends/tda18271c2dd.c b/drivers/media/dvb/frontends/tda18271c2dd.c index 1b1bf20..ae0d33d 100644 --- a/drivers/media/dvb/frontends/tda18271c2dd.c +++ b/drivers/media/dvb/frontends/tda18271c2dd.c @@ -1103,7 +1103,7 @@ static int ChannelConfiguration(struct tda_state *state, return status; } -static int sleep(struct dvb_frontend *fe) +static int do_sleep(struct dvb_frontend *fe) { struct tda_state *state = fe->tuner_priv; @@ -1219,7 +1219,7 @@ static struct dvb_tuner_ops tuner_ops = { .frequency_step = 62500 }, .init = init, - .sleep = sleep, + .sleep = do_sleep, .set_params = set_params, .release = release, .get_if_frequency = get_if_frequency, diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 3ff26ba..44f0250 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c @@ -47,7 +47,7 @@ #endif /* global values */ -#define DEF_NURBS 3 /* default number of URBs */ +#define DEF_NURBS 2 /* default number of URBs */ #if DEF_NURBS > MAX_NURBS #error "DEF_NURBS too big" #endif @@ -1869,7 +1869,7 @@ static int vidioc_dqbuf(struct file *file, void *priv, /* wait till a frame is ready */ ret = wait_event_interruptible_timeout(gspca_dev->wq, frame_ready(gspca_dev, file, v4l2_buf->memory), - msecs_to_jiffies(3000)); + msecs_to_jiffies(5000)); if (ret < 0) return ret; if (ret == 0) diff --git a/drivers/media/video/stk-webcam.h b/drivers/media/video/stk-webcam.h index 9f67366..5ab9faa 100644 --- a/drivers/media/video/stk-webcam.h +++ b/drivers/media/video/stk-webcam.h @@ -28,8 +28,8 @@ #define DRIVER_VERSION "v0.0.1" #define DRIVER_VERSION_NUM 0x000001 -#define MAX_ISO_BUFS 3 -#define ISO_FRAMES_PER_DESC 16 +#define MAX_ISO_BUFS 2 +#define ISO_FRAMES_PER_DESC 56 #define ISO_MAX_FRAME_SIZE 3 * 1024 #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index ffd1158..0308ec3 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c @@ -823,9 +823,7 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream, /* Compute the number of packets. Bulk endpoints might transfer UVC * payloads across multiple URBs. */ - npackets = DIV_ROUND_UP(size, psize); - if (npackets > UVC_MAX_PACKETS) - npackets = UVC_MAX_PACKETS; + npackets = size / psize; /* Retry allocations until one succeed. */ for (; npackets > 1; npackets /= 2) { @@ -888,8 +886,25 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream, u32 size; psize = le16_to_cpu(ep->desc.wMaxPacketSize); - psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); - size = stream->ctrl.dwMaxVideoFrameSize; + + if (stream->dev->udev->speed == USB_SPEED_FULL) { + /* (8000 >> 3) = 1000 FPS */ + psize = (psize & 0x07ff); + size = (UVC_MAX_PACKETS >> 3) * psize; + } else { + /* 1000 - 8000 FPS, figure out */ + psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); + size = ep->desc.bInterval; + if (size > 0) + size --; + if (size > 3) + size = 3; + size = (UVC_MAX_PACKETS >> size) * psize; + } + + /* avoid division by zero */ + if (psize == 0) + return -EINVAL; npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags); if (npackets == 0) @@ -943,6 +958,19 @@ static int uvc_init_video_bulk(struct uvc_streaming *stream, size = stream->ctrl.dwMaxPayloadTransferSize; stream->bulk.max_payload_size = size; + /* avoid division by zero */ + if (psize == 0) + return -EINVAL; + + /* roughly compute size for buffers */ + if (stream->dev->udev->speed == USB_SPEED_FULL) { + size = 4096; + } else { + size = 16384; + } + /* align to packet boundary */ + size += (psize - (size % psize)) % psize; + npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags); if (npackets == 0) return -ENOMEM; diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h index cbdd49b..b456ad5 100644 --- a/drivers/media/video/uvc/uvcvideo.h +++ b/drivers/media/video/uvc/uvcvideo.h @@ -186,9 +186,9 @@ struct uvc_xu_control { #define DRIVER_VERSION "1.1.1" /* Number of isochronous URBs. */ -#define UVC_URBS 5 +#define UVC_URBS 2U /* Maximum number of packets per URB. */ -#define UVC_MAX_PACKETS 32 +#define UVC_MAX_PACKETS 128U /* at 8000 FPS */ /* Maximum number of video buffers. */ #define UVC_MAX_VIDEO_BUFFERS 32 /* Maximum status buffer size in bytes of interrupt URB. */ diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c index a5c9ed1..debefe1 100644 --- a/drivers/media/video/v4l2-dev.c +++ b/drivers/media/video/v4l2-dev.c @@ -35,6 +35,16 @@ #define VIDEO_NUM_DEVICES 256 #define VIDEO_NAME "video4linux" +static int v4l_vflip; +module_param(v4l_vflip, int, 0644); +MODULE_PARM_DESC(v4l_vflip, + "Force all V4L devices to flip the picture vertically."); + +static int v4l_hflip; +module_param(v4l_hflip, int, 0644); +MODULE_PARM_DESC(v4l_hflip, + "Force all V4L devices to flip the picture horizontally."); + /* * sysfs stuff */ @@ -366,6 +376,24 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } else ret = -ENOTTY; + if (ret == 0 && cmd == VIDIOC_ENUMINPUT) { + + __u32 status; + + if (copy_from_user(&status, (char *)arg + + offsetof(struct v4l2_input, status), sizeof(status))) + ret = -EFAULT; + + if (v4l_vflip) + status ^= V4L2_IN_ST_VFLIP; + if (v4l_hflip) + status ^= V4L2_IN_ST_HFLIP; + + if (copy_to_user((char *)arg + offsetof(struct v4l2_input, + status), &status, sizeof(status))) + ret = -EFAULT; + } + return ret; } diff --git a/drivers/media/video/videobuf2-memops.c b/drivers/media/video/videobuf2-memops.c index 71a7a78..b840736 100644 --- a/drivers/media/video/videobuf2-memops.c +++ b/drivers/media/video/videobuf2-memops.c @@ -44,15 +44,8 @@ struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma) if (vma->vm_ops && vma->vm_ops->open) vma->vm_ops->open(vma); - if (vma->vm_file) - get_file(vma->vm_file); - memcpy(vma_copy, vma, sizeof(*vma)); - vma_copy->vm_mm = NULL; - vma_copy->vm_next = NULL; - vma_copy->vm_prev = NULL; - return vma_copy; } @@ -71,79 +64,11 @@ void vb2_put_vma(struct vm_area_struct *vma) if (vma->vm_ops && vma->vm_ops->close) vma->vm_ops->close(vma); - if (vma->vm_file) - fput(vma->vm_file); - kfree(vma); } EXPORT_SYMBOL_GPL(vb2_put_vma); /** - * vb2_get_contig_userptr() - lock physically contiguous userspace mapped memory - * @vaddr: starting virtual address of the area to be verified - * @size: size of the area - * @res_paddr: will return physical address for the given vaddr - * @res_vma: will return locked copy of struct vm_area for the given area - * - * This function will go through memory area of size @size mapped at @vaddr and - * verify that the underlying physical pages are contiguous. If they are - * contiguous the virtual memory area is locked and a @res_vma is filled with - * the copy and @res_pa set to the physical address of the buffer. - * - * Returns 0 on success. - */ -int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, - struct vm_area_struct **res_vma, dma_addr_t *res_pa) -{ - struct mm_struct *mm = current->mm; - struct vm_area_struct *vma; - unsigned long offset, start, end; - unsigned long this_pfn, prev_pfn; - dma_addr_t pa = 0; - int ret = -EFAULT; - - start = vaddr; - offset = start & ~PAGE_MASK; - end = start + size; - - down_read(&mm->mmap_sem); - vma = find_vma(mm, start); - - if (vma == NULL || vma->vm_end < end) - goto done; - - for (prev_pfn = 0; start < end; start += PAGE_SIZE) { - ret = follow_pfn(vma, start, &this_pfn); - if (ret) - goto done; - - if (prev_pfn == 0) - pa = this_pfn << PAGE_SHIFT; - else if (this_pfn != prev_pfn + 1) { - ret = -EFAULT; - goto done; - } - prev_pfn = this_pfn; - } - - /* - * Memory is contigous, lock vma and return to the caller - */ - *res_vma = vb2_get_vma(vma); - if (*res_vma == NULL) { - ret = -ENOMEM; - goto done; - } - *res_pa = pa + offset; - ret = 0; - -done: - up_read(&mm->mmap_sem); - return ret; -} -EXPORT_SYMBOL_GPL(vb2_get_contig_userptr); - -/** * vb2_mmap_pfn_range() - map physical pages to userspace * @vma: virtual memory region for the mapping * @paddr: starting physical address of the memory to be mapped diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index 1b1094c..b38a600 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h @@ -387,7 +387,8 @@ struct dtv_properties { }; #define FE_SET_PROPERTY _IOW('o', 82, struct dtv_properties) -#define FE_GET_PROPERTY _IOR('o', 83, struct dtv_properties) +#define FE_GET_PROPERTY _IOW('o', 83, struct dtv_properties) +#define FE_GET_PROPERTY_OLD _IOR('o', 83, struct dtv_properties) /** diff --git a/include/linux/input.h b/include/linux/input.h index a637e78..e9d2467 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -104,8 +104,12 @@ struct input_keymap_entry { #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ -#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ -#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry) +/* + * These two need to be _IOWR not _IOR (they're wrong on Linux too but + * there the driver doesn't care.) + */ +#define EVIOCGKEYCODE _IOWR('E', 0x04, unsigned int[2]) /* get keycode */ +#define EVIOCGKEYCODE_V2 _IOWR('E', 0x04, struct input_keymap_entry) #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ #define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)