linux/drivers/media/rc/img-ir/img-ir-hw.h
<<
>>
Prefs
   1/*
   2 * ImgTec IR Hardware Decoder found in PowerDown Controller.
   3 *
   4 * Copyright 2010-2014 Imagination Technologies Ltd.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by the
   8 * Free Software Foundation; either version 2 of the License, or (at your
   9 * option) any later version.
  10 */
  11
  12#ifndef _IMG_IR_HW_H_
  13#define _IMG_IR_HW_H_
  14
  15#include <linux/kernel.h>
  16#include <media/rc-core.h>
  17
  18/* constants */
  19
  20#define IMG_IR_CODETYPE_PULSELEN        0x0     /* Sony */
  21#define IMG_IR_CODETYPE_PULSEDIST       0x1     /* NEC, Toshiba, Micom, Sharp */
  22#define IMG_IR_CODETYPE_BIPHASE         0x2     /* RC-5/6 */
  23#define IMG_IR_CODETYPE_2BITPULSEPOS    0x3     /* RC-MM */
  24
  25
  26/* Timing information */
  27
  28/**
  29 * struct img_ir_control - Decoder control settings
  30 * @decoden:    Primary decoder enable
  31 * @code_type:  Decode type (see IMG_IR_CODETYPE_*)
  32 * @hdrtog:     Detect header toggle symbol after leader symbol
  33 * @ldrdec:     Don't discard leader if maximum width reached
  34 * @decodinpol: Decoder input polarity (1=active high)
  35 * @bitorien:   Bit orientation (1=MSB first)
  36 * @d1validsel: Decoder 2 takes over if it detects valid data
  37 * @bitinv:     Bit inversion switch (1=don't invert)
  38 * @decodend2:  Secondary decoder enable (no leader symbol)
  39 * @bitoriend2: Bit orientation (1=MSB first)
  40 * @bitinvd2:   Secondary decoder bit inversion switch (1=don't invert)
  41 */
  42struct img_ir_control {
  43        unsigned decoden:1;
  44        unsigned code_type:2;
  45        unsigned hdrtog:1;
  46        unsigned ldrdec:1;
  47        unsigned decodinpol:1;
  48        unsigned bitorien:1;
  49        unsigned d1validsel:1;
  50        unsigned bitinv:1;
  51        unsigned decodend2:1;
  52        unsigned bitoriend2:1;
  53        unsigned bitinvd2:1;
  54};
  55
  56/**
  57 * struct img_ir_timing_range - range of timing values
  58 * @min:        Minimum timing value
  59 * @max:        Maximum timing value (if < @min, this will be set to @min during
  60 *              preprocessing step, so it is normally not explicitly initialised
  61 *              and is taken care of by the tolerance)
  62 */
  63struct img_ir_timing_range {
  64        u16 min;
  65        u16 max;
  66};
  67
  68/**
  69 * struct img_ir_symbol_timing - timing data for a symbol
  70 * @pulse:      Timing range for the length of the pulse in this symbol
  71 * @space:      Timing range for the length of the space in this symbol
  72 */
  73struct img_ir_symbol_timing {
  74        struct img_ir_timing_range pulse;
  75        struct img_ir_timing_range space;
  76};
  77
  78/**
  79 * struct img_ir_free_timing - timing data for free time symbol
  80 * @minlen:     Minimum number of bits of data
  81 * @maxlen:     Maximum number of bits of data
  82 * @ft_min:     Minimum free time after message
  83 */
  84struct img_ir_free_timing {
  85        /* measured in bits */
  86        u8 minlen;
  87        u8 maxlen;
  88        u16 ft_min;
  89};
  90
  91/**
  92 * struct img_ir_timings - Timing values.
  93 * @ldr:        Leader symbol timing data
  94 * @s00:        Zero symbol timing data for primary decoder
  95 * @s01:        One symbol timing data for primary decoder
  96 * @s10:        Zero symbol timing data for secondary (no leader symbol) decoder
  97 * @s11:        One symbol timing data for secondary (no leader symbol) decoder
  98 * @ft:         Free time symbol timing data
  99 */
 100struct img_ir_timings {
 101        struct img_ir_symbol_timing ldr, s00, s01, s10, s11;
 102        struct img_ir_free_timing ft;
 103};
 104
 105/**
 106 * struct img_ir_filter - Filter IR events.
 107 * @data:       Data to match.
 108 * @mask:       Mask of bits to compare.
 109 * @minlen:     Additional minimum number of bits.
 110 * @maxlen:     Additional maximum number of bits.
 111 */
 112struct img_ir_filter {
 113        u64 data;
 114        u64 mask;
 115        u8 minlen;
 116        u8 maxlen;
 117};
 118
 119/**
 120 * struct img_ir_timing_regvals - Calculated timing register values.
 121 * @ldr:        Leader symbol timing register value
 122 * @s00:        Zero symbol timing register value for primary decoder
 123 * @s01:        One symbol timing register value for primary decoder
 124 * @s10:        Zero symbol timing register value for secondary decoder
 125 * @s11:        One symbol timing register value for secondary decoder
 126 * @ft:         Free time symbol timing register value
 127 */
 128struct img_ir_timing_regvals {
 129        u32 ldr, s00, s01, s10, s11, ft;
 130};
 131
 132#define IMG_IR_SCANCODE         0       /* new scancode */
 133#define IMG_IR_REPEATCODE       1       /* repeat the previous code */
 134
 135/**
 136 * struct img_ir_scancode_req - Scancode request data.
 137 * @protocol:   Protocol code of received message (defaults to
 138 *              RC_TYPE_UNKNOWN).
 139 * @scancode:   Scan code of received message (must be written by
 140 *              handler if IMG_IR_SCANCODE is returned).
 141 * @toggle:     Toggle bit (defaults to 0).
 142 */
 143struct img_ir_scancode_req {
 144        enum rc_type protocol;
 145        u32 scancode;
 146        u8 toggle;
 147};
 148
 149/**
 150 * struct img_ir_decoder - Decoder settings for an IR protocol.
 151 * @type:       Protocol types bitmap.
 152 * @tolerance:  Timing tolerance as a percentage (default 10%).
 153 * @unit:       Unit of timings in nanoseconds (default 1 us).
 154 * @timings:    Primary timings
 155 * @rtimings:   Additional override timings while waiting for repeats.
 156 * @repeat:     Maximum repeat interval (always in milliseconds).
 157 * @control:    Control flags.
 158 *
 159 * @scancode:   Pointer to function to convert the IR data into a scancode (it
 160 *              must be safe to execute in interrupt context).
 161 *              Returns IMG_IR_SCANCODE to emit new scancode.
 162 *              Returns IMG_IR_REPEATCODE to repeat previous code.
 163 *              Returns -errno (e.g. -EINVAL) on error.
 164 * @filter:     Pointer to function to convert scancode filter to raw hardware
 165 *              filter. The minlen and maxlen fields will have been initialised
 166 *              to the maximum range.
 167 */
 168struct img_ir_decoder {
 169        /* core description */
 170        u64                             type;
 171        unsigned int                    tolerance;
 172        unsigned int                    unit;
 173        struct img_ir_timings           timings;
 174        struct img_ir_timings           rtimings;
 175        unsigned int                    repeat;
 176        struct img_ir_control           control;
 177
 178        /* scancode logic */
 179        int (*scancode)(int len, u64 raw, u64 enabled_protocols,
 180                        struct img_ir_scancode_req *request);
 181        int (*filter)(const struct rc_scancode_filter *in,
 182                      struct img_ir_filter *out, u64 protocols);
 183};
 184
 185extern struct img_ir_decoder img_ir_nec;
 186extern struct img_ir_decoder img_ir_jvc;
 187extern struct img_ir_decoder img_ir_sony;
 188extern struct img_ir_decoder img_ir_sharp;
 189extern struct img_ir_decoder img_ir_sanyo;
 190extern struct img_ir_decoder img_ir_rc5;
 191extern struct img_ir_decoder img_ir_rc6;
 192
 193/**
 194 * struct img_ir_reg_timings - Reg values for decoder timings at clock rate.
 195 * @ctrl:       Processed control register value.
 196 * @timings:    Processed primary timings.
 197 * @rtimings:   Processed repeat timings.
 198 */
 199struct img_ir_reg_timings {
 200        u32                             ctrl;
 201        struct img_ir_timing_regvals    timings;
 202        struct img_ir_timing_regvals    rtimings;
 203};
 204
 205struct img_ir_priv;
 206
 207#ifdef CONFIG_IR_IMG_HW
 208
 209enum img_ir_mode {
 210        IMG_IR_M_NORMAL,
 211        IMG_IR_M_REPEATING,
 212#ifdef CONFIG_PM_SLEEP
 213        IMG_IR_M_WAKE,
 214#endif
 215};
 216
 217/**
 218 * struct img_ir_priv_hw - Private driver data for hardware decoder.
 219 * @ct_quirks:          Quirk bits for each code type.
 220 * @rdev:               Remote control device
 221 * @clk_nb:             Notifier block for clock notify events.
 222 * @end_timer:          Timer until repeat timeout.
 223 * @suspend_timer:      Timer to re-enable protocol.
 224 * @decoder:            Current decoder settings.
 225 * @enabled_protocols:  Currently enabled protocols.
 226 * @clk_hz:             Current core clock rate in Hz.
 227 * @reg_timings:        Timing reg values for decoder at clock rate.
 228 * @flags:              IMG_IR_F_*.
 229 * @filters:            HW filters (derived from scancode filters).
 230 * @mode:               Current decode mode.
 231 * @stopping:           Indicates that decoder is being taken down and timers
 232 *                      should not be restarted.
 233 * @suspend_irqen:      Saved IRQ enable mask over suspend.
 234 * @quirk_suspend_irq:  Saved IRQ enable mask over quirk suspend timer.
 235 */
 236struct img_ir_priv_hw {
 237        unsigned int                    ct_quirks[4];
 238        struct rc_dev                   *rdev;
 239        struct notifier_block           clk_nb;
 240        struct timer_list               end_timer;
 241        struct timer_list               suspend_timer;
 242        const struct img_ir_decoder     *decoder;
 243        u64                             enabled_protocols;
 244        unsigned long                   clk_hz;
 245        struct img_ir_reg_timings       reg_timings;
 246        unsigned int                    flags;
 247        struct img_ir_filter            filters[RC_FILTER_MAX];
 248
 249        enum img_ir_mode                mode;
 250        bool                            stopping;
 251        u32                             suspend_irqen;
 252        u32                             quirk_suspend_irq;
 253};
 254
 255static inline bool img_ir_hw_enabled(struct img_ir_priv_hw *hw)
 256{
 257        return hw->rdev;
 258};
 259
 260void img_ir_isr_hw(struct img_ir_priv *priv, u32 irq_status);
 261void img_ir_setup_hw(struct img_ir_priv *priv);
 262int img_ir_probe_hw(struct img_ir_priv *priv);
 263void img_ir_remove_hw(struct img_ir_priv *priv);
 264
 265#ifdef CONFIG_PM_SLEEP
 266int img_ir_suspend(struct device *dev);
 267int img_ir_resume(struct device *dev);
 268#else
 269#define img_ir_suspend NULL
 270#define img_ir_resume NULL
 271#endif
 272
 273#else
 274
 275struct img_ir_priv_hw {
 276};
 277
 278static inline bool img_ir_hw_enabled(struct img_ir_priv_hw *hw)
 279{
 280        return false;
 281};
 282static inline void img_ir_isr_hw(struct img_ir_priv *priv, u32 irq_status)
 283{
 284}
 285static inline void img_ir_setup_hw(struct img_ir_priv *priv)
 286{
 287}
 288static inline int img_ir_probe_hw(struct img_ir_priv *priv)
 289{
 290        return -ENODEV;
 291}
 292static inline void img_ir_remove_hw(struct img_ir_priv *priv)
 293{
 294}
 295
 296#define img_ir_suspend NULL
 297#define img_ir_resume NULL
 298
 299#endif /* CONFIG_IR_IMG_HW */
 300
 301#endif /* _IMG_IR_HW_H_ */
 302