diff options
Diffstat (limited to 'include/media')
33 files changed, 830 insertions, 550 deletions
diff --git a/include/media/adv7604.h b/include/media/adv7604.h index dc004bc926c..aa1c4477722 100644 --- a/include/media/adv7604.h +++ b/include/media/adv7604.h @@ -21,6 +21,8 @@  #ifndef _ADV7604_  #define _ADV7604_ +#include <linux/types.h> +  /* Analog input muxing modes (AFE register 0x02, [2:0]) */  enum adv7604_ain_sel {  	ADV7604_AIN1_2_3_NC_SYNC_1_2 = 0, @@ -30,14 +32,18 @@ enum adv7604_ain_sel {  	ADV7604_AIN9_4_5_6_SYNC_2_1 = 4,  }; -/* Bus rotation and reordering (IO register 0x04, [7:5]) */ -enum adv7604_op_ch_sel { -	ADV7604_OP_CH_SEL_GBR = 0, -	ADV7604_OP_CH_SEL_GRB = 1, -	ADV7604_OP_CH_SEL_BGR = 2, -	ADV7604_OP_CH_SEL_RGB = 3, -	ADV7604_OP_CH_SEL_BRG = 4, -	ADV7604_OP_CH_SEL_RBG = 5, +/* + * Bus rotation and reordering. This is used to specify component reordering on + * the board and describes the components order on the bus when the ADV7604 + * outputs RGB. + */ +enum adv7604_bus_order { +	ADV7604_BUS_ORDER_RGB,		/* No operation	*/ +	ADV7604_BUS_ORDER_GRB,		/* Swap 1-2	*/ +	ADV7604_BUS_ORDER_RBG,		/* Swap 2-3	*/ +	ADV7604_BUS_ORDER_BGR,		/* Swap 1-3	*/ +	ADV7604_BUS_ORDER_BRG,		/* Rotate right	*/ +	ADV7604_BUS_ORDER_GBR,		/* Rotate left	*/  };  /* Input Color Space (IO register 0x02, [7:4]) */ @@ -53,62 +59,84 @@ enum adv7604_inp_color_space {  	ADV7604_INP_COLOR_SPACE_AUTO = 0xf,  }; -/* Select output format (IO register 0x03, [7:0]) */ -enum adv7604_op_format_sel { -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_8 = 0x00, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_10 = 0x01, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_12_MODE0 = 0x02, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_12_MODE1 = 0x06, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_12_MODE2 = 0x0a, -	ADV7604_OP_FORMAT_SEL_DDR_422_8 = 0x20, -	ADV7604_OP_FORMAT_SEL_DDR_422_10 = 0x21, -	ADV7604_OP_FORMAT_SEL_DDR_422_12_MODE0 = 0x22, -	ADV7604_OP_FORMAT_SEL_DDR_422_12_MODE1 = 0x23, -	ADV7604_OP_FORMAT_SEL_DDR_422_12_MODE2 = 0x24, -	ADV7604_OP_FORMAT_SEL_SDR_444_24 = 0x40, -	ADV7604_OP_FORMAT_SEL_SDR_444_30 = 0x41, -	ADV7604_OP_FORMAT_SEL_SDR_444_36_MODE0 = 0x42, -	ADV7604_OP_FORMAT_SEL_DDR_444_24 = 0x60, -	ADV7604_OP_FORMAT_SEL_DDR_444_30 = 0x61, -	ADV7604_OP_FORMAT_SEL_DDR_444_36 = 0x62, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_16 = 0x80, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_20 = 0x81, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_24_MODE0 = 0x82, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_24_MODE1 = 0x86, -	ADV7604_OP_FORMAT_SEL_SDR_ITU656_24_MODE2 = 0x8a, +/* Select output format (IO register 0x03, [4:2]) */ +enum adv7604_op_format_mode_sel { +	ADV7604_OP_FORMAT_MODE0 = 0x00, +	ADV7604_OP_FORMAT_MODE1 = 0x04, +	ADV7604_OP_FORMAT_MODE2 = 0x08, +}; + +enum adv7604_drive_strength { +	ADV7604_DR_STR_MEDIUM_LOW = 1, +	ADV7604_DR_STR_MEDIUM_HIGH = 2, +	ADV7604_DR_STR_HIGH = 3, +}; + +enum adv7604_int1_config { +	ADV7604_INT1_CONFIG_OPEN_DRAIN, +	ADV7604_INT1_CONFIG_ACTIVE_LOW, +	ADV7604_INT1_CONFIG_ACTIVE_HIGH, +	ADV7604_INT1_CONFIG_DISABLED, +}; + +enum adv7604_page { +	ADV7604_PAGE_IO, +	ADV7604_PAGE_AVLINK, +	ADV7604_PAGE_CEC, +	ADV7604_PAGE_INFOFRAME, +	ADV7604_PAGE_ESDP, +	ADV7604_PAGE_DPP, +	ADV7604_PAGE_AFE, +	ADV7604_PAGE_REP, +	ADV7604_PAGE_EDID, +	ADV7604_PAGE_HDMI, +	ADV7604_PAGE_TEST, +	ADV7604_PAGE_CP, +	ADV7604_PAGE_VDP, +	ADV7604_PAGE_MAX,  };  /* Platform dependent definition */  struct adv7604_platform_data { -	/* connector - HDMI or DVI? */ -	unsigned connector_hdmi:1; -  	/* DIS_PWRDNB: 1 if the PWRDNB pin is unused and unconnected */  	unsigned disable_pwrdnb:1;  	/* DIS_CABLE_DET_RST: 1 if the 5V pins are unused and unconnected */  	unsigned disable_cable_det_rst:1; +	int default_input; +  	/* Analog input muxing mode */  	enum adv7604_ain_sel ain_sel;  	/* Bus rotation and reordering */ -	enum adv7604_op_ch_sel op_ch_sel; +	enum adv7604_bus_order bus_order; + +	/* Select output format mode */ +	enum adv7604_op_format_mode_sel op_format_mode_sel; -	/* Select output format */ -	enum adv7604_op_format_sel op_format_sel; +	/* Configuration of the INT1 pin */ +	enum adv7604_int1_config int1_config;  	/* IO register 0x02 */  	unsigned alt_gamma:1;  	unsigned op_656_range:1; -	unsigned rgb_out:1;  	unsigned alt_data_sat:1;  	/* IO register 0x05 */  	unsigned blank_data:1;  	unsigned insert_av_codes:1;  	unsigned replicate_av_codes:1; -	unsigned invert_cbcr:1; + +	/* IO register 0x06 */ +	unsigned inv_vs_pol:1; +	unsigned inv_hs_pol:1; +	unsigned inv_llc_pol:1; + +	/* IO register 0x14 */ +	enum adv7604_drive_strength dr_str_data; +	enum adv7604_drive_strength dr_str_clk; +	enum adv7604_drive_strength dr_str_sync;  	/* IO register 0x30 */  	unsigned output_bus_lsb_to_msb:1; @@ -117,28 +145,20 @@ struct adv7604_platform_data {  	unsigned hdmi_free_run_mode;  	/* i2c addresses: 0 == use default */ -	u8 i2c_avlink; -	u8 i2c_cec; -	u8 i2c_infoframe; -	u8 i2c_esdp; -	u8 i2c_dpp; -	u8 i2c_afe; -	u8 i2c_repeater; -	u8 i2c_edid; -	u8 i2c_hdmi; -	u8 i2c_test; -	u8 i2c_cp; -	u8 i2c_vdp; +	u8 i2c_addresses[ADV7604_PAGE_MAX];  }; -/* - * Mode of operation. - * This is used as the input argument of the s_routing video op. - */ -enum adv7604_mode { -	ADV7604_MODE_COMP, -	ADV7604_MODE_GR, -	ADV7604_MODE_HDMI, +enum adv7604_pad { +	ADV7604_PAD_HDMI_PORT_A = 0, +	ADV7604_PAD_HDMI_PORT_B = 1, +	ADV7604_PAD_HDMI_PORT_C = 2, +	ADV7604_PAD_HDMI_PORT_D = 3, +	ADV7604_PAD_VGA_RGB = 4, +	ADV7604_PAD_VGA_COMP = 5, +	/* The source pad is either 1 (ADV7611) or 6 (ADV7604) */ +	ADV7604_PAD_SOURCE = 6, +	ADV7611_PAD_SOURCE = 1, +	ADV7604_PAD_MAX = 7,  };  #define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE	(V4L2_CID_DV_CLASS_BASE + 0x1000) diff --git a/include/media/adv7842.h b/include/media/adv7842.h index c02201d1c09..924cbb8d004 100644 --- a/include/media/adv7842.h +++ b/include/media/adv7842.h @@ -108,6 +108,13 @@ enum adv7842_select_input {  	ADV7842_SELECT_SDP_YC,  }; +enum adv7842_drive_strength { +	ADV7842_DR_STR_LOW = 0, +	ADV7842_DR_STR_MEDIUM_LOW = 1, +	ADV7842_DR_STR_MEDIUM_HIGH = 2, +	ADV7842_DR_STR_HIGH = 3, +}; +  struct adv7842_sdp_csc_coeff {  	bool manual;  	uint16_t scaling; @@ -131,13 +138,18 @@ struct adv7842_sdp_io_sync_adjustment {  	uint16_t hs_width;  	uint16_t de_beg;  	uint16_t de_end; +	uint8_t vs_beg_o; +	uint8_t vs_beg_e; +	uint8_t vs_end_o; +	uint8_t vs_end_e; +	uint8_t de_v_beg_o; +	uint8_t de_v_beg_e; +	uint8_t de_v_end_o; +	uint8_t de_v_end_e;  };  /* Platform dependent definition */  struct adv7842_platform_data { -	/* connector - HDMI or DVI? */ -	unsigned connector_hdmi:1; -  	/* chip reset during probe */  	unsigned chip_reset:1; @@ -156,12 +168,12 @@ struct adv7842_platform_data {  	/* Default mode */  	enum adv7842_mode mode; +	/* Default input */ +	unsigned input; +  	/* Video standard */  	enum adv7842_vid_std_select vid_std_select; -	/* Input Color Space */ -	enum adv7842_inp_color_space inp_color_space; -  	/* Select output format */  	enum adv7842_op_format_sel op_format_sel; @@ -181,22 +193,40 @@ struct adv7842_platform_data {  	unsigned output_bus_lsb_to_msb:1;  	/* IO register 0x14 */ -	struct { -		unsigned data:2; -		unsigned clock:2; -		unsigned sync:2; -	} drive_strength; +	enum adv7842_drive_strength dr_str_data; +	enum adv7842_drive_strength dr_str_clk; +	enum adv7842_drive_strength dr_str_sync; + +	/* +	 * IO register 0x19: Adjustment to the LLC DLL phase in +	 * increments of 1/32 of a clock period. +	 */ +	unsigned llc_dll_phase:5;  	/* External RAM for 3-D comb or frame synchronizer */  	unsigned sd_ram_size; /* ram size in MB */  	unsigned sd_ram_ddr:1; /* ddr or sdr sdram */ -	/* Free run */ -	unsigned hdmi_free_run_mode; +	/* HDMI free run, CP-reg 0xBA */ +	unsigned hdmi_free_run_enable:1; +	/* 0 = Mode 0: run when there is no TMDS clock +	   1 = Mode 1: run when there is no TMDS clock or the +	       video resolution does not match programmed one. */ +	unsigned hdmi_free_run_mode:1; + +	/* SDP free run, CP-reg 0xDD */ +	unsigned sdp_free_run_auto:1; +	unsigned sdp_free_run_man_col_en:1; +	unsigned sdp_free_run_cbar_en:1; +	unsigned sdp_free_run_force:1; + +	/* HPA manual (0) or auto (1), affects HDMI register 0x69 */ +	unsigned hpa_auto:1;  	struct adv7842_sdp_csc_coeff sdp_csc_coeff; -	struct adv7842_sdp_io_sync_adjustment sdp_io_sync; +	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_625; +	struct adv7842_sdp_io_sync_adjustment sdp_io_sync_525;  	/* i2c addresses */  	u8 i2c_sdp_io; @@ -223,4 +253,8 @@ struct adv7842_platform_data {   * deinterlacer. */  #define ADV7842_CMD_RAM_TEST _IO('V', BASE_VIDIOC_PRIVATE) +#define ADV7842_EDID_PORT_A   0 +#define ADV7842_EDID_PORT_B   1 +#define ADV7842_EDID_PORT_VGA 2 +  #endif diff --git a/include/media/atmel-isi.h b/include/media/atmel-isi.h index 65682307570..2b023471ac8 100644 --- a/include/media/atmel-isi.h +++ b/include/media/atmel-isi.h @@ -56,6 +56,7 @@  #define		ISI_CFG1_FRATE_DIV_6		(5 << 8)  #define		ISI_CFG1_FRATE_DIV_7		(6 << 8)  #define		ISI_CFG1_FRATE_DIV_8		(7 << 8) +#define		ISI_CFG1_FRATE_DIV_MASK		(7 << 8)  #define ISI_CFG1_DISCR				(1 << 11)  #define ISI_CFG1_FULL_MODE			(1 << 12) @@ -66,6 +67,7 @@  #define		ISI_CFG2_YCC_SWAP_MODE_1	(1 << 28)  #define		ISI_CFG2_YCC_SWAP_MODE_2	(2 << 28)  #define		ISI_CFG2_YCC_SWAP_MODE_3	(3 << 28) +#define		ISI_CFG2_YCC_SWAP_MODE_MASK	(3 << 28)  #define ISI_CFG2_IM_VSIZE_OFFSET		0  #define ISI_CFG2_IM_HSIZE_OFFSET		16  #define ISI_CFG2_IM_VSIZE_MASK		(0x7FF << ISI_CFG2_IM_VSIZE_OFFSET) diff --git a/include/media/davinci/vpbe_display.h b/include/media/davinci/vpbe_display.h index 8dffffedbb5..637749a9143 100644 --- a/include/media/davinci/vpbe_display.h +++ b/include/media/davinci/vpbe_display.h @@ -16,6 +16,7 @@  /* Header files */  #include <linux/videodev2.h>  #include <media/v4l2-common.h> +#include <media/v4l2-fh.h>  #include <media/videobuf2-dma-contig.h>  #include <media/davinci/vpbe_types.h>  #include <media/davinci/vpbe_osd.h> @@ -94,8 +95,6 @@ struct vpbe_layer {  	 * has selected  	 */  	enum v4l2_memory memory; -	/* Used to keep track of state of the priority */ -	struct v4l2_prio_state prio;  	/* Used to store pixel format */  	struct v4l2_pix_format pix_fmt;  	enum v4l2_field buf_field; @@ -134,14 +133,13 @@ struct vpbe_display {  /* File handle structure */  struct vpbe_fh { +	struct v4l2_fh fh;  	/* vpbe device structure */  	struct vpbe_display *disp_dev;  	/* pointer to layer object for opened device */  	struct vpbe_layer *layer;  	/* Indicates whether this file handle is doing IO */  	unsigned char io_allowed; -	/* Used to keep track priority of this instance */ -	enum v4l2_priority prio;  };  struct buf_config_params { diff --git a/include/media/davinci/vpfe_capture.h b/include/media/davinci/vpfe_capture.h index cc973ed845a..288772e6900 100644 --- a/include/media/davinci/vpfe_capture.h +++ b/include/media/davinci/vpfe_capture.h @@ -26,6 +26,7 @@  #include <linux/videodev2.h>  #include <linux/clk.h>  #include <linux/i2c.h> +#include <media/v4l2-fh.h>  #include <media/v4l2-ioctl.h>  #include <media/v4l2-device.h>  #include <media/videobuf-dma-contig.h> @@ -110,8 +111,6 @@ struct vpfe_device {  	struct v4l2_device v4l2_dev;  	/* parent device */  	struct device *pdev; -	/* Used to keep track of state of the priority */ -	struct v4l2_prio_state prio;  	/* number of open instances of the channel */  	u32 usrs;  	/* Indicates id of the field which is being displayed */ @@ -174,11 +173,10 @@ struct vpfe_device {  /* File handle structure */  struct vpfe_fh { +	struct v4l2_fh fh;  	struct vpfe_device *vpfe_dev;  	/* Indicates whether this file handle is doing IO */  	u8 io_allowed; -	/* Used to keep track priority of this instance */ -	enum v4l2_priority prio;  };  struct vpfe_config_params { diff --git a/include/media/s5p_fimc.h b/include/media/exynos-fimc.h index b975c285c8a..aa44660e204 100644 --- a/include/media/s5p_fimc.h +++ b/include/media/exynos-fimc.h @@ -61,41 +61,20 @@ enum fimc_bus_type {  #define GRP_ID_FLITE		(1 << 13)  #define GRP_ID_FIMC_IS		(1 << 14) -struct i2c_board_info; -  /**   * struct fimc_source_info - video source description required for the host   *			     interface configuration   * - * @board_info: pointer to I2C subdevice's board info - * @clk_frequency: frequency of the clock the host interface provides to sensor   * @fimc_bus_type: FIMC camera input type   * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc.   * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*) - * @i2c_bus_num: i2c control bus id the sensor is attached to   * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU) - * @clk_id: index of the SoC peripheral clock for sensors   */  struct fimc_source_info { -	struct i2c_board_info *board_info; -	unsigned long clk_frequency;  	enum fimc_bus_type fimc_bus_type;  	enum fimc_bus_type sensor_bus_type;  	u16 flags; -	u16 i2c_bus_num;  	u16 mux_id; -	u8 clk_id; -}; - -/** - * struct s5p_platform_fimc - camera host interface platform data - * - * @source_info: properties of an image source for the host interface setup - * @num_clients: the number of attached image sources - */ -struct s5p_platform_fimc { -	struct fimc_source_info *source_info; -	int num_clients;  };  /* diff --git a/include/media/lm3560.h b/include/media/lm3560.h new file mode 100644 index 00000000000..46670706d6f --- /dev/null +++ b/include/media/lm3560.h @@ -0,0 +1,97 @@ +/* + * include/media/lm3560.h + * + * Copyright (C) 2013 Texas Instruments + * + * Contact: Daniel Jeong <gshark.jeong@gmail.com> + *			Ldd-Mlp <ldd-mlp@list.ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __LM3560_H__ +#define __LM3560_H__ + +#include <media/v4l2-subdev.h> + +#define LM3560_NAME	"lm3560" +#define LM3560_I2C_ADDR	(0x53) + +/*  FLASH Brightness + *	min 62500uA, step 62500uA, max 1000000uA + */ +#define LM3560_FLASH_BRT_MIN 62500 +#define LM3560_FLASH_BRT_STEP 62500 +#define LM3560_FLASH_BRT_MAX 1000000 +#define LM3560_FLASH_BRT_uA_TO_REG(a)	\ +	((a) < LM3560_FLASH_BRT_MIN ? 0 :	\ +	 (((a) - LM3560_FLASH_BRT_MIN) / LM3560_FLASH_BRT_STEP)) +#define LM3560_FLASH_BRT_REG_TO_uA(a)		\ +	((a) * LM3560_FLASH_BRT_STEP + LM3560_FLASH_BRT_MIN) + +/*  FLASH TIMEOUT DURATION + *	min 32ms, step 32ms, max 1024ms + */ +#define LM3560_FLASH_TOUT_MIN 32 +#define LM3560_FLASH_TOUT_STEP 32 +#define LM3560_FLASH_TOUT_MAX 1024 +#define LM3560_FLASH_TOUT_ms_TO_REG(a)	\ +	((a) < LM3560_FLASH_TOUT_MIN ? 0 :	\ +	 (((a) - LM3560_FLASH_TOUT_MIN) / LM3560_FLASH_TOUT_STEP)) +#define LM3560_FLASH_TOUT_REG_TO_ms(a)		\ +	((a) * LM3560_FLASH_TOUT_STEP + LM3560_FLASH_TOUT_MIN) + +/*  TORCH BRT + *	min 31250uA, step 31250uA, max 250000uA + */ +#define LM3560_TORCH_BRT_MIN 31250 +#define LM3560_TORCH_BRT_STEP 31250 +#define LM3560_TORCH_BRT_MAX 250000 +#define LM3560_TORCH_BRT_uA_TO_REG(a)	\ +	((a) < LM3560_TORCH_BRT_MIN ? 0 :	\ +	 (((a) - LM3560_TORCH_BRT_MIN) / LM3560_TORCH_BRT_STEP)) +#define LM3560_TORCH_BRT_REG_TO_uA(a)		\ +	((a) * LM3560_TORCH_BRT_STEP + LM3560_TORCH_BRT_MIN) + +enum lm3560_led_id { +	LM3560_LED0 = 0, +	LM3560_LED1, +	LM3560_LED_MAX +}; + +enum lm3560_peak_current { +	LM3560_PEAK_1600mA = 0x00, +	LM3560_PEAK_2300mA = 0x20, +	LM3560_PEAK_3000mA = 0x40, +	LM3560_PEAK_3600mA = 0x60 +}; + +/* struct lm3560_platform_data + * + * @peak :  peak current + * @max_flash_timeout: flash timeout + * @max_flash_brt: flash mode led brightness + * @max_torch_brt: torch mode led brightness + */ +struct lm3560_platform_data { +	enum lm3560_peak_current peak; + +	u32 max_flash_timeout; +	u32 max_flash_brt[LM3560_LED_MAX]; +	u32 max_torch_brt[LM3560_LED_MAX]; +}; + +#endif /* __LM3560_H__ */ diff --git a/include/media/lm3646.h b/include/media/lm3646.h new file mode 100644 index 00000000000..c6acf5a1d64 --- /dev/null +++ b/include/media/lm3646.h @@ -0,0 +1,87 @@ +/* + * include/media/lm3646.h + * + * Copyright (C) 2014 Texas Instruments + * + * Contact: Daniel Jeong <gshark.jeong@gmail.com> + *			Ldd-Mlp <ldd-mlp@list.ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + */ + +#ifndef __LM3646_H__ +#define __LM3646_H__ + +#include <media/v4l2-subdev.h> + +#define LM3646_NAME	"lm3646" +#define LM3646_I2C_ADDR_REV1	(0x67) +#define LM3646_I2C_ADDR_REV0	(0x63) + +/*  TOTAL FLASH Brightness Max + *	min 93350uA, step 93750uA, max 1499600uA + */ +#define LM3646_TOTAL_FLASH_BRT_MIN 93350 +#define LM3646_TOTAL_FLASH_BRT_STEP 93750 +#define LM3646_TOTAL_FLASH_BRT_MAX 1499600 +#define LM3646_TOTAL_FLASH_BRT_uA_TO_REG(a)	\ +	((a) < LM3646_TOTAL_FLASH_BRT_MIN ? 0 :	\ +	 ((((a) - LM3646_TOTAL_FLASH_BRT_MIN) / LM3646_TOTAL_FLASH_BRT_STEP))) + +/*  TOTAL TORCH Brightness Max + *	min 23040uA, step 23430uA, max 187100uA + */ +#define LM3646_TOTAL_TORCH_BRT_MIN 23040 +#define LM3646_TOTAL_TORCH_BRT_STEP 23430 +#define LM3646_TOTAL_TORCH_BRT_MAX 187100 +#define LM3646_TOTAL_TORCH_BRT_uA_TO_REG(a)	\ +	((a) < LM3646_TOTAL_TORCH_BRT_MIN ? 0 :	\ +	 ((((a) - LM3646_TOTAL_TORCH_BRT_MIN) / LM3646_TOTAL_TORCH_BRT_STEP))) + +/*  LED1 FLASH Brightness + *	min 23040uA, step 11718uA, max 1499600uA + */ +#define LM3646_LED1_FLASH_BRT_MIN 23040 +#define LM3646_LED1_FLASH_BRT_STEP 11718 +#define LM3646_LED1_FLASH_BRT_MAX 1499600 +#define LM3646_LED1_FLASH_BRT_uA_TO_REG(a)	\ +	((a) <= LM3646_LED1_FLASH_BRT_MIN ? 0 :	\ +	 ((((a) - LM3646_LED1_FLASH_BRT_MIN) / LM3646_LED1_FLASH_BRT_STEP))+1) + +/*  LED1 TORCH Brightness + *	min 2530uA, step 1460uA, max 187100uA + */ +#define LM3646_LED1_TORCH_BRT_MIN 2530 +#define LM3646_LED1_TORCH_BRT_STEP 1460 +#define LM3646_LED1_TORCH_BRT_MAX 187100 +#define LM3646_LED1_TORCH_BRT_uA_TO_REG(a)	\ +	((a) <= LM3646_LED1_TORCH_BRT_MIN ? 0 :	\ +	 ((((a) - LM3646_LED1_TORCH_BRT_MIN) / LM3646_LED1_TORCH_BRT_STEP))+1) + +/*  FLASH TIMEOUT DURATION + *	min 50ms, step 50ms, max 400ms + */ +#define LM3646_FLASH_TOUT_MIN 50 +#define LM3646_FLASH_TOUT_STEP 50 +#define LM3646_FLASH_TOUT_MAX 400 +#define LM3646_FLASH_TOUT_ms_TO_REG(a)	\ +	((a) <= LM3646_FLASH_TOUT_MIN ? 0 :	\ +	 (((a) - LM3646_FLASH_TOUT_MIN) / LM3646_FLASH_TOUT_STEP)) + +/* struct lm3646_platform_data + * + * @flash_timeout: flash timeout + * @led1_flash_brt: led1 flash mode brightness, uA + * @led1_torch_brt: led1 torch mode brightness, uA + */ +struct lm3646_platform_data { + +	u32 flash_timeout; + +	u32 led1_flash_brt; +	u32 led1_torch_brt; +}; + +#endif /* __LM3646_H__ */ diff --git a/include/media/media-device.h b/include/media/media-device.h index 12155a9596c..6e6db78f1ee 100644 --- a/include/media/media-device.h +++ b/include/media/media-device.h @@ -87,7 +87,9 @@ struct media_device {  /* media_devnode to media_device */  #define to_media_device(node) container_of(node, struct media_device, devnode) -int __must_check media_device_register(struct media_device *mdev); +int __must_check __media_device_register(struct media_device *mdev, +					 struct module *owner); +#define media_device_register(mdev) __media_device_register(mdev, THIS_MODULE)  void media_device_unregister(struct media_device *mdev);  int __must_check media_device_register_entity(struct media_device *mdev, diff --git a/include/media/media-devnode.h b/include/media/media-devnode.h index 3446af279fc..0dc7060f962 100644 --- a/include/media/media-devnode.h +++ b/include/media/media-devnode.h @@ -82,7 +82,8 @@ struct media_devnode {  /* dev to media_devnode */  #define to_media_devnode(cd) container_of(cd, struct media_devnode, dev) -int __must_check media_devnode_register(struct media_devnode *mdev); +int __must_check media_devnode_register(struct media_devnode *mdev, +					struct module *owner);  void media_devnode_unregister(struct media_devnode *mdev);  static inline struct media_devnode *media_devnode_data(struct file *filp) diff --git a/include/media/media-entity.h b/include/media/media-entity.h index 10df5518798..e00459185d2 100644 --- a/include/media/media-entity.h +++ b/include/media/media-entity.h @@ -24,6 +24,7 @@  #define _MEDIA_ENTITY_H  #include <linux/bitops.h> +#include <linux/kernel.h>  #include <linux/list.h>  #include <linux/media.h> diff --git a/include/media/omap4iss.h b/include/media/omap4iss.h new file mode 100644 index 00000000000..0d7620db5e3 --- /dev/null +++ b/include/media/omap4iss.h @@ -0,0 +1,65 @@ +#ifndef ARCH_ARM_PLAT_OMAP4_ISS_H +#define ARCH_ARM_PLAT_OMAP4_ISS_H + +#include <linux/i2c.h> + +struct iss_device; + +enum iss_interface_type { +	ISS_INTERFACE_CSI2A_PHY1, +	ISS_INTERFACE_CSI2B_PHY2, +}; + +/** + * struct iss_csiphy_lane: CSI2 lane position and polarity + * @pos: position of the lane + * @pol: polarity of the lane + */ +struct iss_csiphy_lane { +	u8 pos; +	u8 pol; +}; + +#define ISS_CSIPHY1_NUM_DATA_LANES	4 +#define ISS_CSIPHY2_NUM_DATA_LANES	1 + +/** + * struct iss_csiphy_lanes_cfg - CSI2 lane configuration + * @data: Configuration of one or two data lanes + * @clk: Clock lane configuration + */ +struct iss_csiphy_lanes_cfg { +	struct iss_csiphy_lane data[ISS_CSIPHY1_NUM_DATA_LANES]; +	struct iss_csiphy_lane clk; +}; + +/** + * struct iss_csi2_platform_data - CSI2 interface platform data + * @crc: Enable the cyclic redundancy check + * @vpclk_div: Video port output clock control + */ +struct iss_csi2_platform_data { +	unsigned crc:1; +	unsigned vpclk_div:2; +	struct iss_csiphy_lanes_cfg lanecfg; +}; + +struct iss_subdev_i2c_board_info { +	struct i2c_board_info *board_info; +	int i2c_adapter_id; +}; + +struct iss_v4l2_subdevs_group { +	struct iss_subdev_i2c_board_info *subdevs; +	enum iss_interface_type interface; +	union { +		struct iss_csi2_platform_data csi2; +	} bus; /* gcc < 4.6.0 chokes on anonymous union initializers */ +}; + +struct iss_platform_data { +	struct iss_v4l2_subdevs_group *subdevs; +	void (*set_constraints)(struct iss_device *iss, bool enable); +}; + +#endif diff --git a/include/media/rc-core.h b/include/media/rc-core.h index 2f6f1f78d95..fde142e5f25 100644 --- a/include/media/rc-core.h +++ b/include/media/rc-core.h @@ -1,7 +1,7 @@  /*   * Remote Controller core header   * - * Copyright (C) 2009-2010 by Mauro Carvalho Chehab <mchehab@redhat.com> + * Copyright (C) 2009-2010 by Mauro Carvalho Chehab   *   * This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -35,8 +35,32 @@ enum rc_driver_type {  };  /** + * struct rc_scancode_filter - Filter scan codes. + * @data:	Scancode data to match. + * @mask:	Mask of bits of scancode to compare. + */ +struct rc_scancode_filter { +	u32 data; +	u32 mask; +}; + +/** + * enum rc_filter_type - Filter type constants. + * @RC_FILTER_NORMAL:	Filter for normal operation. + * @RC_FILTER_WAKEUP:	Filter for waking from suspend. + * @RC_FILTER_MAX:	Number of filter types. + */ +enum rc_filter_type { +	RC_FILTER_NORMAL = 0, +	RC_FILTER_WAKEUP, + +	RC_FILTER_MAX +}; + +/**   * struct rc_dev - represents a remote control device   * @dev: driver model's view of this device + * @sysfs_groups: sysfs attribute groups   * @input_name: name of the input child device   * @input_phys: physical path to the input child device   * @input_id: id of the input child device (struct input_id) @@ -50,8 +74,10 @@ enum rc_driver_type {   * @input_dev: the input child device used to communicate events to userspace   * @driver_type: specifies if protocol decoding is done in hardware or software   * @idle: used to keep track of RX state - * @allowed_protos: bitmask with the supported RC_BIT_* protocols - * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols + * @allowed_protocols: bitmask with the supported RC_BIT_* protocols for each + *	filter type + * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols for each + *	filter type   * @scanmask: some hardware decoders are not capable of providing the full   *	scancode to the application. As this is a hardware limit, we can't do   *	anything with it. Yet, as the same keycode table can be used with other @@ -70,7 +96,10 @@ enum rc_driver_type {   * @max_timeout: maximum timeout supported by device   * @rx_resolution : resolution (in ns) of input sampler   * @tx_resolution: resolution (in ns) of output sampler + * @scancode_filters: scancode filters (indexed by enum rc_filter_type)   * @change_protocol: allow changing the protocol used on hardware decoders + * @change_wakeup_protocol: allow changing the protocol used for wakeup + *	filtering   * @open: callback to allow drivers to enable polling/irq when IR input device   *	is opened.   * @close: callback to allow drivers to disable polling/irq when IR input device @@ -84,9 +113,12 @@ enum rc_driver_type {   *	device doesn't interrupt host until it sees IR pulses   * @s_learning_mode: enable wide band receiver used for learning   * @s_carrier_report: enable carrier reports + * @s_filter: set the scancode filter  + * @s_wakeup_filter: set the wakeup scancode filter   */  struct rc_dev {  	struct device			dev; +	const struct attribute_group	*sysfs_groups[5];  	const char			*input_name;  	const char			*input_phys;  	struct input_id			input_id; @@ -99,8 +131,8 @@ struct rc_dev {  	struct input_dev		*input_dev;  	enum rc_driver_type		driver_type;  	bool				idle; -	u64				allowed_protos; -	u64				enabled_protocols; +	u64				allowed_protocols[RC_FILTER_MAX]; +	u64				enabled_protocols[RC_FILTER_MAX];  	u32				users;  	u32				scanmask;  	void				*priv; @@ -116,7 +148,9 @@ struct rc_dev {  	u32				max_timeout;  	u32				rx_resolution;  	u32				tx_resolution; +	struct rc_scancode_filter	scancode_filters[RC_FILTER_MAX];  	int				(*change_protocol)(struct rc_dev *dev, u64 *rc_type); +	int				(*change_wakeup_protocol)(struct rc_dev *dev, u64 *rc_type);  	int				(*open)(struct rc_dev *dev);  	void				(*close)(struct rc_dev *dev);  	int				(*s_tx_mask)(struct rc_dev *dev, u32 mask); @@ -127,10 +161,50 @@ struct rc_dev {  	void				(*s_idle)(struct rc_dev *dev, bool enable);  	int				(*s_learning_mode)(struct rc_dev *dev, int enable);  	int				(*s_carrier_report) (struct rc_dev *dev, int enable); +	int				(*s_filter)(struct rc_dev *dev, +						    struct rc_scancode_filter *filter); +	int				(*s_wakeup_filter)(struct rc_dev *dev, +							   struct rc_scancode_filter *filter);  };  #define to_rc_dev(d) container_of(d, struct rc_dev, dev) +static inline bool rc_protocols_allowed(struct rc_dev *rdev, u64 protos) +{ +	return rdev->allowed_protocols[RC_FILTER_NORMAL] & protos; +} + +/* should be called prior to registration or with mutex held */ +static inline void rc_set_allowed_protocols(struct rc_dev *rdev, u64 protos) +{ +	rdev->allowed_protocols[RC_FILTER_NORMAL] = protos; +} + +static inline bool rc_protocols_enabled(struct rc_dev *rdev, u64 protos) +{ +	return rdev->enabled_protocols[RC_FILTER_NORMAL] & protos; +} + +/* should be called prior to registration or with mutex held */ +static inline void rc_set_enabled_protocols(struct rc_dev *rdev, u64 protos) +{ +	rdev->enabled_protocols[RC_FILTER_NORMAL] = protos; +} + +/* should be called prior to registration or with mutex held */ +static inline void rc_set_allowed_wakeup_protocols(struct rc_dev *rdev, +						   u64 protos) +{ +	rdev->allowed_protocols[RC_FILTER_WAKEUP] = protos; +} + +/* should be called prior to registration or with mutex held */ +static inline void rc_set_enabled_wakeup_protocols(struct rc_dev *rdev, +						   u64 protos) +{ +	rdev->enabled_protocols[RC_FILTER_WAKEUP] = protos; +} +  /*   * From rc-main.c   * Those functions can be used on any type of Remote Controller. They diff --git a/include/media/rc-map.h b/include/media/rc-map.h index 6628f5d01f5..e5aa2409c0e 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -1,7 +1,7 @@  /*   * rc-map.h - define RC map names used by RC drivers   * - * Copyright (c) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com> + * Copyright (c) 2010 by Mauro Carvalho Chehab   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ enum rc_type {  	RC_TYPE_RC6_6A_24	= 15,	/* Philips RC6-6A-24 protocol */  	RC_TYPE_RC6_6A_32	= 16,	/* Philips RC6-6A-32 protocol */  	RC_TYPE_RC6_MCE		= 17,	/* MCE (Philips RC6-6A-32 subtype) protocol */ +	RC_TYPE_SHARP		= 18,	/* Sharp protocol */  };  #define RC_BIT_NONE		0 @@ -51,6 +52,7 @@ enum rc_type {  #define RC_BIT_RC6_6A_24	(1 << RC_TYPE_RC6_6A_24)  #define RC_BIT_RC6_6A_32	(1 << RC_TYPE_RC6_6A_32)  #define RC_BIT_RC6_MCE		(1 << RC_TYPE_RC6_MCE) +#define RC_BIT_SHARP		(1 << RC_TYPE_SHARP)  #define RC_BIT_ALL	(RC_BIT_UNKNOWN | RC_BIT_OTHER | RC_BIT_LIRC | \  			 RC_BIT_RC5 | RC_BIT_RC5X | RC_BIT_RC5_SZ | \ @@ -58,7 +60,7 @@ enum rc_type {  			 RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20 | \  			 RC_BIT_NEC | RC_BIT_SANYO | RC_BIT_MCE_KBD | \  			 RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | \ -			 RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE) +			 RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | RC_BIT_SHARP)  struct rc_map_table {  	u32	scancode; @@ -193,6 +195,7 @@ void rc_map_init(void);  #define RC_MAP_VIDEOMATE_TV_PVR          "rc-videomate-tv-pvr"  #define RC_MAP_WINFAST                   "rc-winfast"  #define RC_MAP_WINFAST_USBII_DELUXE      "rc-winfast-usbii-deluxe" +#define RC_MAP_SU3000                    "rc-su3000"  /*   * Please, do not just append newer Remote Controller names at the end. diff --git a/include/media/saa6588.h b/include/media/saa6588.h index 2c3c4420a4e..b5ec1aa60ed 100644 --- a/include/media/saa6588.h +++ b/include/media/saa6588.h @@ -27,6 +27,7 @@  struct saa6588_command {  	unsigned int  block_count; +	bool          nonblocking;  	int           result;  	unsigned char __user *buffer;  	struct file   *instance; @@ -34,7 +35,6 @@ struct saa6588_command {  };  /* These ioctls are internal to the kernel */ -#define SAA6588_CMD_OPEN	_IOW('R', 1, int)  #define SAA6588_CMD_CLOSE	_IOW('R', 2, int)  #define SAA6588_CMD_READ	_IOR('R', 3, int)  #define SAA6588_CMD_POLL	_IOR('R', 4, int) diff --git a/include/media/saa6752hs.h b/include/media/saa6752hs.h deleted file mode 100644 index 3b8686ead80..00000000000 --- a/include/media/saa6752hs.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -    saa6752hs.h - definition for saa6752hs MPEG encoder - -    Copyright (C) 2003 Andrew de Quincey <adq@lidskialf.net> - -    This program is free software; you can redistribute it and/or modify -    it under the terms of the GNU General Public License as published by -    the Free Software Foundation; either version 2 of the License, or -    (at your option) any later version. - -    This program is distributed in the hope that it will be useful, -    but WITHOUT ANY WARRANTY; without even the implied warranty of -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -    GNU General Public License for more details. - -    You should have received a copy of the GNU General Public License -    along with this program; if not, write to the Free Software -    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - - -/* - * Local variables: - * c-basic-offset: 8 - * End: - */ diff --git a/include/media/si4713.h b/include/media/si4713.h index ed7353e8a98..f98a0a7af61 100644 --- a/include/media/si4713.h +++ b/include/media/si4713.h @@ -23,6 +23,8 @@   * Platform dependent definition   */  struct si4713_platform_data { +	const char * const *supply_names; +	unsigned supplies;  	int gpio_reset; /* < 0 if not used */  }; diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index 34d2414f2b8..865246b0012 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h @@ -146,9 +146,14 @@ struct soc_camera_subdev_desc {  	/* sensor driver private platform data */  	void *drv_priv; -	/* Optional regulators that have to be managed on power on/off events */ -	struct regulator_bulk_data *regulators; -	int num_regulators; +	/* +	 * Set unbalanced_power to true to deal with legacy drivers, failing to +	 * balance their calls to subdevice's .s_power() method. clock_state is +	 * then used internally by helper functions, it shouldn't be touched by +	 * drivers or the platform code. +	 */ +	bool unbalanced_power; +	unsigned long clock_state;  	/* Optional callbacks to power on or off and reset the sensor */  	int (*power)(struct device *, int); @@ -162,6 +167,9 @@ struct soc_camera_subdev_desc {  	int (*set_bus_param)(struct soc_camera_subdev_desc *, unsigned long flags);  	unsigned long (*query_bus_param)(struct soc_camera_subdev_desc *);  	void (*free_bus)(struct soc_camera_subdev_desc *); + +	/* Optional regulators that have to be managed on power on/off events */ +	struct v4l2_subdev_platform_data sd_pdata;  };  struct soc_camera_host_desc { @@ -202,9 +210,10 @@ struct soc_camera_link {  	void *priv; -	/* Optional regulators that have to be managed on power on/off events */ -	struct regulator_bulk_data *regulators; -	int num_regulators; +	/* Set by platforms to handle misbehaving drivers */ +	bool unbalanced_power; +	/* Used by soc-camera helper functions */ +	unsigned long clock_state;  	/* Optional callbacks to power on or off and reset the sensor */  	int (*power)(struct device *, int); @@ -218,6 +227,12 @@ struct soc_camera_link {  	unsigned long (*query_bus_param)(struct soc_camera_link *);  	void (*free_bus)(struct soc_camera_link *); +	/* Optional regulators that have to be managed on power on/off events */ +	struct regulator_bulk_data *regulators; +	int num_regulators; + +	void *host_priv; +  	/*  	 * Host part - keep at bottom and compatible to  	 * struct soc_camera_host_desc diff --git a/include/media/v4l2-clk.h b/include/media/v4l2-clk.h index 0503a90b48b..0b36cc13830 100644 --- a/include/media/v4l2-clk.h +++ b/include/media/v4l2-clk.h @@ -15,6 +15,7 @@  #define MEDIA_V4L2_CLK_H  #include <linux/atomic.h> +#include <linux/export.h>  #include <linux/list.h>  #include <linux/mutex.h> @@ -51,4 +52,20 @@ void v4l2_clk_disable(struct v4l2_clk *clk);  unsigned long v4l2_clk_get_rate(struct v4l2_clk *clk);  int v4l2_clk_set_rate(struct v4l2_clk *clk, unsigned long rate); +struct module; + +struct v4l2_clk *__v4l2_clk_register_fixed(const char *dev_id, +		const char *id, unsigned long rate, struct module *owner); +void v4l2_clk_unregister_fixed(struct v4l2_clk *clk); + +static inline struct v4l2_clk *v4l2_clk_register_fixed(const char *dev_id, +							const char *id, +							unsigned long rate) +{ +	return __v4l2_clk_register_fixed(dev_id, id, rate, THIS_MODULE); +} + +#define v4l2_clk_name_i2c(name, size, adap, client) snprintf(name, size, \ +			  "%d-%04x", adap, client) +  #endif diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 16550c43900..48f974866f1 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -35,7 +35,7 @@  	printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg)  #define v4l_client_printk(level, client, fmt, arg...)			    \ -	v4l_printk(level, (client)->driver->driver.name, (client)->adapter, \ +	v4l_printk(level, (client)->dev.driver->name, (client)->adapter, \  		   (client)->addr, fmt , ## arg)  #define v4l_err(client, fmt, arg...) \ @@ -86,7 +86,7 @@ int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,  		const char * const *menu_items);  const char *v4l2_ctrl_get_name(u32 id);  const char * const *v4l2_ctrl_get_menu(u32 id); -const s64 const *v4l2_ctrl_get_int_menu(u32 id, u32 *len); +const s64 *v4l2_ctrl_get_int_menu(u32 id, u32 *len);  int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def);  int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu,  		struct v4l2_queryctrl *qctrl, const char * const *menu_items); diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index 47ada23345a..16f7f260651 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -571,7 +571,7 @@ static inline void v4l2_ctrl_lock(struct v4l2_ctrl *ctrl)  	mutex_lock(ctrl->handler->lock);  } -/** v4l2_ctrl_lock() - Helper function to unlock the handler +/** v4l2_ctrl_unlock() - Helper function to unlock the handler    * associated with the control.    * @ctrl:	The control to unlock.    */ diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index c768c9f8abc..eec6e460f64 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h @@ -24,7 +24,8 @@  #define VFL_TYPE_VBI		1  #define VFL_TYPE_RADIO		2  #define VFL_TYPE_SUBDEV		3 -#define VFL_TYPE_MAX		4 +#define VFL_TYPE_SDR		4 +#define VFL_TYPE_MAX		5  /* Is this a receiver, transmitter or mem-to-mem? */  /* Ignored for VFL_TYPE_SUBDEV. */ diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h index c9b1593923f..ffb69da3ce9 100644 --- a/include/media/v4l2-device.h +++ b/include/media/v4l2-device.h @@ -120,6 +120,14 @@ void v4l2_device_unregister_subdev(struct v4l2_subdev *sd);  int __must_check  v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev); +/* Send a notification to v4l2_device. */ +static inline void v4l2_subdev_notify(struct v4l2_subdev *sd, +				      unsigned int notification, void *arg) +{ +	if (sd && sd->v4l2_dev && sd->v4l2_dev->notify) +		sd->v4l2_dev->notify(sd, notification, arg); +} +  /* Iterate over all subdevs. */  #define v4l2_device_for_each_subdev(sd, v4l2_dev)			\  	list_for_each_entry(sd, &(v4l2_dev)->subdevs, list) diff --git a/include/media/v4l2-event.h b/include/media/v4l2-event.h index be05d019de2..1ab9045e52e 100644 --- a/include/media/v4l2-event.h +++ b/include/media/v4l2-event.h @@ -132,4 +132,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,  void v4l2_event_unsubscribe_all(struct v4l2_fh *fh);  int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh,  				  struct v4l2_event_subscription *sub); +int v4l2_src_change_event_subscribe(struct v4l2_fh *fh, +				const struct v4l2_event_subscription *sub); +int v4l2_src_change_event_subdev_subscribe(struct v4l2_subdev *sd, +		struct v4l2_fh *fh, struct v4l2_event_subscription *sub);  #endif /* V4L2_EVENT_H */ diff --git a/include/media/v4l2-fh.h b/include/media/v4l2-fh.h index a62ee18cb7b..80351677516 100644 --- a/include/media/v4l2-fh.h +++ b/include/media/v4l2-fh.h @@ -26,7 +26,9 @@  #ifndef V4L2_FH_H  #define V4L2_FH_H +#include <linux/fs.h>  #include <linux/list.h> +#include <linux/videodev2.h>  struct video_device;  struct v4l2_ctrl_handler; @@ -43,6 +45,10 @@ struct v4l2_fh {  	struct list_head	available; /* Dequeueable event */  	unsigned int		navailable;  	u32			sequence; + +#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV) +	struct v4l2_m2m_ctx	*m2m_ctx; +#endif  };  /* diff --git a/include/media/v4l2-int-device.h b/include/media/v4l2-int-device.h deleted file mode 100644 index 0286c95814f..00000000000 --- a/include/media/v4l2-int-device.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * include/media/v4l2-int-device.h - * - * V4L2 internal ioctl interface. - * - * Copyright (C) 2007 Nokia Corporation. - * - * Contact: Sakari Ailus <sakari.ailus@nokia.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - -#ifndef V4L2_INT_DEVICE_H -#define V4L2_INT_DEVICE_H - -#include <media/v4l2-common.h> - -#define V4L2NAMESIZE 32 - -/* - * - * The internal V4L2 device interface core. - * - */ - -enum v4l2_int_type { -	v4l2_int_type_master = 1, -	v4l2_int_type_slave -}; - -struct module; - -struct v4l2_int_device; - -struct v4l2_int_master { -	int (*attach)(struct v4l2_int_device *slave); -	void (*detach)(struct v4l2_int_device *slave); -}; - -typedef int (v4l2_int_ioctl_func)(struct v4l2_int_device *); -typedef int (v4l2_int_ioctl_func_0)(struct v4l2_int_device *); -typedef int (v4l2_int_ioctl_func_1)(struct v4l2_int_device *, void *); - -struct v4l2_int_ioctl_desc { -	int num; -	v4l2_int_ioctl_func *func; -}; - -struct v4l2_int_slave { -	/* Don't touch master. */ -	struct v4l2_int_device *master; - -	char attach_to[V4L2NAMESIZE]; - -	int num_ioctls; -	struct v4l2_int_ioctl_desc *ioctls; -}; - -struct v4l2_int_device { -	/* Don't touch head. */ -	struct list_head head; - -	struct module *module; - -	char name[V4L2NAMESIZE]; - -	enum v4l2_int_type type; -	union { -		struct v4l2_int_master *master; -		struct v4l2_int_slave *slave; -	} u; - -	void *priv; -}; - -void v4l2_int_device_try_attach_all(void); - -int v4l2_int_device_register(struct v4l2_int_device *d); -void v4l2_int_device_unregister(struct v4l2_int_device *d); - -int v4l2_int_ioctl_0(struct v4l2_int_device *d, int cmd); -int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg); - -/* - * - * Types and definitions for IOCTL commands. - * - */ - -enum v4l2_power { -	V4L2_POWER_OFF = 0, -	V4L2_POWER_ON, -	V4L2_POWER_STANDBY, -}; - -/* Slave interface type. */ -enum v4l2_if_type { -	/* -	 * Parallel 8-, 10- or 12-bit interface, used by for example -	 * on certain image sensors. -	 */ -	V4L2_IF_TYPE_BT656, -}; - -enum v4l2_if_type_bt656_mode { -	/* -	 * Modes without Bt synchronisation codes. Separate -	 * synchronisation signal lines are used. -	 */ -	V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT, -	V4L2_IF_TYPE_BT656_MODE_NOBT_10BIT, -	V4L2_IF_TYPE_BT656_MODE_NOBT_12BIT, -	/* -	 * Use Bt synchronisation codes. The vertical and horizontal -	 * synchronisation is done based on synchronisation codes. -	 */ -	V4L2_IF_TYPE_BT656_MODE_BT_8BIT, -	V4L2_IF_TYPE_BT656_MODE_BT_10BIT, -}; - -struct v4l2_if_type_bt656 { -	/* -	 * 0: Frame begins when vsync is high. -	 * 1: Frame begins when vsync changes from low to high. -	 */ -	unsigned frame_start_on_rising_vs:1; -	/* Use Bt synchronisation codes for sync correction. */ -	unsigned bt_sync_correct:1; -	/* Swap every two adjacent image data elements. */ -	unsigned swap:1; -	/* Inverted latch clock polarity from slave. */ -	unsigned latch_clk_inv:1; -	/* Hs polarity. 0 is active high, 1 active low. */ -	unsigned nobt_hs_inv:1; -	/* Vs polarity. 0 is active high, 1 active low. */ -	unsigned nobt_vs_inv:1; -	enum v4l2_if_type_bt656_mode mode; -	/* Minimum accepted bus clock for slave (in Hz). */ -	u32 clock_min; -	/* Maximum accepted bus clock for slave. */ -	u32 clock_max; -	/* -	 * Current wish of the slave. May only change in response to -	 * ioctls that affect image capture. -	 */ -	u32 clock_curr; -}; - -struct v4l2_ifparm { -	enum v4l2_if_type if_type; -	union { -		struct v4l2_if_type_bt656 bt656; -	} u; -}; - -/* IOCTL command numbers. */ -enum v4l2_int_ioctl_num { -	/* -	 * -	 * "Proper" V4L ioctls, as in struct video_device. -	 * -	 */ -	vidioc_int_enum_fmt_cap_num = 1, -	vidioc_int_g_fmt_cap_num, -	vidioc_int_s_fmt_cap_num, -	vidioc_int_try_fmt_cap_num, -	vidioc_int_queryctrl_num, -	vidioc_int_g_ctrl_num, -	vidioc_int_s_ctrl_num, -	vidioc_int_cropcap_num, -	vidioc_int_g_crop_num, -	vidioc_int_s_crop_num, -	vidioc_int_g_parm_num, -	vidioc_int_s_parm_num, -	vidioc_int_querystd_num, -	vidioc_int_s_std_num, -	vidioc_int_s_video_routing_num, - -	/* -	 * -	 * Strictly internal ioctls. -	 * -	 */ -	/* Initialise the device when slave attaches to the master. */ -	vidioc_int_dev_init_num = 1000, -	/* Delinitialise the device at slave detach. */ -	vidioc_int_dev_exit_num, -	/* Set device power state. */ -	vidioc_int_s_power_num, -	/* -	* Get slave private data, e.g. platform-specific slave -	* configuration used by the master. -	*/ -	vidioc_int_g_priv_num, -	/* Get slave interface parameters. */ -	vidioc_int_g_ifparm_num, -	/* Does the slave need to be reset after VIDIOC_DQBUF? */ -	vidioc_int_g_needs_reset_num, -	vidioc_int_enum_framesizes_num, -	vidioc_int_enum_frameintervals_num, - -	/* -	 * -	 * VIDIOC_INT_* ioctls. -	 * -	 */ -	/* VIDIOC_INT_RESET */ -	vidioc_int_reset_num, -	/* VIDIOC_INT_INIT */ -	vidioc_int_init_num, - -	/* -	 * -	 * Start of private ioctls. -	 * -	 */ -	vidioc_int_priv_start_num = 2000, -}; - -/* - * - * IOCTL wrapper functions for better type checking. - * - */ - -#define V4L2_INT_WRAPPER_0(name)					\ -	static inline int vidioc_int_##name(struct v4l2_int_device *d)	\ -	{								\ -		return v4l2_int_ioctl_0(d, vidioc_int_##name##_num);	\ -	}								\ -									\ -	static inline struct v4l2_int_ioctl_desc			\ -	vidioc_int_##name##_cb(int (*func)				\ -			       (struct v4l2_int_device *))		\ -	{								\ -		struct v4l2_int_ioctl_desc desc;			\ -									\ -		desc.num = vidioc_int_##name##_num;			\ -		desc.func = (v4l2_int_ioctl_func *)func;		\ -									\ -		return desc;						\ -	} - -#define V4L2_INT_WRAPPER_1(name, arg_type, asterisk)			\ -	static inline int vidioc_int_##name(struct v4l2_int_device *d,	\ -					    arg_type asterisk arg)	\ -	{								\ -		return v4l2_int_ioctl_1(d, vidioc_int_##name##_num,	\ -					(void *)(unsigned long)arg);	\ -	}								\ -									\ -	static inline struct v4l2_int_ioctl_desc			\ -	vidioc_int_##name##_cb(int (*func)				\ -			       (struct v4l2_int_device *,		\ -				arg_type asterisk))			\ -	{								\ -		struct v4l2_int_ioctl_desc desc;			\ -									\ -		desc.num = vidioc_int_##name##_num;			\ -		desc.func = (v4l2_int_ioctl_func *)func;		\ -									\ -		return desc;						\ -	} - -V4L2_INT_WRAPPER_1(enum_fmt_cap, struct v4l2_fmtdesc, *); -V4L2_INT_WRAPPER_1(g_fmt_cap, struct v4l2_format, *); -V4L2_INT_WRAPPER_1(s_fmt_cap, struct v4l2_format, *); -V4L2_INT_WRAPPER_1(try_fmt_cap, struct v4l2_format, *); -V4L2_INT_WRAPPER_1(queryctrl, struct v4l2_queryctrl, *); -V4L2_INT_WRAPPER_1(g_ctrl, struct v4l2_control, *); -V4L2_INT_WRAPPER_1(s_ctrl, struct v4l2_control, *); -V4L2_INT_WRAPPER_1(cropcap, struct v4l2_cropcap, *); -V4L2_INT_WRAPPER_1(g_crop, struct v4l2_crop, *); -V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *); -V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *); -V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *); -V4L2_INT_WRAPPER_1(querystd, v4l2_std_id, *); -V4L2_INT_WRAPPER_1(s_std, v4l2_std_id, *); -V4L2_INT_WRAPPER_1(s_video_routing, struct v4l2_routing, *); - -V4L2_INT_WRAPPER_0(dev_init); -V4L2_INT_WRAPPER_0(dev_exit); -V4L2_INT_WRAPPER_1(s_power, enum v4l2_power, ); -V4L2_INT_WRAPPER_1(g_priv, void, *); -V4L2_INT_WRAPPER_1(g_ifparm, struct v4l2_ifparm, *); -V4L2_INT_WRAPPER_1(g_needs_reset, void, *); -V4L2_INT_WRAPPER_1(enum_framesizes, struct v4l2_frmsizeenum, *); -V4L2_INT_WRAPPER_1(enum_frameintervals, struct v4l2_frmivalenum, *); - -V4L2_INT_WRAPPER_0(reset); -V4L2_INT_WRAPPER_0(init); - -#endif diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h index e0b74a430b3..50cf7c110a7 100644 --- a/include/media/v4l2-ioctl.h +++ b/include/media/v4l2-ioctl.h @@ -40,6 +40,8 @@ struct v4l2_ioctl_ops {  					      struct v4l2_fmtdesc *f);  	int (*vidioc_enum_fmt_vid_out_mplane)(struct file *file, void *fh,  					      struct v4l2_fmtdesc *f); +	int (*vidioc_enum_fmt_sdr_cap)     (struct file *file, void *fh, +					    struct v4l2_fmtdesc *f);  	/* VIDIOC_G_FMT handlers */  	int (*vidioc_g_fmt_vid_cap)    (struct file *file, void *fh, @@ -62,6 +64,8 @@ struct v4l2_ioctl_ops {  					   struct v4l2_format *f);  	int (*vidioc_g_fmt_vid_out_mplane)(struct file *file, void *fh,  					   struct v4l2_format *f); +	int (*vidioc_g_fmt_sdr_cap)    (struct file *file, void *fh, +					struct v4l2_format *f);  	/* VIDIOC_S_FMT handlers */  	int (*vidioc_s_fmt_vid_cap)    (struct file *file, void *fh, @@ -84,6 +88,8 @@ struct v4l2_ioctl_ops {  					   struct v4l2_format *f);  	int (*vidioc_s_fmt_vid_out_mplane)(struct file *file, void *fh,  					   struct v4l2_format *f); +	int (*vidioc_s_fmt_sdr_cap)    (struct file *file, void *fh, +					struct v4l2_format *f);  	/* VIDIOC_TRY_FMT handlers */  	int (*vidioc_try_fmt_vid_cap)    (struct file *file, void *fh, @@ -106,6 +112,8 @@ struct v4l2_ioctl_ops {  					     struct v4l2_format *f);  	int (*vidioc_try_fmt_vid_out_mplane)(struct file *file, void *fh,  					     struct v4l2_format *f); +	int (*vidioc_try_fmt_sdr_cap)    (struct file *file, void *fh, +					  struct v4l2_format *f);  	/* Buffer handlers */  	int (*vidioc_reqbufs) (struct file *file, void *fh, struct v4l2_requestbuffers *b); @@ -265,6 +273,8 @@ struct v4l2_ioctl_ops {  				    struct v4l2_enum_dv_timings *timings);  	int (*vidioc_dv_timings_cap) (struct file *file, void *fh,  				    struct v4l2_dv_timings_cap *cap); +	int (*vidioc_g_edid) (struct file *file, void *fh, struct v4l2_edid *edid); +	int (*vidioc_s_edid) (struct file *file, void *fh, struct v4l2_edid *edid);  	int (*vidioc_subscribe_event)  (struct v4l2_fh *fh,  					const struct v4l2_event_subscription *sub); diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h index 44542a20ab8..12ea5a6a433 100644 --- a/include/media/v4l2-mem2mem.h +++ b/include/media/v4l2-mem2mem.h @@ -64,6 +64,9 @@ struct v4l2_m2m_queue_ctx {  };  struct v4l2_m2m_ctx { +	/* optional cap/out vb2 queues lock */ +	struct mutex			*q_lock; +  /* private: internal use only */  	struct v4l2_m2m_dev		*m2m_dev; @@ -229,5 +232,26 @@ static inline void *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)  	return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx);  } +/* v4l2 ioctl helpers */ + +int v4l2_m2m_ioctl_reqbufs(struct file *file, void *priv, +				struct v4l2_requestbuffers *rb); +int v4l2_m2m_ioctl_create_bufs(struct file *file, void *fh, +				struct v4l2_create_buffers *create); +int v4l2_m2m_ioctl_querybuf(struct file *file, void *fh, +				struct v4l2_buffer *buf); +int v4l2_m2m_ioctl_expbuf(struct file *file, void *fh, +				struct v4l2_exportbuffer *eb); +int v4l2_m2m_ioctl_qbuf(struct file *file, void *fh, +				struct v4l2_buffer *buf); +int v4l2_m2m_ioctl_dqbuf(struct file *file, void *fh, +				struct v4l2_buffer *buf); +int v4l2_m2m_ioctl_streamon(struct file *file, void *fh, +				enum v4l2_buf_type type); +int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh, +				enum v4l2_buf_type type); +int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma); +unsigned int v4l2_m2m_fop_poll(struct file *file, poll_table *wait); +  #endif /* _MEDIA_V4L2_MEM2MEM_H */ diff --git a/include/media/v4l2-of.h b/include/media/v4l2-of.h index 3a8a84124b4..70fa7b7b048 100644 --- a/include/media/v4l2-of.h +++ b/include/media/v4l2-of.h @@ -17,6 +17,7 @@  #include <linux/list.h>  #include <linux/types.h>  #include <linux/errno.h> +#include <linux/of_graph.h>  #include <media/v4l2-mediabus.h> @@ -50,19 +51,13 @@ struct v4l2_of_bus_parallel {  /**   * struct v4l2_of_endpoint - the endpoint data structure - * @port: identifier (value of reg property) of a port this endpoint belongs to - * @id: identifier (value of reg property) of this endpoint - * @local_node: pointer to device_node of this endpoint - * @remote: phandle to remote endpoint node + * @base: struct of_endpoint containing port, id, and local of_node   * @bus_type: bus type   * @bus: bus configuration data structure   * @head: list head for this structure   */  struct v4l2_of_endpoint { -	unsigned int port; -	unsigned int id; -	const struct device_node *local_node; -	const __be32 *remote; +	struct of_endpoint base;  	enum v4l2_mbus_type bus_type;  	union {  		struct v4l2_of_bus_parallel parallel; @@ -72,13 +67,8 @@ struct v4l2_of_endpoint {  };  #ifdef CONFIG_OF -void v4l2_of_parse_endpoint(const struct device_node *node, -				struct v4l2_of_endpoint *link); -struct device_node *v4l2_of_get_next_endpoint(const struct device_node *parent, -					struct device_node *previous); -struct device_node *v4l2_of_get_remote_port_parent( -					const struct device_node *node); -struct device_node *v4l2_of_get_remote_port(const struct device_node *node); +int v4l2_of_parse_endpoint(const struct device_node *node, +			   struct v4l2_of_endpoint *endpoint);  #else /* CONFIG_OF */  static inline int v4l2_of_parse_endpoint(const struct device_node *node, @@ -87,25 +77,6 @@ static inline int v4l2_of_parse_endpoint(const struct device_node *node,  	return -ENOSYS;  } -static inline struct device_node *v4l2_of_get_next_endpoint( -					const struct device_node *parent, -					struct device_node *previous) -{ -	return NULL; -} - -static inline struct device_node *v4l2_of_get_remote_port_parent( -					const struct device_node *node) -{ -	return NULL; -} - -static inline struct device_node *v4l2_of_get_remote_port( -					const struct device_node *node) -{ -	return NULL; -} -  #endif /* CONFIG_OF */  #endif /* _V4L2_OF_H */ diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index bfda0fe9aeb..d7465725773 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -159,9 +159,11 @@ struct v4l2_subdev_core_ops {  	int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);  	int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);  	int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm); -	int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm); -	int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);  	long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg); +#ifdef CONFIG_COMPAT +	long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd, +			       unsigned long arg); +#endif  #ifdef CONFIG_VIDEO_ADV_DEBUG  	int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);  	int (*s_register)(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg); @@ -192,6 +194,7 @@ struct v4l2_subdev_tuner_ops {  	int (*s_radio)(struct v4l2_subdev *sd);  	int (*s_frequency)(struct v4l2_subdev *sd, const struct v4l2_frequency *freq);  	int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq); +	int (*enum_freq_bands)(struct v4l2_subdev *sd, struct v4l2_frequency_band *band);  	int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);  	int (*s_tuner)(struct v4l2_subdev *sd, const struct v4l2_tuner *vt);  	int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm); @@ -229,15 +232,18 @@ struct v4l2_subdev_audio_ops {  /* Indicates the @length field specifies maximum data length. */  #define V4L2_MBUS_FRAME_DESC_FL_LEN_MAX		(1U << 0) -/* Indicates user defined data format, i.e. non standard frame format. */ +/* + * Indicates that the format does not have line offsets, i.e. the + * receiver should use 1D DMA. + */  #define V4L2_MBUS_FRAME_DESC_FL_BLOB		(1U << 1)  /**   * struct v4l2_mbus_frame_desc_entry - media bus frame description structure   * @flags: V4L2_MBUS_FRAME_DESC_FL_* flags   * @pixelcode: media bus pixel code, valid if FRAME_DESC_FL_BLOB is not set - * @length: number of octets per frame, valid for compressed or unspecified - *          formats + * @length: number of octets per frame, valid if V4L2_MBUS_FRAME_DESC_FL_BLOB + *	    is set   */  struct v4l2_mbus_frame_desc_entry {  	u16 flags; @@ -264,8 +270,11 @@ struct v4l2_mbus_frame_desc {     g_std_output: get current standard for video OUTPUT devices. This is ignored  	by video input devices. -   g_tvnorms_output: get v4l2_std_id with all standards supported by video -	OUTPUT device. This is ignored by video input devices. +   g_tvnorms: get v4l2_std_id with all standards supported by the video +	CAPTURE device. This is ignored by video output devices. + +   g_tvnorms_output: get v4l2_std_id with all standards supported by the video +	OUTPUT device. This is ignored by video capture devices.     s_crystal_freq: sets the frequency of the crystal used to generate the  	clocks in Hz. An extra flags field allows device specific configuration @@ -305,9 +314,12 @@ struct v4l2_mbus_frame_desc {  struct v4l2_subdev_video_ops {  	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);  	int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags); +	int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm); +	int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);  	int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);  	int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);  	int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std); +	int (*g_tvnorms)(struct v4l2_subdev *sd, v4l2_std_id *std);  	int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);  	int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);  	int (*s_stream)(struct v4l2_subdev *sd, int enable); @@ -326,12 +338,8 @@ struct v4l2_subdev_video_ops {  			struct v4l2_dv_timings *timings);  	int (*g_dv_timings)(struct v4l2_subdev *sd,  			struct v4l2_dv_timings *timings); -	int (*enum_dv_timings)(struct v4l2_subdev *sd, -			struct v4l2_enum_dv_timings *timings);  	int (*query_dv_timings)(struct v4l2_subdev *sd,  			struct v4l2_dv_timings *timings); -	int (*dv_timings_cap)(struct v4l2_subdev *sd, -			struct v4l2_dv_timings_cap *cap);  	int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,  			     enum v4l2_mbus_pixelcode *code);  	int (*enum_mbus_fsizes)(struct v4l2_subdev *sd, @@ -503,8 +511,12 @@ struct v4l2_subdev_pad_ops {  			     struct v4l2_subdev_selection *sel);  	int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,  			     struct v4l2_subdev_selection *sel); -	int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid); -	int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid); +	int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); +	int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); +	int (*dv_timings_cap)(struct v4l2_subdev *sd, +			      struct v4l2_dv_timings_cap *cap); +	int (*enum_dv_timings)(struct v4l2_subdev *sd, +			       struct v4l2_enum_dv_timings *timings);  #ifdef CONFIG_MEDIA_CONTROLLER  	int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,  			     struct v4l2_subdev_format *source_fmt, @@ -559,6 +571,17 @@ struct v4l2_subdev_internal_ops {  /* Set this flag if this subdev generates events. */  #define V4L2_SUBDEV_FL_HAS_EVENTS		(1U << 3) +struct regulator_bulk_data; + +struct v4l2_subdev_platform_data { +	/* Optional regulators uset to power on/off the subdevice */ +	struct regulator_bulk_data *regulators; +	int num_regulators; + +	/* Per-subdevice data, specific for a certain video host device */ +	void *host_priv; +}; +  /* Each instance of a subdev driver should create this struct, either     stand-alone or embedded in a larger struct.   */ @@ -568,6 +591,7 @@ struct v4l2_subdev {  #endif  	struct list_head list;  	struct module *owner; +	bool owner_v4l2_dev;  	u32 flags;  	struct v4l2_device *v4l2_dev;  	const struct v4l2_subdev_ops *ops; @@ -592,6 +616,8 @@ struct v4l2_subdev {  	struct v4l2_async_subdev *asd;  	/* Pointer to the managing notifier. */  	struct v4l2_async_notifier *notifier; +	/* common part of subdevice platform data */ +	struct v4l2_subdev_platform_data *pdata;  };  #define media_entity_to_v4l2_subdev(ent) \ @@ -622,13 +648,13 @@ struct v4l2_subdev_fh {  	v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh,	\  				       unsigned int pad)		\  	{								\ -		BUG_ON(unlikely(pad >= vdev_to_v4l2_subdev(		\ -					fh->vfh.vdev)->entity.num_pads)); \ +		BUG_ON(pad >= vdev_to_v4l2_subdev(			\ +					fh->vfh.vdev)->entity.num_pads); \  		return &fh->pad[pad].field_name;			\  	}  __V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt) -__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_compose) +__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_crop)  __V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)  #endif @@ -667,17 +693,12 @@ void v4l2_subdev_init(struct v4l2_subdev *sd,  /* Call an ops of a v4l2_subdev, doing the right checks against     NULL pointers. -   Example: err = v4l2_subdev_call(sd, core, s_std, norm); +   Example: err = v4l2_subdev_call(sd, video, s_std, norm);   */  #define v4l2_subdev_call(sd, o, f, args...)				\  	(!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ?	\  		(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) -/* Send a notification to v4l2_device. */ -#define v4l2_subdev_notify(sd, notification, arg)			   \ -	((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \ -	 (sd)->v4l2_dev->notify((sd), (notification), (arg))) -  #define v4l2_subdev_has_op(sd, o, f) \  	((sd)->ops->o && (sd)->ops->o->f) diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index 6781258d0b6..8fab6fa0dbf 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -20,6 +20,7 @@  struct vb2_alloc_ctx;  struct vb2_fileio_data; +struct vb2_threadio_data;  /**   * struct vb2_mem_ops - memory handling/memory allocator operations @@ -34,56 +35,56 @@ struct vb2_fileio_data;   *		usually will result in the allocator freeing the buffer (if   *		no other users of this buffer are present); the buf_priv   *		argument is the allocator private per-buffer structure - *		previously returned from the alloc callback + *		previously returned from the alloc callback.   * @get_userptr: acquire userspace memory for a hardware operation; used for   *		 USERPTR memory types; vaddr is the address passed to the   *		 videobuf layer when queuing a video buffer of USERPTR type;   *		 should return an allocator private per-buffer structure   *		 associated with the buffer on success, NULL on failure;   *		 the returned private structure will then be passed as buf_priv - *		 argument to other ops in this structure + *		 argument to other ops in this structure.   * @put_userptr: inform the allocator that a USERPTR buffer will no longer - *		 be used + *		 be used.   * @attach_dmabuf: attach a shared struct dma_buf for a hardware operation;   *		   used for DMABUF memory types; alloc_ctx is the alloc context   *		   dbuf is the shared dma_buf; returns NULL on failure;   *		   allocator private per-buffer structure on success; - *		   this needs to be used for further accesses to the buffer + *		   this needs to be used for further accesses to the buffer.   * @detach_dmabuf: inform the exporter of the buffer that the current DMABUF   *		   buffer is no longer used; the buf_priv argument is the   *		   allocator private per-buffer structure previously returned - *		   from the attach_dmabuf callback + *		   from the attach_dmabuf callback.   * @map_dmabuf: request for access to the dmabuf from allocator; the allocator   *		of dmabuf is informed that this driver is going to use the - *		dmabuf + *		dmabuf.   * @unmap_dmabuf: releases access control to the dmabuf - allocator is notified - *		  that this driver is done using the dmabuf for now + *		  that this driver is done using the dmabuf for now.   * @prepare:	called every time the buffer is passed from userspace to the - *		driver, useful for cache synchronisation, optional + *		driver, useful for cache synchronisation, optional.   * @finish:	called every time the buffer is passed back from the driver - *		to the userspace, also optional + *		to the userspace, also optional.   * @vaddr:	return a kernel virtual address to a given memory buffer   *		associated with the passed private structure or NULL if no - *		such mapping exists + *		such mapping exists.   * @cookie:	return allocator specific cookie for a given memory buffer   *		associated with the passed private structure or NULL if not - *		available + *		available.   * @num_users:	return the current number of users of a memory buffer;   *		return 1 if the videobuf layer (or actually the driver using - *		it) is the only user + *		it) is the only user.   * @mmap:	setup a userspace mapping for a given memory buffer under - *		the provided virtual memory region + *		the provided virtual memory region.   *   * Required ops for USERPTR types: get_userptr, put_userptr.   * Required ops for MMAP types: alloc, put, num_users, mmap. - * Required ops for read/write access types: alloc, put, num_users, vaddr + * Required ops for read/write access types: alloc, put, num_users, vaddr.   * Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf,   *				  unmap_dmabuf.   */  struct vb2_mem_ops {  	void		*(*alloc)(void *alloc_ctx, unsigned long size, gfp_t gfp_flags);  	void		(*put)(void *buf_priv); -	struct dma_buf *(*get_dmabuf)(void *buf_priv); +	struct dma_buf *(*get_dmabuf)(void *buf_priv, unsigned long flags);  	void		*(*get_userptr)(void *alloc_ctx, unsigned long vaddr,  					unsigned long size, int write); @@ -142,6 +143,7 @@ enum vb2_fileio_flags {  /**   * enum vb2_buffer_state - current video buffer state   * @VB2_BUF_STATE_DEQUEUED:	buffer under userspace control + * @VB2_BUF_STATE_PREPARING:	buffer is being prepared in videobuf   * @VB2_BUF_STATE_PREPARED:	buffer prepared in videobuf and by the driver   * @VB2_BUF_STATE_QUEUED:	buffer queued in videobuf, but not in driver   * @VB2_BUF_STATE_ACTIVE:	buffer queued in driver and possibly used @@ -154,6 +156,7 @@ enum vb2_fileio_flags {   */  enum vb2_buffer_state {  	VB2_BUF_STATE_DEQUEUED, +	VB2_BUF_STATE_PREPARING,  	VB2_BUF_STATE_PREPARED,  	VB2_BUF_STATE_QUEUED,  	VB2_BUF_STATE_ACTIVE, @@ -201,6 +204,37 @@ struct vb2_buffer {  	struct list_head	done_entry;  	struct vb2_plane	planes[VIDEO_MAX_PLANES]; + +#ifdef CONFIG_VIDEO_ADV_DEBUG +	/* +	 * Counters for how often these buffer-related ops are +	 * called. Used to check for unbalanced ops. +	 */ +	u32		cnt_mem_alloc; +	u32		cnt_mem_put; +	u32		cnt_mem_get_dmabuf; +	u32		cnt_mem_get_userptr; +	u32		cnt_mem_put_userptr; +	u32		cnt_mem_prepare; +	u32		cnt_mem_finish; +	u32		cnt_mem_attach_dmabuf; +	u32		cnt_mem_detach_dmabuf; +	u32		cnt_mem_map_dmabuf; +	u32		cnt_mem_unmap_dmabuf; +	u32		cnt_mem_vaddr; +	u32		cnt_mem_cookie; +	u32		cnt_mem_num_users; +	u32		cnt_mem_mmap; + +	u32		cnt_buf_init; +	u32		cnt_buf_prepare; +	u32		cnt_buf_finish; +	u32		cnt_buf_cleanup; +	u32		cnt_buf_queue; + +	/* This counts the number of calls to vb2_buffer_done() */ +	u32		cnt_buf_done; +#endif  };  /** @@ -225,35 +259,46 @@ struct vb2_buffer {   * @wait_prepare:	release any locks taken while calling vb2 functions;   *			it is called before an ioctl needs to wait for a new   *			buffer to arrive; required to avoid a deadlock in - *			blocking access type + *			blocking access type.   * @wait_finish:	reacquire all locks released in the previous callback;   *			required to continue operation after sleeping while - *			waiting for a new buffer to arrive + *			waiting for a new buffer to arrive.   * @buf_init:		called once after allocating a buffer (in MMAP case)   *			or after acquiring a new USERPTR buffer; drivers may   *			perform additional buffer-related initialization;   *			initialization failure (return != 0) will prevent - *			queue setup from completing successfully; optional + *			queue setup from completing successfully; optional.   * @buf_prepare:	called every time the buffer is queued from userspace   *			and from the VIDIOC_PREPARE_BUF ioctl; drivers may   *			perform any initialization required before each hardware   *			operation in this callback; drivers that support   *			VIDIOC_CREATE_BUFS must also validate the buffer size;   *			if an error is returned, the buffer will not be queued - *			in driver; optional + *			in driver; optional.   * @buf_finish:		called before every dequeue of the buffer back to   *			userspace; drivers may perform any operations required - *			before userspace accesses the buffer; optional + *			before userspace accesses the buffer; optional. The + *			buffer state can be one of the following: DONE and + *			ERROR occur while streaming is in progress, and the + *			PREPARED state occurs when the queue has been canceled + *			and all pending buffers are being returned to their + *			default DEQUEUED state. Typically you only have to do + *			something if the state is VB2_BUF_STATE_DONE, since in + *			all other cases the buffer contents will be ignored + *			anyway.   * @buf_cleanup:	called once before the buffer is freed; drivers may - *			perform any additional cleanup; optional + *			perform any additional cleanup; optional.   * @start_streaming:	called once to enter 'streaming' state; the driver may   *			receive buffers with @buf_queue callback before   *			@start_streaming is called; the driver gets the number   *			of already queued buffers in count parameter; driver - *			can return an error if hardware fails or not enough - *			buffers has been queued, in such case all buffers that - *			have been already given by the @buf_queue callback are - *			invalidated. + *			can return an error if hardware fails, in that case all + *			buffers that have been already given by the @buf_queue + *			callback are invalidated. + *			If there were not enough queued buffers to start + *			streaming, then this callback returns -ENOBUFS, and the + *			vb2 core will retry calling @start_streaming when a new + *			buffer is queued.   * @stop_streaming:	called when 'streaming' state must be disabled; driver   *			should stop any DMA transactions or wait until they   *			finish and give back all buffers it got from buf_queue() @@ -263,7 +308,7 @@ struct vb2_buffer {   *			the buffer back by calling vb2_buffer_done() function;   *			it is allways called after calling STREAMON ioctl;   *			might be called before start_streaming callback if user - *			pre-queued buffers before calling STREAMON + *			pre-queued buffers before calling STREAMON.   */  struct vb2_ops {  	int (*queue_setup)(struct vb2_queue *q, const struct v4l2_format *fmt, @@ -275,11 +320,11 @@ struct vb2_ops {  	int (*buf_init)(struct vb2_buffer *vb);  	int (*buf_prepare)(struct vb2_buffer *vb); -	int (*buf_finish)(struct vb2_buffer *vb); +	void (*buf_finish)(struct vb2_buffer *vb);  	void (*buf_cleanup)(struct vb2_buffer *vb);  	int (*start_streaming)(struct vb2_queue *q, unsigned int count); -	int (*stop_streaming)(struct vb2_queue *q); +	void (*stop_streaming)(struct vb2_queue *q);  	void (*buf_queue)(struct vb2_buffer *vb);  }; @@ -307,21 +352,31 @@ struct v4l2_fh;   * @buf_struct_size: size of the driver-specific buffer structure;   *		"0" indicates the driver doesn't want to use a custom buffer   *		structure type, so sizeof(struct vb2_buffer) will is used + * @timestamp_flags: Timestamp flags; V4L2_BUF_FLAGS_TIMESTAMP_* and + *		V4L2_BUF_FLAGS_TSTAMP_SRC_*   * @gfp_flags:	additional gfp flags used when allocating the buffers.   *		Typically this is 0, but it may be e.g. GFP_DMA or __GFP_DMA32   *		to force the buffer allocation to a specific memory zone. + * @min_buffers_needed: the minimum number of buffers needed before + *		start_streaming() can be called. Used when a DMA engine + *		cannot be started unless at least this number of buffers + *		have been queued into the driver.   *   * @memory:	current memory type used   * @bufs:	videobuf buffer structures   * @num_buffers: number of allocated/used buffers   * @queued_list: list of buffers currently queued from userspace - * @queued_count: number of buffers owned by the driver + * @queued_count: number of buffers queued and ready for streaming. + * @owned_by_drv_count: number of buffers owned by the driver   * @done_list:	list of buffers ready to be dequeued to userspace   * @done_lock:	lock to protect done_list list   * @done_wq:	waitqueue for processes waiting for buffers ready to be dequeued   * @alloc_ctx:	memory type/allocator-specific contexts for each plane   * @streaming:	current streaming state + * @start_streaming_called: start_streaming() was called successfully and we + *		started streaming.   * @fileio:	file io emulator internal data, used only if emulator is active + * @threadio:	thread io internal data, used only if thread is active   */  struct vb2_queue {  	enum v4l2_buf_type		type; @@ -334,8 +389,9 @@ struct vb2_queue {  	const struct vb2_mem_ops	*mem_ops;  	void				*drv_priv;  	unsigned int			buf_struct_size; -	u32				timestamp_type; +	u32				timestamp_flags;  	gfp_t				gfp_flags; +	u32				min_buffers_needed;  /* private: internal use only */  	enum v4l2_memory		memory; @@ -343,8 +399,9 @@ struct vb2_queue {  	unsigned int			num_buffers;  	struct list_head		queued_list; +	unsigned int			queued_count; -	atomic_t			queued_count; +	atomic_t			owned_by_drv_count;  	struct list_head		done_list;  	spinlock_t			done_lock;  	wait_queue_head_t		done_wq; @@ -353,14 +410,29 @@ struct vb2_queue {  	unsigned int			plane_sizes[VIDEO_MAX_PLANES];  	unsigned int			streaming:1; +	unsigned int			start_streaming_called:1;  	struct vb2_fileio_data		*fileio; +	struct vb2_threadio_data	*threadio; + +#ifdef CONFIG_VIDEO_ADV_DEBUG +	/* +	 * Counters for how often these queue-related ops are +	 * called. Used to check for unbalanced ops. +	 */ +	u32				cnt_queue_setup; +	u32				cnt_wait_prepare; +	u32				cnt_wait_finish; +	u32				cnt_start_streaming; +	u32				cnt_stop_streaming; +#endif  };  void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no);  void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no);  void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state); +void vb2_discard_done(struct vb2_queue *q);  int vb2_wait_for_all_buffers(struct vb2_queue *q);  int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b); @@ -391,8 +463,37 @@ unsigned long vb2_get_unmapped_area(struct vb2_queue *q,  unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait);  size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count,  		loff_t *ppos, int nonblock); -size_t vb2_write(struct vb2_queue *q, char __user *data, size_t count, +size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count,  		loff_t *ppos, int nonblock); +/** + * vb2_thread_fnc - callback function for use with vb2_thread + * + * This is called whenever a buffer is dequeued in the thread. + */ +typedef int (*vb2_thread_fnc)(struct vb2_buffer *vb, void *priv); + +/** + * vb2_thread_start() - start a thread for the given queue. + * @q:		videobuf queue + * @fnc:	callback function + * @priv:	priv pointer passed to the callback function + * @thread_name:the name of the thread. This will be prefixed with "vb2-". + * + * This starts a thread that will queue and dequeue until an error occurs + * or @vb2_thread_stop is called. + * + * This function should not be used for anything else but the videobuf2-dvb + * support. If you think you have another good use-case for this, then please + * contact the linux-media mailinglist first. + */ +int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, +		     const char *thread_name); + +/** + * vb2_thread_stop() - stop the thread for the given queue. + * @q:		videobuf queue + */ +int vb2_thread_stop(struct vb2_queue *q);  /**   * vb2_is_streaming() - return streaming status of the queue @@ -404,6 +505,23 @@ static inline bool vb2_is_streaming(struct vb2_queue *q)  }  /** + * vb2_fileio_is_active() - return true if fileio is active. + * @q:		videobuf queue + * + * This returns true if read() or write() is used to stream the data + * as opposed to stream I/O. This is almost never an important distinction, + * except in rare cases. One such case is that using read() or write() to + * stream a format using V4L2_FIELD_ALTERNATE is not allowed since there + * is no way you can pass the field information of each buffer to/from + * userspace. A driver that supports this field format should check for + * this in the queue_setup op and reject it if this function returns true. + */ +static inline bool vb2_fileio_is_active(struct vb2_queue *q) +{ +	return q->fileio; +} + +/**   * vb2_is_busy() - return busy status of the queue   * @q:		videobuf queue   * @@ -491,7 +609,8 @@ int vb2_ioctl_expbuf(struct file *file, void *priv,  int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma);  int vb2_fop_release(struct file *file); -ssize_t vb2_fop_write(struct file *file, char __user *buf, +int _vb2_fop_release(struct file *file, struct mutex *lock); +ssize_t vb2_fop_write(struct file *file, const char __user *buf,  		size_t count, loff_t *ppos);  ssize_t vb2_fop_read(struct file *file, char __user *buf,  		size_t count, loff_t *ppos); diff --git a/include/media/videobuf2-dma-sg.h b/include/media/videobuf2-dma-sg.h index 0038526b8ef..7b89852779a 100644 --- a/include/media/videobuf2-dma-sg.h +++ b/include/media/videobuf2-dma-sg.h @@ -15,16 +15,10 @@  #include <media/videobuf2-core.h> -struct vb2_dma_sg_desc { -	unsigned long		size; -	unsigned int		num_pages; -	struct scatterlist	*sglist; -}; - -static inline struct vb2_dma_sg_desc *vb2_dma_sg_plane_desc( +static inline struct sg_table *vb2_dma_sg_plane_desc(  		struct vb2_buffer *vb, unsigned int plane_no)  { -	return (struct vb2_dma_sg_desc *)vb2_plane_cookie(vb, plane_no); +	return (struct sg_table *)vb2_plane_cookie(vb, plane_no);  }  extern const struct vb2_mem_ops vb2_dma_sg_memops; diff --git a/include/media/videobuf2-dvb.h b/include/media/videobuf2-dvb.h new file mode 100644 index 00000000000..8f61456f139 --- /dev/null +++ b/include/media/videobuf2-dvb.h @@ -0,0 +1,58 @@ +#ifndef _VIDEOBUF2_DVB_H_ +#define	_VIDEOBUF2_DVB_H_ + +#include <dvbdev.h> +#include <dmxdev.h> +#include <dvb_demux.h> +#include <dvb_net.h> +#include <dvb_frontend.h> +#include <media/videobuf2-core.h> + +struct vb2_dvb { +	/* filling that the job of the driver */ +	char			*name; +	struct dvb_frontend	*frontend; +	struct vb2_queue	dvbq; + +	/* video-buf-dvb state info */ +	struct mutex		lock; +	int			nfeeds; + +	/* vb2_dvb_(un)register manages this */ +	struct dvb_demux	demux; +	struct dmxdev		dmxdev; +	struct dmx_frontend	fe_hw; +	struct dmx_frontend	fe_mem; +	struct dvb_net		net; +}; + +struct vb2_dvb_frontend { +	struct list_head felist; +	int id; +	struct vb2_dvb dvb; +}; + +struct vb2_dvb_frontends { +	struct list_head felist; +	struct mutex lock; +	struct dvb_adapter adapter; +	int active_fe_id; /* Indicates which frontend in the felist is in use */ +	int gate; /* Frontend with gate control 0=!MFE,1=fe0,2=fe1 etc */ +}; + +int vb2_dvb_register_bus(struct vb2_dvb_frontends *f, +			 struct module *module, +			 void *adapter_priv, +			 struct device *device, +			 short *adapter_nr, +			 int mfe_shared); + +void vb2_dvb_unregister_bus(struct vb2_dvb_frontends *f); + +struct vb2_dvb_frontend *vb2_dvb_alloc_frontend(struct vb2_dvb_frontends *f, int id); +void vb2_dvb_dealloc_frontends(struct vb2_dvb_frontends *f); + +struct vb2_dvb_frontend *vb2_dvb_get_frontend(struct vb2_dvb_frontends *f, int id); +int vb2_dvb_find_frontend(struct vb2_dvb_frontends *f, struct dvb_frontend *p); + +#endif			/* _VIDEOBUF2_DVB_H_ */  | 
