Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.7-rc8 572 lines 19 kB view raw
1/* 2 * linux/drivers/video/omap2/dss/dss.h 3 * 4 * Copyright (C) 2009 Nokia Corporation 5 * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 6 * 7 * Some code and ideas taken from drivers/video/omap/ driver 8 * by Imre Deak. 9 * 10 * This program is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License version 2 as published by 12 * the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 17 * more details. 18 * 19 * You should have received a copy of the GNU General Public License along with 20 * this program. If not, see <http://www.gnu.org/licenses/>. 21 */ 22 23#ifndef __OMAP2_DSS_H 24#define __OMAP2_DSS_H 25 26#ifdef CONFIG_OMAP2_DSS_DEBUG_SUPPORT 27#define DEBUG 28#endif 29 30#ifdef DEBUG 31extern bool dss_debug; 32#ifdef DSS_SUBSYS_NAME 33#define DSSDBG(format, ...) \ 34 if (dss_debug) \ 35 printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME ": " format, \ 36 ## __VA_ARGS__) 37#else 38#define DSSDBG(format, ...) \ 39 if (dss_debug) \ 40 printk(KERN_DEBUG "omapdss: " format, ## __VA_ARGS__) 41#endif 42 43#ifdef DSS_SUBSYS_NAME 44#define DSSDBGF(format, ...) \ 45 if (dss_debug) \ 46 printk(KERN_DEBUG "omapdss " DSS_SUBSYS_NAME \ 47 ": %s(" format ")\n", \ 48 __func__, \ 49 ## __VA_ARGS__) 50#else 51#define DSSDBGF(format, ...) \ 52 if (dss_debug) \ 53 printk(KERN_DEBUG "omapdss: " \ 54 ": %s(" format ")\n", \ 55 __func__, \ 56 ## __VA_ARGS__) 57#endif 58 59#else /* DEBUG */ 60#define DSSDBG(format, ...) 61#define DSSDBGF(format, ...) 62#endif 63 64 65#ifdef DSS_SUBSYS_NAME 66#define DSSERR(format, ...) \ 67 printk(KERN_ERR "omapdss " DSS_SUBSYS_NAME " error: " format, \ 68 ## __VA_ARGS__) 69#else 70#define DSSERR(format, ...) \ 71 printk(KERN_ERR "omapdss error: " format, ## __VA_ARGS__) 72#endif 73 74#ifdef DSS_SUBSYS_NAME 75#define DSSINFO(format, ...) \ 76 printk(KERN_INFO "omapdss " DSS_SUBSYS_NAME ": " format, \ 77 ## __VA_ARGS__) 78#else 79#define DSSINFO(format, ...) \ 80 printk(KERN_INFO "omapdss: " format, ## __VA_ARGS__) 81#endif 82 83#ifdef DSS_SUBSYS_NAME 84#define DSSWARN(format, ...) \ 85 printk(KERN_WARNING "omapdss " DSS_SUBSYS_NAME ": " format, \ 86 ## __VA_ARGS__) 87#else 88#define DSSWARN(format, ...) \ 89 printk(KERN_WARNING "omapdss: " format, ## __VA_ARGS__) 90#endif 91 92/* OMAP TRM gives bitfields as start:end, where start is the higher bit 93 number. For example 7:0 */ 94#define FLD_MASK(start, end) (((1 << ((start) - (end) + 1)) - 1) << (end)) 95#define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end)) 96#define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end)) 97#define FLD_MOD(orig, val, start, end) \ 98 (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) 99 100enum dss_io_pad_mode { 101 DSS_IO_PAD_MODE_RESET, 102 DSS_IO_PAD_MODE_RFBI, 103 DSS_IO_PAD_MODE_BYPASS, 104}; 105 106enum dss_hdmi_venc_clk_source_select { 107 DSS_VENC_TV_CLK = 0, 108 DSS_HDMI_M_PCLK = 1, 109}; 110 111enum dss_dsi_content_type { 112 DSS_DSI_CONTENT_DCS, 113 DSS_DSI_CONTENT_GENERIC, 114}; 115 116enum dss_writeback_channel { 117 DSS_WB_LCD1_MGR = 0, 118 DSS_WB_LCD2_MGR = 1, 119 DSS_WB_TV_MGR = 2, 120 DSS_WB_OVL0 = 3, 121 DSS_WB_OVL1 = 4, 122 DSS_WB_OVL2 = 5, 123 DSS_WB_OVL3 = 6, 124 DSS_WB_LCD3_MGR = 7, 125}; 126 127struct dss_clock_info { 128 /* rates that we get with dividers below */ 129 unsigned long fck; 130 131 /* dividers */ 132 u16 fck_div; 133}; 134 135struct dispc_clock_info { 136 /* rates that we get with dividers below */ 137 unsigned long lck; 138 unsigned long pck; 139 140 /* dividers */ 141 u16 lck_div; 142 u16 pck_div; 143}; 144 145struct dsi_clock_info { 146 /* rates that we get with dividers below */ 147 unsigned long fint; 148 unsigned long clkin4ddr; 149 unsigned long clkin; 150 unsigned long dsi_pll_hsdiv_dispc_clk; /* OMAP3: DSI1_PLL_CLK 151 * OMAP4: PLLx_CLK1 */ 152 unsigned long dsi_pll_hsdiv_dsi_clk; /* OMAP3: DSI2_PLL_CLK 153 * OMAP4: PLLx_CLK2 */ 154 unsigned long lp_clk; 155 156 /* dividers */ 157 u16 regn; 158 u16 regm; 159 u16 regm_dispc; /* OMAP3: REGM3 160 * OMAP4: REGM4 */ 161 u16 regm_dsi; /* OMAP3: REGM4 162 * OMAP4: REGM5 */ 163 u16 lp_clk_div; 164}; 165 166struct reg_field { 167 u16 reg; 168 u8 high; 169 u8 low; 170}; 171 172struct dss_lcd_mgr_config { 173 enum dss_io_pad_mode io_pad_mode; 174 175 bool stallmode; 176 bool fifohandcheck; 177 178 struct dispc_clock_info clock_info; 179 180 int video_port_width; 181 182 int lcden_sig_polarity; 183}; 184 185struct seq_file; 186struct platform_device; 187 188/* core */ 189const char *dss_get_default_display_name(void); 190struct bus_type *dss_get_bus(void); 191struct regulator *dss_get_vdds_dsi(void); 192struct regulator *dss_get_vdds_sdi(void); 193int dss_get_ctx_loss_count(struct device *dev); 194int dss_dsi_enable_pads(int dsi_id, unsigned lane_mask); 195void dss_dsi_disable_pads(int dsi_id, unsigned lane_mask); 196int dss_set_min_bus_tput(struct device *dev, unsigned long tput); 197int dss_debugfs_create_file(const char *name, void (*write)(struct seq_file *)); 198 199struct omap_dss_device *dss_alloc_and_init_device(struct device *parent); 200int dss_add_device(struct omap_dss_device *dssdev); 201void dss_unregister_device(struct omap_dss_device *dssdev); 202void dss_unregister_child_devices(struct device *parent); 203void dss_put_device(struct omap_dss_device *dssdev); 204void dss_copy_device_pdata(struct omap_dss_device *dst, 205 const struct omap_dss_device *src); 206 207/* apply */ 208void dss_apply_init(void); 209int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr); 210int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl); 211void dss_mgr_start_update(struct omap_overlay_manager *mgr); 212int omap_dss_mgr_apply(struct omap_overlay_manager *mgr); 213 214int dss_mgr_enable(struct omap_overlay_manager *mgr); 215void dss_mgr_disable(struct omap_overlay_manager *mgr); 216int dss_mgr_set_info(struct omap_overlay_manager *mgr, 217 struct omap_overlay_manager_info *info); 218void dss_mgr_get_info(struct omap_overlay_manager *mgr, 219 struct omap_overlay_manager_info *info); 220int dss_mgr_set_device(struct omap_overlay_manager *mgr, 221 struct omap_dss_device *dssdev); 222int dss_mgr_unset_device(struct omap_overlay_manager *mgr); 223int dss_mgr_set_output(struct omap_overlay_manager *mgr, 224 struct omap_dss_output *output); 225int dss_mgr_unset_output(struct omap_overlay_manager *mgr); 226void dss_mgr_set_timings(struct omap_overlay_manager *mgr, 227 const struct omap_video_timings *timings); 228void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, 229 const struct dss_lcd_mgr_config *config); 230const struct omap_video_timings *dss_mgr_get_timings(struct omap_overlay_manager *mgr); 231 232bool dss_ovl_is_enabled(struct omap_overlay *ovl); 233int dss_ovl_enable(struct omap_overlay *ovl); 234int dss_ovl_disable(struct omap_overlay *ovl); 235int dss_ovl_set_info(struct omap_overlay *ovl, 236 struct omap_overlay_info *info); 237void dss_ovl_get_info(struct omap_overlay *ovl, 238 struct omap_overlay_info *info); 239int dss_ovl_set_manager(struct omap_overlay *ovl, 240 struct omap_overlay_manager *mgr); 241int dss_ovl_unset_manager(struct omap_overlay *ovl); 242 243/* output */ 244void dss_register_output(struct omap_dss_output *out); 245void dss_unregister_output(struct omap_dss_output *out); 246struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev); 247 248/* display */ 249int dss_suspend_all_devices(void); 250int dss_resume_all_devices(void); 251void dss_disable_all_devices(void); 252 253int dss_init_device(struct platform_device *pdev, 254 struct omap_dss_device *dssdev); 255void dss_uninit_device(struct platform_device *pdev, 256 struct omap_dss_device *dssdev); 257 258/* manager */ 259int dss_init_overlay_managers(struct platform_device *pdev); 260void dss_uninit_overlay_managers(struct platform_device *pdev); 261int dss_mgr_simple_check(struct omap_overlay_manager *mgr, 262 const struct omap_overlay_manager_info *info); 263int dss_mgr_check_timings(struct omap_overlay_manager *mgr, 264 const struct omap_video_timings *timings); 265int dss_mgr_check(struct omap_overlay_manager *mgr, 266 struct omap_overlay_manager_info *info, 267 const struct omap_video_timings *mgr_timings, 268 const struct dss_lcd_mgr_config *config, 269 struct omap_overlay_info **overlay_infos); 270 271static inline bool dss_mgr_is_lcd(enum omap_channel id) 272{ 273 if (id == OMAP_DSS_CHANNEL_LCD || id == OMAP_DSS_CHANNEL_LCD2 || 274 id == OMAP_DSS_CHANNEL_LCD3) 275 return true; 276 else 277 return false; 278} 279 280int dss_manager_kobj_init(struct omap_overlay_manager *mgr, 281 struct platform_device *pdev); 282void dss_manager_kobj_uninit(struct omap_overlay_manager *mgr); 283 284/* overlay */ 285void dss_init_overlays(struct platform_device *pdev); 286void dss_uninit_overlays(struct platform_device *pdev); 287void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr); 288int dss_ovl_simple_check(struct omap_overlay *ovl, 289 const struct omap_overlay_info *info); 290int dss_ovl_check(struct omap_overlay *ovl, struct omap_overlay_info *info, 291 const struct omap_video_timings *mgr_timings); 292bool dss_ovl_use_replication(struct dss_lcd_mgr_config config, 293 enum omap_color_mode mode); 294int dss_overlay_kobj_init(struct omap_overlay *ovl, 295 struct platform_device *pdev); 296void dss_overlay_kobj_uninit(struct omap_overlay *ovl); 297 298/* DSS */ 299int dss_init_platform_driver(void) __init; 300void dss_uninit_platform_driver(void); 301 302int dss_dpi_select_source(enum omap_channel channel); 303void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select); 304enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void); 305const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src); 306void dss_dump_clocks(struct seq_file *s); 307 308#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 309void dss_debug_dump_clocks(struct seq_file *s); 310#endif 311 312void dss_sdi_init(int datapairs); 313int dss_sdi_enable(void); 314void dss_sdi_disable(void); 315 316void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src); 317void dss_select_dsi_clk_source(int dsi_module, 318 enum omap_dss_clk_source clk_src); 319void dss_select_lcd_clk_source(enum omap_channel channel, 320 enum omap_dss_clk_source clk_src); 321enum omap_dss_clk_source dss_get_dispc_clk_source(void); 322enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module); 323enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel); 324 325void dss_set_venc_output(enum omap_dss_venc_type type); 326void dss_set_dac_pwrdn_bgz(bool enable); 327 328unsigned long dss_get_dpll4_rate(void); 329int dss_set_clock_div(struct dss_clock_info *cinfo); 330int dss_calc_clock_div(unsigned long req_pck, struct dss_clock_info *dss_cinfo, 331 struct dispc_clock_info *dispc_cinfo); 332 333/* SDI */ 334int sdi_init_platform_driver(void) __init; 335void sdi_uninit_platform_driver(void) __exit; 336 337/* DSI */ 338#ifdef CONFIG_OMAP2_DSS_DSI 339 340struct dentry; 341struct file_operations; 342 343int dsi_init_platform_driver(void) __init; 344void dsi_uninit_platform_driver(void) __exit; 345 346int dsi_runtime_get(struct platform_device *dsidev); 347void dsi_runtime_put(struct platform_device *dsidev); 348 349void dsi_dump_clocks(struct seq_file *s); 350 351void dsi_irq_handler(void); 352u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt); 353 354unsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev); 355int dsi_pll_set_clock_div(struct platform_device *dsidev, 356 struct dsi_clock_info *cinfo); 357int dsi_pll_calc_clock_div_pck(struct platform_device *dsidev, 358 unsigned long req_pck, struct dsi_clock_info *cinfo, 359 struct dispc_clock_info *dispc_cinfo); 360int dsi_pll_init(struct platform_device *dsidev, bool enable_hsclk, 361 bool enable_hsdiv); 362void dsi_pll_uninit(struct platform_device *dsidev, bool disconnect_lanes); 363void dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev); 364void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev); 365struct platform_device *dsi_get_dsidev_from_id(int module); 366#else 367static inline int dsi_runtime_get(struct platform_device *dsidev) 368{ 369 return 0; 370} 371static inline void dsi_runtime_put(struct platform_device *dsidev) 372{ 373} 374static inline u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt) 375{ 376 WARN("%s: DSI not compiled in, returning pixel_size as 0\n", __func__); 377 return 0; 378} 379static inline unsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev) 380{ 381 WARN("%s: DSI not compiled in, returning rate as 0\n", __func__); 382 return 0; 383} 384static inline int dsi_pll_set_clock_div(struct platform_device *dsidev, 385 struct dsi_clock_info *cinfo) 386{ 387 WARN("%s: DSI not compiled in\n", __func__); 388 return -ENODEV; 389} 390static inline int dsi_pll_calc_clock_div_pck(struct platform_device *dsidev, 391 unsigned long req_pck, 392 struct dsi_clock_info *dsi_cinfo, 393 struct dispc_clock_info *dispc_cinfo) 394{ 395 WARN("%s: DSI not compiled in\n", __func__); 396 return -ENODEV; 397} 398static inline int dsi_pll_init(struct platform_device *dsidev, 399 bool enable_hsclk, bool enable_hsdiv) 400{ 401 WARN("%s: DSI not compiled in\n", __func__); 402 return -ENODEV; 403} 404static inline void dsi_pll_uninit(struct platform_device *dsidev, 405 bool disconnect_lanes) 406{ 407} 408static inline void dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev) 409{ 410} 411static inline void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev) 412{ 413} 414static inline struct platform_device *dsi_get_dsidev_from_id(int module) 415{ 416 WARN("%s: DSI not compiled in, returning platform device as NULL\n", 417 __func__); 418 return NULL; 419} 420#endif 421 422/* DPI */ 423int dpi_init_platform_driver(void) __init; 424void dpi_uninit_platform_driver(void) __exit; 425 426/* DISPC */ 427int dispc_init_platform_driver(void) __init; 428void dispc_uninit_platform_driver(void) __exit; 429void dispc_dump_clocks(struct seq_file *s); 430void dispc_irq_handler(void); 431 432int dispc_runtime_get(void); 433void dispc_runtime_put(void); 434 435void dispc_enable_sidle(void); 436void dispc_disable_sidle(void); 437 438void dispc_lcd_enable_signal_polarity(bool act_high); 439void dispc_lcd_enable_signal(bool enable); 440void dispc_pck_free_enable(bool enable); 441void dispc_enable_fifomerge(bool enable); 442void dispc_enable_gamma_table(bool enable); 443void dispc_set_loadmode(enum omap_dss_load_mode mode); 444 445bool dispc_mgr_timings_ok(enum omap_channel channel, 446 const struct omap_video_timings *timings); 447unsigned long dispc_fclk_rate(void); 448void dispc_find_clk_divs(unsigned long req_pck, unsigned long fck, 449 struct dispc_clock_info *cinfo); 450int dispc_calc_clock_rates(unsigned long dispc_fclk_rate, 451 struct dispc_clock_info *cinfo); 452 453 454void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high); 455void dispc_ovl_compute_fifo_thresholds(enum omap_plane plane, 456 u32 *fifo_low, u32 *fifo_high, bool use_fifomerge, 457 bool manual_update); 458int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi, 459 bool replication, const struct omap_video_timings *mgr_timings, 460 bool mem_to_mem); 461int dispc_ovl_enable(enum omap_plane plane, bool enable); 462void dispc_ovl_set_channel_out(enum omap_plane plane, 463 enum omap_channel channel); 464 465void dispc_mgr_enable_fifohandcheck(enum omap_channel channel, bool enable); 466u32 dispc_mgr_get_vsync_irq(enum omap_channel channel); 467u32 dispc_mgr_get_framedone_irq(enum omap_channel channel); 468bool dispc_mgr_go_busy(enum omap_channel channel); 469void dispc_mgr_go(enum omap_channel channel); 470bool dispc_mgr_is_enabled(enum omap_channel channel); 471void dispc_mgr_enable(enum omap_channel channel, bool enable); 472bool dispc_mgr_is_channel_enabled(enum omap_channel channel); 473void dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode); 474void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable); 475void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines); 476void dispc_mgr_set_lcd_type_tft(enum omap_channel channel); 477void dispc_mgr_set_timings(enum omap_channel channel, 478 struct omap_video_timings *timings); 479unsigned long dispc_mgr_lclk_rate(enum omap_channel channel); 480unsigned long dispc_mgr_pclk_rate(enum omap_channel channel); 481unsigned long dispc_core_clk_rate(void); 482void dispc_mgr_set_clock_div(enum omap_channel channel, 483 struct dispc_clock_info *cinfo); 484int dispc_mgr_get_clock_div(enum omap_channel channel, 485 struct dispc_clock_info *cinfo); 486void dispc_mgr_setup(enum omap_channel channel, 487 struct omap_overlay_manager_info *info); 488 489u32 dispc_wb_get_framedone_irq(void); 490bool dispc_wb_go_busy(void); 491void dispc_wb_go(void); 492void dispc_wb_enable(bool enable); 493bool dispc_wb_is_enabled(void); 494void dispc_wb_set_channel_in(enum dss_writeback_channel channel); 495int dispc_wb_setup(const struct omap_dss_writeback_info *wi, 496 bool mem_to_mem, const struct omap_video_timings *timings); 497 498/* VENC */ 499#ifdef CONFIG_OMAP2_DSS_VENC 500int venc_init_platform_driver(void) __init; 501void venc_uninit_platform_driver(void) __exit; 502unsigned long venc_get_pixel_clock(void); 503#else 504static inline unsigned long venc_get_pixel_clock(void) 505{ 506 WARN("%s: VENC not compiled in, returning pclk as 0\n", __func__); 507 return 0; 508} 509#endif 510int omapdss_venc_display_enable(struct omap_dss_device *dssdev); 511void omapdss_venc_display_disable(struct omap_dss_device *dssdev); 512void omapdss_venc_set_timings(struct omap_dss_device *dssdev, 513 struct omap_video_timings *timings); 514int omapdss_venc_check_timings(struct omap_dss_device *dssdev, 515 struct omap_video_timings *timings); 516u32 omapdss_venc_get_wss(struct omap_dss_device *dssdev); 517int omapdss_venc_set_wss(struct omap_dss_device *dssdev, u32 wss); 518void omapdss_venc_set_type(struct omap_dss_device *dssdev, 519 enum omap_dss_venc_type type); 520void omapdss_venc_invert_vid_out_polarity(struct omap_dss_device *dssdev, 521 bool invert_polarity); 522int venc_panel_init(void); 523void venc_panel_exit(void); 524 525/* HDMI */ 526#ifdef CONFIG_OMAP4_DSS_HDMI 527int hdmi_init_platform_driver(void) __init; 528void hdmi_uninit_platform_driver(void) __exit; 529unsigned long hdmi_get_pixel_clock(void); 530#else 531static inline unsigned long hdmi_get_pixel_clock(void) 532{ 533 WARN("%s: HDMI not compiled in, returning pclk as 0\n", __func__); 534 return 0; 535} 536#endif 537int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev); 538void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev); 539void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev, 540 struct omap_video_timings *timings); 541int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, 542 struct omap_video_timings *timings); 543int omapdss_hdmi_read_edid(u8 *buf, int len); 544bool omapdss_hdmi_detect(void); 545int hdmi_panel_init(void); 546void hdmi_panel_exit(void); 547#ifdef CONFIG_OMAP4_DSS_HDMI_AUDIO 548int hdmi_audio_enable(void); 549void hdmi_audio_disable(void); 550int hdmi_audio_start(void); 551void hdmi_audio_stop(void); 552bool hdmi_mode_has_audio(void); 553int hdmi_audio_config(struct omap_dss_audio *audio); 554#endif 555 556/* RFBI */ 557int rfbi_init_platform_driver(void) __init; 558void rfbi_uninit_platform_driver(void) __exit; 559 560 561#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 562static inline void dss_collect_irq_stats(u32 irqstatus, unsigned *irq_arr) 563{ 564 int b; 565 for (b = 0; b < 32; ++b) { 566 if (irqstatus & (1 << b)) 567 irq_arr[b]++; 568 } 569} 570#endif 571 572#endif