via-cuda.c 15.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
/*
 * Device driver for the via-cuda on Apple Powermacs.
 *
 * The VIA (versatile interface adapter) interfaces to the CUDA,
 * a 6805 microprocessor core which controls the ADB (Apple Desktop
 * Bus) which connects to the keyboard and mouse.  The CUDA also
 * controls system power and the RTC (real time clock) chip.
 *
 * Copyright (C) 1996 Paul Mackerras.
 */
#include <stdarg.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/adb.h>
#include <linux/cuda.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#ifdef CONFIG_PPC
#include <asm/prom.h>
#include <asm/machdep.h>
#else
#include <asm/macintosh.h>
#include <asm/macints.h>
#include <asm/mac_via.h>
#endif
#include <asm/io.h>
#include <linux/init.h>

static volatile unsigned char __iomem *via;
static DEFINE_SPINLOCK(cuda_lock);

/* VIA registers - spaced 0x200 bytes apart */
#define RS		0x200		/* skip between registers */
#define B		0		/* B-side data */
#define A		RS		/* A-side data */
#define DIRB		(2*RS)		/* B-side direction (1=output) */
#define DIRA		(3*RS)		/* A-side direction (1=output) */
#define T1CL		(4*RS)		/* Timer 1 ctr/latch (low 8 bits) */
#define T1CH		(5*RS)		/* Timer 1 counter (high 8 bits) */
#define T1LL		(6*RS)		/* Timer 1 latch (low 8 bits) */
#define T1LH		(7*RS)		/* Timer 1 latch (high 8 bits) */
#define T2CL		(8*RS)		/* Timer 2 ctr/latch (low 8 bits) */
#define T2CH		(9*RS)		/* Timer 2 counter (high 8 bits) */
#define SR		(10*RS)		/* Shift register */
#define ACR		(11*RS)		/* Auxiliary control register */
#define PCR		(12*RS)		/* Peripheral control register */
#define IFR		(13*RS)		/* Interrupt flag register */
#define IER		(14*RS)		/* Interrupt enable register */
#define ANH		(15*RS)		/* A-side data, no handshake */

/* Bits in B data register: all active low */
#define TREQ		0x08		/* Transfer request (input) */
#define TACK		0x10		/* Transfer acknowledge (output) */
#define TIP		0x20		/* Transfer in progress (output) */

/* Bits in ACR */
#define SR_CTRL		0x1c		/* Shift register control bits */
#define SR_EXT		0x0c		/* Shift on external clock */
#define SR_OUT		0x10		/* Shift out if 1 */

/* Bits in IFR and IER */
#define IER_SET		0x80		/* set bits in IER */
#define IER_CLR		0		/* clear bits in IER */
#define SR_INT		0x04		/* Shift register full/empty */

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
static inline bool TREQ_asserted(u8 portb)
{
	return !(portb & TREQ);
}

static inline void assert_TIP(void)
{
	out_8(&via[B], in_8(&via[B]) & ~TIP);
}

static inline void assert_TACK(void)
{
	out_8(&via[B], in_8(&via[B]) & ~TACK);
}

static inline void toggle_TACK(void)
{
	out_8(&via[B], in_8(&via[B]) ^ TACK);
}

static inline void negate_TACK(void)
{
	out_8(&via[B], in_8(&via[B]) | TACK);
}

static inline void negate_TIP_and_TACK(void)
{
	out_8(&via[B], in_8(&via[B]) | TIP | TACK);
}

L
Linus Torvalds 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
static enum cuda_state {
    idle,
    sent_first_byte,
    sending,
    reading,
    read_done,
    awaiting_reply
} cuda_state;

static struct adb_request *current_req;
static struct adb_request *last_req;
static unsigned char cuda_rbuf[16];
static unsigned char *reply_ptr;
static int reading_reply;
static int data_index;
F
Finn Thain 已提交
113
static int cuda_irq;
L
Linus Torvalds 已提交
114 115 116
#ifdef CONFIG_PPC
static struct device_node *vias;
#endif
117
static int cuda_fully_inited;
L
Linus Torvalds 已提交
118 119 120 121 122 123 124 125 126 127

#ifdef CONFIG_ADB
static int cuda_probe(void);
static int cuda_send_request(struct adb_request *req, int sync);
static int cuda_adb_autopoll(int devs);
static int cuda_reset_adb_bus(void);
#endif /* CONFIG_ADB */

static int cuda_init_via(void);
static void cuda_start(void);
128 129
static irqreturn_t cuda_interrupt(int irq, void *arg);
static void cuda_input(unsigned char *buf, int nb);
L
Linus Torvalds 已提交
130 131 132 133 134 135 136 137
void cuda_poll(void);
static int cuda_write(struct adb_request *req);

int cuda_request(struct adb_request *req,
		 void (*done)(struct adb_request *), int nbytes, ...);

#ifdef CONFIG_ADB
struct adb_driver via_cuda_driver = {
F
Finn Thain 已提交
138 139 140 141 142 143
	.name         = "CUDA",
	.probe        = cuda_probe,
	.send_request = cuda_send_request,
	.autopoll     = cuda_adb_autopoll,
	.poll         = cuda_poll,
	.reset_bus    = cuda_reset_adb_bus,
L
Linus Torvalds 已提交
144 145 146
};
#endif /* CONFIG_ADB */

F
Finn Thain 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
#ifdef CONFIG_MAC
int __init find_via_cuda(void)
{
    struct adb_request req;
    int err;

    if (macintosh_config->adb_type != MAC_ADB_CUDA)
	return 0;

    via = via1;
    cuda_state = idle;

    err = cuda_init_via();
    if (err) {
	printk(KERN_ERR "cuda_init_via() failed\n");
	via = NULL;
	return 0;
    }

    /* enable autopoll */
    cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, 1);
    while (!req.complete)
	cuda_poll();

    return 1;
}
#else
174
int __init find_via_cuda(void)
L
Linus Torvalds 已提交
175 176
{
    struct adb_request req;
177
    phys_addr_t taddr;
178
    const u32 *reg;
179
    int err;
L
Linus Torvalds 已提交
180 181 182

    if (vias != 0)
	return 1;
183
    vias = of_find_node_by_name(NULL, "via-cuda");
L
Linus Torvalds 已提交
184 185 186
    if (vias == 0)
	return 0;

187
    reg = of_get_property(vias, "reg", NULL);
188 189 190 191 192 193 194 195 196 197 198 199 200
    if (reg == NULL) {
	    printk(KERN_ERR "via-cuda: No \"reg\" property !\n");
	    goto fail;
    }
    taddr = of_translate_address(vias, reg);
    if (taddr == 0) {
	    printk(KERN_ERR "via-cuda: Can't translate address !\n");
	    goto fail;
    }
    via = ioremap(taddr, 0x2000);
    if (via == NULL) {
	    printk(KERN_ERR "via-cuda: Can't map address !\n");
	    goto fail;
L
Linus Torvalds 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
    }

    cuda_state = idle;
    sys_ctrler = SYS_CTRLER_CUDA;

    err = cuda_init_via();
    if (err) {
	printk(KERN_ERR "cuda_init_via() failed\n");
	via = NULL;
	return 0;
    }

    /* Clear and enable interrupts, but only on PPC. On 68K it's done  */
    /* for us by the main VIA driver in arch/m68k/mac/via.c        */

    out_8(&via[IFR], 0x7f);	/* clear interrupts by writing 1s */
    out_8(&via[IER], IER_SET|SR_INT); /* enable interrupt from SR */

    /* enable autopoll */
    cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, 1);
    while (!req.complete)
	cuda_poll();

    return 1;
225 226 227 228 229

 fail:
    of_node_put(vias);
    vias = NULL;
    return 0;
L
Linus Torvalds 已提交
230
}
F
Finn Thain 已提交
231
#endif /* !defined CONFIG_MAC */
L
Linus Torvalds 已提交
232 233 234 235 236 237

static int __init via_cuda_start(void)
{
    if (via == NULL)
	return -ENODEV;

238
#ifdef CONFIG_MAC
F
Finn Thain 已提交
239
    cuda_irq = IRQ_MAC_ADB;
F
Finn Thain 已提交
240
#else
F
Finn Thain 已提交
241
    cuda_irq = irq_of_parse_and_map(vias, 0);
242
    if (!cuda_irq) {
243 244 245 246
	printk(KERN_ERR "via-cuda: can't map interrupts for %s\n",
	       vias->full_name);
	return -ENODEV;
    }
F
Finn Thain 已提交
247
#endif
248

F
Finn Thain 已提交
249 250
    if (request_irq(cuda_irq, cuda_interrupt, 0, "ADB", cuda_interrupt)) {
	printk(KERN_ERR "via-cuda: can't request irq %d\n", cuda_irq);
L
Linus Torvalds 已提交
251 252 253
	return -EAGAIN;
    }

F
Finn Thain 已提交
254
    pr_info("Macintosh CUDA driver v0.5 for Unified ADB.\n");
L
Linus Torvalds 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283

    cuda_fully_inited = 1;
    return 0;
}

device_initcall(via_cuda_start);

#ifdef CONFIG_ADB
static int
cuda_probe(void)
{
#ifdef CONFIG_PPC
    if (sys_ctrler != SYS_CTRLER_CUDA)
	return -ENODEV;
#else
    if (macintosh_config->adb_type != MAC_ADB_CUDA)
	return -ENODEV;
#endif
    if (via == NULL)
	return -ENODEV;
    return 0;
}
#endif /* CONFIG_ADB */

#define WAIT_FOR(cond, what)					\
    do {                                                        \
    	int x;							\
	for (x = 1000; !(cond); --x) {				\
	    if (x == 0) {					\
F
Finn Thain 已提交
284
		pr_err("Timeout waiting for " what "\n");	\
L
Linus Torvalds 已提交
285 286 287 288 289 290 291
		return -ENXIO;					\
	    }							\
	    udelay(100);					\
	}							\
    } while (0)

static int
292
__init cuda_init_via(void)
L
Linus Torvalds 已提交
293 294
{
    out_8(&via[DIRB], (in_8(&via[DIRB]) | TACK | TIP) & ~TREQ);	/* TACK & TIP out */
295
    negate_TIP_and_TACK();
L
Linus Torvalds 已提交
296 297
    out_8(&via[ACR] ,(in_8(&via[ACR]) & ~SR_CTRL) | SR_EXT);	/* SR data in */
    (void)in_8(&via[SR]);						/* clear any left-over data */
F
Finn Thain 已提交
298
#ifdef CONFIG_PPC
L
Linus Torvalds 已提交
299 300
    out_8(&via[IER], 0x7f);					/* disable interrupts from VIA */
    (void)in_8(&via[IER]);
F
Finn Thain 已提交
301 302
#else
    out_8(&via[IER], SR_INT);					/* disable SR interrupt from VIA */
L
Linus Torvalds 已提交
303 304 305 306 307
#endif

    /* delay 4ms and then clear any pending interrupt */
    mdelay(4);
    (void)in_8(&via[SR]);
F
Finn Thain 已提交
308
    out_8(&via[IFR], SR_INT);
L
Linus Torvalds 已提交
309 310

    /* sync with the CUDA - assert TACK without TIP */
311
    assert_TACK();
L
Linus Torvalds 已提交
312 313

    /* wait for the CUDA to assert TREQ in response */
314
    WAIT_FOR(TREQ_asserted(in_8(&via[B])), "CUDA response to sync");
L
Linus Torvalds 已提交
315 316 317 318

    /* wait for the interrupt and then clear it */
    WAIT_FOR(in_8(&via[IFR]) & SR_INT, "CUDA response to sync (2)");
    (void)in_8(&via[SR]);
F
Finn Thain 已提交
319
    out_8(&via[IFR], SR_INT);
L
Linus Torvalds 已提交
320 321

    /* finish the sync by negating TACK */
322
    negate_TACK();
L
Linus Torvalds 已提交
323 324

    /* wait for the CUDA to negate TREQ and the corresponding interrupt */
325
    WAIT_FOR(!TREQ_asserted(in_8(&via[B])), "CUDA response to sync (3)");
L
Linus Torvalds 已提交
326 327
    WAIT_FOR(in_8(&via[IFR]) & SR_INT, "CUDA response to sync (4)");
    (void)in_8(&via[SR]);
F
Finn Thain 已提交
328
    out_8(&via[IFR], SR_INT);
L
Linus Torvalds 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388

    return 0;
}

#ifdef CONFIG_ADB
/* Send an ADB command */
static int
cuda_send_request(struct adb_request *req, int sync)
{
    int i;

    if ((via == NULL) || !cuda_fully_inited) {
	req->complete = 1;
	return -ENXIO;
    }
  
    req->reply_expected = 1;

    i = cuda_write(req);
    if (i)
	return i;

    if (sync) {
	while (!req->complete)
	    cuda_poll();
    }
    return 0;
}


/* Enable/disable autopolling */
static int
cuda_adb_autopoll(int devs)
{
    struct adb_request req;

    if ((via == NULL) || !cuda_fully_inited)
	return -ENXIO;

    cuda_request(&req, NULL, 3, CUDA_PACKET, CUDA_AUTOPOLL, (devs? 1: 0));
    while (!req.complete)
	cuda_poll();
    return 0;
}

/* Reset adb bus - how do we do this?? */
static int
cuda_reset_adb_bus(void)
{
    struct adb_request req;

    if ((via == NULL) || !cuda_fully_inited)
	return -ENXIO;

    cuda_request(&req, NULL, 2, ADB_PACKET, 0);		/* maybe? */
    while (!req.complete)
	cuda_poll();
    return 0;
}
#endif /* CONFIG_ADB */
F
Finn Thain 已提交
389

L
Linus Torvalds 已提交
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
/* Construct and send a cuda request */
int
cuda_request(struct adb_request *req, void (*done)(struct adb_request *),
	     int nbytes, ...)
{
    va_list list;
    int i;

    if (via == NULL) {
	req->complete = 1;
	return -ENXIO;
    }

    req->nbytes = nbytes;
    req->done = done;
    va_start(list, nbytes);
    for (i = 0; i < nbytes; ++i)
	req->data[i] = va_arg(list, int);
    va_end(list);
    req->reply_expected = 1;
    return cuda_write(req);
}
412
EXPORT_SYMBOL(cuda_request);
L
Linus Torvalds 已提交
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446

static int
cuda_write(struct adb_request *req)
{
    unsigned long flags;

    if (req->nbytes < 2 || req->data[0] > CUDA_PACKET) {
	req->complete = 1;
	return -EINVAL;
    }
    req->next = NULL;
    req->sent = 0;
    req->complete = 0;
    req->reply_len = 0;

    spin_lock_irqsave(&cuda_lock, flags);
    if (current_req != 0) {
	last_req->next = req;
	last_req = req;
    } else {
	current_req = req;
	last_req = req;
	if (cuda_state == idle)
	    cuda_start();
    }
    spin_unlock_irqrestore(&cuda_lock, flags);

    return 0;
}

static void
cuda_start(void)
{
    /* assert cuda_state == idle */
447
    if (current_req == NULL)
L
Linus Torvalds 已提交
448
	return;
449
    if (TREQ_asserted(in_8(&via[B])))
L
Linus Torvalds 已提交
450 451 452 453
	return;			/* a byte is coming in from the CUDA */

    /* set the shift register to shift out and send a byte */
    out_8(&via[ACR], in_8(&via[ACR]) | SR_OUT);
454
    out_8(&via[SR], current_req->data[0]);
455
    assert_TIP();
L
Linus Torvalds 已提交
456 457 458 459 460 461 462 463 464
    cuda_state = sent_first_byte;
}

void
cuda_poll(void)
{
    /* cuda_interrupt only takes a normal lock, we disable
     * interrupts here to avoid re-entering and thus deadlocking.
     */
F
Finn Thain 已提交
465 466
    if (cuda_irq)
	disable_irq(cuda_irq);
467
    cuda_interrupt(0, NULL);
F
Finn Thain 已提交
468 469
    if (cuda_irq)
	enable_irq(cuda_irq);
L
Linus Torvalds 已提交
470
}
471
EXPORT_SYMBOL(cuda_poll);
L
Linus Torvalds 已提交
472 473

static irqreturn_t
474
cuda_interrupt(int irq, void *arg)
L
Linus Torvalds 已提交
475
{
476
    u8 status;
L
Linus Torvalds 已提交
477 478 479 480 481 482 483
    struct adb_request *req = NULL;
    unsigned char ibuf[16];
    int ibuf_len = 0;
    int complete = 0;
    
    spin_lock(&cuda_lock);

F
Finn Thain 已提交
484
    /* On powermacs, this handler is registered for the VIA IRQ. But they use
F
Finn Thain 已提交
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
     * just the shift register IRQ -- other VIA interrupt sources are disabled.
     * On m68k macs, the VIA IRQ sources are dispatched individually. Unless
     * we are polling, the shift register IRQ flag has already been cleared.
     */

#ifdef CONFIG_MAC
    if (!arg)
#endif
    {
        if ((in_8(&via[IFR]) & SR_INT) == 0) {
            spin_unlock(&cuda_lock);
            return IRQ_NONE;
        } else {
            out_8(&via[IFR], SR_INT);
        }
L
Linus Torvalds 已提交
500
    }
501 502 503

    status = in_8(&via[B]) & (TIP | TACK | TREQ);

L
Linus Torvalds 已提交
504 505 506 507
    switch (cuda_state) {
    case idle:
	/* CUDA has sent us the first byte of data - unsolicited */
	(void)in_8(&via[SR]);
508
	assert_TIP();
L
Linus Torvalds 已提交
509 510 511 512 513 514 515 516
	cuda_state = reading;
	reply_ptr = cuda_rbuf;
	reading_reply = 0;
	break;

    case awaiting_reply:
	/* CUDA has sent us the first byte of data of a reply */
	(void)in_8(&via[SR]);
517
	assert_TIP();
L
Linus Torvalds 已提交
518 519 520 521 522 523
	cuda_state = reading;
	reply_ptr = current_req->reply;
	reading_reply = 1;
	break;

    case sent_first_byte:
524
	if (TREQ_asserted(status)) {
L
Linus Torvalds 已提交
525 526 527
	    /* collision */
	    out_8(&via[ACR], in_8(&via[ACR]) & ~SR_OUT);
	    (void)in_8(&via[SR]);
528
	    negate_TIP_and_TACK();
L
Linus Torvalds 已提交
529 530 531
	    cuda_state = idle;
	} else {
	    out_8(&via[SR], current_req->data[1]);
532
	    toggle_TACK();
L
Linus Torvalds 已提交
533 534 535 536 537 538 539 540 541 542
	    data_index = 2;
	    cuda_state = sending;
	}
	break;

    case sending:
	req = current_req;
	if (data_index >= req->nbytes) {
	    out_8(&via[ACR], in_8(&via[ACR]) & ~SR_OUT);
	    (void)in_8(&via[SR]);
543
	    negate_TIP_and_TACK();
L
Linus Torvalds 已提交
544 545 546 547 548 549 550 551 552 553 554 555
	    req->sent = 1;
	    if (req->reply_expected) {
		cuda_state = awaiting_reply;
	    } else {
		current_req = req->next;
		complete = 1;
		/* not sure about this */
		cuda_state = idle;
		cuda_start();
	    }
	} else {
	    out_8(&via[SR], req->data[data_index++]);
556
	    toggle_TACK();
L
Linus Torvalds 已提交
557 558 559 560 561
	}
	break;

    case reading:
	*reply_ptr++ = in_8(&via[SR]);
562
	if (!TREQ_asserted(status)) {
L
Linus Torvalds 已提交
563
	    /* that's all folks */
564
	    negate_TIP_and_TACK();
L
Linus Torvalds 已提交
565 566
	    cuda_state = read_done;
	} else {
567
	    toggle_TACK();
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
	}
	break;

    case read_done:
	(void)in_8(&via[SR]);
	if (reading_reply) {
	    req = current_req;
	    req->reply_len = reply_ptr - req->reply;
	    if (req->data[0] == ADB_PACKET) {
		/* Have to adjust the reply from ADB commands */
		if (req->reply_len <= 2 || (req->reply[1] & 2) != 0) {
		    /* the 0x2 bit indicates no response */
		    req->reply_len = 0;
		} else {
		    /* leave just the command and result bytes in the reply */
		    req->reply_len -= 2;
		    memmove(req->reply, req->reply + 2, req->reply_len);
		}
	    }
	    current_req = req->next;
	    complete = 1;
	} else {
	    /* This is tricky. We must break the spinlock to call
	     * cuda_input. However, doing so means we might get
	     * re-entered from another CPU getting an interrupt
	     * or calling cuda_poll(). I ended up using the stack
	     * (it's only for 16 bytes) and moving the actual
	     * call to cuda_input to outside of the lock.
	     */
	    ibuf_len = reply_ptr - cuda_rbuf;
	    memcpy(ibuf, cuda_rbuf, ibuf_len);
	}
600 601
	if (TREQ_asserted(status)) {
	    assert_TIP();
L
Linus Torvalds 已提交
602 603 604 605 606 607 608 609 610 611
	    cuda_state = reading;
	    reply_ptr = cuda_rbuf;
	    reading_reply = 0;
	} else {
	    cuda_state = idle;
	    cuda_start();
	}
	break;

    default:
F
Finn Thain 已提交
612
	pr_err("cuda_interrupt: unknown cuda_state %d?\n", cuda_state);
L
Linus Torvalds 已提交
613 614 615 616 617 618 619 620 621 622 623 624 625
    }
    spin_unlock(&cuda_lock);
    if (complete && req) {
    	void (*done)(struct adb_request *) = req->done;
    	mb();
    	req->complete = 1;
    	/* Here, we assume that if the request has a done member, the
    	 * struct request will survive to setting req->complete to 1
    	 */
    	if (done)
		(*done)(req);
    }
    if (ibuf_len)
626
	cuda_input(ibuf, ibuf_len);
L
Linus Torvalds 已提交
627 628 629 630
    return IRQ_HANDLED;
}

static void
631
cuda_input(unsigned char *buf, int nb)
L
Linus Torvalds 已提交
632 633 634 635 636 637 638 639 640 641 642 643 644
{
    switch (buf[0]) {
    case ADB_PACKET:
#ifdef CONFIG_XMON
	if (nb == 5 && buf[2] == 0x2c) {
	    extern int xmon_wants_key, xmon_adb_keycode;
	    if (xmon_wants_key) {
		xmon_adb_keycode = buf[3];
		return;
	    }
	}
#endif /* CONFIG_XMON */
#ifdef CONFIG_ADB
645
	adb_input(buf+2, nb-2, buf[1] & 0x40);
L
Linus Torvalds 已提交
646 647 648 649
#endif /* CONFIG_ADB */
	break;

    default:
F
Finn Thain 已提交
650 651
	print_hex_dump(KERN_INFO, "cuda_input: ", DUMP_PREFIX_NONE, 32, 1,
	               buf, nb, false);
L
Linus Torvalds 已提交
652 653
    }
}