linux/drivers/video/fbdev/bt455.h
<<
>>
Prefs
   1/*
   2 *      linux/drivers/video/bt455.h
   3 *
   4 *      Copyright 2003  Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
   5 *      Copyright 2016  Maciej W. Rozycki <macro@linux-mips.org>
   6 *
   7 *      This file is subject to the terms and conditions of the GNU General
   8 *      Public License. See the file COPYING in the main directory of this
   9 *      archive for more details.
  10 */
  11#include <linux/types.h>
  12
  13/*
  14 * Bt455 byte-wide registers, 32-bit aligned.
  15 */
  16struct bt455_regs {
  17        volatile u8 addr_cmap;
  18        u8 pad0[3];
  19        volatile u8 addr_cmap_data;
  20        u8 pad1[3];
  21        volatile u8 addr_clr;
  22        u8 pad2[3];
  23        volatile u8 addr_ovly;
  24        u8 pad3[3];
  25};
  26
  27static inline void bt455_select_reg(struct bt455_regs *regs, int ir)
  28{
  29        mb();
  30        regs->addr_cmap = ir & 0x0f;
  31}
  32
  33static inline void bt455_reset_reg(struct bt455_regs *regs)
  34{
  35        mb();
  36        regs->addr_clr = 0;
  37}
  38
  39/*
  40 * Read/write to a Bt455 color map register.
  41 */
  42static inline void bt455_read_cmap_next(struct bt455_regs *regs, u8 *grey)
  43{
  44        mb();
  45        regs->addr_cmap_data;
  46        rmb();
  47        *grey = regs->addr_cmap_data & 0xf;
  48        rmb();
  49        regs->addr_cmap_data;
  50}
  51
  52static inline void bt455_write_cmap_next(struct bt455_regs *regs, u8 grey)
  53{
  54        wmb();
  55        regs->addr_cmap_data = 0x0;
  56        wmb();
  57        regs->addr_cmap_data = grey & 0xf;
  58        wmb();
  59        regs->addr_cmap_data = 0x0;
  60}
  61
  62static inline void bt455_write_ovly_next(struct bt455_regs *regs, u8 grey)
  63{
  64        wmb();
  65        regs->addr_ovly = 0x0;
  66        wmb();
  67        regs->addr_ovly = grey & 0xf;
  68        wmb();
  69        regs->addr_ovly = 0x0;
  70}
  71
  72static inline void bt455_read_cmap_entry(struct bt455_regs *regs,
  73                                         int cr, u8 *grey)
  74{
  75        bt455_select_reg(regs, cr);
  76        bt455_read_cmap_next(regs, grey);
  77}
  78
  79static inline void bt455_write_cmap_entry(struct bt455_regs *regs,
  80                                          int cr, u8 grey)
  81{
  82        bt455_select_reg(regs, cr);
  83        bt455_write_cmap_next(regs, grey);
  84}
  85
  86static inline void bt455_write_ovly_entry(struct bt455_regs *regs, u8 grey)
  87{
  88        bt455_reset_reg(regs);
  89        bt455_write_ovly_next(regs, grey);
  90}
  91