Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: comedi: ni_stc.h: remove stc read/write callbacks from ni_private

The drivers that include ni_mio_common.c set the stc register read/write
callbacks to private functions that handle the read/write operations in
the correct manner for the hardware.

The ni_atmio and ni_mio_cs drivers use identical code to handle the
operations.

The ni_pcimio driver is a bit different due to the non-windowed setup
of the stc registers on the m series boards. For the other boards
supported by the ni_pcimio driver, the direct access of the first 8
STC registers is also disabled due to a difference on the 611x devices.

These differences can all be handled in the ni_stc_{read,write}[lw]()
helpers. Refactor the helpers and remove the callbacks from the private
data.

Also, move the helper functions the handle the mapping of the windowed
STC register offsets to M series register offset from ni_pcimio.c to
ni_mio_common.c.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

H Hartley Sweeten and committed by
Greg Kroah-Hartman
b30f0d0c ac63baf5

+323 -431
-44
drivers/staging/comedi/drivers/ni_atmio.c
··· 272 272 273 273 #include "ni_mio_common.c" 274 274 275 - /* How we access windowed registers */ 276 - 277 - /* We automatically take advantage of STC registers that can be 278 - * read/written directly in the I/O space of the board. The 279 - * AT-MIO devices map the low 8 STC registers to iobase+addr*2. */ 280 - 281 - static void ni_atmio_win_out(struct comedi_device *dev, uint16_t data, int addr) 282 - { 283 - struct ni_private *devpriv = dev->private; 284 - unsigned long flags; 285 - 286 - spin_lock_irqsave(&devpriv->window_lock, flags); 287 - if ((addr) < 8) { 288 - ni_writew(dev, data, addr * 2); 289 - } else { 290 - ni_writew(dev, addr, Window_Address); 291 - ni_writew(dev, data, Window_Data); 292 - } 293 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 294 - } 295 - 296 - static uint16_t ni_atmio_win_in(struct comedi_device *dev, int addr) 297 - { 298 - struct ni_private *devpriv = dev->private; 299 - unsigned long flags; 300 - uint16_t ret; 301 - 302 - spin_lock_irqsave(&devpriv->window_lock, flags); 303 - if (addr < 8) { 304 - ret = ni_readw(dev, addr * 2); 305 - } else { 306 - ni_writew(dev, addr, Window_Address); 307 - ret = ni_readw(dev, Window_Data); 308 - } 309 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 310 - 311 - return ret; 312 - } 313 - 314 275 static struct pnp_device_id device_ids[] = { 315 276 {.id = "NIC1900", .driver_data = 0}, 316 277 {.id = "NIC2400", .driver_data = 0}, ··· 356 395 if (ret) 357 396 return ret; 358 397 devpriv = dev->private; 359 - 360 - devpriv->stc_writew = ni_atmio_win_out; 361 - devpriv->stc_readw = ni_atmio_win_in; 362 - devpriv->stc_writel = win_out2; 363 - devpriv->stc_readl = win_in2; 364 398 365 399 iobase = it->options[0]; 366 400 irq = it->options[1];
+321 -23
drivers/staging/comedi/drivers/ni_mio_common.c
··· 306 306 return inb(dev->iobase + reg); 307 307 } 308 308 309 - static void ni_stc_writel(struct comedi_device *dev, uint32_t data, int reg) 310 - { 311 - struct ni_private *devpriv = dev->private; 309 + /* 310 + * We automatically take advantage of STC registers that can be 311 + * read/written directly in the I/O space of the board. 312 + * 313 + * The AT-MIO and DAQCard devices map the low 8 STC registers to 314 + * iobase+reg*2. 315 + * 316 + * Most PCIMIO devices also map the low 8 STC registers but the 317 + * 611x devices map the read registers to iobase+(addr-1)*2. 318 + * For now non-windowed STC access is disabled if a PCIMIO device 319 + * is detected (devpriv->mite has been initialized). 320 + * 321 + * The M series devices do not used windowed registers for the 322 + * STC registers. The functions below handle the mapping of the 323 + * windowed STC registers to the m series register offsets. 324 + */ 312 325 313 - devpriv->stc_writel(dev, data, reg); 326 + static void m_series_stc_writel(struct comedi_device *dev, 327 + uint32_t data, int reg) 328 + { 329 + unsigned offset; 330 + 331 + switch (reg) { 332 + case AI_SC_Load_A_Registers: 333 + offset = M_Offset_AI_SC_Load_A; 334 + break; 335 + case AI_SI_Load_A_Registers: 336 + offset = M_Offset_AI_SI_Load_A; 337 + break; 338 + case AO_BC_Load_A_Register: 339 + offset = M_Offset_AO_BC_Load_A; 340 + break; 341 + case AO_UC_Load_A_Register: 342 + offset = M_Offset_AO_UC_Load_A; 343 + break; 344 + case AO_UI_Load_A_Register: 345 + offset = M_Offset_AO_UI_Load_A; 346 + break; 347 + case G_Load_A_Register(0): 348 + offset = M_Offset_G0_Load_A; 349 + break; 350 + case G_Load_A_Register(1): 351 + offset = M_Offset_G1_Load_A; 352 + break; 353 + case G_Load_B_Register(0): 354 + offset = M_Offset_G0_Load_B; 355 + break; 356 + case G_Load_B_Register(1): 357 + offset = M_Offset_G1_Load_B; 358 + break; 359 + default: 360 + dev_warn(dev->class_dev, 361 + "%s: bug! unhandled register=0x%x in switch\n", 362 + __func__, reg); 363 + return; 364 + } 365 + ni_writel(dev, data, offset); 366 + } 367 + 368 + static void m_series_stc_writew(struct comedi_device *dev, 369 + uint16_t data, int reg) 370 + { 371 + unsigned offset; 372 + 373 + switch (reg) { 374 + case ADC_FIFO_Clear: 375 + offset = M_Offset_AI_FIFO_Clear; 376 + break; 377 + case AI_Command_1_Register: 378 + offset = M_Offset_AI_Command_1; 379 + break; 380 + case AI_Command_2_Register: 381 + offset = M_Offset_AI_Command_2; 382 + break; 383 + case AI_Mode_1_Register: 384 + offset = M_Offset_AI_Mode_1; 385 + break; 386 + case AI_Mode_2_Register: 387 + offset = M_Offset_AI_Mode_2; 388 + break; 389 + case AI_Mode_3_Register: 390 + offset = M_Offset_AI_Mode_3; 391 + break; 392 + case AI_Output_Control_Register: 393 + offset = M_Offset_AI_Output_Control; 394 + break; 395 + case AI_Personal_Register: 396 + offset = M_Offset_AI_Personal; 397 + break; 398 + case AI_SI2_Load_A_Register: 399 + /* this is a 32 bit register on m series boards */ 400 + ni_writel(dev, data, M_Offset_AI_SI2_Load_A); 401 + return; 402 + case AI_SI2_Load_B_Register: 403 + /* this is a 32 bit register on m series boards */ 404 + ni_writel(dev, data, M_Offset_AI_SI2_Load_B); 405 + return; 406 + case AI_START_STOP_Select_Register: 407 + offset = M_Offset_AI_START_STOP_Select; 408 + break; 409 + case AI_Trigger_Select_Register: 410 + offset = M_Offset_AI_Trigger_Select; 411 + break; 412 + case Analog_Trigger_Etc_Register: 413 + offset = M_Offset_Analog_Trigger_Etc; 414 + break; 415 + case AO_Command_1_Register: 416 + offset = M_Offset_AO_Command_1; 417 + break; 418 + case AO_Command_2_Register: 419 + offset = M_Offset_AO_Command_2; 420 + break; 421 + case AO_Mode_1_Register: 422 + offset = M_Offset_AO_Mode_1; 423 + break; 424 + case AO_Mode_2_Register: 425 + offset = M_Offset_AO_Mode_2; 426 + break; 427 + case AO_Mode_3_Register: 428 + offset = M_Offset_AO_Mode_3; 429 + break; 430 + case AO_Output_Control_Register: 431 + offset = M_Offset_AO_Output_Control; 432 + break; 433 + case AO_Personal_Register: 434 + offset = M_Offset_AO_Personal; 435 + break; 436 + case AO_Start_Select_Register: 437 + offset = M_Offset_AO_Start_Select; 438 + break; 439 + case AO_Trigger_Select_Register: 440 + offset = M_Offset_AO_Trigger_Select; 441 + break; 442 + case Clock_and_FOUT_Register: 443 + offset = M_Offset_Clock_and_FOUT; 444 + break; 445 + case Configuration_Memory_Clear: 446 + offset = M_Offset_Configuration_Memory_Clear; 447 + break; 448 + case DAC_FIFO_Clear: 449 + offset = M_Offset_AO_FIFO_Clear; 450 + break; 451 + case DIO_Control_Register: 452 + dev_dbg(dev->class_dev, 453 + "%s: FIXME: register 0x%x does not map cleanly on to m-series boards\n", 454 + __func__, reg); 455 + return; 456 + case G_Autoincrement_Register(0): 457 + offset = M_Offset_G0_Autoincrement; 458 + break; 459 + case G_Autoincrement_Register(1): 460 + offset = M_Offset_G1_Autoincrement; 461 + break; 462 + case G_Command_Register(0): 463 + offset = M_Offset_G0_Command; 464 + break; 465 + case G_Command_Register(1): 466 + offset = M_Offset_G1_Command; 467 + break; 468 + case G_Input_Select_Register(0): 469 + offset = M_Offset_G0_Input_Select; 470 + break; 471 + case G_Input_Select_Register(1): 472 + offset = M_Offset_G1_Input_Select; 473 + break; 474 + case G_Mode_Register(0): 475 + offset = M_Offset_G0_Mode; 476 + break; 477 + case G_Mode_Register(1): 478 + offset = M_Offset_G1_Mode; 479 + break; 480 + case Interrupt_A_Ack_Register: 481 + offset = M_Offset_Interrupt_A_Ack; 482 + break; 483 + case Interrupt_A_Enable_Register: 484 + offset = M_Offset_Interrupt_A_Enable; 485 + break; 486 + case Interrupt_B_Ack_Register: 487 + offset = M_Offset_Interrupt_B_Ack; 488 + break; 489 + case Interrupt_B_Enable_Register: 490 + offset = M_Offset_Interrupt_B_Enable; 491 + break; 492 + case Interrupt_Control_Register: 493 + offset = M_Offset_Interrupt_Control; 494 + break; 495 + case IO_Bidirection_Pin_Register: 496 + offset = M_Offset_IO_Bidirection_Pin; 497 + break; 498 + case Joint_Reset_Register: 499 + offset = M_Offset_Joint_Reset; 500 + break; 501 + case RTSI_Trig_A_Output_Register: 502 + offset = M_Offset_RTSI_Trig_A_Output; 503 + break; 504 + case RTSI_Trig_B_Output_Register: 505 + offset = M_Offset_RTSI_Trig_B_Output; 506 + break; 507 + case RTSI_Trig_Direction_Register: 508 + offset = M_Offset_RTSI_Trig_Direction; 509 + break; 510 + /* 511 + * FIXME: DIO_Output_Register (16 bit reg) is replaced by 512 + * M_Offset_Static_Digital_Output (32 bit) and 513 + * M_Offset_SCXI_Serial_Data_Out (8 bit) 514 + */ 515 + default: 516 + dev_warn(dev->class_dev, 517 + "%s: bug! unhandled register=0x%x in switch\n", 518 + __func__, reg); 519 + return; 520 + } 521 + ni_writew(dev, data, offset); 522 + } 523 + 524 + static uint32_t m_series_stc_readl(struct comedi_device *dev, int reg) 525 + { 526 + unsigned offset; 527 + 528 + switch (reg) { 529 + case G_HW_Save_Register(0): 530 + offset = M_Offset_G0_HW_Save; 531 + break; 532 + case G_HW_Save_Register(1): 533 + offset = M_Offset_G1_HW_Save; 534 + break; 535 + case G_Save_Register(0): 536 + offset = M_Offset_G0_Save; 537 + break; 538 + case G_Save_Register(1): 539 + offset = M_Offset_G1_Save; 540 + break; 541 + default: 542 + dev_warn(dev->class_dev, 543 + "%s: bug! unhandled register=0x%x in switch\n", 544 + __func__, reg); 545 + return 0; 546 + } 547 + return ni_readl(dev, offset); 548 + } 549 + 550 + static uint16_t m_series_stc_readw(struct comedi_device *dev, int reg) 551 + { 552 + unsigned offset; 553 + 554 + switch (reg) { 555 + case AI_Status_1_Register: 556 + offset = M_Offset_AI_Status_1; 557 + break; 558 + case AO_Status_1_Register: 559 + offset = M_Offset_AO_Status_1; 560 + break; 561 + case AO_Status_2_Register: 562 + offset = M_Offset_AO_Status_2; 563 + break; 564 + case DIO_Serial_Input_Register: 565 + return ni_readb(dev, M_Offset_SCXI_Serial_Data_In); 566 + case Joint_Status_1_Register: 567 + offset = M_Offset_Joint_Status_1; 568 + break; 569 + case Joint_Status_2_Register: 570 + offset = M_Offset_Joint_Status_2; 571 + break; 572 + case G_Status_Register: 573 + offset = M_Offset_G01_Status; 574 + break; 575 + default: 576 + dev_warn(dev->class_dev, 577 + "%s: bug! unhandled register=0x%x in switch\n", 578 + __func__, reg); 579 + return 0; 580 + } 581 + return ni_readw(dev, offset); 314 582 } 315 583 316 584 static void ni_stc_writew(struct comedi_device *dev, uint16_t data, int reg) 317 585 { 318 586 struct ni_private *devpriv = dev->private; 587 + unsigned long flags; 319 588 320 - devpriv->stc_writew(dev, data, reg); 589 + if (devpriv->is_m_series) { 590 + m_series_stc_writew(dev, data, reg); 591 + } else { 592 + spin_lock_irqsave(&devpriv->window_lock, flags); 593 + if (!devpriv->mite && reg < 8) { 594 + ni_writew(dev, data, reg * 2); 595 + } else { 596 + ni_writew(dev, reg, Window_Address); 597 + ni_writew(dev, data, Window_Data); 598 + } 599 + spin_unlock_irqrestore(&devpriv->window_lock, flags); 600 + } 321 601 } 322 602 323 - static uint32_t ni_stc_readl(struct comedi_device *dev, int reg) 603 + static void ni_stc_writel(struct comedi_device *dev, uint32_t data, int reg) 324 604 { 325 605 struct ni_private *devpriv = dev->private; 326 606 327 - return devpriv->stc_readl(dev, reg); 607 + if (devpriv->is_m_series) { 608 + m_series_stc_writel(dev, data, reg); 609 + } else { 610 + ni_stc_writew(dev, data >> 16, reg); 611 + ni_stc_writew(dev, data & 0xffff, reg + 1); 612 + } 328 613 } 329 614 330 615 static uint16_t ni_stc_readw(struct comedi_device *dev, int reg) 331 616 { 332 617 struct ni_private *devpriv = dev->private; 618 + unsigned long flags; 619 + uint16_t val; 333 620 334 - return devpriv->stc_readw(dev, reg); 621 + if (devpriv->is_m_series) { 622 + val = m_series_stc_readw(dev, reg); 623 + } else { 624 + spin_lock_irqsave(&devpriv->window_lock, flags); 625 + if (!devpriv->mite && reg < 8) { 626 + val = ni_readw(dev, reg * 2); 627 + } else { 628 + ni_writew(dev, reg, Window_Address); 629 + val = ni_readw(dev, Window_Data); 630 + } 631 + spin_unlock_irqrestore(&devpriv->window_lock, flags); 632 + } 633 + return val; 634 + } 635 + 636 + static uint32_t ni_stc_readl(struct comedi_device *dev, int reg) 637 + { 638 + struct ni_private *devpriv = dev->private; 639 + uint32_t val; 640 + 641 + if (devpriv->is_m_series) { 642 + val = m_series_stc_readl(dev, reg); 643 + } else { 644 + val = ni_stc_readw(dev, reg) << 16; 645 + val |= ni_stc_readw(dev, reg + 1); 646 + } 647 + return val; 335 648 } 336 649 337 650 static inline void ni_set_bitfield(struct comedi_device *dev, int reg, ··· 992 679 #endif 993 680 } 994 681 } 995 - } 996 - 997 - static void win_out2(struct comedi_device *dev, uint32_t data, int reg) 998 - { 999 - ni_stc_writew(dev, data >> 16, reg); 1000 - ni_stc_writew(dev, data & 0xffff, reg + 1); 1001 - } 1002 - 1003 - static uint32_t win_in2(struct comedi_device *dev, int reg) 1004 - { 1005 - uint32_t bits; 1006 - 1007 - bits = ni_stc_readw(dev, reg) << 16; 1008 - bits |= ni_stc_readw(dev, reg + 1); 1009 - return bits; 1010 682 } 1011 683 1012 684 #define ao_win_out(data, addr) ni_ao_win_outw(dev, data, addr)
-44
drivers/staging/comedi/drivers/ni_mio_cs.c
··· 143 143 144 144 #include "ni_mio_common.c" 145 145 146 - /* How we access windowed registers */ 147 - 148 - /* We automatically take advantage of STC registers that can be 149 - * read/written directly in the I/O space of the board. The 150 - * DAQCard devices map the low 8 STC registers to iobase+addr*2. */ 151 - 152 - static void mio_cs_win_out(struct comedi_device *dev, uint16_t data, int addr) 153 - { 154 - struct ni_private *devpriv = dev->private; 155 - unsigned long flags; 156 - 157 - spin_lock_irqsave(&devpriv->window_lock, flags); 158 - if (addr < 8) { 159 - ni_writew(dev, data, addr * 2); 160 - } else { 161 - ni_writew(dev, addr, Window_Address); 162 - ni_writew(dev, data, Window_Data); 163 - } 164 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 165 - } 166 - 167 - static uint16_t mio_cs_win_in(struct comedi_device *dev, int addr) 168 - { 169 - struct ni_private *devpriv = dev->private; 170 - unsigned long flags; 171 - uint16_t ret; 172 - 173 - spin_lock_irqsave(&devpriv->window_lock, flags); 174 - if (addr < 8) { 175 - ret = ni_readw(dev, addr * 2); 176 - } else { 177 - ni_writew(dev, addr, Window_Address); 178 - ret = ni_readw(dev, Window_Data); 179 - } 180 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 181 - 182 - return ret; 183 - } 184 - 185 146 static const void *ni_getboardtype(struct comedi_device *dev, 186 147 struct pcmcia_device *link) 187 148 { ··· 204 243 return ret; 205 244 206 245 devpriv = dev->private; 207 - 208 - devpriv->stc_writew = mio_cs_win_out; 209 - devpriv->stc_readw = mio_cs_win_in; 210 - devpriv->stc_writel = win_out2; 211 - devpriv->stc_readl = win_in2; 212 246 213 247 return ni_E_init(dev); 214 248 }
+2 -315
drivers/staging/comedi/drivers/ni_pcimio.c
··· 1049 1049 1050 1050 #include "ni_mio_common.c" 1051 1051 1052 - /* How we access STC registers */ 1053 - 1054 - /* We automatically take advantage of STC registers that can be 1055 - * read/written directly in the I/O space of the board. Most 1056 - * PCIMIO devices map the low 8 STC registers to iobase+addr*2. 1057 - * The 611x devices map the write registers to iobase+addr*2, and 1058 - * the read registers to iobase+(addr-1)*2. */ 1059 - /* However, the 611x boards still aren't working, so I'm disabling 1060 - * non-windowed STC access temporarily */ 1061 - 1062 - static void e_series_win_out(struct comedi_device *dev, uint16_t data, int reg) 1063 - { 1064 - struct ni_private *devpriv = dev->private; 1065 - unsigned long flags; 1066 - 1067 - spin_lock_irqsave(&devpriv->window_lock, flags); 1068 - ni_writew(dev, reg, Window_Address); 1069 - ni_writew(dev, data, Window_Data); 1070 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 1071 - } 1072 - 1073 - static uint16_t e_series_win_in(struct comedi_device *dev, int reg) 1074 - { 1075 - struct ni_private *devpriv = dev->private; 1076 - unsigned long flags; 1077 - uint16_t ret; 1078 - 1079 - spin_lock_irqsave(&devpriv->window_lock, flags); 1080 - ni_writew(dev, reg, Window_Address); 1081 - ret = ni_readw(dev, Window_Data); 1082 - spin_unlock_irqrestore(&devpriv->window_lock, flags); 1083 - 1084 - return ret; 1085 - } 1086 - 1087 - static void m_series_stc_writew(struct comedi_device *dev, uint16_t data, 1088 - int reg) 1089 - { 1090 - unsigned offset; 1091 - 1092 - switch (reg) { 1093 - case ADC_FIFO_Clear: 1094 - offset = M_Offset_AI_FIFO_Clear; 1095 - break; 1096 - case AI_Command_1_Register: 1097 - offset = M_Offset_AI_Command_1; 1098 - break; 1099 - case AI_Command_2_Register: 1100 - offset = M_Offset_AI_Command_2; 1101 - break; 1102 - case AI_Mode_1_Register: 1103 - offset = M_Offset_AI_Mode_1; 1104 - break; 1105 - case AI_Mode_2_Register: 1106 - offset = M_Offset_AI_Mode_2; 1107 - break; 1108 - case AI_Mode_3_Register: 1109 - offset = M_Offset_AI_Mode_3; 1110 - break; 1111 - case AI_Output_Control_Register: 1112 - offset = M_Offset_AI_Output_Control; 1113 - break; 1114 - case AI_Personal_Register: 1115 - offset = M_Offset_AI_Personal; 1116 - break; 1117 - case AI_SI2_Load_A_Register: 1118 - /* this is actually a 32 bit register on m series boards */ 1119 - ni_writel(dev, data, M_Offset_AI_SI2_Load_A); 1120 - return; 1121 - break; 1122 - case AI_SI2_Load_B_Register: 1123 - /* this is actually a 32 bit register on m series boards */ 1124 - ni_writel(dev, data, M_Offset_AI_SI2_Load_B); 1125 - return; 1126 - break; 1127 - case AI_START_STOP_Select_Register: 1128 - offset = M_Offset_AI_START_STOP_Select; 1129 - break; 1130 - case AI_Trigger_Select_Register: 1131 - offset = M_Offset_AI_Trigger_Select; 1132 - break; 1133 - case Analog_Trigger_Etc_Register: 1134 - offset = M_Offset_Analog_Trigger_Etc; 1135 - break; 1136 - case AO_Command_1_Register: 1137 - offset = M_Offset_AO_Command_1; 1138 - break; 1139 - case AO_Command_2_Register: 1140 - offset = M_Offset_AO_Command_2; 1141 - break; 1142 - case AO_Mode_1_Register: 1143 - offset = M_Offset_AO_Mode_1; 1144 - break; 1145 - case AO_Mode_2_Register: 1146 - offset = M_Offset_AO_Mode_2; 1147 - break; 1148 - case AO_Mode_3_Register: 1149 - offset = M_Offset_AO_Mode_3; 1150 - break; 1151 - case AO_Output_Control_Register: 1152 - offset = M_Offset_AO_Output_Control; 1153 - break; 1154 - case AO_Personal_Register: 1155 - offset = M_Offset_AO_Personal; 1156 - break; 1157 - case AO_Start_Select_Register: 1158 - offset = M_Offset_AO_Start_Select; 1159 - break; 1160 - case AO_Trigger_Select_Register: 1161 - offset = M_Offset_AO_Trigger_Select; 1162 - break; 1163 - case Clock_and_FOUT_Register: 1164 - offset = M_Offset_Clock_and_FOUT; 1165 - break; 1166 - case Configuration_Memory_Clear: 1167 - offset = M_Offset_Configuration_Memory_Clear; 1168 - break; 1169 - case DAC_FIFO_Clear: 1170 - offset = M_Offset_AO_FIFO_Clear; 1171 - break; 1172 - case DIO_Control_Register: 1173 - dev_dbg(dev->class_dev, 1174 - "%s: FIXME: register 0x%x does not map cleanly on to m-series boards.\n", 1175 - __func__, reg); 1176 - return; 1177 - break; 1178 - case G_Autoincrement_Register(0): 1179 - offset = M_Offset_G0_Autoincrement; 1180 - break; 1181 - case G_Autoincrement_Register(1): 1182 - offset = M_Offset_G1_Autoincrement; 1183 - break; 1184 - case G_Command_Register(0): 1185 - offset = M_Offset_G0_Command; 1186 - break; 1187 - case G_Command_Register(1): 1188 - offset = M_Offset_G1_Command; 1189 - break; 1190 - case G_Input_Select_Register(0): 1191 - offset = M_Offset_G0_Input_Select; 1192 - break; 1193 - case G_Input_Select_Register(1): 1194 - offset = M_Offset_G1_Input_Select; 1195 - break; 1196 - case G_Mode_Register(0): 1197 - offset = M_Offset_G0_Mode; 1198 - break; 1199 - case G_Mode_Register(1): 1200 - offset = M_Offset_G1_Mode; 1201 - break; 1202 - case Interrupt_A_Ack_Register: 1203 - offset = M_Offset_Interrupt_A_Ack; 1204 - break; 1205 - case Interrupt_A_Enable_Register: 1206 - offset = M_Offset_Interrupt_A_Enable; 1207 - break; 1208 - case Interrupt_B_Ack_Register: 1209 - offset = M_Offset_Interrupt_B_Ack; 1210 - break; 1211 - case Interrupt_B_Enable_Register: 1212 - offset = M_Offset_Interrupt_B_Enable; 1213 - break; 1214 - case Interrupt_Control_Register: 1215 - offset = M_Offset_Interrupt_Control; 1216 - break; 1217 - case IO_Bidirection_Pin_Register: 1218 - offset = M_Offset_IO_Bidirection_Pin; 1219 - break; 1220 - case Joint_Reset_Register: 1221 - offset = M_Offset_Joint_Reset; 1222 - break; 1223 - case RTSI_Trig_A_Output_Register: 1224 - offset = M_Offset_RTSI_Trig_A_Output; 1225 - break; 1226 - case RTSI_Trig_B_Output_Register: 1227 - offset = M_Offset_RTSI_Trig_B_Output; 1228 - break; 1229 - case RTSI_Trig_Direction_Register: 1230 - offset = M_Offset_RTSI_Trig_Direction; 1231 - break; 1232 - /* FIXME: DIO_Output_Register (16 bit reg) is replaced by M_Offset_Static_Digital_Output (32 bit) 1233 - and M_Offset_SCXI_Serial_Data_Out (8 bit) */ 1234 - default: 1235 - dev_warn(dev->class_dev, 1236 - "%s: bug! unhandled register=0x%x in switch.\n", 1237 - __func__, reg); 1238 - BUG(); 1239 - return; 1240 - break; 1241 - } 1242 - ni_writew(dev, data, offset); 1243 - } 1244 - 1245 - static uint16_t m_series_stc_readw(struct comedi_device *dev, int reg) 1246 - { 1247 - unsigned offset; 1248 - 1249 - switch (reg) { 1250 - case AI_Status_1_Register: 1251 - offset = M_Offset_AI_Status_1; 1252 - break; 1253 - case AO_Status_1_Register: 1254 - offset = M_Offset_AO_Status_1; 1255 - break; 1256 - case AO_Status_2_Register: 1257 - offset = M_Offset_AO_Status_2; 1258 - break; 1259 - case DIO_Serial_Input_Register: 1260 - return ni_readb(dev, M_Offset_SCXI_Serial_Data_In); 1261 - break; 1262 - case Joint_Status_1_Register: 1263 - offset = M_Offset_Joint_Status_1; 1264 - break; 1265 - case Joint_Status_2_Register: 1266 - offset = M_Offset_Joint_Status_2; 1267 - break; 1268 - case G_Status_Register: 1269 - offset = M_Offset_G01_Status; 1270 - break; 1271 - default: 1272 - dev_warn(dev->class_dev, 1273 - "%s: bug! unhandled register=0x%x in switch.\n", 1274 - __func__, reg); 1275 - BUG(); 1276 - return 0; 1277 - break; 1278 - } 1279 - return ni_readw(dev, offset); 1280 - } 1281 - 1282 - static void m_series_stc_writel(struct comedi_device *dev, uint32_t data, 1283 - int reg) 1284 - { 1285 - unsigned offset; 1286 - 1287 - switch (reg) { 1288 - case AI_SC_Load_A_Registers: 1289 - offset = M_Offset_AI_SC_Load_A; 1290 - break; 1291 - case AI_SI_Load_A_Registers: 1292 - offset = M_Offset_AI_SI_Load_A; 1293 - break; 1294 - case AO_BC_Load_A_Register: 1295 - offset = M_Offset_AO_BC_Load_A; 1296 - break; 1297 - case AO_UC_Load_A_Register: 1298 - offset = M_Offset_AO_UC_Load_A; 1299 - break; 1300 - case AO_UI_Load_A_Register: 1301 - offset = M_Offset_AO_UI_Load_A; 1302 - break; 1303 - case G_Load_A_Register(0): 1304 - offset = M_Offset_G0_Load_A; 1305 - break; 1306 - case G_Load_A_Register(1): 1307 - offset = M_Offset_G1_Load_A; 1308 - break; 1309 - case G_Load_B_Register(0): 1310 - offset = M_Offset_G0_Load_B; 1311 - break; 1312 - case G_Load_B_Register(1): 1313 - offset = M_Offset_G1_Load_B; 1314 - break; 1315 - default: 1316 - dev_warn(dev->class_dev, 1317 - "%s: bug! unhandled register=0x%x in switch.\n", 1318 - __func__, reg); 1319 - BUG(); 1320 - return; 1321 - break; 1322 - } 1323 - ni_writel(dev, data, offset); 1324 - } 1325 - 1326 - static uint32_t m_series_stc_readl(struct comedi_device *dev, int reg) 1327 - { 1328 - unsigned offset; 1329 - 1330 - switch (reg) { 1331 - case G_HW_Save_Register(0): 1332 - offset = M_Offset_G0_HW_Save; 1333 - break; 1334 - case G_HW_Save_Register(1): 1335 - offset = M_Offset_G1_HW_Save; 1336 - break; 1337 - case G_Save_Register(0): 1338 - offset = M_Offset_G0_Save; 1339 - break; 1340 - case G_Save_Register(1): 1341 - offset = M_Offset_G1_Save; 1342 - break; 1343 - default: 1344 - dev_warn(dev->class_dev, 1345 - "%s: bug! unhandled register=0x%x in switch.\n", 1346 - __func__, reg); 1347 - BUG(); 1348 - return 0; 1349 - break; 1350 - } 1351 - return ni_readl(dev, offset); 1352 - } 1353 - 1354 1052 static int pcimio_ai_change(struct comedi_device *dev, 1355 1053 struct comedi_subdevice *s, unsigned long new_size); 1356 1054 static int pcimio_ao_change(struct comedi_device *dev, ··· 1107 1409 struct ni_private *devpriv = dev->private; 1108 1410 1109 1411 /* Disable interrupts */ 1110 - devpriv->stc_writew(dev, 0, Interrupt_Control_Register); 1412 + ni_stc_writew(dev, 0, Interrupt_Control_Register); 1111 1413 1112 1414 /* Initialise 6143 AI specific bits */ 1113 1415 ··· 1179 1481 if (!devpriv->mite) 1180 1482 return -ENOMEM; 1181 1483 1182 - if (board->reg_type & ni_reg_m_series_mask) { 1484 + if (board->reg_type & ni_reg_m_series_mask) 1183 1485 devpriv->is_m_series = 1; 1184 - 1185 - devpriv->stc_writew = m_series_stc_writew; 1186 - devpriv->stc_readw = m_series_stc_readw; 1187 - devpriv->stc_writel = m_series_stc_writel; 1188 - devpriv->stc_readl = m_series_stc_readl; 1189 - } else { 1190 - devpriv->stc_writew = e_series_win_out; 1191 - devpriv->stc_readw = e_series_win_in; 1192 - devpriv->stc_writel = win_out2; 1193 - devpriv->stc_readl = win_in2; 1194 - } 1195 1486 1196 1487 ret = mite_setup(devpriv->mite); 1197 1488 if (ret < 0) {
-5
drivers/staging/comedi/drivers/ni_stc.h
··· 1421 1421 #define NUM_GPCT 2 1422 1422 1423 1423 struct ni_private { 1424 - uint16_t (*stc_readw)(struct comedi_device *, int reg); 1425 - uint32_t (*stc_readl)(struct comedi_device *, int reg); 1426 - void (*stc_writew)(struct comedi_device *, uint16_t value, int reg); 1427 - void (*stc_writel)(struct comedi_device *, uint32_t value, int reg); 1428 - 1429 1424 unsigned short dio_output; 1430 1425 unsigned short dio_control; 1431 1426 int aimode;