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