cx18-io.h (4284B)
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * cx18 driver PCI memory mapped IO access routines 4 * 5 * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> 6 * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> 7 */ 8 9#ifndef CX18_IO_H 10#define CX18_IO_H 11 12#include "cx18-driver.h" 13 14/* 15 * Readback and retry of MMIO access for reliability: 16 * The concept was suggested by Steve Toth <stoth@linuxtv.org>. 17 * The implementation is the fault of Andy Walls <awalls@md.metrocast.net>. 18 * 19 * *write* functions are implied to retry the mmio unless suffixed with _noretry 20 * *read* functions never retry the mmio (it never helps to do so) 21 */ 22 23/* Non byteswapping memory mapped IO */ 24static inline u32 cx18_raw_readl(struct cx18 *cx, const void __iomem *addr) 25{ 26 return __raw_readl(addr); 27} 28 29static inline 30void cx18_raw_writel_noretry(struct cx18 *cx, u32 val, void __iomem *addr) 31{ 32 __raw_writel(val, addr); 33} 34 35static inline void cx18_raw_writel(struct cx18 *cx, u32 val, void __iomem *addr) 36{ 37 int i; 38 for (i = 0; i < CX18_MAX_MMIO_WR_RETRIES; i++) { 39 cx18_raw_writel_noretry(cx, val, addr); 40 if (val == cx18_raw_readl(cx, addr)) 41 break; 42 } 43} 44 45/* Normal memory mapped IO */ 46static inline u32 cx18_readl(struct cx18 *cx, const void __iomem *addr) 47{ 48 return readl(addr); 49} 50 51static inline 52void cx18_writel_noretry(struct cx18 *cx, u32 val, void __iomem *addr) 53{ 54 writel(val, addr); 55} 56 57static inline void cx18_writel(struct cx18 *cx, u32 val, void __iomem *addr) 58{ 59 int i; 60 for (i = 0; i < CX18_MAX_MMIO_WR_RETRIES; i++) { 61 cx18_writel_noretry(cx, val, addr); 62 if (val == cx18_readl(cx, addr)) 63 break; 64 } 65} 66 67static inline 68void cx18_writel_expect(struct cx18 *cx, u32 val, void __iomem *addr, 69 u32 eval, u32 mask) 70{ 71 int i; 72 u32 r; 73 eval &= mask; 74 for (i = 0; i < CX18_MAX_MMIO_WR_RETRIES; i++) { 75 cx18_writel_noretry(cx, val, addr); 76 r = cx18_readl(cx, addr); 77 if (r == 0xffffffff && eval != 0xffffffff) 78 continue; 79 if (eval == (r & mask)) 80 break; 81 } 82} 83 84static inline u16 cx18_readw(struct cx18 *cx, const void __iomem *addr) 85{ 86 return readw(addr); 87} 88 89static inline 90void cx18_writew_noretry(struct cx18 *cx, u16 val, void __iomem *addr) 91{ 92 writew(val, addr); 93} 94 95static inline void cx18_writew(struct cx18 *cx, u16 val, void __iomem *addr) 96{ 97 int i; 98 for (i = 0; i < CX18_MAX_MMIO_WR_RETRIES; i++) { 99 cx18_writew_noretry(cx, val, addr); 100 if (val == cx18_readw(cx, addr)) 101 break; 102 } 103} 104 105static inline u8 cx18_readb(struct cx18 *cx, const void __iomem *addr) 106{ 107 return readb(addr); 108} 109 110static inline 111void cx18_writeb_noretry(struct cx18 *cx, u8 val, void __iomem *addr) 112{ 113 writeb(val, addr); 114} 115 116static inline void cx18_writeb(struct cx18 *cx, u8 val, void __iomem *addr) 117{ 118 int i; 119 for (i = 0; i < CX18_MAX_MMIO_WR_RETRIES; i++) { 120 cx18_writeb_noretry(cx, val, addr); 121 if (val == cx18_readb(cx, addr)) 122 break; 123 } 124} 125 126static inline 127void cx18_memcpy_fromio(struct cx18 *cx, void *to, 128 const void __iomem *from, unsigned int len) 129{ 130 memcpy_fromio(to, from, len); 131} 132 133void cx18_memset_io(struct cx18 *cx, void __iomem *addr, int val, size_t count); 134 135 136/* Access "register" region of CX23418 memory mapped I/O */ 137static inline void cx18_write_reg_noretry(struct cx18 *cx, u32 val, u32 reg) 138{ 139 cx18_writel_noretry(cx, val, cx->reg_mem + reg); 140} 141 142static inline void cx18_write_reg(struct cx18 *cx, u32 val, u32 reg) 143{ 144 cx18_writel(cx, val, cx->reg_mem + reg); 145} 146 147static inline void cx18_write_reg_expect(struct cx18 *cx, u32 val, u32 reg, 148 u32 eval, u32 mask) 149{ 150 cx18_writel_expect(cx, val, cx->reg_mem + reg, eval, mask); 151} 152 153static inline u32 cx18_read_reg(struct cx18 *cx, u32 reg) 154{ 155 return cx18_readl(cx, cx->reg_mem + reg); 156} 157 158 159/* Access "encoder memory" region of CX23418 memory mapped I/O */ 160static inline void cx18_write_enc(struct cx18 *cx, u32 val, u32 addr) 161{ 162 cx18_writel(cx, val, cx->enc_mem + addr); 163} 164 165static inline u32 cx18_read_enc(struct cx18 *cx, u32 addr) 166{ 167 return cx18_readl(cx, cx->enc_mem + addr); 168} 169 170void cx18_sw1_irq_enable(struct cx18 *cx, u32 val); 171void cx18_sw1_irq_disable(struct cx18 *cx, u32 val); 172void cx18_sw2_irq_enable(struct cx18 *cx, u32 val); 173void cx18_sw2_irq_disable(struct cx18 *cx, u32 val); 174void cx18_sw2_irq_disable_cpu(struct cx18 *cx, u32 val); 175void cx18_setup_page(struct cx18 *cx, u32 addr); 176 177#endif /* CX18_IO_H */