162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * linux/drivers/video/bt455.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright 2003 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> 562306a36Sopenharmony_ci * Copyright 2016 Maciej W. Rozycki <macro@linux-mips.org> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General 862306a36Sopenharmony_ci * Public License. See the file COPYING in the main directory of this 962306a36Sopenharmony_ci * archive for more details. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Bt455 byte-wide registers, 32-bit aligned. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_cistruct bt455_regs { 1762306a36Sopenharmony_ci volatile u8 addr_cmap; 1862306a36Sopenharmony_ci u8 pad0[3]; 1962306a36Sopenharmony_ci volatile u8 addr_cmap_data; 2062306a36Sopenharmony_ci u8 pad1[3]; 2162306a36Sopenharmony_ci volatile u8 addr_clr; 2262306a36Sopenharmony_ci u8 pad2[3]; 2362306a36Sopenharmony_ci volatile u8 addr_ovly; 2462306a36Sopenharmony_ci u8 pad3[3]; 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic inline void bt455_select_reg(struct bt455_regs *regs, int ir) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci mb(); 3062306a36Sopenharmony_ci regs->addr_cmap = ir & 0x0f; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic inline void bt455_reset_reg(struct bt455_regs *regs) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci mb(); 3662306a36Sopenharmony_ci regs->addr_clr = 0; 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * Read/write to a Bt455 color map register. 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_cistatic inline void bt455_read_cmap_next(struct bt455_regs *regs, u8 *grey) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci mb(); 4562306a36Sopenharmony_ci regs->addr_cmap_data; 4662306a36Sopenharmony_ci rmb(); 4762306a36Sopenharmony_ci *grey = regs->addr_cmap_data & 0xf; 4862306a36Sopenharmony_ci rmb(); 4962306a36Sopenharmony_ci regs->addr_cmap_data; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic inline void bt455_write_cmap_next(struct bt455_regs *regs, u8 grey) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci wmb(); 5562306a36Sopenharmony_ci regs->addr_cmap_data = 0x0; 5662306a36Sopenharmony_ci wmb(); 5762306a36Sopenharmony_ci regs->addr_cmap_data = grey & 0xf; 5862306a36Sopenharmony_ci wmb(); 5962306a36Sopenharmony_ci regs->addr_cmap_data = 0x0; 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic inline void bt455_write_ovly_next(struct bt455_regs *regs, u8 grey) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci wmb(); 6562306a36Sopenharmony_ci regs->addr_ovly = 0x0; 6662306a36Sopenharmony_ci wmb(); 6762306a36Sopenharmony_ci regs->addr_ovly = grey & 0xf; 6862306a36Sopenharmony_ci wmb(); 6962306a36Sopenharmony_ci regs->addr_ovly = 0x0; 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic inline void bt455_read_cmap_entry(struct bt455_regs *regs, 7362306a36Sopenharmony_ci int cr, u8 *grey) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci bt455_select_reg(regs, cr); 7662306a36Sopenharmony_ci bt455_read_cmap_next(regs, grey); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic inline void bt455_write_cmap_entry(struct bt455_regs *regs, 8062306a36Sopenharmony_ci int cr, u8 grey) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci bt455_select_reg(regs, cr); 8362306a36Sopenharmony_ci bt455_write_cmap_next(regs, grey); 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic inline void bt455_write_ovly_entry(struct bt455_regs *regs, u8 grey) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci bt455_reset_reg(regs); 8962306a36Sopenharmony_ci bt455_write_ovly_next(regs, grey); 9062306a36Sopenharmony_ci} 91