15fd54aceSGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 290fccb52SAndrzej Pietrasiewicz /* 390fccb52SAndrzej Pietrasiewicz * Toshiba TC86C001 ("Goku-S") USB Device Controller driver 490fccb52SAndrzej Pietrasiewicz * 590fccb52SAndrzej Pietrasiewicz * Copyright (C) 2000-2002 Lineo 690fccb52SAndrzej Pietrasiewicz * by Stuart Lynne, Tom Rushworth, and Bruce Balden 790fccb52SAndrzej Pietrasiewicz * Copyright (C) 2002 Toshiba Corporation 890fccb52SAndrzej Pietrasiewicz * Copyright (C) 2003 MontaVista Software (source@mvista.com) 990fccb52SAndrzej Pietrasiewicz */ 1090fccb52SAndrzej Pietrasiewicz 1190fccb52SAndrzej Pietrasiewicz /* 1290fccb52SAndrzej Pietrasiewicz * PCI BAR 0 points to these registers. 1390fccb52SAndrzej Pietrasiewicz */ 1490fccb52SAndrzej Pietrasiewicz struct goku_udc_regs { 1590fccb52SAndrzej Pietrasiewicz /* irq management */ 1690fccb52SAndrzej Pietrasiewicz u32 int_status; /* 0x000 */ 1790fccb52SAndrzej Pietrasiewicz u32 int_enable; 1890fccb52SAndrzej Pietrasiewicz #define INT_SUSPEND 0x00001 /* or resume */ 1990fccb52SAndrzej Pietrasiewicz #define INT_USBRESET 0x00002 2090fccb52SAndrzej Pietrasiewicz #define INT_ENDPOINT0 0x00004 2190fccb52SAndrzej Pietrasiewicz #define INT_SETUP 0x00008 2290fccb52SAndrzej Pietrasiewicz #define INT_STATUS 0x00010 2390fccb52SAndrzej Pietrasiewicz #define INT_STATUSNAK 0x00020 2490fccb52SAndrzej Pietrasiewicz #define INT_EPxDATASET(n) (0x00020 << (n)) /* 0 < n < 4 */ 2590fccb52SAndrzej Pietrasiewicz # define INT_EP1DATASET 0x00040 2690fccb52SAndrzej Pietrasiewicz # define INT_EP2DATASET 0x00080 2790fccb52SAndrzej Pietrasiewicz # define INT_EP3DATASET 0x00100 28*ac87e560SWolfram Sang #define INT_EPnNAK(n) (0x00100 << (n)) /* 0 < n < 4 */ 2990fccb52SAndrzej Pietrasiewicz # define INT_EP1NAK 0x00200 3090fccb52SAndrzej Pietrasiewicz # define INT_EP2NAK 0x00400 3190fccb52SAndrzej Pietrasiewicz # define INT_EP3NAK 0x00800 3290fccb52SAndrzej Pietrasiewicz #define INT_SOF 0x01000 3390fccb52SAndrzej Pietrasiewicz #define INT_ERR 0x02000 3490fccb52SAndrzej Pietrasiewicz #define INT_MSTWRSET 0x04000 3590fccb52SAndrzej Pietrasiewicz #define INT_MSTWREND 0x08000 3690fccb52SAndrzej Pietrasiewicz #define INT_MSTWRTMOUT 0x10000 3790fccb52SAndrzej Pietrasiewicz #define INT_MSTRDEND 0x20000 3890fccb52SAndrzej Pietrasiewicz #define INT_SYSERROR 0x40000 3990fccb52SAndrzej Pietrasiewicz #define INT_PWRDETECT 0x80000 4090fccb52SAndrzej Pietrasiewicz 4190fccb52SAndrzej Pietrasiewicz #define INT_DEVWIDE \ 4290fccb52SAndrzej Pietrasiewicz (INT_PWRDETECT|INT_SYSERROR/*|INT_ERR*/|INT_USBRESET|INT_SUSPEND) 4390fccb52SAndrzej Pietrasiewicz #define INT_EP0 \ 4490fccb52SAndrzej Pietrasiewicz (INT_SETUP|INT_ENDPOINT0/*|INT_STATUS*/|INT_STATUSNAK) 4590fccb52SAndrzej Pietrasiewicz 4690fccb52SAndrzej Pietrasiewicz u32 dma_master; 4790fccb52SAndrzej Pietrasiewicz #define MST_EOPB_DIS 0x0800 4890fccb52SAndrzej Pietrasiewicz #define MST_EOPB_ENA 0x0400 4990fccb52SAndrzej Pietrasiewicz #define MST_TIMEOUT_DIS 0x0200 5090fccb52SAndrzej Pietrasiewicz #define MST_TIMEOUT_ENA 0x0100 5190fccb52SAndrzej Pietrasiewicz #define MST_RD_EOPB 0x0080 /* write-only */ 5290fccb52SAndrzej Pietrasiewicz #define MST_RD_RESET 0x0040 5390fccb52SAndrzej Pietrasiewicz #define MST_WR_RESET 0x0020 5490fccb52SAndrzej Pietrasiewicz #define MST_RD_ENA 0x0004 /* 1:start, 0:ignore */ 5590fccb52SAndrzej Pietrasiewicz #define MST_WR_ENA 0x0002 /* 1:start, 0:ignore */ 5690fccb52SAndrzej Pietrasiewicz #define MST_CONNECTION 0x0001 /* 0 for ep1out/ep2in */ 5790fccb52SAndrzej Pietrasiewicz 5890fccb52SAndrzej Pietrasiewicz #define MST_R_BITS (MST_EOPB_DIS|MST_EOPB_ENA \ 5990fccb52SAndrzej Pietrasiewicz |MST_RD_ENA|MST_RD_RESET) 6090fccb52SAndrzej Pietrasiewicz #define MST_W_BITS (MST_TIMEOUT_DIS|MST_TIMEOUT_ENA \ 6190fccb52SAndrzej Pietrasiewicz |MST_WR_ENA|MST_WR_RESET) 6290fccb52SAndrzej Pietrasiewicz #define MST_RW_BITS (MST_R_BITS|MST_W_BITS \ 6390fccb52SAndrzej Pietrasiewicz |MST_CONNECTION) 6490fccb52SAndrzej Pietrasiewicz 6590fccb52SAndrzej Pietrasiewicz /* these values assume (dma_master & MST_CONNECTION) == 0 */ 6690fccb52SAndrzej Pietrasiewicz #define UDC_MSTWR_ENDPOINT 1 6790fccb52SAndrzej Pietrasiewicz #define UDC_MSTRD_ENDPOINT 2 6890fccb52SAndrzej Pietrasiewicz 6990fccb52SAndrzej Pietrasiewicz /* dma master write */ 7090fccb52SAndrzej Pietrasiewicz u32 out_dma_start; 7190fccb52SAndrzej Pietrasiewicz u32 out_dma_end; 7290fccb52SAndrzej Pietrasiewicz u32 out_dma_current; 7390fccb52SAndrzej Pietrasiewicz 7490fccb52SAndrzej Pietrasiewicz /* dma master read */ 7590fccb52SAndrzej Pietrasiewicz u32 in_dma_start; 7690fccb52SAndrzej Pietrasiewicz u32 in_dma_end; 7790fccb52SAndrzej Pietrasiewicz u32 in_dma_current; 7890fccb52SAndrzej Pietrasiewicz 7990fccb52SAndrzej Pietrasiewicz u32 power_detect; 8090fccb52SAndrzej Pietrasiewicz #define PW_DETECT 0x04 8190fccb52SAndrzej Pietrasiewicz #define PW_RESETB 0x02 8290fccb52SAndrzej Pietrasiewicz #define PW_PULLUP 0x01 8390fccb52SAndrzej Pietrasiewicz 8490fccb52SAndrzej Pietrasiewicz u8 _reserved0 [0x1d8]; 8590fccb52SAndrzej Pietrasiewicz 8690fccb52SAndrzej Pietrasiewicz /* endpoint registers */ 8790fccb52SAndrzej Pietrasiewicz u32 ep_fifo [4]; /* 0x200 */ 8890fccb52SAndrzej Pietrasiewicz u8 _reserved1 [0x10]; 8990fccb52SAndrzej Pietrasiewicz u32 ep_mode [4]; /* only 1-3 valid */ 9090fccb52SAndrzej Pietrasiewicz u8 _reserved2 [0x10]; 9190fccb52SAndrzej Pietrasiewicz 9290fccb52SAndrzej Pietrasiewicz u32 ep_status [4]; 9390fccb52SAndrzej Pietrasiewicz #define EPxSTATUS_TOGGLE 0x40 9490fccb52SAndrzej Pietrasiewicz #define EPxSTATUS_SUSPEND 0x20 9590fccb52SAndrzej Pietrasiewicz #define EPxSTATUS_EP_MASK (0x07<<2) 9690fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_READY (0<<2) 9790fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_DATAIN (1<<2) 9890fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_FULL (2<<2) 9990fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_TX_ERR (3<<2) 10090fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_RX_ERR (4<<2) 10190fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_BUSY (5<<2) 10290fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_STALL (6<<2) 10390fccb52SAndrzej Pietrasiewicz # define EPxSTATUS_EP_INVALID (7<<2) 10490fccb52SAndrzej Pietrasiewicz #define EPxSTATUS_FIFO_DISABLE 0x02 10590fccb52SAndrzej Pietrasiewicz #define EPxSTATUS_STAGE_ERROR 0x01 10690fccb52SAndrzej Pietrasiewicz 10790fccb52SAndrzej Pietrasiewicz u8 _reserved3 [0x10]; 10890fccb52SAndrzej Pietrasiewicz u32 EPxSizeLA[4]; 10990fccb52SAndrzej Pietrasiewicz #define PACKET_ACTIVE (1<<7) 11090fccb52SAndrzej Pietrasiewicz #define DATASIZE 0x7f 11190fccb52SAndrzej Pietrasiewicz u8 _reserved3a [0x10]; 11290fccb52SAndrzej Pietrasiewicz u32 EPxSizeLB[4]; /* only 1,2 valid */ 11390fccb52SAndrzej Pietrasiewicz u8 _reserved3b [0x10]; 11490fccb52SAndrzej Pietrasiewicz u32 EPxSizeHA[4]; /* only 1-3 valid */ 11590fccb52SAndrzej Pietrasiewicz u8 _reserved3c [0x10]; 11690fccb52SAndrzej Pietrasiewicz u32 EPxSizeHB[4]; /* only 1,2 valid */ 11790fccb52SAndrzej Pietrasiewicz u8 _reserved4[0x30]; 11890fccb52SAndrzej Pietrasiewicz 11990fccb52SAndrzej Pietrasiewicz /* SETUP packet contents */ 12090fccb52SAndrzej Pietrasiewicz u32 bRequestType; /* 0x300 */ 12190fccb52SAndrzej Pietrasiewicz u32 bRequest; 12290fccb52SAndrzej Pietrasiewicz u32 wValueL; 12390fccb52SAndrzej Pietrasiewicz u32 wValueH; 12490fccb52SAndrzej Pietrasiewicz u32 wIndexL; 12590fccb52SAndrzej Pietrasiewicz u32 wIndexH; 12690fccb52SAndrzej Pietrasiewicz u32 wLengthL; 12790fccb52SAndrzej Pietrasiewicz u32 wLengthH; 12890fccb52SAndrzej Pietrasiewicz 12990fccb52SAndrzej Pietrasiewicz /* command interaction/handshaking */ 13090fccb52SAndrzej Pietrasiewicz u32 SetupRecv; /* 0x320 */ 13190fccb52SAndrzej Pietrasiewicz u32 CurrConfig; 13290fccb52SAndrzej Pietrasiewicz u32 StdRequest; 13390fccb52SAndrzej Pietrasiewicz u32 Request; 13490fccb52SAndrzej Pietrasiewicz u32 DataSet; 13590fccb52SAndrzej Pietrasiewicz #define DATASET_A(epnum) (1<<(2*(epnum))) 13690fccb52SAndrzej Pietrasiewicz #define DATASET_B(epnum) (2<<(2*(epnum))) 13790fccb52SAndrzej Pietrasiewicz #define DATASET_AB(epnum) (3<<(2*(epnum))) 13890fccb52SAndrzej Pietrasiewicz u8 _reserved5[4]; 13990fccb52SAndrzej Pietrasiewicz 14090fccb52SAndrzej Pietrasiewicz u32 UsbState; 14190fccb52SAndrzej Pietrasiewicz #define USBSTATE_CONFIGURED 0x04 14290fccb52SAndrzej Pietrasiewicz #define USBSTATE_ADDRESSED 0x02 14390fccb52SAndrzej Pietrasiewicz #define USBSTATE_DEFAULT 0x01 14490fccb52SAndrzej Pietrasiewicz 14590fccb52SAndrzej Pietrasiewicz u32 EOP; 14690fccb52SAndrzej Pietrasiewicz 14790fccb52SAndrzej Pietrasiewicz u32 Command; /* 0x340 */ 14890fccb52SAndrzej Pietrasiewicz #define COMMAND_SETDATA0 2 14990fccb52SAndrzej Pietrasiewicz #define COMMAND_RESET 3 15090fccb52SAndrzej Pietrasiewicz #define COMMAND_STALL 4 15190fccb52SAndrzej Pietrasiewicz #define COMMAND_INVALID 5 15290fccb52SAndrzej Pietrasiewicz #define COMMAND_FIFO_DISABLE 7 15390fccb52SAndrzej Pietrasiewicz #define COMMAND_FIFO_ENABLE 8 15490fccb52SAndrzej Pietrasiewicz #define COMMAND_INIT_DESCRIPTOR 9 15590fccb52SAndrzej Pietrasiewicz #define COMMAND_FIFO_CLEAR 10 /* also stall */ 15690fccb52SAndrzej Pietrasiewicz #define COMMAND_STALL_CLEAR 11 15790fccb52SAndrzej Pietrasiewicz #define COMMAND_EP(n) ((n) << 4) 15890fccb52SAndrzej Pietrasiewicz 15990fccb52SAndrzej Pietrasiewicz u32 EPxSingle; 16090fccb52SAndrzej Pietrasiewicz u8 _reserved6[4]; 16190fccb52SAndrzej Pietrasiewicz u32 EPxBCS; 16290fccb52SAndrzej Pietrasiewicz u8 _reserved7[8]; 16390fccb52SAndrzej Pietrasiewicz u32 IntControl; 16490fccb52SAndrzej Pietrasiewicz #define ICONTROL_STATUSNAK 1 16590fccb52SAndrzej Pietrasiewicz u8 _reserved8[4]; 16690fccb52SAndrzej Pietrasiewicz 16790fccb52SAndrzej Pietrasiewicz u32 reqmode; // 0x360 standard request mode, low 8 bits 16890fccb52SAndrzej Pietrasiewicz #define G_REQMODE_SET_INTF (1<<7) 16990fccb52SAndrzej Pietrasiewicz #define G_REQMODE_GET_INTF (1<<6) 17090fccb52SAndrzej Pietrasiewicz #define G_REQMODE_SET_CONF (1<<5) 17190fccb52SAndrzej Pietrasiewicz #define G_REQMODE_GET_CONF (1<<4) 17290fccb52SAndrzej Pietrasiewicz #define G_REQMODE_GET_DESC (1<<3) 17390fccb52SAndrzej Pietrasiewicz #define G_REQMODE_SET_FEAT (1<<2) 17490fccb52SAndrzej Pietrasiewicz #define G_REQMODE_CLEAR_FEAT (1<<1) 17590fccb52SAndrzej Pietrasiewicz #define G_REQMODE_GET_STATUS (1<<0) 17690fccb52SAndrzej Pietrasiewicz 17790fccb52SAndrzej Pietrasiewicz u32 ReqMode; 17890fccb52SAndrzej Pietrasiewicz u8 _reserved9[0x18]; 17990fccb52SAndrzej Pietrasiewicz u32 PortStatus; /* 0x380 */ 18090fccb52SAndrzej Pietrasiewicz u8 _reserved10[8]; 18190fccb52SAndrzej Pietrasiewicz u32 address; 18290fccb52SAndrzej Pietrasiewicz u32 buff_test; 18390fccb52SAndrzej Pietrasiewicz u8 _reserved11[4]; 18490fccb52SAndrzej Pietrasiewicz u32 UsbReady; 18590fccb52SAndrzej Pietrasiewicz u8 _reserved12[4]; 18690fccb52SAndrzej Pietrasiewicz u32 SetDescStall; /* 0x3a0 */ 18790fccb52SAndrzej Pietrasiewicz u8 _reserved13[0x45c]; 18890fccb52SAndrzej Pietrasiewicz 18990fccb52SAndrzej Pietrasiewicz /* hardware could handle limited GET_DESCRIPTOR duties */ 19090fccb52SAndrzej Pietrasiewicz #define DESC_LEN 0x80 19190fccb52SAndrzej Pietrasiewicz u32 descriptors[DESC_LEN]; /* 0x800 */ 19290fccb52SAndrzej Pietrasiewicz u8 _reserved14[0x600]; 19390fccb52SAndrzej Pietrasiewicz 19490fccb52SAndrzej Pietrasiewicz } __attribute__ ((packed)); 19590fccb52SAndrzej Pietrasiewicz 19690fccb52SAndrzej Pietrasiewicz #define MAX_FIFO_SIZE 64 19790fccb52SAndrzej Pietrasiewicz #define MAX_EP0_SIZE 8 /* ep0 fifo is bigger, though */ 19890fccb52SAndrzej Pietrasiewicz 19990fccb52SAndrzej Pietrasiewicz 20090fccb52SAndrzej Pietrasiewicz /*-------------------------------------------------------------------------*/ 20190fccb52SAndrzej Pietrasiewicz 20290fccb52SAndrzej Pietrasiewicz /* DRIVER DATA STRUCTURES and UTILITIES */ 20390fccb52SAndrzej Pietrasiewicz 20490fccb52SAndrzej Pietrasiewicz struct goku_ep { 20590fccb52SAndrzej Pietrasiewicz struct usb_ep ep; 20690fccb52SAndrzej Pietrasiewicz struct goku_udc *dev; 20790fccb52SAndrzej Pietrasiewicz unsigned long irqs; 20890fccb52SAndrzej Pietrasiewicz 20990fccb52SAndrzej Pietrasiewicz unsigned num:8, 21090fccb52SAndrzej Pietrasiewicz dma:1, 21190fccb52SAndrzej Pietrasiewicz is_in:1, 21290fccb52SAndrzej Pietrasiewicz stopped:1; 21390fccb52SAndrzej Pietrasiewicz 21490fccb52SAndrzej Pietrasiewicz /* analogous to a host-side qh */ 21590fccb52SAndrzej Pietrasiewicz struct list_head queue; 21690fccb52SAndrzej Pietrasiewicz 21790fccb52SAndrzej Pietrasiewicz u32 __iomem *reg_fifo; 21890fccb52SAndrzej Pietrasiewicz u32 __iomem *reg_mode; 21990fccb52SAndrzej Pietrasiewicz u32 __iomem *reg_status; 22090fccb52SAndrzej Pietrasiewicz }; 22190fccb52SAndrzej Pietrasiewicz 22290fccb52SAndrzej Pietrasiewicz struct goku_request { 22390fccb52SAndrzej Pietrasiewicz struct usb_request req; 22490fccb52SAndrzej Pietrasiewicz struct list_head queue; 22590fccb52SAndrzej Pietrasiewicz 22690fccb52SAndrzej Pietrasiewicz unsigned mapped:1; 22790fccb52SAndrzej Pietrasiewicz }; 22890fccb52SAndrzej Pietrasiewicz 22990fccb52SAndrzej Pietrasiewicz enum ep0state { 23090fccb52SAndrzej Pietrasiewicz EP0_DISCONNECT, /* no host */ 23190fccb52SAndrzej Pietrasiewicz EP0_IDLE, /* between STATUS ack and SETUP report */ 23290fccb52SAndrzej Pietrasiewicz EP0_IN, EP0_OUT, /* data stage */ 23390fccb52SAndrzej Pietrasiewicz EP0_STATUS, /* status stage */ 23490fccb52SAndrzej Pietrasiewicz EP0_STALL, /* data or status stages */ 23590fccb52SAndrzej Pietrasiewicz EP0_SUSPEND, /* usb suspend */ 23690fccb52SAndrzej Pietrasiewicz }; 23790fccb52SAndrzej Pietrasiewicz 23890fccb52SAndrzej Pietrasiewicz struct goku_udc { 23990fccb52SAndrzej Pietrasiewicz /* each pci device provides one gadget, several endpoints */ 24090fccb52SAndrzej Pietrasiewicz struct usb_gadget gadget; 24190fccb52SAndrzej Pietrasiewicz spinlock_t lock; 24290fccb52SAndrzej Pietrasiewicz struct goku_ep ep[4]; 24390fccb52SAndrzej Pietrasiewicz struct usb_gadget_driver *driver; 24490fccb52SAndrzej Pietrasiewicz 24590fccb52SAndrzej Pietrasiewicz enum ep0state ep0state; 24690fccb52SAndrzej Pietrasiewicz unsigned got_irq:1, 24790fccb52SAndrzej Pietrasiewicz got_region:1, 24890fccb52SAndrzej Pietrasiewicz req_config:1, 24990fccb52SAndrzej Pietrasiewicz configured:1, 25090fccb52SAndrzej Pietrasiewicz enabled:1; 25190fccb52SAndrzej Pietrasiewicz 25290fccb52SAndrzej Pietrasiewicz /* pci state used to access those endpoints */ 25390fccb52SAndrzej Pietrasiewicz struct pci_dev *pdev; 25490fccb52SAndrzej Pietrasiewicz struct goku_udc_regs __iomem *regs; 25590fccb52SAndrzej Pietrasiewicz u32 int_enable; 25690fccb52SAndrzej Pietrasiewicz 25790fccb52SAndrzej Pietrasiewicz /* statistics... */ 25890fccb52SAndrzej Pietrasiewicz unsigned long irqs; 25990fccb52SAndrzej Pietrasiewicz }; 26090fccb52SAndrzej Pietrasiewicz #define to_goku_udc(g) (container_of((g), struct goku_udc, gadget)) 26190fccb52SAndrzej Pietrasiewicz 26290fccb52SAndrzej Pietrasiewicz /*-------------------------------------------------------------------------*/ 26390fccb52SAndrzej Pietrasiewicz 26490fccb52SAndrzej Pietrasiewicz #define xprintk(dev,level,fmt,args...) \ 26590fccb52SAndrzej Pietrasiewicz printk(level "%s %s: " fmt , driver_name , \ 26690fccb52SAndrzej Pietrasiewicz pci_name(dev->pdev) , ## args) 26790fccb52SAndrzej Pietrasiewicz 26890fccb52SAndrzej Pietrasiewicz #ifdef DEBUG 26990fccb52SAndrzej Pietrasiewicz #define DBG(dev,fmt,args...) \ 27090fccb52SAndrzej Pietrasiewicz xprintk(dev , KERN_DEBUG , fmt , ## args) 27190fccb52SAndrzej Pietrasiewicz #else 27290fccb52SAndrzej Pietrasiewicz #define DBG(dev,fmt,args...) \ 27390fccb52SAndrzej Pietrasiewicz do { } while (0) 27490fccb52SAndrzej Pietrasiewicz #endif /* DEBUG */ 27590fccb52SAndrzej Pietrasiewicz 27690fccb52SAndrzej Pietrasiewicz #ifdef VERBOSE 27790fccb52SAndrzej Pietrasiewicz #define VDBG DBG 27890fccb52SAndrzej Pietrasiewicz #else 27990fccb52SAndrzej Pietrasiewicz #define VDBG(dev,fmt,args...) \ 28090fccb52SAndrzej Pietrasiewicz do { } while (0) 28190fccb52SAndrzej Pietrasiewicz #endif /* VERBOSE */ 28290fccb52SAndrzej Pietrasiewicz 28390fccb52SAndrzej Pietrasiewicz #define ERROR(dev,fmt,args...) \ 28490fccb52SAndrzej Pietrasiewicz xprintk(dev , KERN_ERR , fmt , ## args) 28590fccb52SAndrzej Pietrasiewicz #define WARNING(dev,fmt,args...) \ 28690fccb52SAndrzej Pietrasiewicz xprintk(dev , KERN_WARNING , fmt , ## args) 28790fccb52SAndrzej Pietrasiewicz #define INFO(dev,fmt,args...) \ 28890fccb52SAndrzej Pietrasiewicz xprintk(dev , KERN_INFO , fmt , ## args) 28990fccb52SAndrzej Pietrasiewicz 290