On 02/21/18 16:14, Sakari Ailus wrote: > Hi Hans, > > On Wed, Feb 21, 2018 at 03:33:03PM +0100, Hans Verkuil wrote: >> On 02/21/18 15:15, Sakari Ailus wrote: >>> Hi Hans, >>> >>> On Mon, Feb 19, 2018 at 11:38:06AM +0100, Hans Verkuil wrote: >>>> The media.h public header is very messy. It mixes legacy and 'new' defines >>>> and it is not easy to figure out what should and what shouldn't be used. It >>>> also contains confusing comment that are either out of date or completely >>>> uninteresting for anyone that needs to use this header. >>>> >>>> The patch groups all entity functions together, including the 'old' defines >>>> based on the old range base. The reader just wants to know about the available >>>> functions and doesn't care about what range is used. >>>> >>>> All legacy defines are moved to the end of the header, so it is easier to >>>> locate them and just ignore them. >>>> >>>> The legacy structs in the struct media_entity_desc are put under >>>> #if !defined(__KERNEL__) to prevent the kernel from using them, and this is >>>> also a much more effective signal to the reader that they shouldn't be used >>>> compared to the old method of relying on '#if 1' followed by a comment. >>>> >>>> The unused MEDIA_INTF_T_ALSA_* defines are also moved to the end of the header >>>> in the legacy area. They are also dropped from intf_type() in media-entity.c. >>>> >>>> All defines are also aligned at the same tab making the header easier to read. >>>> >>>> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> >>>> --- >>>> drivers/media/media-entity.c | 16 -- >>>> include/uapi/linux/media.h | 345 +++++++++++++++++++++---------------------- >>>> 2 files changed, 166 insertions(+), 195 deletions(-) >>>> >> >> <snip> >> >>>> /* >>>> - * I/O entities >>>> + * Subdevs are initialized with MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN in order >>>> + * to preserve backward compatibility. Drivers must change to the proper >>>> + * subdev type before registering the entity. >>> >>> s/type/function/ >> >> Good catch! >> >>> >>> I wonder if "should" would actually be better; the current API assumes an >>> entity has at most one function which is somehow defined by the API. I >>> guess you could force everything into some kind of a group, as the current >>> approach seems to be. This is also what the enumeration through >>> MEDIA_IOC_ENUM_ENTITIES will yield to for the new functions anyway. >> >> I don't quite follow you. 'should' suggests that they don't have to, but that's >> not the case. They really must set function to something other than UNKNOWN. > > I'd like to reiterate that a single function cannot fully describe all > entities, and not all of them fit well to existing categories. If an entity > has multiple functions, which one do you pick? > > Say, a SoC camera that also controls the lens. In that case I would pick CAM_SENSOR and once we have properties you can add lens controller to the list of functions. CAM_SENSOR is *far* better than just leaving it at UNKNOWN. Especially since properties are still vaporware. I'm interested in working on that, but first I want to get all these compliance issues sorted. > >> >> The fact that newer functions are never actually exposed in the MEDIA_IOC_ENUM_ENTITIES >> ioctl since there only is a 'type' field and not a 'function' field is another >> matter altogether. > > I don't have a strong opinion on this, feel free to leave it as-is for now. > >> >>> >>>> */ >>>> -#define MEDIA_ENT_F_IO_DTV (MEDIA_ENT_F_BASE + 0x01001) >>>> -#define MEDIA_ENT_F_IO_VBI (MEDIA_ENT_F_BASE + 0x01002) >>>> -#define MEDIA_ENT_F_IO_SWRADIO (MEDIA_ENT_F_BASE + 0x01003) >>>> +#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN MEDIA_ENT_F_OLD_SUBDEV_BASE >>>> >>>> /* >>>> - * Analog TV IF-PLL decoders >>>> - * >>>> - * It is a responsibility of the master/bridge drivers to create links >>>> - * for MEDIA_ENT_F_IF_VID_DECODER and MEDIA_ENT_F_IF_AUD_DECODER. >>>> + * DVB entity functions >>>> */ >>>> -#define MEDIA_ENT_F_IF_VID_DECODER (MEDIA_ENT_F_BASE + 0x02001) >>>> -#define MEDIA_ENT_F_IF_AUD_DECODER (MEDIA_ENT_F_BASE + 0x02002) >>>> +#define MEDIA_ENT_F_DTV_DEMOD (MEDIA_ENT_F_BASE + 0x00001) >>>> +#define MEDIA_ENT_F_TS_DEMUX (MEDIA_ENT_F_BASE + 0x00002) >>>> +#define MEDIA_ENT_F_DTV_CA (MEDIA_ENT_F_BASE + 0x00003) >>>> +#define MEDIA_ENT_F_DTV_NET_DECAP (MEDIA_ENT_F_BASE + 0x00004) >>>> >>>> /* >>>> - * Audio Entity Functions >>>> + * I/O entity functions >>>> */ >>>> -#define MEDIA_ENT_F_AUDIO_CAPTURE (MEDIA_ENT_F_BASE + 0x03001) >>>> -#define MEDIA_ENT_F_AUDIO_PLAYBACK (MEDIA_ENT_F_BASE + 0x03002) >>>> -#define MEDIA_ENT_F_AUDIO_MIXER (MEDIA_ENT_F_BASE + 0x03003) >>>> +#define MEDIA_ENT_F_IO_V4L (MEDIA_ENT_F_OLD_BASE + 1) >>>> +#define MEDIA_ENT_F_IO_DTV (MEDIA_ENT_F_BASE + 0x01001) >>>> +#define MEDIA_ENT_F_IO_VBI (MEDIA_ENT_F_BASE + 0x01002) >>>> +#define MEDIA_ENT_F_IO_SWRADIO (MEDIA_ENT_F_BASE + 0x01003) >>>> >>>> /* >>>> - * Processing entities >>>> + * Sensor functions >>>> */ >>>> -#define MEDIA_ENT_F_PROC_VIDEO_COMPOSER (MEDIA_ENT_F_BASE + 0x4001) >>>> -#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER (MEDIA_ENT_F_BASE + 0x4002) >>>> -#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV (MEDIA_ENT_F_BASE + 0x4003) >>>> -#define MEDIA_ENT_F_PROC_VIDEO_LUT (MEDIA_ENT_F_BASE + 0x4004) >>>> -#define MEDIA_ENT_F_PROC_VIDEO_SCALER (MEDIA_ENT_F_BASE + 0x4005) >>>> -#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS (MEDIA_ENT_F_BASE + 0x4006) >>>> +#define MEDIA_ENT_F_CAM_SENSOR (MEDIA_ENT_F_OLD_SUBDEV_BASE + 1) >>>> +#define MEDIA_ENT_F_FLASH (MEDIA_ENT_F_OLD_SUBDEV_BASE + 2) >>>> +#define MEDIA_ENT_F_LENS (MEDIA_ENT_F_OLD_SUBDEV_BASE + 3) >>>> >>>> /* >>>> - * Switch and bridge entitites >>>> + * Analog video decoder functions >>>> */ >>>> -#define MEDIA_ENT_F_VID_MUX (MEDIA_ENT_F_BASE + 0x5001) >>>> -#define MEDIA_ENT_F_VID_IF_BRIDGE (MEDIA_ENT_F_BASE + 0x5002) >>>> +#define MEDIA_ENT_F_ATV_DECODER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 4) >>>> >>>> /* >>>> - * Connectors >>>> - */ >>>> -/* It is a responsibility of the entity drivers to add connectors and links */ >>>> -#ifdef __KERNEL__ >>>> - /* >>>> - * For now, it should not be used in userspace, as some >>>> - * definitions may change >>>> - */ >>>> - >>>> -#define MEDIA_ENT_F_CONN_RF (MEDIA_ENT_F_BASE + 0x30001) >>>> -#define MEDIA_ENT_F_CONN_SVIDEO (MEDIA_ENT_F_BASE + 0x30002) >>>> -#define MEDIA_ENT_F_CONN_COMPOSITE (MEDIA_ENT_F_BASE + 0x30003) >>>> - >>>> -#endif >>>> - >>>> -/* >>>> - * Don't touch on those. The ranges MEDIA_ENT_F_OLD_BASE and >>>> - * MEDIA_ENT_F_OLD_SUBDEV_BASE are kept to keep backward compatibility >>>> - * with the legacy v1 API.The number range is out of range by purpose: >>>> - * several previously reserved numbers got excluded from this range. >>>> + * Digital TV, analog TV, radio and/or software defined radio tuner functions. >>>> * >>>> - * Subdevs are initialized with MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN, >>>> - * in order to preserve backward compatibility. >>>> - * Drivers must change to the proper subdev type before >>>> - * registering the entity. >>>> - */ >>>> - >>>> -#define MEDIA_ENT_F_IO_V4L (MEDIA_ENT_F_OLD_BASE + 1) >>>> - >>>> -#define MEDIA_ENT_F_CAM_SENSOR (MEDIA_ENT_F_OLD_SUBDEV_BASE + 1) >>>> -#define MEDIA_ENT_F_FLASH (MEDIA_ENT_F_OLD_SUBDEV_BASE + 2) >>>> -#define MEDIA_ENT_F_LENS (MEDIA_ENT_F_OLD_SUBDEV_BASE + 3) >>>> -#define MEDIA_ENT_F_ATV_DECODER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 4) >>>> -/* >>>> * It is a responsibility of the master/bridge drivers to add connectors >>>> * and links for MEDIA_ENT_F_TUNER. Please notice that some old tuners >>>> * may require the usage of separate I2C chips to decode analog TV signals, >>>> @@ -151,49 +104,46 @@ struct media_device_info { >>>> * On such cases, the IF-PLL staging is mapped via one or two entities: >>>> * MEDIA_ENT_F_IF_VID_DECODER and/or MEDIA_ENT_F_IF_AUD_DECODER. >>>> */ >>>> -#define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5) >>>> +#define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5) >>>> >>>> -#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN MEDIA_ENT_F_OLD_SUBDEV_BASE >>>> +/* >>>> + * Analog TV IF-PLL decoder functions >>>> + * >>>> + * It is a responsibility of the master/bridge drivers to create links >>>> + * for MEDIA_ENT_F_IF_VID_DECODER and MEDIA_ENT_F_IF_AUD_DECODER. >>>> + */ >>>> +#define MEDIA_ENT_F_IF_VID_DECODER (MEDIA_ENT_F_BASE + 0x02001) >>>> +#define MEDIA_ENT_F_IF_AUD_DECODER (MEDIA_ENT_F_BASE + 0x02002) >>>> >>>> -#if !defined(__KERNEL__) || defined(__NEED_MEDIA_LEGACY_API) >>>> +/* >>>> + * Audio entity functions >>>> + */ >>>> +#define MEDIA_ENT_F_AUDIO_CAPTURE (MEDIA_ENT_F_BASE + 0x03001) >>>> +#define MEDIA_ENT_F_AUDIO_PLAYBACK (MEDIA_ENT_F_BASE + 0x03002) >>>> +#define MEDIA_ENT_F_AUDIO_MIXER (MEDIA_ENT_F_BASE + 0x03003) >>>> >>>> /* >>>> - * Legacy symbols used to avoid userspace compilation breakages >>>> - * >>>> - * Those symbols map the entity function into types and should be >>>> - * used only on legacy programs for legacy hardware. Don't rely >>>> - * on those for MEDIA_IOC_G_TOPOLOGY. >>>> + * Processing entity functions >>>> */ >>>> -#define MEDIA_ENT_TYPE_SHIFT 16 >>>> -#define MEDIA_ENT_TYPE_MASK 0x00ff0000 >>>> -#define MEDIA_ENT_SUBTYPE_MASK 0x0000ffff >>>> - >>>> -/* End of the old subdev reserved numberspace */ >>>> -#define MEDIA_ENT_T_DEVNODE_UNKNOWN (MEDIA_ENT_T_DEVNODE | \ >>>> - MEDIA_ENT_SUBTYPE_MASK) >>>> - >>>> -#define MEDIA_ENT_T_DEVNODE MEDIA_ENT_F_OLD_BASE >>>> -#define MEDIA_ENT_T_DEVNODE_V4L MEDIA_ENT_F_IO_V4L >>>> -#define MEDIA_ENT_T_DEVNODE_FB (MEDIA_ENT_T_DEVNODE + 2) >>>> -#define MEDIA_ENT_T_DEVNODE_ALSA (MEDIA_ENT_T_DEVNODE + 3) >>>> -#define MEDIA_ENT_T_DEVNODE_DVB (MEDIA_ENT_T_DEVNODE + 4) >>>> - >>>> -#define MEDIA_ENT_T_UNKNOWN MEDIA_ENT_F_UNKNOWN >>>> -#define MEDIA_ENT_T_V4L2_VIDEO MEDIA_ENT_F_IO_V4L >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR MEDIA_ENT_F_CAM_SENSOR >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH MEDIA_ENT_F_FLASH >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV_LENS MEDIA_ENT_F_LENS >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER MEDIA_ENT_F_ATV_DECODER >>>> -#define MEDIA_ENT_T_V4L2_SUBDEV_TUNER MEDIA_ENT_F_TUNER >>>> +#define MEDIA_ENT_F_PROC_VIDEO_COMPOSER (MEDIA_ENT_F_BASE + 0x4001) >>>> +#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER (MEDIA_ENT_F_BASE + 0x4002) >>>> +#define MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV (MEDIA_ENT_F_BASE + 0x4003) >>>> +#define MEDIA_ENT_F_PROC_VIDEO_LUT (MEDIA_ENT_F_BASE + 0x4004) >>>> +#define MEDIA_ENT_F_PROC_VIDEO_SCALER (MEDIA_ENT_F_BASE + 0x4005) >>>> +#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS (MEDIA_ENT_F_BASE + 0x4006) >>>> >>>> -/* Obsolete symbol for media_version, no longer used in the kernel */ >>>> -#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 0) >>>> -#endif >>>> +/* >>>> + * Switch and bridge entity functions >>>> + */ >>>> +#define MEDIA_ENT_F_VID_MUX (MEDIA_ENT_F_BASE + 0x5001) >>>> +#define MEDIA_ENT_F_VID_IF_BRIDGE (MEDIA_ENT_F_BASE + 0x5002) >>>> >>>> /* Entity flags */ >>>> -#define MEDIA_ENT_FL_DEFAULT (1 << 0) >>>> -#define MEDIA_ENT_FL_CONNECTOR (1 << 1) >>>> +#define MEDIA_ENT_FL_DEFAULT (1 << 0) >>>> +#define MEDIA_ENT_FL_CONNECTOR (1 << 1) >>>> + >>>> +/* OR with the entity id value to find the next entity */ >>> >>> This comment is confusing, I'd prefer to either drop or improve it. This is >>> well documented in uAPI documentation after all. >> >> Hmm. How about: >> >> /* Modifier flag for the media_entity_desc 'id' field */ >> >> Or, alternatively: /* Entity ID flag */ >> >> I'd like to have something, otherwise it is just a random define without a >> comment that puts it into context. > > How about: > > /* Flags for struct media_entity_desc id field */ Sounds good. I'll take this. > > Pick the one you like the best. > > Acked-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > Regards, Hans