From 5d47dbc85228de3ce82dea11af3c169e66cbf520 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Wed, 24 Apr 2013 13:32:51 +0300 Subject: OMAPDSS: public omapdss_register_output() In order to allow multiple display block in a video pipeline, we need to give the drivers way to register themselves. For now we have the omapdss_register_display() which is used to register panels, and dss_register_output() which is used to register DSS encoders. This patch makes dss_register_output() public (with the name of omapdss_register_output), which can be used to register also external encoders. The distinction between register_output and register_display is that a "display" is an entity at the end of the videopipeline, and "output" is something inside the pipeline. The registration and naming will be made saner in the future, but the current names and functions are kept to minimize changes during the dss device model transition. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index ef9db241b4a1..cca912a5f32e 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -780,6 +780,8 @@ struct omap_overlay_manager *omap_dss_get_overlay_manager(int num); int omap_dss_get_num_overlays(void); struct omap_overlay *omap_dss_get_overlay(int num); +int omapdss_register_output(struct omap_dss_device *output); +void omapdss_unregister_output(struct omap_dss_device *output); struct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id); struct omap_dss_device *omap_dss_find_output(const char *name); struct omap_dss_device *omap_dss_find_output_by_node(struct device_node *node); -- cgit v1.2.1 From bc24b8b6d75be869e2ae0c1e4d93cbb0463f5935 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Mon, 13 May 2013 13:40:33 +0300 Subject: OMAPDSS: add OMAP_DISPLAY_TYPE_DVI Add new display bus type for DVI. This is not used by omapdss driver itself, but is used by external encoder chips that output DVI. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 1 + 1 file changed, 1 insertion(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index cca912a5f32e..cff514eec584 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -70,6 +70,7 @@ enum omap_display_type { OMAP_DISPLAY_TYPE_DSI = 1 << 3, OMAP_DISPLAY_TYPE_VENC = 1 << 4, OMAP_DISPLAY_TYPE_HDMI = 1 << 5, + OMAP_DISPLAY_TYPE_DVI = 1 << 6, }; enum omap_plane { -- cgit v1.2.1 From 0b24edb1c7d5aeadde0e38337b9b86fe16064505 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:18:52 +0300 Subject: OMAPDSS: DPI: Add ops Add "ops" style method for using DPI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index cff514eec584..71fe1566ce01 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -573,6 +573,25 @@ struct omap_dss_writeback_info { u8 pre_mult_alpha; }; +struct omapdss_dpi_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev); + + int (*check_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*set_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*get_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + + void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -638,6 +657,10 @@ struct omap_dss_device { struct omap_dss_driver *driver; + union { + const struct omapdss_dpi_ops *dpi; + } ops; + /* helper variable for driver suspend/resume */ bool activate_after_resume; -- cgit v1.2.1 From b1082dfd610772aff79f55f11a1b73e34f07d31f Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:19:14 +0300 Subject: OMAPDSS: SDI: Add ops Add "ops" style method for using SDI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 71fe1566ce01..c5935a824ec5 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -592,6 +592,25 @@ struct omapdss_dpi_ops { void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines); }; +struct omapdss_sdi_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev); + + int (*check_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*set_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*get_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + + void (*set_datapairs)(struct omap_dss_device *dssdev, int datapairs); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -659,6 +678,7 @@ struct omap_dss_device { union { const struct omapdss_dpi_ops *dpi; + const struct omapdss_sdi_ops *sdi; } ops; /* helper variable for driver suspend/resume */ -- cgit v1.2.1 From 7700c2d4f79c423f29a5c2c10ca5a9b9c8c5c60f Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:19:30 +0300 Subject: OMAPDSS: DVI: Add ops Add "ops" style method for using DVI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index c5935a824ec5..3b3903fa1500 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -611,6 +611,23 @@ struct omapdss_sdi_ops { void (*set_datapairs)(struct omap_dss_device *dssdev, int datapairs); }; +struct omapdss_dvi_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev); + + int (*check_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*set_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*get_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -679,6 +696,7 @@ struct omap_dss_device { union { const struct omapdss_dpi_ops *dpi; const struct omapdss_sdi_ops *sdi; + const struct omapdss_dvi_ops *dvi; } ops; /* helper variable for driver suspend/resume */ -- cgit v1.2.1 From fb8efa49660ea450ad632c9d8b70f12e4a43a495 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:19:50 +0300 Subject: OMAPDSS: AnalogTV: Add ops Add "ops" style method for using analog TV functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 3b3903fa1500..adb103633bd1 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -628,6 +628,31 @@ struct omapdss_dvi_ops { struct omap_video_timings *timings); }; +struct omapdss_atv_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev); + + int (*check_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*set_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*get_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + + void (*set_type)(struct omap_dss_device *dssdev, + enum omap_dss_venc_type type); + void (*invert_vid_out_polarity)(struct omap_dss_device *dssdev, + bool invert_polarity); + + int (*set_wss)(struct omap_dss_device *dssdev, u32 wss); + u32 (*get_wss)(struct omap_dss_device *dssdev); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -697,6 +722,7 @@ struct omap_dss_device { const struct omapdss_dpi_ops *dpi; const struct omapdss_sdi_ops *sdi; const struct omapdss_dvi_ops *dvi; + const struct omapdss_atv_ops *atv; } ops; /* helper variable for driver suspend/resume */ -- cgit v1.2.1 From 0b450c31317914feb39616cb553b67c170aaf3d0 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:20:17 +0300 Subject: OMAPDSS: HDMI: Add ops Add "ops" style method for using HDMI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index adb103633bd1..709e8015f324 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -172,6 +172,11 @@ enum omap_dss_audio_state { OMAP_DSS_AUDIO_PLAYING, }; +struct omap_dss_audio { + struct snd_aes_iec958 *iec; + struct snd_cea_861_aud_if *cea; +}; + enum omap_dss_rotation_type { OMAP_DSS_ROT_DMA = 1 << 0, OMAP_DSS_ROT_VRFB = 1 << 1, @@ -653,6 +658,39 @@ struct omapdss_atv_ops { u32 (*get_wss)(struct omap_dss_device *dssdev); }; +struct omapdss_hdmi_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev); + + int (*check_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*set_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + void (*get_timings)(struct omap_dss_device *dssdev, + struct omap_video_timings *timings); + + int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); + bool (*detect)(struct omap_dss_device *dssdev); + + /* + * Note: These functions might sleep. Do not call while + * holding a spinlock/readlock. + */ + int (*audio_enable)(struct omap_dss_device *dssdev); + void (*audio_disable)(struct omap_dss_device *dssdev); + bool (*audio_supported)(struct omap_dss_device *dssdev); + int (*audio_config)(struct omap_dss_device *dssdev, + struct omap_dss_audio *audio); + /* Note: These functions may not sleep */ + int (*audio_start)(struct omap_dss_device *dssdev); + void (*audio_stop)(struct omap_dss_device *dssdev); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -722,6 +760,7 @@ struct omap_dss_device { const struct omapdss_dpi_ops *dpi; const struct omapdss_sdi_ops *sdi; const struct omapdss_dvi_ops *dvi; + const struct omapdss_hdmi_ops *hdmi; const struct omapdss_atv_ops *atv; } ops; @@ -759,11 +798,6 @@ struct omap_dss_hdmi_data int hpd_gpio; }; -struct omap_dss_audio { - struct snd_aes_iec958 *iec; - struct snd_cea_861_aud_if *cea; -}; - struct omap_dss_driver { struct device_driver driver; -- cgit v1.2.1 From deb16df884966570ebe6197feecab100436414e5 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 13:20:27 +0300 Subject: OMAPDSS: DSI: Add ops Add "ops" style method for using DSI functionality. Ops style calls will allow us to have arbitrarily long display pipelines, where each entity can call ops in the previous display entity. Signed-off-by: Tomi Valkeinen --- include/video/omapdss.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'include/video') diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 709e8015f324..b39463553845 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -691,6 +691,63 @@ struct omapdss_hdmi_ops { void (*audio_stop)(struct omap_dss_device *dssdev); }; +struct omapdss_dsi_ops { + int (*connect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + void (*disconnect)(struct omap_dss_device *dssdev, + struct omap_dss_device *dst); + + int (*enable)(struct omap_dss_device *dssdev); + void (*disable)(struct omap_dss_device *dssdev, bool disconnect_lanes, + bool enter_ulps); + + /* bus configuration */ + int (*set_config)(struct omap_dss_device *dssdev, + const struct omap_dss_dsi_config *cfg); + int (*configure_pins)(struct omap_dss_device *dssdev, + const struct omap_dsi_pin_config *pin_cfg); + + void (*enable_hs)(struct omap_dss_device *dssdev, int channel, + bool enable); + int (*enable_te)(struct omap_dss_device *dssdev, bool enable); + + int (*update)(struct omap_dss_device *dssdev, int channel, + void (*callback)(int, void *), void *data); + + void (*bus_lock)(struct omap_dss_device *dssdev); + void (*bus_unlock)(struct omap_dss_device *dssdev); + + int (*enable_video_output)(struct omap_dss_device *dssdev, int channel); + void (*disable_video_output)(struct omap_dss_device *dssdev, + int channel); + + int (*request_vc)(struct omap_dss_device *dssdev, int *channel); + int (*set_vc_id)(struct omap_dss_device *dssdev, int channel, + int vc_id); + void (*release_vc)(struct omap_dss_device *dssdev, int channel); + + /* data transfer */ + int (*dcs_write)(struct omap_dss_device *dssdev, int channel, + u8 *data, int len); + int (*dcs_write_nosync)(struct omap_dss_device *dssdev, int channel, + u8 *data, int len); + int (*dcs_read)(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, + u8 *data, int len); + + int (*gen_write)(struct omap_dss_device *dssdev, int channel, + u8 *data, int len); + int (*gen_write_nosync)(struct omap_dss_device *dssdev, int channel, + u8 *data, int len); + int (*gen_read)(struct omap_dss_device *dssdev, int channel, + u8 *reqdata, int reqlen, + u8 *data, int len); + + int (*bta_sync)(struct omap_dss_device *dssdev, int channel); + + int (*set_max_rx_packet_size)(struct omap_dss_device *dssdev, + int channel, u16 plen); +}; + struct omap_dss_device { /* old device, to be removed */ struct device old_dev; @@ -762,6 +819,7 @@ struct omap_dss_device { const struct omapdss_dvi_ops *dvi; const struct omapdss_hdmi_ops *hdmi; const struct omapdss_atv_ops *atv; + const struct omapdss_dsi_ops *dsi; } ops; /* helper variable for driver suspend/resume */ -- cgit v1.2.1 From 2773fefbd764646a3dba3349d4848d90d85a127d Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:18:30 +0300 Subject: OMAPDSS: Add new TFP410 Encoder driver Add TFP410 DPI-to-DVI Encoder driver which uses the new DSS device model and DSS ops. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index 0c3b46d3daf3..bc899b7a4a64 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -147,4 +147,17 @@ struct panel_tpo_td043_data { int nreset_gpio; }; +/** + * encoder_tfp410 platform data + * @name: name for this display entity + * @power_down_gpio: gpio number for PD pin (or -1 if not available) + * @data_lines: number of DPI datalines + */ +struct encoder_tfp410_platform_data { + const char *name; + const char *source; + int power_down_gpio; + int data_lines; +}; + #endif /* __OMAP_PANEL_DATA_H */ -- cgit v1.2.1 From a0ee577fa26959d6ae8fe89ea5121ec444e8c0f1 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:20:14 +0300 Subject: OMAPDSS: Add new TPD12S015 Encoder driver Add TPD12S015 HDMI ESD protection and level shifter encoder driver which uses the new DSS device model and DSS ops. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index bc899b7a4a64..aa58612ec8ab 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -160,4 +160,20 @@ struct encoder_tfp410_platform_data { int data_lines; }; +/** + * encoder_tpd12s015 platform data + * @name: name for this display entity + * @ct_cp_hpd_gpio: CT_CP_HPD gpio number + * @ls_oe_gpio: LS_OE gpio number + * @hpd_gpio: HPD gpio number + */ +struct encoder_tpd12s015_platform_data { + const char *name; + const char *source; + + int ct_cp_hpd_gpio; + int ls_oe_gpio; + int hpd_gpio; +}; + #endif /* __OMAP_PANEL_DATA_H */ -- cgit v1.2.1 From 348077b154357eec595068a3336ef6beb870e6f3 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:20:45 +0300 Subject: OMAPDSS: Add new DVI Connector driver Add DVI Connector driver which uses the new DSS device model and DSS ops. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index aa58612ec8ab..3eaaaf638a84 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -176,4 +176,16 @@ struct encoder_tpd12s015_platform_data { int hpd_gpio; }; +/** + * connector_dvi platform data + * @name: name for this display entity + * @source: name of the display entity used as a video source + * @i2c_bus_num: i2c bus number to be used for reading EDID + */ +struct connector_dvi_platform_data { + const char *name; + const char *source; + int i2c_bus_num; +}; + #endif /* __OMAP_PANEL_DATA_H */ -- cgit v1.2.1 From 3cb07ee66bca756921f0e967b687f4d0e05ba439 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:21:08 +0300 Subject: OMAPDSS: Add new HDMI Connector driver Add HDMI Connector driver which uses the new DSS device model and DSS ops. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index 3eaaaf638a84..397df766bfb7 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -188,4 +188,14 @@ struct connector_dvi_platform_data { int i2c_bus_num; }; +/** + * connector_hdmi platform data + * @name: name for this display entity + * @source: name of the display entity used as a video source + */ +struct connector_hdmi_platform_data { + const char *name; + const char *source; +}; + #endif /* __OMAP_PANEL_DATA_H */ -- cgit v1.2.1 From 61a7f24a3f148b3fe491154943221f1a7fa729b7 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:21:30 +0300 Subject: OMAPDSS: Add new Analog TV Connector driver Add Analog TV Connector driver which uses the new DSS device model and DSS ops. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index 397df766bfb7..670c0cdea9bb 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -198,4 +198,19 @@ struct connector_hdmi_platform_data { const char *source; }; +/** + * connector_atv platform data + * @name: name for this display entity + * @source: name of the display entity used as a video source + * @connector_type: composite/svideo + * @invert_polarity: invert signal polarity + */ +struct connector_atv_platform_data { + const char *name; + const char *source; + + enum omap_dss_venc_type connector_type; + bool invert_polarity; +}; + #endif /* __OMAP_PANEL_DATA_H */ -- cgit v1.2.1 From 04f0ff022dde900ce2bb363f7b5b7a21c079cd21 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Fri, 24 May 2013 14:21:56 +0300 Subject: OMAPDSS: Add new simple DPI panel driver Add simple DPI Panel driver which uses the new DSS device model and DSS ops. A "simple" panel means one that does not require any special setup. Signed-off-by: Tomi Valkeinen --- include/video/omap-panel-data.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'include/video') diff --git a/include/video/omap-panel-data.h b/include/video/omap-panel-data.h index 670c0cdea9bb..4e0fc1a8c843 100644 --- a/include/video/omap-panel-data.h +++ b/include/video/omap-panel-data.h @@ -27,6 +27,8 @@ #ifndef __OMAP_PANEL_DATA_H #define __OMAP_PANEL_DATA_H +#include