1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #pragma ident "%Z%%M% %I% %E% SMI" 27 28 /* 29 * pcf8584.c is the nexus driver for all pcf8584 controller 30 * implementations. It supports both interrupt and polled 31 * mode operation, but defaults to interrupt. 32 */ 33 34 #include <sys/types.h> 35 #include <sys/conf.h> 36 #include <sys/file.h> 37 #include <sys/open.h> 38 #include <sys/ddi.h> 39 #include <sys/sunddi.h> 40 #include <sys/sunndi.h> 41 #include <sys/modctl.h> 42 #include <sys/stat.h> 43 #include <sys/kmem.h> 44 #include <sys/archsystm.h> 45 #include <sys/platform_module.h> 46 47 #include <sys/i2c/clients/i2c_client.h> 48 #include <sys/i2c/misc/i2c_svc.h> 49 #include <sys/i2c/misc/i2c_svc_impl.h> 50 #include <sys/i2c/nexus/pcf8584.h> 51 52 #include <sys/note.h> 53 54 /* 55 * static function declarations 56 */ 57 static void pcf8584_resume(dev_info_t *dip); 58 static void pcf8584_suspend(dev_info_t *dip); 59 static int pcf8584_bus_ctl(dev_info_t *dip, dev_info_t *rdip, 60 ddi_ctl_enum_t op, void *arg, void *result); 61 static void pcf8584_acquire(pcf8584_t *, dev_info_t *dip, 62 i2c_transfer_t *tp, boolean_t force); 63 static void pcf8584_release(pcf8584_t *, boolean_t force); 64 static int pcf8584_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); 65 static int pcf8584_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); 66 static int pcf8584_open(dev_t *devp, int flag, int otyp, 67 cred_t *cred_p); 68 static int pcf8584_close(dev_t dev, int flag, int otyp, 69 cred_t *cred_p); 70 static int pcf8584_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); 71 static void pcf8584_select_bus(pcf8584_t *i2c); 72 static enum tran_state pcf8584_type_to_state(int i2c_flags); 73 static void pcf8584_put_s1(pcf8584_t *i2c, char cmd); 74 static void pcf8584_put_s0(pcf8584_t *i2c, char data); 75 static uint8_t pcf8584_get_s0(pcf8584_t *i2c); 76 static uint8_t pcf8584_get_s1(pcf8584_t *i2c); 77 static int pcf8584_bbn_ready(pcf8584_t *i2c); 78 static int pcf8584_error(int status, uint8_t rdwr, pcf8584_t *i2c); 79 static void pcf8584_monitor_mode(pcf8584_t *i2c); 80 static int pcf8584_initchild(dev_info_t *cdip); 81 static void pcf8584_uninitchild(dev_info_t *cdip); 82 static void pcf8584_init(pcf8584_t *i2c); 83 static int pcf8584_setup_regs(dev_info_t *dip, pcf8584_t *i2c); 84 static void pcf8584_free_regs(pcf8584_t *i2c); 85 static void pcf8584_reportdev(dev_info_t *dip, dev_info_t *rdip); 86 static int pcf8584_dip_to_addr(dev_info_t *dip); 87 static uint_t pcf8584_intr(caddr_t arg); 88 static int pcf8584_process(pcf8584_t *i2c, uint8_t s1); 89 int pcf8584_transfer(dev_info_t *dip, i2c_transfer_t *tp); 90 91 static void pcf8584_do_polled_io(pcf8584_t *i2c); 92 static void pcf8584_take_over(pcf8584_t *i2c, dev_info_t *dip, 93 i2c_transfer_t *tp, kcondvar_t **waiter, int *saved_mode); 94 static void pcf8584_give_up(pcf8584_t *i2c, kcondvar_t *waiter, int saved_mode); 95 96 static struct bus_ops pcf8584_busops = { 97 BUSO_REV, 98 nullbusmap, /* bus_map */ 99 NULL, /* bus_get_intrspec */ 100 NULL, /* bus_add_intrspec */ 101 NULL, /* bus_remove_intrspec */ 102 NULL, /* bus_map_fault */ 103 ddi_no_dma_map, /* bus_dma_map */ 104 ddi_no_dma_allochdl, /* bus_dma_allochdl */ 105 ddi_no_dma_freehdl, /* bus_dma_freehdl */ 106 ddi_no_dma_bindhdl, /* bus_dma_bindhdl */ 107 ddi_no_dma_unbindhdl, /* bus_unbindhdl */ 108 ddi_no_dma_flush, /* bus_dma_flush */ 109 ddi_no_dma_win, /* bus_dma_win */ 110 ddi_no_dma_mctl, /* bus_dma_ctl */ 111 pcf8584_bus_ctl, /* bus_ctl */ 112 ddi_bus_prop_op, /* bus_prop_op */ 113 NULL, /* bus_get_eventcookie */ 114 NULL, /* bus_add_eventcall */ 115 NULL, /* bus_remove_eventcall */ 116 NULL, /* bus_post_event */ 117 0, /* bus_intr_ctl */ 118 0, /* bus_config */ 119 0, /* bus_unconfig */ 120 0, /* bus_fm_init */ 121 0, /* bus_fm_fini */ 122 0, /* bus_fm_access_enter */ 123 0, /* bus_fm_access_exit */ 124 0, /* bus_power */ 125 i_ddi_intr_ops /* bus_intr_op */ 126 }; 127 128 struct cb_ops pcf8584_cb_ops = { 129 pcf8584_open, /* open */ 130 pcf8584_close, /* close */ 131 nodev, /* strategy */ 132 nodev, /* print */ 133 nodev, /* dump */ 134 nodev, /* read */ 135 nodev, /* write */ 136 pcf8584_ioctl, /* ioctl */ 137 nodev, /* devmap */ 138 nodev, /* mmap */ 139 nodev, /* segmap */ 140 nochpoll, /* poll */ 141 ddi_prop_op, /* cb_prop_op */ 142 0, /* streamtab */ 143 D_MP | D_NEW /* Driver compatibility flag */ 144 }; 145 146 static struct dev_ops pcf8584_ops = { 147 DEVO_REV, 148 0, 149 ddi_getinfo_1to1, 150 nulldev, 151 nulldev, 152 pcf8584_attach, 153 pcf8584_detach, 154 nodev, 155 &pcf8584_cb_ops, 156 &pcf8584_busops 157 }; 158 159 static struct modldrv modldrv = { 160 &mod_driverops, /* Type of module. This one is a driver */ 161 "I2C Nexus Driver %I%", /* Name of the module. */ 162 &pcf8584_ops, /* driver ops */ 163 }; 164 165 static struct modlinkage modlinkage = { 166 MODREV_1, 167 &modldrv, 168 NULL 169 }; 170 171 /* 172 * pcf8584 soft state 173 */ 174 static void *pcf8584_state; 175 176 i2c_nexus_reg_t pcf8584_regvec = { 177 I2C_NEXUS_REV, 178 pcf8584_transfer, 179 }; 180 181 /* 182 * The "interrupt_priorities" property is how a driver can specify a SPARC 183 * PIL level to associate with each of its interrupt properties. Most 184 * self-identifying busses have a better mechanism for managing this, but I2C 185 * doesn't. 186 */ 187 int pcf8584_pil = PCF8584_PIL; 188 189 #ifdef DEBUG 190 int pcf8584_print_lvl = 0; 191 static kmutex_t msg_buf_lock; 192 static char msg_buff[1024]; 193 #define PCF8584_DDB(command) \ 194 do { \ 195 { command; } \ 196 _NOTE(CONSTANTCONDITION) \ 197 } while (0) 198 199 static void 200 pcf8584_print(int flags, const char *fmt, ...) 201 { 202 if (flags & pcf8584_print_lvl) { 203 va_list ap; 204 205 va_start(ap, fmt); 206 207 if (pcf8584_print_lvl & PRT_PROM) { 208 prom_vprintf(fmt, ap); 209 } else { 210 mutex_enter(&msg_buf_lock); 211 (void) vsprintf(msg_buff, fmt, ap); 212 if (pcf8584_print_lvl & PRT_BUFFONLY) { 213 cmn_err(CE_CONT, "?%s", msg_buff); 214 } else { 215 cmn_err(CE_CONT, "%s", msg_buff); 216 } 217 mutex_exit(&msg_buf_lock); 218 } 219 va_end(ap); 220 } 221 } 222 #else 223 #define PCF8584_DDB(command) \ 224 do { \ 225 { _NOTE(EMPTY); } \ 226 _NOTE(CONSTANTCONDITION) \ 227 } while (0) 228 #endif 229 230 #define PCF8584_IMPL_DELAY(type, delay) \ 231 if (type == PIC16F747) { \ 232 drv_usecwait(delay); \ 233 } 234 235 int 236 _init(void) 237 { 238 int status; 239 240 status = ddi_soft_state_init(&pcf8584_state, sizeof (pcf8584_t), 241 PCF8584_INITIAL_SOFT_SPACE); 242 if (status != 0) { 243 244 return (status); 245 } 246 247 if ((status = mod_install(&modlinkage)) != 0) { 248 ddi_soft_state_fini(&pcf8584_state); 249 } 250 251 return (status); 252 } 253 254 int 255 _fini(void) 256 { 257 int status; 258 259 if ((status = mod_remove(&modlinkage)) == 0) { 260 ddi_soft_state_fini(&pcf8584_state); 261 } 262 263 return (status); 264 } 265 266 /* 267 * The loadable-module _info(9E) entry point 268 */ 269 int 270 _info(struct modinfo *modinfop) 271 { 272 return (mod_info(&modlinkage, modinfop)); 273 } 274 275 static void 276 pcf8584_dodetach(dev_info_t *dip) 277 { 278 pcf8584_t *i2c; 279 int instance = ddi_get_instance(dip); 280 281 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 282 283 if ((i2c->pcf8584_attachflags & ADD_INTR) != 0) { 284 ddi_remove_intr(dip, 0, i2c->pcf8584_icookie); 285 } 286 287 cv_destroy(&i2c->pcf8584_cv); 288 289 if ((i2c->pcf8584_attachflags & IMUTEX) != 0) { 290 mutex_destroy(&i2c->pcf8584_imutex); 291 cv_destroy(&i2c->pcf8584_icv); 292 } 293 if ((i2c->pcf8584_attachflags & SETUP_REGS) != 0) { 294 pcf8584_free_regs(i2c); 295 } 296 if ((i2c->pcf8584_attachflags & NEXUS_REGISTER) != 0) { 297 i2c_nexus_unregister(dip); 298 } 299 if ((i2c->pcf8584_attachflags & PROP_CREATE) != 0) { 300 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, 301 "interrupt-priorities"); 302 } 303 if ((i2c->pcf8584_attachflags & MINOR_NODE) != 0) { 304 ddi_remove_minor_node(dip, NULL); 305 } 306 307 ddi_soft_state_free(pcf8584_state, instance); 308 } 309 310 static int 311 pcf8584_doattach(dev_info_t *dip) 312 { 313 pcf8584_t *i2c; 314 int instance = ddi_get_instance(dip); 315 316 /* 317 * Allocate soft state structure. 318 */ 319 if (ddi_soft_state_zalloc(pcf8584_state, instance) != DDI_SUCCESS) { 320 321 return (DDI_FAILURE); 322 } 323 324 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 325 326 i2c->pcf8584_dip = dip; 327 328 (void) snprintf(i2c->pcf8584_name, sizeof (i2c->pcf8584_name), 329 "%s_%d", ddi_node_name(dip), instance); 330 331 /* 332 * Identify which pcf8584 implementation is being attached to. 333 */ 334 if (strcmp(ddi_binding_name(i2c->pcf8584_dip), "SUNW,bbc-i2c") == 0) { 335 i2c->pcf8584_impl_type = BBC; 336 i2c->pcf8584_impl_delay = PCF8584_GENERIC_DELAY; 337 } else if (strcmp(ddi_binding_name(i2c->pcf8584_dip), 338 "SUNW,i2c-pic16f747") == 0) { 339 i2c->pcf8584_impl_type = PIC16F747; 340 i2c->pcf8584_impl_delay = PCF8584_PIC16F747_DELAY; 341 } else { 342 i2c->pcf8584_impl_type = GENERIC; 343 i2c->pcf8584_impl_delay = PCF8584_GENERIC_DELAY; 344 } 345 346 if (ddi_prop_exists(DDI_DEV_T_ANY, dip, 347 DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, 348 "interrupt-priorities") != 1) { 349 (void) ddi_prop_create(DDI_DEV_T_NONE, dip, 350 DDI_PROP_CANSLEEP, "interrupt-priorities", 351 (caddr_t)&pcf8584_pil, 352 sizeof (pcf8584_pil)); 353 i2c->pcf8584_attachflags |= PROP_CREATE; 354 } 355 356 cv_init(&i2c->pcf8584_cv, NULL, CV_DRIVER, NULL); 357 358 if (pcf8584_setup_regs(dip, i2c) != DDI_SUCCESS) { 359 goto bad; 360 } 361 362 i2c->pcf8584_attachflags |= SETUP_REGS; 363 364 if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS | 365 DDI_PROP_CANSLEEP, "poll-mode") == 1) { 366 i2c->pcf8584_mode = PCF8584_POLL_MODE; 367 } else { 368 369 if (ddi_get_iblock_cookie(dip, 0, 370 &i2c->pcf8584_icookie) == DDI_SUCCESS) { 371 mutex_init(&i2c->pcf8584_imutex, NULL, MUTEX_DRIVER, 372 (void *)i2c->pcf8584_icookie); 373 cv_init(&i2c->pcf8584_icv, NULL, CV_DRIVER, NULL); 374 i2c->pcf8584_attachflags |= IMUTEX; 375 376 if (ddi_add_intr(dip, 0, NULL, NULL, pcf8584_intr, 377 (caddr_t)i2c) == DDI_SUCCESS) { 378 i2c->pcf8584_attachflags |= ADD_INTR; 379 i2c->pcf8584_mode = PCF8584_INTR_MODE; 380 } else { 381 cmn_err(CE_WARN, "%s failed to add interrupt", 382 i2c->pcf8584_name); 383 i2c->pcf8584_mode = PCF8584_POLL_MODE; 384 } 385 } else { 386 cmn_err(CE_WARN, "%s failed to retrieve iblock cookie. " 387 "Operating in POLL MODE only", i2c->pcf8584_name); 388 i2c->pcf8584_mode = PCF8584_POLL_MODE; 389 } 390 } 391 392 /* 393 * For polled mode, still initialize a cv and mutex 394 */ 395 if ((i2c->pcf8584_attachflags & IMUTEX) == 0) { 396 cv_init(&i2c->pcf8584_icv, NULL, CV_DRIVER, NULL); 397 mutex_init(&i2c->pcf8584_imutex, NULL, MUTEX_DRIVER, NULL); 398 i2c->pcf8584_attachflags |= IMUTEX; 399 } 400 401 i2c_nexus_register(dip, &pcf8584_regvec); 402 i2c->pcf8584_attachflags |= NEXUS_REGISTER; 403 404 if (ddi_create_minor_node(dip, "devctl", S_IFCHR, instance, 405 DDI_NT_NEXUS, 0) == DDI_FAILURE) { 406 cmn_err(CE_WARN, "%s ddi_create_minor_node failed", 407 i2c->pcf8584_name); 408 goto bad; 409 } 410 411 i2c->pcf8584_attachflags |= MINOR_NODE; 412 413 pcf8584_init(i2c); 414 415 i2c->pcf8584_nexus_dip = dip; 416 417 return (DDI_SUCCESS); 418 419 bad: 420 pcf8584_dodetach(dip); 421 422 return (DDI_FAILURE); 423 } 424 425 static int 426 pcf8584_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 427 { 428 switch (cmd) { 429 case DDI_ATTACH: 430 431 return (pcf8584_doattach(dip)); 432 case DDI_RESUME: 433 pcf8584_resume(dip); 434 435 return (DDI_SUCCESS); 436 default: 437 438 return (DDI_FAILURE); 439 } 440 } 441 442 static int 443 pcf8584_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 444 { 445 switch (cmd) { 446 case DDI_DETACH: 447 pcf8584_dodetach(dip); 448 449 return (DDI_SUCCESS); 450 case DDI_SUSPEND: 451 pcf8584_suspend(dip); 452 453 return (DDI_SUCCESS); 454 default: 455 456 return (DDI_FAILURE); 457 } 458 } 459 460 /*ARGSUSED*/ 461 static int 462 pcf8584_open(dev_t *devp, int flag, int otyp, cred_t *cred_p) 463 { 464 int instance; 465 pcf8584_t *i2c; 466 467 /* 468 * Make sure the open is for the right file type 469 */ 470 if (otyp != OTYP_CHR) 471 return (EINVAL); 472 473 instance = getminor(*devp); 474 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 475 if (i2c == NULL) 476 return (ENXIO); 477 478 /* 479 * Enforce exclusive access 480 */ 481 mutex_enter(&i2c->pcf8584_imutex); 482 if (i2c->pcf8584_open) { 483 mutex_exit(&i2c->pcf8584_imutex); 484 485 return (EBUSY); 486 } else 487 i2c->pcf8584_open = 1; 488 mutex_exit(&i2c->pcf8584_imutex); 489 490 return (0); 491 } 492 493 /*ARGSUSED*/ 494 static int 495 pcf8584_close(dev_t dev, int flag, int otyp, cred_t *cred_p) 496 { 497 int instance; 498 pcf8584_t *i2c; 499 500 /* 501 * Make sure the close is for the right file type 502 */ 503 if (otyp != OTYP_CHR) 504 return (EINVAL); 505 506 instance = getminor(dev); 507 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 508 if (i2c == NULL) 509 return (ENXIO); 510 511 mutex_enter(&i2c->pcf8584_imutex); 512 i2c->pcf8584_open = 0; 513 mutex_exit(&i2c->pcf8584_imutex); 514 515 return (0); 516 } 517 518 /*ARGSUSED*/ 519 static int 520 pcf8584_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, 521 int *rvalp) 522 { 523 pcf8584_t *i2c; 524 dev_info_t *self; 525 struct devctl_iocdata *dcp; 526 int rv; 527 528 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, getminor(dev)); 529 if (i2c == NULL) 530 return (ENXIO); 531 532 self = (dev_info_t *)i2c->pcf8584_nexus_dip; 533 534 /* 535 * read devctl ioctl data 536 */ 537 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS) { 538 539 return (EFAULT); 540 } 541 542 switch (cmd) { 543 case DEVCTL_BUS_DEV_CREATE: 544 rv = ndi_dc_devi_create(dcp, self, 0, NULL); 545 break; 546 case DEVCTL_DEVICE_REMOVE: 547 rv = ndi_devctl_device_remove(self, dcp, 0); 548 break; 549 default: 550 rv = ENOTSUP; 551 } 552 553 ndi_dc_freehdl(dcp); 554 555 return (rv); 556 } 557 558 static int 559 pcf8584_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op, 560 void *arg, void *result) 561 { 562 switch (op) { 563 case DDI_CTLOPS_INITCHILD: 564 565 return (pcf8584_initchild((dev_info_t *)arg)); 566 case DDI_CTLOPS_UNINITCHILD: 567 pcf8584_uninitchild((dev_info_t *)arg); 568 569 return (DDI_SUCCESS); 570 case DDI_CTLOPS_REPORTDEV: 571 pcf8584_reportdev(dip, rdip); 572 573 return (DDI_SUCCESS); 574 case DDI_CTLOPS_DMAPMAPC: 575 case DDI_CTLOPS_POKE: 576 case DDI_CTLOPS_PEEK: 577 case DDI_CTLOPS_IOMIN: 578 case DDI_CTLOPS_REPORTINT: 579 case DDI_CTLOPS_SIDDEV: 580 case DDI_CTLOPS_SLAVEONLY: 581 case DDI_CTLOPS_AFFINITY: 582 case DDI_CTLOPS_PTOB: 583 case DDI_CTLOPS_BTOP: 584 case DDI_CTLOPS_BTOPR: 585 case DDI_CTLOPS_DVMAPAGESIZE: 586 587 return (DDI_FAILURE); 588 default: 589 590 return (ddi_ctlops(dip, rdip, op, arg, result)); 591 } 592 } 593 594 /* 595 * pcf8584_suspend() is called before the system suspends. Existing 596 * transfer in progress or waiting will complete, but new transfers are 597 * effectively blocked by "acquiring" the bus. 598 */ 599 static void 600 pcf8584_suspend(dev_info_t *dip) 601 { 602 pcf8584_t *i2c; 603 int instance; 604 605 instance = ddi_get_instance(dip); 606 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 607 608 pcf8584_acquire(i2c, NULL, NULL, B_FALSE); 609 } 610 611 /* 612 * pcf8584_resume() is called when the system resumes from CPR. It releases 613 * the hold that was placed on the i2c bus, which allows any real 614 * transfers to continue. 615 */ 616 static void 617 pcf8584_resume(dev_info_t *dip) 618 { 619 pcf8584_t *i2c; 620 int instance; 621 622 instance = ddi_get_instance(dip); 623 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, instance); 624 625 pcf8584_release(i2c, B_FALSE); 626 627 pcf8584_init(i2c); 628 } 629 630 /* 631 * pcf8584_acquire() is called by a thread wishing to "own" the I2C bus. 632 * It should not be held across multiple transfers. If the 'force' flag 633 * is set, do not try to acquire mutex or do cv_wait. 634 */ 635 static void 636 pcf8584_acquire(pcf8584_t *i2c, dev_info_t *dip, i2c_transfer_t *tp, 637 boolean_t force) 638 { 639 if (force) { 640 i2c->pcf8584_busy = 1; 641 i2c->pcf8584_cur_tran = tp; 642 i2c->pcf8584_cur_dip = dip; 643 i2c->pcf8584_cur_status = PCF8584_TRANSFER_NEW; 644 return; 645 } 646 647 mutex_enter(&i2c->pcf8584_imutex); 648 while (i2c->pcf8584_busy) { 649 cv_wait(&i2c->pcf8584_cv, &i2c->pcf8584_imutex); 650 } 651 i2c->pcf8584_busy = 1; 652 mutex_exit(&i2c->pcf8584_imutex); 653 /* 654 * On systems where OBP shares a pcf8584 controller with the 655 * OS, plat_shared_i2c_enter will serialize access to the 656 * pcf8584 controller. Do not grab this lock during CPR 657 * suspend as the CPR thread also acquires this muxex 658 * through through prom_setprop which causes recursive 659 * mutex enter. 660 * 661 * dip == NULL during CPR. 662 */ 663 if ((&plat_shared_i2c_enter != NULL) && (dip != NULL)) { 664 plat_shared_i2c_enter(i2c->pcf8584_dip); 665 } 666 667 mutex_enter(&i2c->pcf8584_imutex); 668 i2c->pcf8584_cur_tran = tp; 669 i2c->pcf8584_cur_dip = dip; 670 mutex_exit(&i2c->pcf8584_imutex); 671 } 672 673 /* 674 * pcf8584_release() is called to release a hold made by pcf8584_acquire(). 675 */ 676 static void 677 pcf8584_release(pcf8584_t *i2c, boolean_t force) 678 { 679 if (force) { 680 i2c->pcf8584_busy = 0; 681 i2c->pcf8584_cur_tran = NULL; 682 i2c->pcf8584_cur_dip = NULL; 683 i2c->pcf8584_cur_status = PCF8584_TRANSFER_OVER; 684 cv_signal(&i2c->pcf8584_cv); 685 return; 686 } 687 688 mutex_enter(&i2c->pcf8584_imutex); 689 i2c->pcf8584_busy = 0; 690 i2c->pcf8584_cur_tran = NULL; 691 cv_signal(&i2c->pcf8584_cv); 692 mutex_exit(&i2c->pcf8584_imutex); 693 694 if ((&plat_shared_i2c_exit != NULL) && (i2c->pcf8584_cur_dip != NULL)) { 695 plat_shared_i2c_exit(i2c->pcf8584_dip); 696 } 697 } 698 699 /* 700 * if pcf8584_b_reg exists, it means the current bus controller signals 701 * are multiplexed into more than a single bus. Select the bus needed 702 * by writing to the mux register. 703 */ 704 static void 705 pcf8584_select_bus(pcf8584_t *i2c) 706 { 707 int bus; 708 pcf8584_ppvt_t *ppvt; 709 710 /* 711 * The existence of pcf8584_b_reg means the bus registers 712 * are multiplexed. 713 */ 714 715 PCF8584_DDB(pcf8584_print(PRT_SELECT, "bus multiplex: %X\n", 716 i2c->pcf8584_b_reg)); 717 if (i2c->pcf8584_b_reg != NULL) { 718 ppvt = ddi_get_parent_data(i2c->pcf8584_cur_dip); 719 720 bus = ppvt->pcf8584_ppvt_bus; 721 722 PCF8584_DDB(pcf8584_print(PRT_SELECT, 723 "transmitting bus number %d\n", bus)); 724 725 ddi_put8(i2c->pcf8584_b_rhandle, i2c->pcf8584_b_reg, bus); 726 } 727 } 728 729 /* 730 * pcf8584_type_to_state() converts a transfer type to the 731 * next state of the I2C state machine based on the requested 732 * transfer type. 733 */ 734 static enum tran_state 735 pcf8584_type_to_state(int i2c_flags) 736 { 737 switch (i2c_flags) { 738 case I2C_WR: 739 740 return (TRAN_STATE_WR); 741 case I2C_RD: 742 743 return (TRAN_STATE_DUMMY_RD); 744 case I2C_WR_RD: 745 746 return (TRAN_STATE_WR_RD); 747 } 748 /*NOTREACHED*/ 749 return (TRAN_STATE_NULL); 750 } 751 752 /* 753 * pcf8584_put_s1() writes out cmd to register S1. 754 */ 755 static void 756 pcf8584_put_s1(pcf8584_t *i2c, char cmd) 757 { 758 ddi_acc_handle_t hp = i2c->pcf8584_rhandle; 759 pcf8584_regs_t *rp = &i2c->pcf8584_regs; 760 761 ddi_put8(hp, rp->pcf8584_regs_s1, cmd); 762 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 763 i2c->pcf8584_impl_delay); 764 /* 765 * read status to make sure write is flushed 766 */ 767 (void) ddi_get8(hp, rp->pcf8584_regs_s1); 768 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 769 i2c->pcf8584_impl_delay); 770 } 771 772 /* 773 * pcf8584_put_s0() writes out data to register S0. 774 */ 775 static void 776 pcf8584_put_s0(pcf8584_t *i2c, char data) 777 { 778 ddi_acc_handle_t hp = i2c->pcf8584_rhandle; 779 pcf8584_regs_t *rp = &i2c->pcf8584_regs; 780 781 ddi_put8(hp, rp->pcf8584_regs_s0, data); 782 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 783 i2c->pcf8584_impl_delay); 784 /* 785 * read status to make sure write is flushed 786 */ 787 (void) ddi_get8(hp, rp->pcf8584_regs_s1); 788 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 789 i2c->pcf8584_impl_delay); 790 } 791 792 /* 793 * pcf8584_get_s0() reads from register S0. 794 */ 795 static uint8_t 796 pcf8584_get_s0(pcf8584_t *i2c) 797 { 798 ddi_acc_handle_t hp = i2c->pcf8584_rhandle; 799 pcf8584_regs_t *rp = &i2c->pcf8584_regs; 800 uint8_t s0; 801 802 s0 = ddi_get8(hp, rp->pcf8584_regs_s0); 803 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 804 i2c->pcf8584_impl_delay); 805 806 return (s0); 807 } 808 809 /* 810 * pcf8584_get_s1() reads from register S1. 811 */ 812 static uint8_t 813 pcf8584_get_s1(pcf8584_t *i2c) 814 { 815 ddi_acc_handle_t hp = i2c->pcf8584_rhandle; 816 pcf8584_regs_t *rp = &i2c->pcf8584_regs; 817 uint8_t s1; 818 819 s1 = ddi_get8(hp, rp->pcf8584_regs_s1); 820 PCF8584_IMPL_DELAY(i2c->pcf8584_impl_type, 821 i2c->pcf8584_impl_delay); 822 823 return (s1); 824 } 825 826 /* 827 * If the previous transaction was a write, the stop 828 * bit may not make it out on the wire before 829 * the next transaction startes. And unfortunately, there 830 * is no interrupt after the stop bit is written, so this 831 * function will poll to make sure the BBC is ready. 832 */ 833 static int 834 pcf8584_bbn_ready(pcf8584_t *i2c) 835 { 836 uint8_t s1; 837 int usecwaits = 0; 838 839 s1 = pcf8584_get_s1(i2c); 840 841 while ((s1 & S1_BBN) == 0) { 842 843 if (usecwaits++ == 100) { 844 /* Try initializing the bus */ 845 pcf8584_monitor_mode(i2c); 846 pcf8584_put_s1(i2c, S1_STOP); 847 delay(1); 848 pcf8584_init(i2c); 849 (void) pcf8584_get_s0(i2c); 850 s1 = pcf8584_get_s1(i2c); 851 if (s1 & S1_BBN) { 852 cmn_err(CE_WARN, 853 "!%s: cleared bus busy. addr=0x%x", 854 i2c->pcf8584_name, 855 pcf8584_dip_to_addr(i2c->pcf8584_cur_dip)); 856 857 return (I2C_SUCCESS); 858 } else { 859 cmn_err(CE_WARN, 860 "!%s bus busy after init addr=0x%x", 861 i2c->pcf8584_name, 862 pcf8584_dip_to_addr(i2c->pcf8584_cur_dip)); 863 864 return (I2C_FAILURE); 865 } 866 } 867 drv_usecwait(1); 868 s1 = pcf8584_get_s1(i2c); 869 } 870 871 return (I2C_SUCCESS); 872 } 873 874 static int 875 pcf8584_error(int status, uint8_t rdwr, pcf8584_t *i2c) 876 { 877 int addr = pcf8584_dip_to_addr(i2c->pcf8584_cur_dip); 878 pcf8584_regs_t *rp = &i2c->pcf8584_regs; 879 880 if (status & S1_BER) { 881 cmn_err(CE_WARN, 882 "!%s bus error; Controller = 0x%p " 883 " addr = 0x%x", i2c->pcf8584_name, 884 (void *)rp->pcf8584_regs_s1, addr); 885 pcf8584_init(i2c); 886 887 return (I2C_FAILURE); 888 } else if (status & S1_LAB) { 889 cmn_err(CE_WARN, "!%s lost arbitration; Controller =" 890 " 0x%p addr = 0x%x", i2c->pcf8584_name, 891 (void *)rp->pcf8584_regs_s1, addr); 892 pcf8584_init(i2c); 893 894 return (I2C_FAILURE); 895 } else if ((status & S1_LRB) && (rdwr == I2C_WR)) { 896 /* 897 * No error logged here, because this may be benign. 898 * Cf. the "Alert Response Address" feature of SMBUS. 899 */ 900 pcf8584_put_s1(i2c, S1_STOP); 901 902 return (I2C_FAILURE); 903 } 904 905 return (I2C_SUCCESS); 906 } 907 908 static void 909 pcf8584_monitor_mode(pcf8584_t *i2c) 910 { 911 pcf8584_put_s1(i2c, S1_PIN); 912 913 pcf8584_put_s0(i2c, MONITOR_ADDRESS); 914 } 915 916 static int 917 pcf8584_initchild(dev_info_t *cdip) 918 { 919 int32_t cell_size; 920 int len; 921 int32_t regs[2]; 922 int err; 923 pcf8584_ppvt_t *ppvt; 924 char name[30]; 925 926 PCF8584_DDB(pcf8584_print(PRT_INIT, "pcf8584_initchild enter: %s\n", 927 ddi_node_name(cdip))); 928 929 ppvt = kmem_alloc(sizeof (pcf8584_ppvt_t), KM_SLEEP); 930 931 len = sizeof (cell_size); 932 err = ddi_getlongprop_buf(DDI_DEV_T_ANY, cdip, 933 DDI_PROP_CANSLEEP, "#address-cells", 934 (caddr_t)&cell_size, &len); 935 if (err != DDI_PROP_SUCCESS || len != sizeof (cell_size)) { 936 937 return (DDI_FAILURE); 938 } 939 940 len = sizeof (regs); 941 err = ddi_getlongprop_buf(DDI_DEV_T_ANY, cdip, 942 DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, 943 "reg", (caddr_t)regs, &len); 944 if (err != DDI_PROP_SUCCESS || 945 len != (cell_size * sizeof (int32_t))) { 946 947 return (DDI_FAILURE); 948 } 949 950 if (cell_size == 1) { 951 ppvt->pcf8584_ppvt_addr = regs[0]; 952 (void) sprintf(name, "%x", regs[0]); 953 } else if (cell_size == 2) { 954 ppvt->pcf8584_ppvt_bus = regs[0]; 955 ppvt->pcf8584_ppvt_addr = regs[1]; 956 (void) sprintf(name, "%x,%x", regs[0], regs[1]); 957 } else { 958 959 return (DDI_FAILURE); 960 } 961 962 ddi_set_parent_data(cdip, ppvt); 963 964 ddi_set_name_addr(cdip, name); 965 966 PCF8584_DDB(pcf8584_print(PRT_INIT, 967 "pcf8584_initchild SUCCESS: %s\n", ddi_node_name(cdip))); 968 969 return (DDI_SUCCESS); 970 } 971 972 static void 973 pcf8584_uninitchild(dev_info_t *cdip) 974 { 975 pcf8584_ppvt_t *ppvt; 976 977 ppvt = ddi_get_parent_data(cdip); 978 kmem_free(ppvt, sizeof (pcf8584_ppvt_t)); 979 980 ddi_set_parent_data(cdip, NULL); 981 ddi_set_name_addr(cdip, NULL); 982 983 PCF8584_DDB(pcf8584_print(PRT_INIT, "i2c_uninitchild: %s\n", 984 ddi_node_name(cdip))); 985 } 986 987 static void 988 pcf8584_init(pcf8584_t *i2c) 989 { 990 uint8_t clk_div = 0x1C; 991 992 pcf8584_put_s1(i2c, S1_PIN); 993 994 pcf8584_put_s0(i2c, S0_OWN); 995 996 pcf8584_put_s1(i2c, S1_PIN | S1_ES1); 997 998 /* 999 * The default case is to set the clock divisor to the least common 1000 * denominator to avoid over clocking the I2C bus. Assume that 1001 * BBC based systems are using the Safari clock as input, so select 1002 * the clk divisor based on it. 1003 */ 1004 if (i2c->pcf8584_impl_type == BBC) { 1005 dev_info_t *root_node; 1006 int clock_freq; 1007 root_node = ddi_root_node(); 1008 clock_freq = ddi_prop_get_int(DDI_DEV_T_ANY, root_node, 1009 DDI_PROP_DONTPASS, "clock-frequency", 0); 1010 1011 if (clock_freq < 105000000) { 1012 clk_div = 0x00; 1013 } else if (clock_freq < 160000000) { 1014 clk_div = 0x10; 1015 } else { 1016 clk_div = 0x1C; 1017 } 1018 } 1019 1020 /* set I2C clock speed */ 1021 pcf8584_put_s0(i2c, clk_div); 1022 1023 pcf8584_put_s1(i2c, S1_PIN | S1_ESO | S1_ACK); 1024 1025 /* 1026 * Multi-Master: Wait for a period of time equal to the 1027 * longest I2C message. This accounts for the case 1028 * where multiple controllers and, if this particular one 1029 * is "lagging", misses the BB(bus busy) condition. 1030 * We wait 200 ms since the longest transaction at this time 1031 * on the i2c bus is a 256 byte read from the seprom which takes 1032 * about 75 ms. Some additional buffer does no harm to the driver. 1033 */ 1034 1035 delay(drv_usectohz(PCF8584_INIT_WAIT)); 1036 } 1037 1038 /* 1039 * pcf8584_setup_regs() is called to map in registers specific to 1040 * the pcf8584. 1041 */ 1042 static int 1043 pcf8584_setup_regs(dev_info_t *dip, pcf8584_t *i2c) 1044 { 1045 int nregs; 1046 ddi_device_acc_attr_t attr; 1047 caddr_t reg_base; 1048 1049 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 1050 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; 1051 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 1052 1053 if (ddi_dev_nregs(dip, &nregs) != DDI_SUCCESS) { 1054 1055 return (DDI_FAILURE); 1056 } 1057 1058 if (ddi_regs_map_setup(dip, 0, 1059 (caddr_t *)®_base, 0, 0, &attr, 1060 &i2c->pcf8584_rhandle) != DDI_SUCCESS) { 1061 1062 return (DDI_FAILURE); 1063 } 1064 1065 /* 1066 * If i2c controller is on BBC, then s1 comes before s0. 1067 */ 1068 if (i2c->pcf8584_impl_type == BBC) { 1069 i2c->pcf8584_regs.pcf8584_regs_s0 = 1070 (uint8_t *)®_base[1]; 1071 i2c->pcf8584_regs.pcf8584_regs_s1 = 1072 (uint8_t *)®_base[0]; 1073 } else { 1074 i2c->pcf8584_regs.pcf8584_regs_s0 = 1075 (uint8_t *)®_base[0]; 1076 i2c->pcf8584_regs.pcf8584_regs_s1 = 1077 (uint8_t *)®_base[1]; 1078 } 1079 1080 if (nregs > 1) { 1081 if (ddi_regs_map_setup(dip, 1082 1, (caddr_t *)&i2c->pcf8584_b_reg, 1083 0, 0, &attr, &i2c->pcf8584_b_rhandle) != 1084 DDI_SUCCESS) { 1085 1086 return (DDI_FAILURE); 1087 } 1088 } 1089 1090 return (DDI_SUCCESS); 1091 } 1092 1093 /* 1094 * pcf8584_free_regs() frees any registers previously 1095 * allocated. 1096 */ 1097 static void 1098 pcf8584_free_regs(pcf8584_t *i2c) 1099 { 1100 if (i2c->pcf8584_regs.pcf8584_regs_s0 != NULL) { 1101 ddi_regs_map_free(&i2c->pcf8584_rhandle); 1102 } 1103 if (i2c->pcf8584_b_reg != NULL) { 1104 ddi_regs_map_free(&i2c->pcf8584_b_rhandle); 1105 } 1106 } 1107 1108 static void 1109 pcf8584_reportdev(dev_info_t *dip, dev_info_t *rdip) 1110 { 1111 pcf8584_ppvt_t *ppvt; 1112 1113 ppvt = ddi_get_parent_data(rdip); 1114 1115 cmn_err(CE_CONT, "?%s%d at %s%d: addr 0x%x", 1116 ddi_driver_name(rdip), ddi_get_instance(rdip), 1117 ddi_driver_name(dip), ddi_get_instance(dip), 1118 ppvt->pcf8584_ppvt_addr); 1119 } 1120 1121 /* 1122 * i2_nexus_dip_to_addr() takes a dip and returns an I2C address. 1123 */ 1124 static int 1125 pcf8584_dip_to_addr(dev_info_t *dip) 1126 { 1127 pcf8584_ppvt_t *ppvt; 1128 1129 ppvt = ddi_get_parent_data(dip); 1130 1131 return (ppvt->pcf8584_ppvt_addr); 1132 } 1133 1134 /* 1135 * pcf8584_intr() is the interrupt service routine registered during 1136 * attach, and remains registered even if the driver is in POLLED mode. So if 1137 * this is called from POLLED mode, it needs to return without doing 1138 * any work to prevent the I2C bus from entering an unknown state. 1139 */ 1140 static uint_t 1141 pcf8584_intr(caddr_t arg) 1142 { 1143 pcf8584_t *i2c = (pcf8584_t *)arg; 1144 uint8_t s1; 1145 1146 ASSERT(i2c->pcf8584_mode != PCF8584_POLL_MODE); 1147 PCF8584_DDB(pcf8584_print(PRT_INTR, "pcf8584_intr: enter\n")); 1148 1149 mutex_enter(&i2c->pcf8584_imutex); 1150 1151 /* 1152 * It is necessary to check both whether the hardware is interrupting 1153 * and that there is a current transaction for the bus in progress. 1154 * Checking just one but not the other will lead to a panic on xcal 1155 * since both controllers share the same ino, and also because OBP 1156 * shares a controller with the kernel even while the kernel is running. 1157 */ 1158 1159 if (i2c->pcf8584_cur_tran == NULL) { 1160 mutex_exit(&i2c->pcf8584_imutex); 1161 1162 return (DDI_INTR_UNCLAIMED); 1163 } 1164 1165 1166 s1 = pcf8584_get_s1(i2c); 1167 if (s1 & S1_PIN) { 1168 mutex_exit(&i2c->pcf8584_imutex); 1169 1170 return (DDI_INTR_UNCLAIMED); 1171 } 1172 1173 if (pcf8584_process(i2c, s1) == I2C_COMPLETE) { 1174 i2c->pcf8584_tran_state = TRAN_STATE_NULL; 1175 i2c->pcf8584_cur_status = PCF8584_TRANSFER_OVER; 1176 cv_signal(&i2c->pcf8584_icv); 1177 } else 1178 i2c->pcf8584_cur_status = PCF8584_TRANSFER_ON; 1179 1180 mutex_exit(&i2c->pcf8584_imutex); 1181 1182 return (DDI_INTR_CLAIMED); 1183 } 1184 1185 /* 1186 * Interrupt occurs after a byte is transmitted or received, indicating 1187 * the device is ready to be serviced. 1188 */ 1189 static int 1190 pcf8584_process(pcf8584_t *i2c, uint8_t s1) 1191 { 1192 i2c_transfer_t *tp = i2c->pcf8584_cur_tran; 1193 int addr = pcf8584_dip_to_addr(i2c->pcf8584_cur_dip); 1194 int dummy_read; 1195 1196 ASSERT(i2c->pcf8584_tran_state != TRAN_STATE_NULL); 1197 1198 switch (i2c->pcf8584_tran_state) { 1199 case TRAN_STATE_DUMMY_DATA: 1200 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1201 "TRAN_STATE_DUMMY DATA: write dummy %x\n", DUMMY_DATA)); 1202 if (pcf8584_error(s1, I2C_RD, i2c) != I2C_SUCCESS) { 1203 tp->i2c_result = I2C_FAILURE; 1204 1205 return (I2C_COMPLETE); 1206 } 1207 i2c->pcf8584_tran_state = TRAN_STATE_START; 1208 pcf8584_put_s0(i2c, DUMMY_DATA); 1209 1210 return (I2C_PENDING); 1211 case TRAN_STATE_START: 1212 if (pcf8584_error(s1, I2C_RD, i2c) != I2C_SUCCESS) { 1213 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1214 "TRAN_STATE_START failure\n")); 1215 tp->i2c_result = I2C_FAILURE; 1216 1217 return (I2C_COMPLETE); 1218 } 1219 i2c->pcf8584_tran_state = 1220 pcf8584_type_to_state(tp->i2c_flags); 1221 1222 /* Set read bit if this is a read transaction */ 1223 if (tp->i2c_flags == I2C_RD) { 1224 addr |= I2C_READ; 1225 } 1226 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1227 pcf8584_put_s1(i2c, S1_START2); 1228 else 1229 pcf8584_put_s1(i2c, S1_START2 | S1_ENI); 1230 pcf8584_put_s0(i2c, addr); 1231 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1232 "TRAN_STATE_START: write addr: %x\n", addr)); 1233 1234 return (I2C_PENDING); 1235 case TRAN_STATE_WR: 1236 1237 if (pcf8584_error(s1, I2C_WR, i2c) != I2C_SUCCESS) { 1238 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1239 "TRAN_STATE_WR failure\n")); 1240 tp->i2c_result = I2C_FAILURE; 1241 1242 return (I2C_COMPLETE); 1243 } 1244 /* check to see if at end of buffer */ 1245 if (tp->i2c_w_resid == 0) { 1246 pcf8584_put_s1(i2c, S1_STOP); 1247 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1248 "TRAN_STATE_WR: write STOP\n")); 1249 1250 return (I2C_COMPLETE); 1251 } 1252 1253 pcf8584_put_s0(i2c, tp->i2c_wbuf[tp->i2c_wlen - 1254 tp->i2c_w_resid--]); 1255 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1256 "TRAN_STATE_WR: write data %x\n", 1257 tp->i2c_wbuf[tp->i2c_wlen - (tp->i2c_w_resid + 1)])); 1258 1259 return (I2C_PENDING); 1260 case TRAN_STATE_DUMMY_RD: 1261 1262 if (pcf8584_error(s1, I2C_WR, i2c) != I2C_SUCCESS) { 1263 tp->i2c_result = I2C_FAILURE; 1264 1265 return (I2C_COMPLETE); 1266 } 1267 /* 1268 * The first read is always a dummy read, because reading S0 1269 * is what starts bit shifting and ACK on the I2c bus. 1270 * This byte is accessed during the next read, which starts 1271 * another 8 bit bus shift. 1272 * 1273 * special case for 1 byte reads: Clear the ACK bit 1274 * here since this read causes the last and only byte 1275 * to be sent on the I2C bus. 1276 */ 1277 if (tp->i2c_r_resid == 1) { 1278 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1279 pcf8584_put_s1(i2c, S1_ESO); 1280 else 1281 pcf8584_put_s1(i2c, S1_ESO | S1_ENI); 1282 } 1283 1284 /* 1285 * dummy read 1286 */ 1287 dummy_read = pcf8584_get_s0(i2c); 1288 1289 i2c->pcf8584_tran_state = TRAN_STATE_RD; 1290 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1291 "TRAN_STATE_DUMMY_RD: read dummy %d\n", dummy_read)); 1292 1293 return (I2C_PENDING); 1294 case TRAN_STATE_RD: 1295 if (pcf8584_error(s1, I2C_RD, i2c) != I2C_SUCCESS) { 1296 tp->i2c_result = I2C_FAILURE; 1297 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1298 "TRAN_STATE_RD failure\n")); 1299 1300 return (I2C_COMPLETE); 1301 } 1302 1303 /* 1304 * If resid == 1, the last byte has already been shifted into 1305 * the accumulator. Send the stop bit. This also prevents the 1306 * last S0 read from shifting in another byte from the I2C bus. 1307 */ 1308 if (tp->i2c_r_resid == 1) { 1309 pcf8584_put_s1(i2c, S1_STOP); 1310 } 1311 1312 /* 1313 * If resid == 2, then the next read will cause the I2C bus to 1314 * start shifting in the last byte on the I2C bus, which we 1315 * don't want to be ACK'd, so clear the ACK bit. 1316 */ 1317 if (tp->i2c_r_resid == 2) { 1318 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1319 pcf8584_put_s1(i2c, S1_ESO); 1320 else 1321 pcf8584_put_s1(i2c, S1_ESO | S1_ENI); 1322 } 1323 1324 tp->i2c_rbuf[tp->i2c_rlen - tp->i2c_r_resid] = 1325 pcf8584_get_s0(i2c); 1326 1327 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1328 "TRAN_STATE_RD: returning. i2c_rlen = %d " 1329 "i2c_r_resid = %d, data =%x\n", tp->i2c_rlen, 1330 tp->i2c_r_resid, tp->i2c_rbuf[tp->i2c_rlen - 1331 tp->i2c_r_resid])); 1332 1333 if (--tp->i2c_r_resid == 0) { 1334 1335 return (I2C_COMPLETE); 1336 } 1337 1338 return (I2C_PENDING); 1339 case TRAN_STATE_WR_RD: 1340 1341 if (pcf8584_error(s1, I2C_WR, i2c) != I2C_SUCCESS) { 1342 tp->i2c_result = I2C_FAILURE; 1343 1344 return (I2C_COMPLETE); 1345 } 1346 if ((s1 & S1_LRB)) { 1347 pcf8584_put_s1(i2c, S1_STOP); 1348 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1349 "TRAN_STATE_WR_RD sending STOP\n")); 1350 1351 return (I2C_COMPLETE); 1352 } 1353 if (tp->i2c_w_resid != 0) { 1354 pcf8584_put_s0(i2c, tp->i2c_wbuf[tp->i2c_wlen - 1355 tp->i2c_w_resid--]); 1356 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1357 "TRAN_STATE_WR_RD: write data %x\n", 1358 tp->i2c_wbuf[tp->i2c_wlen - 1359 (tp->i2c_w_resid + 1)])); 1360 } else { 1361 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1362 pcf8584_put_s1(i2c, S1_START2); 1363 else 1364 pcf8584_put_s1(i2c, S1_START2 | S1_ENI); 1365 pcf8584_put_s0(i2c, addr | I2C_READ); 1366 i2c->pcf8584_tran_state = 1367 TRAN_STATE_DUMMY_RD; 1368 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1369 "TRAN_STATE_WR_RD: write addr " 1370 "%x\n", addr | I2C_READ)); 1371 } 1372 1373 return (I2C_PENDING); 1374 default: 1375 1376 return (I2C_COMPLETE); 1377 } 1378 } 1379 1380 /* 1381 * pcf8584_transfer() is the function that is registered with 1382 * I2C services to be called from pcf8584_transfer() for each transfer. 1383 * 1384 * This function starts the transfer, and then waits for the 1385 * interrupt or polled thread to signal that the transfer has 1386 * completed. 1387 */ 1388 int 1389 pcf8584_transfer(dev_info_t *dip, i2c_transfer_t *tp) 1390 { 1391 pcf8584_t *i2c; 1392 int saved_mode, took_over = 0; 1393 kcondvar_t *waiter = NULL; 1394 extern int do_polled_io; 1395 1396 i2c = (pcf8584_t *)ddi_get_soft_state(pcf8584_state, 1397 ddi_get_instance(ddi_get_parent(dip))); 1398 1399 tp->i2c_r_resid = tp->i2c_rlen; 1400 tp->i2c_w_resid = tp->i2c_wlen; 1401 tp->i2c_result = I2C_SUCCESS; 1402 1403 begin: 1404 /* 1405 * If we're explicitly asked to do polled io (or if we are panic'ing), 1406 * we need to usurp ownership of the I2C bus, bypassing any other 1407 * waiters. 1408 */ 1409 if (do_polled_io || ddi_in_panic()) { 1410 pcf8584_take_over(i2c, dip, tp, &waiter, &saved_mode); 1411 took_over = 1; 1412 } else { 1413 pcf8584_acquire(i2c, dip, tp, B_FALSE); 1414 mutex_enter(&i2c->pcf8584_imutex); 1415 1416 /* 1417 * See if someone else had intruded and taken over the bus 1418 * between the 'pcf8584_acquire' and 'mutex_enter' above. 1419 * If so, we'll have to start all over again. 1420 */ 1421 if (i2c->pcf8584_cur_tran != tp) { 1422 mutex_exit(&i2c->pcf8584_imutex); 1423 goto begin; 1424 } 1425 } 1426 1427 if (pcf8584_bbn_ready(i2c) != I2C_SUCCESS) { 1428 if (took_over) 1429 pcf8584_give_up(i2c, waiter, saved_mode); 1430 else { 1431 mutex_exit(&i2c->pcf8584_imutex); 1432 pcf8584_release(i2c, B_FALSE); 1433 } 1434 1435 return (tp->i2c_result = I2C_FAILURE); 1436 } 1437 1438 /* 1439 * Bus selection must be followed by pcf8584_bbn_ready(), 1440 * otherwise the bus can be switched before the stop 1441 * bit is written out, causing the stop bit to get 1442 * sent to the wrong (new) bus. This causes the 1443 * previous bus to permanently hang waiting for the 1444 * stop bit. 1445 */ 1446 pcf8584_select_bus(i2c); 1447 1448 i2c->pcf8584_tran_state = TRAN_STATE_DUMMY_DATA; 1449 pcf8584_put_s0(i2c, DUMMY_ADDR); 1450 PCF8584_DDB(pcf8584_print(PRT_TRAN, 1451 "FIRST WRITE DUMMY ADDR: write %x\n", DUMMY_ADDR)); 1452 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1453 pcf8584_put_s1(i2c, S1_START); 1454 else 1455 pcf8584_put_s1(i2c, S1_START | S1_ENI); 1456 1457 /* 1458 * Update transfer status so any polled i/o request coming in 1459 * after this will complete this transfer for us, before issuing 1460 * its own. 1461 */ 1462 i2c->pcf8584_cur_status = PCF8584_TRANSFER_ON; 1463 1464 if (i2c->pcf8584_mode == PCF8584_POLL_MODE) 1465 pcf8584_do_polled_io(i2c); 1466 1467 if (took_over) 1468 pcf8584_give_up(i2c, waiter, saved_mode); 1469 else { 1470 if (i2c->pcf8584_mode != PCF8584_POLL_MODE) 1471 cv_wait(&i2c->pcf8584_icv, &i2c->pcf8584_imutex); 1472 mutex_exit(&i2c->pcf8584_imutex); 1473 1474 /* 1475 * Release the I2C bus only if we still own it. If we don't 1476 * own it (someone usurped it from us while we were waiting), 1477 * we still need to drop the lock that serializes access to 1478 * the pcf8584 controller on systems where OBP shares the 1479 * controller with the OS. 1480 */ 1481 if (i2c->pcf8584_cur_tran == tp) 1482 pcf8584_release(i2c, B_FALSE); 1483 else if (&plat_shared_i2c_exit && dip) 1484 plat_shared_i2c_exit(i2c->pcf8584_dip); 1485 } 1486 1487 return (tp->i2c_result); 1488 } 1489 1490 static void 1491 pcf8584_do_polled_io(pcf8584_t *i2c) 1492 { 1493 int completed = I2C_PENDING; 1494 uint8_t s1; 1495 1496 while (completed != I2C_COMPLETE) { 1497 s1 = pcf8584_get_s1(i2c); 1498 if (!(s1 & S1_PIN)) { 1499 ASSERT(i2c->pcf8584_cur_tran); 1500 completed = pcf8584_process(i2c, s1); 1501 } 1502 drv_usecwait(1); 1503 } 1504 1505 i2c->pcf8584_cur_status = PCF8584_TRANSFER_OVER; 1506 } 1507 1508 /* 1509 * pcf8584_take_over() grabs the I2C bus and other resources by force and 1510 * flushes any pending transaction. This is called if a polled i/o 1511 * request comes in. 1512 */ 1513 static void 1514 pcf8584_take_over(pcf8584_t *i2c, dev_info_t *dip, i2c_transfer_t *tp, 1515 kcondvar_t **waiter, int *saved_mode) 1516 { 1517 mutex_enter(&i2c->pcf8584_imutex); 1518 *saved_mode = i2c->pcf8584_mode; 1519 i2c->pcf8584_mode = PCF8584_POLL_MODE; 1520 1521 /* 1522 * We need to flush out any currently pending transaction before 1523 * issuing ours. 1524 */ 1525 if (i2c->pcf8584_busy) { 1526 if (i2c->pcf8584_cur_tran && 1527 i2c->pcf8584_cur_status == PCF8584_TRANSFER_ON) { 1528 pcf8584_do_polled_io(i2c); 1529 *waiter = &i2c->pcf8584_icv; 1530 } 1531 } 1532 1533 /* 1534 * Since pcf8584_acquire() is by default a good citizen that 1535 * will wait its turn to acquire the I2C bus, we need to set 1536 * the 'force' flag on. 1537 */ 1538 pcf8584_acquire(i2c, dip, tp, B_TRUE); 1539 } 1540 1541 /* 1542 * pcf8584_give_up() returns all resources that were taken over forcefully 1543 */ 1544 static void 1545 pcf8584_give_up(pcf8584_t *i2c, kcondvar_t *waiter, int saved_mode) 1546 { 1547 i2c->pcf8584_mode = saved_mode; 1548 1549 /* 1550 * Note that pcf8584_release only wakes up threads waiting to acquire 1551 * the I2C bus. We still need to wake up the waiter from whom we 1552 * usurped the bus. 1553 */ 1554 pcf8584_release(i2c, B_TRUE); 1555 if (waiter) 1556 cv_signal(waiter); 1557 1558 mutex_exit(&i2c->pcf8584_imutex); 1559 } 1560