162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * iohelper.h 462306a36Sopenharmony_ci * helper for define functions to access ISDN hardware 562306a36Sopenharmony_ci * supported are memory mapped IO 662306a36Sopenharmony_ci * indirect port IO (one port for address, one for data) 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Author Karsten Keil <keil@isdn4linux.de> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Copyright 2009 by Karsten Keil <keil@isdn4linux.de> 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifndef _IOHELPER_H 1462306a36Sopenharmony_ci#define _IOHELPER_H 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_citypedef u8 (read_reg_func)(void *hwp, u8 offset); 1762306a36Sopenharmony_citypedef void (write_reg_func)(void *hwp, u8 offset, u8 value); 1862306a36Sopenharmony_citypedef void (fifo_func)(void *hwp, u8 offset, u8 *datap, int size); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct _ioport { 2162306a36Sopenharmony_ci u32 port; 2262306a36Sopenharmony_ci u32 ale; 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define IOFUNC_IO(name, hws, ap) \ 2662306a36Sopenharmony_ci static u8 Read##name##_IO(void *p, u8 off) { \ 2762306a36Sopenharmony_ci struct hws *hw = p; \ 2862306a36Sopenharmony_ci return inb(hw->ap.port + off); \ 2962306a36Sopenharmony_ci } \ 3062306a36Sopenharmony_ci static void Write##name##_IO(void *p, u8 off, u8 val) { \ 3162306a36Sopenharmony_ci struct hws *hw = p; \ 3262306a36Sopenharmony_ci outb(val, hw->ap.port + off); \ 3362306a36Sopenharmony_ci } \ 3462306a36Sopenharmony_ci static void ReadFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) { \ 3562306a36Sopenharmony_ci struct hws *hw = p; \ 3662306a36Sopenharmony_ci insb(hw->ap.port + off, dp, size); \ 3762306a36Sopenharmony_ci } \ 3862306a36Sopenharmony_ci static void WriteFiFo##name##_IO(void *p, u8 off, u8 *dp, int size) { \ 3962306a36Sopenharmony_ci struct hws *hw = p; \ 4062306a36Sopenharmony_ci outsb(hw->ap.port + off, dp, size); \ 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define IOFUNC_IND(name, hws, ap) \ 4462306a36Sopenharmony_ci static u8 Read##name##_IND(void *p, u8 off) { \ 4562306a36Sopenharmony_ci struct hws *hw = p; \ 4662306a36Sopenharmony_ci outb(off, hw->ap.ale); \ 4762306a36Sopenharmony_ci return inb(hw->ap.port); \ 4862306a36Sopenharmony_ci } \ 4962306a36Sopenharmony_ci static void Write##name##_IND(void *p, u8 off, u8 val) { \ 5062306a36Sopenharmony_ci struct hws *hw = p; \ 5162306a36Sopenharmony_ci outb(off, hw->ap.ale); \ 5262306a36Sopenharmony_ci outb(val, hw->ap.port); \ 5362306a36Sopenharmony_ci } \ 5462306a36Sopenharmony_ci static void ReadFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) { \ 5562306a36Sopenharmony_ci struct hws *hw = p; \ 5662306a36Sopenharmony_ci outb(off, hw->ap.ale); \ 5762306a36Sopenharmony_ci insb(hw->ap.port, dp, size); \ 5862306a36Sopenharmony_ci } \ 5962306a36Sopenharmony_ci static void WriteFiFo##name##_IND(void *p, u8 off, u8 *dp, int size) { \ 6062306a36Sopenharmony_ci struct hws *hw = p; \ 6162306a36Sopenharmony_ci outb(off, hw->ap.ale); \ 6262306a36Sopenharmony_ci outsb(hw->ap.port, dp, size); \ 6362306a36Sopenharmony_ci } 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define IOFUNC_MEMIO(name, hws, typ, adr) \ 6662306a36Sopenharmony_ci static u8 Read##name##_MIO(void *p, u8 off) { \ 6762306a36Sopenharmony_ci struct hws *hw = p; \ 6862306a36Sopenharmony_ci return readb(((typ *)hw->adr) + off); \ 6962306a36Sopenharmony_ci } \ 7062306a36Sopenharmony_ci static void Write##name##_MIO(void *p, u8 off, u8 val) { \ 7162306a36Sopenharmony_ci struct hws *hw = p; \ 7262306a36Sopenharmony_ci writeb(val, ((typ *)hw->adr) + off); \ 7362306a36Sopenharmony_ci } \ 7462306a36Sopenharmony_ci static void ReadFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) { \ 7562306a36Sopenharmony_ci struct hws *hw = p; \ 7662306a36Sopenharmony_ci while (size--) \ 7762306a36Sopenharmony_ci *dp++ = readb(((typ *)hw->adr) + off); \ 7862306a36Sopenharmony_ci } \ 7962306a36Sopenharmony_ci static void WriteFiFo##name##_MIO(void *p, u8 off, u8 *dp, int size) { \ 8062306a36Sopenharmony_ci struct hws *hw = p; \ 8162306a36Sopenharmony_ci while (size--) \ 8262306a36Sopenharmony_ci writeb(*dp++, ((typ *)hw->adr) + off); \ 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define ASSIGN_FUNC(typ, name, dest) do { \ 8662306a36Sopenharmony_ci dest.read_reg = &Read##name##_##typ; \ 8762306a36Sopenharmony_ci dest.write_reg = &Write##name##_##typ; \ 8862306a36Sopenharmony_ci dest.read_fifo = &ReadFiFo##name##_##typ; \ 8962306a36Sopenharmony_ci dest.write_fifo = &WriteFiFo##name##_##typ; \ 9062306a36Sopenharmony_ci } while (0) 9162306a36Sopenharmony_ci#define ASSIGN_FUNC_IPAC(typ, target) do { \ 9262306a36Sopenharmony_ci ASSIGN_FUNC(typ, ISAC, target.isac); \ 9362306a36Sopenharmony_ci ASSIGN_FUNC(typ, IPAC, target); \ 9462306a36Sopenharmony_ci } while (0) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#endif 97