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