r8a66597-udc.h revision 59c82d12aa898c2f373b7e44bdea0b7c762ceccc
1c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda/*
2c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * R8A66597 UDC
3c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
4c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * Copyright (C) 2007-2009 Renesas Solutions Corp.
5c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
6c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * Author : Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
7c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
8c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * This program is free software; you can redistribute it and/or modify
9c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * it under the terms of the GNU General Public License as published by
10c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * the Free Software Foundation; version 2 of the License.
11c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
12c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * This program is distributed in the hope that it will be useful,
13c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * but WITHOUT ANY WARRANTY; without even the implied warranty of
14c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * GNU General Public License for more details.
16c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
17c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * You should have received a copy of the GNU General Public License
18c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * along with this program; if not, write to the Free Software
19c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda *
21c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda */
22c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
23c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#ifndef __R8A66597_H__
24c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define __R8A66597_H__
25c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
26d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm#ifdef CONFIG_HAVE_CLK
27d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm#include <linux/clk.h>
28d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm#endif
29d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm
30c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#include <linux/usb/r8a66597.h>
31c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
32c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_SAMPLING	10
33c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
34c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_NUM_PIPE	8
35c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_NUM_BULK	3
36c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_NUM_ISOC	2
37c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_NUM_INT	2
38c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
39c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_BASE_PIPENUM_BULK	3
40c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_BASE_PIPENUM_ISOC	1
41c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_BASE_PIPENUM_INT	6
42c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
43c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_BASE_BUFNUM	6
44c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define R8A66597_MAX_BUFNUM	0x4F
45c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
46c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define is_bulk_pipe(pipenum)	\
47c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	((pipenum >= R8A66597_BASE_PIPENUM_BULK) && \
48c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	 (pipenum < (R8A66597_BASE_PIPENUM_BULK + R8A66597_MAX_NUM_BULK)))
49c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define is_interrupt_pipe(pipenum)	\
50c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	((pipenum >= R8A66597_BASE_PIPENUM_INT) && \
51c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	 (pipenum < (R8A66597_BASE_PIPENUM_INT + R8A66597_MAX_NUM_INT)))
52c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define is_isoc_pipe(pipenum)	\
53c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	((pipenum >= R8A66597_BASE_PIPENUM_ISOC) && \
54c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	 (pipenum < (R8A66597_BASE_PIPENUM_ISOC + R8A66597_MAX_NUM_ISOC)))
55c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
56c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastruct r8a66597_pipe_info {
57c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	pipe;
58c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	epnum;
59c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	maxpacket;
60c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	type;
61c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	interval;
62c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16	dir_in;
63c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda};
64c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
65c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastruct r8a66597_request {
66c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct usb_request	req;
67c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct list_head	queue;
68c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda};
69c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
70c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastruct r8a66597_ep {
71c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct usb_ep		ep;
72c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct r8a66597		*r8a66597;
73c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
74c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct list_head	queue;
75c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned		busy:1;
769e7291c1124655980ab05fc89930de8e218c7d64Yoshihiro Shimoda	unsigned		wedge:1;
77c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned		internal_ccpl:1;	/* use only control */
78c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
79c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	/* this member can able to after r8a66597_enable */
80c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned		use_dma:1;
81c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			pipenum;
82c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			type;
83c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	const struct usb_endpoint_descriptor	*desc;
84c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	/* register address */
85c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char		fifoaddr;
86c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char		fifosel;
87c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char		fifoctr;
88c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char		fifotrn;
89c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char		pipectr;
90c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda};
91c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
92c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastruct r8a66597 {
93c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	spinlock_t		lock;
94c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned long		reg;
95c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
96d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm#ifdef CONFIG_HAVE_CLK
97d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm	struct clk *clk;
98d2e27bdf2870e507dd4abba1f56ca84ee6ae7232Magnus Damm#endif
99c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct r8a66597_platdata	*pdata;
100c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
101c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct usb_gadget		gadget;
102c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct usb_gadget_driver	*driver;
103c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
104c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct r8a66597_ep	ep[R8A66597_MAX_NUM_PIPE];
105c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct r8a66597_ep	*pipenum2ep[R8A66597_MAX_NUM_PIPE];
106c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct r8a66597_ep	*epaddr2ep[16];
107c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
108c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct timer_list	timer;
109c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	struct usb_request	*ep0_req;	/* for internal request */
110c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			ep0_data;	/* for internal request */
111c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			old_vbus;
112c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			scount;
113c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16			old_dvsq;
114c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
115c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	/* pipe config */
116c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char bulk;
117c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char interrupt;
118c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char isochronous;
119c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned char num_dma;
120c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
121c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned irq_sense_low:1;
122c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda};
123c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
124c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define gadget_to_r8a66597(_gadget)	\
125c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		container_of(_gadget, struct r8a66597, gadget)
126c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define r8a66597_to_gadget(r8a66597) (&r8a66597->gadget)
127c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
128c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset)
129c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
130c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	return inw(r8a66597->reg + offset);
131c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
132c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
133c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline void r8a66597_read_fifo(struct r8a66597 *r8a66597,
13459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				      unsigned long offset,
13559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				      unsigned char *buf,
136c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda				      int len)
137c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
13859c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	unsigned long fifoaddr = r8a66597->reg + offset;
13959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	unsigned int data;
14059c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	int i;
14159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
142c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	if (r8a66597->pdata->on_chip) {
14359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* 32-bit accesses for on_chip controllers */
14459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
14559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* aligned buf case */
14659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		if (len >= 4 && !((unsigned long)buf & 0x03)) {
14759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			insl(fifoaddr, buf, len / 4);
14859c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf += len & ~0x03;
14959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			len &= 0x03;
15059c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		}
15159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
15259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* unaligned buf case */
15359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		for (i = 0; i < len; i++) {
15459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			if (!(i & 0x03))
15559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				data = inl(fifoaddr);
15659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
15759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf[i] = (data >> ((i & 0x03) * 8)) & 0xff;
158c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		}
159c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	} else {
16059c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* 16-bit accesses for external controllers */
16159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
16259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* aligned buf case */
16359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		if (len >= 2 && !((unsigned long)buf & 0x01)) {
16459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			insw(fifoaddr, buf, len / 2);
16559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf += len & ~0x01;
16659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			len &= 0x01;
16759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		}
16859c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
16959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* unaligned buf case */
17059c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		for (i = 0; i < len; i++) {
17159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			if (!(i & 0x01))
17259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				data = inw(fifoaddr);
17359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
17459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf[i] = (data >> ((i & 0x01) * 8)) & 0xff;
17559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		}
176c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	}
177c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
178c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
179c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline void r8a66597_write(struct r8a66597 *r8a66597, u16 val,
180c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda				  unsigned long offset)
181c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
182c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	outw(val, r8a66597->reg + offset);
183c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
184c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
185c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline void r8a66597_write_fifo(struct r8a66597 *r8a66597,
18659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				       unsigned long offset,
18759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm				       unsigned char *buf,
188c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda				       int len)
189c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
190c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	unsigned long fifoaddr = r8a66597->reg + offset;
19159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	int adj = 0;
19259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	int i;
193c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
194c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	if (r8a66597->pdata->on_chip) {
19559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* 32-bit access only if buf is 32-bit aligned */
19659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		if (len >= 4 && !((unsigned long)buf & 0x03)) {
19759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			outsl(fifoaddr, buf, len / 4);
19859c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf += len & ~0x03;
19959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			len &= 0x03;
200c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		}
201c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	} else {
20259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		/* 16-bit access only if buf is 16-bit aligned */
20359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		if (len >= 2 && !((unsigned long)buf & 0x01)) {
20459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			outsw(fifoaddr, buf, len / 2);
20559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			buf += len & ~0x01;
20659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			len &= 0x01;
207c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		}
208c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	}
20959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
21059c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	/* adjust fifo address in the little endian case */
21159c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	if (!(r8a66597_read(r8a66597, CFIFOSEL) & BIGEND)) {
21259c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		if (r8a66597->pdata->on_chip)
21359c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			adj = 0x03; /* 32-bit wide */
21459c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		else
21559c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm			adj = 0x01; /* 16-bit wide */
21659c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	}
21759c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm
21859c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm	for (i = 0; i < len; i++)
21959c82d12aa898c2f373b7e44bdea0b7c762cecccMagnus Damm		outb(buf[i], fifoaddr + adj - (i & adj));
220c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
221c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
222c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline void r8a66597_mdfy(struct r8a66597 *r8a66597,
223c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda				 u16 val, u16 pat, unsigned long offset)
224c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
225c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16 tmp;
226c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	tmp = r8a66597_read(r8a66597, offset);
227c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	tmp = tmp & (~pat);
228c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	tmp = tmp | val;
229c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	r8a66597_write(r8a66597, tmp, offset);
230c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
231c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
232c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimodastatic inline u16 get_xtal_from_pdata(struct r8a66597_platdata *pdata)
233c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda{
234c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	u16 clock = 0;
235c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
236c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	switch (pdata->xtal) {
237c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	case R8A66597_PLATDATA_XTAL_12MHZ:
238c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		clock = XTAL12;
239c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		break;
240c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	case R8A66597_PLATDATA_XTAL_24MHZ:
241c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		clock = XTAL24;
242c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		break;
243c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	case R8A66597_PLATDATA_XTAL_48MHZ:
244c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		clock = XTAL48;
245c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		break;
246c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	default:
247c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		printk(KERN_ERR "r8a66597: platdata clock is wrong.\n");
248c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda		break;
249c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	}
250c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
251c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	return clock;
252c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda}
253c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
254c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define r8a66597_bclr(r8a66597, val, offset)	\
255c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda			r8a66597_mdfy(r8a66597, 0, val, offset)
256c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define r8a66597_bset(r8a66597, val, offset)	\
257c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda			r8a66597_mdfy(r8a66597, val, 0, offset)
258c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
259c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define get_pipectr_addr(pipenum)	(PIPE1CTR + (pipenum - 1) * 2)
260c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
261c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define enable_irq_ready(r8a66597, pipenum)	\
262c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	enable_pipe_irq(r8a66597, pipenum, BRDYENB)
263c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define disable_irq_ready(r8a66597, pipenum)	\
264c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	disable_pipe_irq(r8a66597, pipenum, BRDYENB)
265c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define enable_irq_empty(r8a66597, pipenum)	\
266c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	enable_pipe_irq(r8a66597, pipenum, BEMPENB)
267c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define disable_irq_empty(r8a66597, pipenum)	\
268c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	disable_pipe_irq(r8a66597, pipenum, BEMPENB)
269c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define enable_irq_nrdy(r8a66597, pipenum)	\
270c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	enable_pipe_irq(r8a66597, pipenum, NRDYENB)
271c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#define disable_irq_nrdy(r8a66597, pipenum)	\
272c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda	disable_pipe_irq(r8a66597, pipenum, NRDYENB)
273c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
274c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda#endif	/* __R8A66597_H__ */
275c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda
276