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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.14-rc3 1063 lines 25 kB view raw
1/* 2 * MCP23S08 SPI/I2C GPIO gpio expander driver 3 * 4 * The inputs and outputs of the mcp23s08, mcp23s17, mcp23008 and mcp23017 are 5 * supported. 6 * For the I2C versions of the chips (mcp23008 and mcp23017) generation of 7 * interrupts is also supported. 8 * The hardware of the SPI versions of the chips (mcp23s08 and mcp23s17) is 9 * also capable of generating interrupts, but the linux driver does not 10 * support that yet. 11 */ 12 13#include <linux/kernel.h> 14#include <linux/device.h> 15#include <linux/mutex.h> 16#include <linux/module.h> 17#include <linux/gpio.h> 18#include <linux/i2c.h> 19#include <linux/spi/spi.h> 20#include <linux/spi/mcp23s08.h> 21#include <linux/slab.h> 22#include <asm/byteorder.h> 23#include <linux/interrupt.h> 24#include <linux/of_irq.h> 25#include <linux/of_device.h> 26 27/** 28 * MCP types supported by driver 29 */ 30#define MCP_TYPE_S08 0 31#define MCP_TYPE_S17 1 32#define MCP_TYPE_008 2 33#define MCP_TYPE_017 3 34 35/* Registers are all 8 bits wide. 36 * 37 * The mcp23s17 has twice as many bits, and can be configured to work 38 * with either 16 bit registers or with two adjacent 8 bit banks. 39 */ 40#define MCP_IODIR 0x00 /* init/reset: all ones */ 41#define MCP_IPOL 0x01 42#define MCP_GPINTEN 0x02 43#define MCP_DEFVAL 0x03 44#define MCP_INTCON 0x04 45#define MCP_IOCON 0x05 46# define IOCON_MIRROR (1 << 6) 47# define IOCON_SEQOP (1 << 5) 48# define IOCON_HAEN (1 << 3) 49# define IOCON_ODR (1 << 2) 50# define IOCON_INTPOL (1 << 1) 51#define MCP_GPPU 0x06 52#define MCP_INTF 0x07 53#define MCP_INTCAP 0x08 54#define MCP_GPIO 0x09 55#define MCP_OLAT 0x0a 56 57struct mcp23s08; 58 59struct mcp23s08_ops { 60 int (*read)(struct mcp23s08 *mcp, unsigned reg); 61 int (*write)(struct mcp23s08 *mcp, unsigned reg, unsigned val); 62 int (*read_regs)(struct mcp23s08 *mcp, unsigned reg, 63 u16 *vals, unsigned n); 64}; 65 66struct mcp23s08 { 67 u8 addr; 68 69 u16 cache[11]; 70 u16 irq_rise; 71 u16 irq_fall; 72 int irq; 73 bool irq_controller; 74 /* lock protects the cached values */ 75 struct mutex lock; 76 struct mutex irq_lock; 77 struct irq_domain *irq_domain; 78 79 struct gpio_chip chip; 80 81 const struct mcp23s08_ops *ops; 82 void *data; /* ops specific data */ 83}; 84 85/* A given spi_device can represent up to eight mcp23sxx chips 86 * sharing the same chipselect but using different addresses 87 * (e.g. chips #0 and #3 might be populated, but not #1 or $2). 88 * Driver data holds all the per-chip data. 89 */ 90struct mcp23s08_driver_data { 91 unsigned ngpio; 92 struct mcp23s08 *mcp[8]; 93 struct mcp23s08 chip[]; 94}; 95 96/* This lock class tells lockdep that GPIO irqs are in a different 97 * category than their parents, so it won't report false recursion. 98 */ 99static struct lock_class_key gpio_lock_class; 100 101/*----------------------------------------------------------------------*/ 102 103#if IS_ENABLED(CONFIG_I2C) 104 105static int mcp23008_read(struct mcp23s08 *mcp, unsigned reg) 106{ 107 return i2c_smbus_read_byte_data(mcp->data, reg); 108} 109 110static int mcp23008_write(struct mcp23s08 *mcp, unsigned reg, unsigned val) 111{ 112 return i2c_smbus_write_byte_data(mcp->data, reg, val); 113} 114 115static int 116mcp23008_read_regs(struct mcp23s08 *mcp, unsigned reg, u16 *vals, unsigned n) 117{ 118 while (n--) { 119 int ret = mcp23008_read(mcp, reg++); 120 if (ret < 0) 121 return ret; 122 *vals++ = ret; 123 } 124 125 return 0; 126} 127 128static int mcp23017_read(struct mcp23s08 *mcp, unsigned reg) 129{ 130 return i2c_smbus_read_word_data(mcp->data, reg << 1); 131} 132 133static int mcp23017_write(struct mcp23s08 *mcp, unsigned reg, unsigned val) 134{ 135 return i2c_smbus_write_word_data(mcp->data, reg << 1, val); 136} 137 138static int 139mcp23017_read_regs(struct mcp23s08 *mcp, unsigned reg, u16 *vals, unsigned n) 140{ 141 while (n--) { 142 int ret = mcp23017_read(mcp, reg++); 143 if (ret < 0) 144 return ret; 145 *vals++ = ret; 146 } 147 148 return 0; 149} 150 151static const struct mcp23s08_ops mcp23008_ops = { 152 .read = mcp23008_read, 153 .write = mcp23008_write, 154 .read_regs = mcp23008_read_regs, 155}; 156 157static const struct mcp23s08_ops mcp23017_ops = { 158 .read = mcp23017_read, 159 .write = mcp23017_write, 160 .read_regs = mcp23017_read_regs, 161}; 162 163#endif /* CONFIG_I2C */ 164 165/*----------------------------------------------------------------------*/ 166 167#ifdef CONFIG_SPI_MASTER 168 169static int mcp23s08_read(struct mcp23s08 *mcp, unsigned reg) 170{ 171 u8 tx[2], rx[1]; 172 int status; 173 174 tx[0] = mcp->addr | 0x01; 175 tx[1] = reg; 176 status = spi_write_then_read(mcp->data, tx, sizeof tx, rx, sizeof rx); 177 return (status < 0) ? status : rx[0]; 178} 179 180static int mcp23s08_write(struct mcp23s08 *mcp, unsigned reg, unsigned val) 181{ 182 u8 tx[3]; 183 184 tx[0] = mcp->addr; 185 tx[1] = reg; 186 tx[2] = val; 187 return spi_write_then_read(mcp->data, tx, sizeof tx, NULL, 0); 188} 189 190static int 191mcp23s08_read_regs(struct mcp23s08 *mcp, unsigned reg, u16 *vals, unsigned n) 192{ 193 u8 tx[2], *tmp; 194 int status; 195 196 if ((n + reg) > sizeof mcp->cache) 197 return -EINVAL; 198 tx[0] = mcp->addr | 0x01; 199 tx[1] = reg; 200 201 tmp = (u8 *)vals; 202 status = spi_write_then_read(mcp->data, tx, sizeof tx, tmp, n); 203 if (status >= 0) { 204 while (n--) 205 vals[n] = tmp[n]; /* expand to 16bit */ 206 } 207 return status; 208} 209 210static int mcp23s17_read(struct mcp23s08 *mcp, unsigned reg) 211{ 212 u8 tx[2], rx[2]; 213 int status; 214 215 tx[0] = mcp->addr | 0x01; 216 tx[1] = reg << 1; 217 status = spi_write_then_read(mcp->data, tx, sizeof tx, rx, sizeof rx); 218 return (status < 0) ? status : (rx[0] | (rx[1] << 8)); 219} 220 221static int mcp23s17_write(struct mcp23s08 *mcp, unsigned reg, unsigned val) 222{ 223 u8 tx[4]; 224 225 tx[0] = mcp->addr; 226 tx[1] = reg << 1; 227 tx[2] = val; 228 tx[3] = val >> 8; 229 return spi_write_then_read(mcp->data, tx, sizeof tx, NULL, 0); 230} 231 232static int 233mcp23s17_read_regs(struct mcp23s08 *mcp, unsigned reg, u16 *vals, unsigned n) 234{ 235 u8 tx[2]; 236 int status; 237 238 if ((n + reg) > sizeof mcp->cache) 239 return -EINVAL; 240 tx[0] = mcp->addr | 0x01; 241 tx[1] = reg << 1; 242 243 status = spi_write_then_read(mcp->data, tx, sizeof tx, 244 (u8 *)vals, n * 2); 245 if (status >= 0) { 246 while (n--) 247 vals[n] = __le16_to_cpu((__le16)vals[n]); 248 } 249 250 return status; 251} 252 253static const struct mcp23s08_ops mcp23s08_ops = { 254 .read = mcp23s08_read, 255 .write = mcp23s08_write, 256 .read_regs = mcp23s08_read_regs, 257}; 258 259static const struct mcp23s08_ops mcp23s17_ops = { 260 .read = mcp23s17_read, 261 .write = mcp23s17_write, 262 .read_regs = mcp23s17_read_regs, 263}; 264 265#endif /* CONFIG_SPI_MASTER */ 266 267/*----------------------------------------------------------------------*/ 268 269static int mcp23s08_direction_input(struct gpio_chip *chip, unsigned offset) 270{ 271 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 272 int status; 273 274 mutex_lock(&mcp->lock); 275 mcp->cache[MCP_IODIR] |= (1 << offset); 276 status = mcp->ops->write(mcp, MCP_IODIR, mcp->cache[MCP_IODIR]); 277 mutex_unlock(&mcp->lock); 278 return status; 279} 280 281static int mcp23s08_get(struct gpio_chip *chip, unsigned offset) 282{ 283 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 284 int status; 285 286 mutex_lock(&mcp->lock); 287 288 /* REVISIT reading this clears any IRQ ... */ 289 status = mcp->ops->read(mcp, MCP_GPIO); 290 if (status < 0) 291 status = 0; 292 else { 293 mcp->cache[MCP_GPIO] = status; 294 status = !!(status & (1 << offset)); 295 } 296 mutex_unlock(&mcp->lock); 297 return status; 298} 299 300static int __mcp23s08_set(struct mcp23s08 *mcp, unsigned mask, int value) 301{ 302 unsigned olat = mcp->cache[MCP_OLAT]; 303 304 if (value) 305 olat |= mask; 306 else 307 olat &= ~mask; 308 mcp->cache[MCP_OLAT] = olat; 309 return mcp->ops->write(mcp, MCP_OLAT, olat); 310} 311 312static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value) 313{ 314 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 315 unsigned mask = 1 << offset; 316 317 mutex_lock(&mcp->lock); 318 __mcp23s08_set(mcp, mask, value); 319 mutex_unlock(&mcp->lock); 320} 321 322static int 323mcp23s08_direction_output(struct gpio_chip *chip, unsigned offset, int value) 324{ 325 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 326 unsigned mask = 1 << offset; 327 int status; 328 329 mutex_lock(&mcp->lock); 330 status = __mcp23s08_set(mcp, mask, value); 331 if (status == 0) { 332 mcp->cache[MCP_IODIR] &= ~mask; 333 status = mcp->ops->write(mcp, MCP_IODIR, mcp->cache[MCP_IODIR]); 334 } 335 mutex_unlock(&mcp->lock); 336 return status; 337} 338 339/*----------------------------------------------------------------------*/ 340static irqreturn_t mcp23s08_irq(int irq, void *data) 341{ 342 struct mcp23s08 *mcp = data; 343 int intcap, intf, i; 344 unsigned int child_irq; 345 346 mutex_lock(&mcp->lock); 347 intf = mcp->ops->read(mcp, MCP_INTF); 348 if (intf < 0) { 349 mutex_unlock(&mcp->lock); 350 return IRQ_HANDLED; 351 } 352 353 mcp->cache[MCP_INTF] = intf; 354 355 intcap = mcp->ops->read(mcp, MCP_INTCAP); 356 if (intcap < 0) { 357 mutex_unlock(&mcp->lock); 358 return IRQ_HANDLED; 359 } 360 361 mcp->cache[MCP_INTCAP] = intcap; 362 mutex_unlock(&mcp->lock); 363 364 365 for (i = 0; i < mcp->chip.ngpio; i++) { 366 if ((BIT(i) & mcp->cache[MCP_INTF]) && 367 ((BIT(i) & intcap & mcp->irq_rise) || 368 (mcp->irq_fall & ~intcap & BIT(i)))) { 369 child_irq = irq_find_mapping(mcp->irq_domain, i); 370 handle_nested_irq(child_irq); 371 } 372 } 373 374 return IRQ_HANDLED; 375} 376 377static int mcp23s08_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 378{ 379 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 380 381 return irq_find_mapping(mcp->irq_domain, offset); 382} 383 384static void mcp23s08_irq_mask(struct irq_data *data) 385{ 386 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 387 unsigned int pos = data->hwirq; 388 389 mcp->cache[MCP_GPINTEN] &= ~BIT(pos); 390} 391 392static void mcp23s08_irq_unmask(struct irq_data *data) 393{ 394 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 395 unsigned int pos = data->hwirq; 396 397 mcp->cache[MCP_GPINTEN] |= BIT(pos); 398} 399 400static int mcp23s08_irq_set_type(struct irq_data *data, unsigned int type) 401{ 402 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 403 unsigned int pos = data->hwirq; 404 int status = 0; 405 406 if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) { 407 mcp->cache[MCP_INTCON] &= ~BIT(pos); 408 mcp->irq_rise |= BIT(pos); 409 mcp->irq_fall |= BIT(pos); 410 } else if (type & IRQ_TYPE_EDGE_RISING) { 411 mcp->cache[MCP_INTCON] &= ~BIT(pos); 412 mcp->irq_rise |= BIT(pos); 413 mcp->irq_fall &= ~BIT(pos); 414 } else if (type & IRQ_TYPE_EDGE_FALLING) { 415 mcp->cache[MCP_INTCON] &= ~BIT(pos); 416 mcp->irq_rise &= ~BIT(pos); 417 mcp->irq_fall |= BIT(pos); 418 } else 419 return -EINVAL; 420 421 return status; 422} 423 424static void mcp23s08_irq_bus_lock(struct irq_data *data) 425{ 426 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 427 428 mutex_lock(&mcp->irq_lock); 429} 430 431static void mcp23s08_irq_bus_unlock(struct irq_data *data) 432{ 433 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 434 435 mutex_lock(&mcp->lock); 436 mcp->ops->write(mcp, MCP_GPINTEN, mcp->cache[MCP_GPINTEN]); 437 mcp->ops->write(mcp, MCP_DEFVAL, mcp->cache[MCP_DEFVAL]); 438 mcp->ops->write(mcp, MCP_INTCON, mcp->cache[MCP_INTCON]); 439 mutex_unlock(&mcp->lock); 440 mutex_unlock(&mcp->irq_lock); 441} 442 443static unsigned int mcp23s08_irq_startup(struct irq_data *data) 444{ 445 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 446 447 if (gpio_lock_as_irq(&mcp->chip, data->hwirq)) 448 dev_err(mcp->chip.dev, 449 "unable to lock HW IRQ %lu for IRQ usage\n", 450 data->hwirq); 451 452 mcp23s08_irq_unmask(data); 453 return 0; 454} 455 456static void mcp23s08_irq_shutdown(struct irq_data *data) 457{ 458 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 459 460 mcp23s08_irq_mask(data); 461 gpio_unlock_as_irq(&mcp->chip, data->hwirq); 462} 463 464static struct irq_chip mcp23s08_irq_chip = { 465 .name = "gpio-mcp23xxx", 466 .irq_mask = mcp23s08_irq_mask, 467 .irq_unmask = mcp23s08_irq_unmask, 468 .irq_set_type = mcp23s08_irq_set_type, 469 .irq_bus_lock = mcp23s08_irq_bus_lock, 470 .irq_bus_sync_unlock = mcp23s08_irq_bus_unlock, 471 .irq_startup = mcp23s08_irq_startup, 472 .irq_shutdown = mcp23s08_irq_shutdown, 473}; 474 475static int mcp23s08_irq_setup(struct mcp23s08 *mcp) 476{ 477 struct gpio_chip *chip = &mcp->chip; 478 int err, irq, j; 479 480 mutex_init(&mcp->irq_lock); 481 482 mcp->irq_domain = irq_domain_add_linear(chip->of_node, chip->ngpio, 483 &irq_domain_simple_ops, mcp); 484 if (!mcp->irq_domain) 485 return -ENODEV; 486 487 err = devm_request_threaded_irq(chip->dev, mcp->irq, NULL, mcp23s08_irq, 488 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 489 dev_name(chip->dev), mcp); 490 if (err != 0) { 491 dev_err(chip->dev, "unable to request IRQ#%d: %d\n", 492 mcp->irq, err); 493 return err; 494 } 495 496 chip->to_irq = mcp23s08_gpio_to_irq; 497 498 for (j = 0; j < mcp->chip.ngpio; j++) { 499 irq = irq_create_mapping(mcp->irq_domain, j); 500 irq_set_lockdep_class(irq, &gpio_lock_class); 501 irq_set_chip_data(irq, mcp); 502 irq_set_chip(irq, &mcp23s08_irq_chip); 503 irq_set_nested_thread(irq, true); 504#ifdef CONFIG_ARM 505 set_irq_flags(irq, IRQF_VALID); 506#else 507 irq_set_noprobe(irq); 508#endif 509 } 510 return 0; 511} 512 513static void mcp23s08_irq_teardown(struct mcp23s08 *mcp) 514{ 515 unsigned int irq, i; 516 517 free_irq(mcp->irq, mcp); 518 519 for (i = 0; i < mcp->chip.ngpio; i++) { 520 irq = irq_find_mapping(mcp->irq_domain, i); 521 if (irq > 0) 522 irq_dispose_mapping(irq); 523 } 524 525 irq_domain_remove(mcp->irq_domain); 526} 527 528/*----------------------------------------------------------------------*/ 529 530#ifdef CONFIG_DEBUG_FS 531 532#include <linux/seq_file.h> 533 534/* 535 * This shows more info than the generic gpio dump code: 536 * pullups, deglitching, open drain drive. 537 */ 538static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip) 539{ 540 struct mcp23s08 *mcp; 541 char bank; 542 int t; 543 unsigned mask; 544 545 mcp = container_of(chip, struct mcp23s08, chip); 546 547 /* NOTE: we only handle one bank for now ... */ 548 bank = '0' + ((mcp->addr >> 1) & 0x7); 549 550 mutex_lock(&mcp->lock); 551 t = mcp->ops->read_regs(mcp, 0, mcp->cache, ARRAY_SIZE(mcp->cache)); 552 if (t < 0) { 553 seq_printf(s, " I/O ERROR %d\n", t); 554 goto done; 555 } 556 557 for (t = 0, mask = 1; t < chip->ngpio; t++, mask <<= 1) { 558 const char *label; 559 560 label = gpiochip_is_requested(chip, t); 561 if (!label) 562 continue; 563 564 seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s", 565 chip->base + t, bank, t, label, 566 (mcp->cache[MCP_IODIR] & mask) ? "in " : "out", 567 (mcp->cache[MCP_GPIO] & mask) ? "hi" : "lo", 568 (mcp->cache[MCP_GPPU] & mask) ? "up" : " "); 569 /* NOTE: ignoring the irq-related registers */ 570 seq_printf(s, "\n"); 571 } 572done: 573 mutex_unlock(&mcp->lock); 574} 575 576#else 577#define mcp23s08_dbg_show NULL 578#endif 579 580/*----------------------------------------------------------------------*/ 581 582static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, 583 void *data, unsigned addr, unsigned type, 584 unsigned base, unsigned pullups) 585{ 586 int status; 587 bool mirror = false; 588 589 mutex_init(&mcp->lock); 590 591 mcp->data = data; 592 mcp->addr = addr; 593 594 mcp->chip.direction_input = mcp23s08_direction_input; 595 mcp->chip.get = mcp23s08_get; 596 mcp->chip.direction_output = mcp23s08_direction_output; 597 mcp->chip.set = mcp23s08_set; 598 mcp->chip.dbg_show = mcp23s08_dbg_show; 599#ifdef CONFIG_OF 600 mcp->chip.of_gpio_n_cells = 2; 601 mcp->chip.of_node = dev->of_node; 602#endif 603 604 switch (type) { 605#ifdef CONFIG_SPI_MASTER 606 case MCP_TYPE_S08: 607 mcp->ops = &mcp23s08_ops; 608 mcp->chip.ngpio = 8; 609 mcp->chip.label = "mcp23s08"; 610 break; 611 612 case MCP_TYPE_S17: 613 mcp->ops = &mcp23s17_ops; 614 mcp->chip.ngpio = 16; 615 mcp->chip.label = "mcp23s17"; 616 break; 617#endif /* CONFIG_SPI_MASTER */ 618 619#if IS_ENABLED(CONFIG_I2C) 620 case MCP_TYPE_008: 621 mcp->ops = &mcp23008_ops; 622 mcp->chip.ngpio = 8; 623 mcp->chip.label = "mcp23008"; 624 break; 625 626 case MCP_TYPE_017: 627 mcp->ops = &mcp23017_ops; 628 mcp->chip.ngpio = 16; 629 mcp->chip.label = "mcp23017"; 630 break; 631#endif /* CONFIG_I2C */ 632 633 default: 634 dev_err(dev, "invalid device type (%d)\n", type); 635 return -EINVAL; 636 } 637 638 mcp->chip.base = base; 639 mcp->chip.can_sleep = true; 640 mcp->chip.dev = dev; 641 mcp->chip.owner = THIS_MODULE; 642 643 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work, 644 * and MCP_IOCON.HAEN = 1, so we work with all chips. 645 */ 646 647 status = mcp->ops->read(mcp, MCP_IOCON); 648 if (status < 0) 649 goto fail; 650 651 mcp->irq_controller = of_property_read_bool(mcp->chip.of_node, 652 "interrupt-controller"); 653 if (mcp->irq && mcp->irq_controller && (type == MCP_TYPE_017)) 654 mirror = of_property_read_bool(mcp->chip.of_node, 655 "microchip,irq-mirror"); 656 657 if ((status & IOCON_SEQOP) || !(status & IOCON_HAEN) || mirror) { 658 /* mcp23s17 has IOCON twice, make sure they are in sync */ 659 status &= ~(IOCON_SEQOP | (IOCON_SEQOP << 8)); 660 status |= IOCON_HAEN | (IOCON_HAEN << 8); 661 status &= ~(IOCON_INTPOL | (IOCON_INTPOL << 8)); 662 if (mirror) 663 status |= IOCON_MIRROR | (IOCON_MIRROR << 8); 664 665 status = mcp->ops->write(mcp, MCP_IOCON, status); 666 if (status < 0) 667 goto fail; 668 } 669 670 /* configure ~100K pullups */ 671 status = mcp->ops->write(mcp, MCP_GPPU, pullups); 672 if (status < 0) 673 goto fail; 674 675 status = mcp->ops->read_regs(mcp, 0, mcp->cache, ARRAY_SIZE(mcp->cache)); 676 if (status < 0) 677 goto fail; 678 679 /* disable inverter on input */ 680 if (mcp->cache[MCP_IPOL] != 0) { 681 mcp->cache[MCP_IPOL] = 0; 682 status = mcp->ops->write(mcp, MCP_IPOL, 0); 683 if (status < 0) 684 goto fail; 685 } 686 687 /* disable irqs */ 688 if (mcp->cache[MCP_GPINTEN] != 0) { 689 mcp->cache[MCP_GPINTEN] = 0; 690 status = mcp->ops->write(mcp, MCP_GPINTEN, 0); 691 if (status < 0) 692 goto fail; 693 } 694 695 status = gpiochip_add(&mcp->chip); 696 if (status < 0) 697 goto fail; 698 699 if (mcp->irq && mcp->irq_controller) { 700 status = mcp23s08_irq_setup(mcp); 701 if (status) { 702 mcp23s08_irq_teardown(mcp); 703 goto fail; 704 } 705 } 706fail: 707 if (status < 0) 708 dev_dbg(dev, "can't setup chip %d, --> %d\n", 709 addr, status); 710 return status; 711} 712 713/*----------------------------------------------------------------------*/ 714 715#ifdef CONFIG_OF 716#ifdef CONFIG_SPI_MASTER 717static struct of_device_id mcp23s08_spi_of_match[] = { 718 { 719 .compatible = "microchip,mcp23s08", 720 .data = (void *) MCP_TYPE_S08, 721 }, 722 { 723 .compatible = "microchip,mcp23s17", 724 .data = (void *) MCP_TYPE_S17, 725 }, 726/* NOTE: The use of the mcp prefix is deprecated and will be removed. */ 727 { 728 .compatible = "mcp,mcp23s08", 729 .data = (void *) MCP_TYPE_S08, 730 }, 731 { 732 .compatible = "mcp,mcp23s17", 733 .data = (void *) MCP_TYPE_S17, 734 }, 735 { }, 736}; 737MODULE_DEVICE_TABLE(of, mcp23s08_spi_of_match); 738#endif 739 740#if IS_ENABLED(CONFIG_I2C) 741static struct of_device_id mcp23s08_i2c_of_match[] = { 742 { 743 .compatible = "microchip,mcp23008", 744 .data = (void *) MCP_TYPE_008, 745 }, 746 { 747 .compatible = "microchip,mcp23017", 748 .data = (void *) MCP_TYPE_017, 749 }, 750/* NOTE: The use of the mcp prefix is deprecated and will be removed. */ 751 { 752 .compatible = "mcp,mcp23008", 753 .data = (void *) MCP_TYPE_008, 754 }, 755 { 756 .compatible = "mcp,mcp23017", 757 .data = (void *) MCP_TYPE_017, 758 }, 759 { }, 760}; 761MODULE_DEVICE_TABLE(of, mcp23s08_i2c_of_match); 762#endif 763#endif /* CONFIG_OF */ 764 765 766#if IS_ENABLED(CONFIG_I2C) 767 768static int mcp230xx_probe(struct i2c_client *client, 769 const struct i2c_device_id *id) 770{ 771 struct mcp23s08_platform_data *pdata; 772 struct mcp23s08 *mcp; 773 int status, base, pullups; 774 const struct of_device_id *match; 775 776 match = of_match_device(of_match_ptr(mcp23s08_i2c_of_match), 777 &client->dev); 778 pdata = dev_get_platdata(&client->dev); 779 if (match || !pdata) { 780 base = -1; 781 pullups = 0; 782 client->irq = irq_of_parse_and_map(client->dev.of_node, 0); 783 } else { 784 if (!gpio_is_valid(pdata->base)) { 785 dev_dbg(&client->dev, "invalid platform data\n"); 786 return -EINVAL; 787 } 788 base = pdata->base; 789 pullups = pdata->chip[0].pullups; 790 } 791 792 mcp = kzalloc(sizeof *mcp, GFP_KERNEL); 793 if (!mcp) 794 return -ENOMEM; 795 796 mcp->irq = client->irq; 797 status = mcp23s08_probe_one(mcp, &client->dev, client, client->addr, 798 id->driver_data, base, pullups); 799 if (status) 800 goto fail; 801 802 i2c_set_clientdata(client, mcp); 803 804 return 0; 805 806fail: 807 kfree(mcp); 808 809 return status; 810} 811 812static int mcp230xx_remove(struct i2c_client *client) 813{ 814 struct mcp23s08 *mcp = i2c_get_clientdata(client); 815 int status; 816 817 if (client->irq && mcp->irq_controller) 818 mcp23s08_irq_teardown(mcp); 819 820 status = gpiochip_remove(&mcp->chip); 821 if (status == 0) 822 kfree(mcp); 823 824 return status; 825} 826 827static const struct i2c_device_id mcp230xx_id[] = { 828 { "mcp23008", MCP_TYPE_008 }, 829 { "mcp23017", MCP_TYPE_017 }, 830 { }, 831}; 832MODULE_DEVICE_TABLE(i2c, mcp230xx_id); 833 834static struct i2c_driver mcp230xx_driver = { 835 .driver = { 836 .name = "mcp230xx", 837 .owner = THIS_MODULE, 838 .of_match_table = of_match_ptr(mcp23s08_i2c_of_match), 839 }, 840 .probe = mcp230xx_probe, 841 .remove = mcp230xx_remove, 842 .id_table = mcp230xx_id, 843}; 844 845static int __init mcp23s08_i2c_init(void) 846{ 847 return i2c_add_driver(&mcp230xx_driver); 848} 849 850static void mcp23s08_i2c_exit(void) 851{ 852 i2c_del_driver(&mcp230xx_driver); 853} 854 855#else 856 857static int __init mcp23s08_i2c_init(void) { return 0; } 858static void mcp23s08_i2c_exit(void) { } 859 860#endif /* CONFIG_I2C */ 861 862/*----------------------------------------------------------------------*/ 863 864#ifdef CONFIG_SPI_MASTER 865 866static int mcp23s08_probe(struct spi_device *spi) 867{ 868 struct mcp23s08_platform_data *pdata; 869 unsigned addr; 870 unsigned chips = 0; 871 struct mcp23s08_driver_data *data; 872 int status, type; 873 unsigned base = -1, 874 ngpio = 0, 875 pullups[ARRAY_SIZE(pdata->chip)]; 876 const struct of_device_id *match; 877 u32 spi_present_mask = 0; 878 879 match = of_match_device(of_match_ptr(mcp23s08_spi_of_match), &spi->dev); 880 if (match) { 881 type = (int)(uintptr_t)match->data; 882 status = of_property_read_u32(spi->dev.of_node, 883 "microchip,spi-present-mask", &spi_present_mask); 884 if (status) { 885 status = of_property_read_u32(spi->dev.of_node, 886 "mcp,spi-present-mask", &spi_present_mask); 887 if (status) { 888 dev_err(&spi->dev, 889 "DT has no spi-present-mask\n"); 890 return -ENODEV; 891 } 892 } 893 if ((spi_present_mask <= 0) || (spi_present_mask >= 256)) { 894 dev_err(&spi->dev, "invalid spi-present-mask\n"); 895 return -ENODEV; 896 } 897 898 for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) 899 pullups[addr] = 0; 900 } else { 901 type = spi_get_device_id(spi)->driver_data; 902 pdata = dev_get_platdata(&spi->dev); 903 if (!pdata || !gpio_is_valid(pdata->base)) { 904 dev_dbg(&spi->dev, 905 "invalid or missing platform data\n"); 906 return -EINVAL; 907 } 908 909 for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { 910 if (!pdata->chip[addr].is_present) 911 continue; 912 chips++; 913 if ((type == MCP_TYPE_S08) && (addr > 3)) { 914 dev_err(&spi->dev, 915 "mcp23s08 only supports address 0..3\n"); 916 return -EINVAL; 917 } 918 spi_present_mask |= 1 << addr; 919 pullups[addr] = pdata->chip[addr].pullups; 920 } 921 922 if (!chips) 923 return -ENODEV; 924 925 base = pdata->base; 926 } 927 928 data = kzalloc(sizeof *data + chips * sizeof(struct mcp23s08), 929 GFP_KERNEL); 930 if (!data) 931 return -ENOMEM; 932 spi_set_drvdata(spi, data); 933 934 for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { 935 if (!(spi_present_mask & (1 << addr))) 936 continue; 937 chips--; 938 data->mcp[addr] = &data->chip[chips]; 939 status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi, 940 0x40 | (addr << 1), type, base, 941 pullups[addr]); 942 if (status < 0) 943 goto fail; 944 945 if (base != -1) 946 base += (type == MCP_TYPE_S17) ? 16 : 8; 947 ngpio += (type == MCP_TYPE_S17) ? 16 : 8; 948 } 949 data->ngpio = ngpio; 950 951 /* NOTE: these chips have a relatively sane IRQ framework, with 952 * per-signal masking and level/edge triggering. It's not yet 953 * handled here... 954 */ 955 956 return 0; 957 958fail: 959 for (addr = 0; addr < ARRAY_SIZE(data->mcp); addr++) { 960 int tmp; 961 962 if (!data->mcp[addr]) 963 continue; 964 tmp = gpiochip_remove(&data->mcp[addr]->chip); 965 if (tmp < 0) 966 dev_err(&spi->dev, "%s --> %d\n", "remove", tmp); 967 } 968 kfree(data); 969 return status; 970} 971 972static int mcp23s08_remove(struct spi_device *spi) 973{ 974 struct mcp23s08_driver_data *data = spi_get_drvdata(spi); 975 unsigned addr; 976 int status = 0; 977 978 for (addr = 0; addr < ARRAY_SIZE(data->mcp); addr++) { 979 int tmp; 980 981 if (!data->mcp[addr]) 982 continue; 983 984 tmp = gpiochip_remove(&data->mcp[addr]->chip); 985 if (tmp < 0) { 986 dev_err(&spi->dev, "%s --> %d\n", "remove", tmp); 987 status = tmp; 988 } 989 } 990 if (status == 0) 991 kfree(data); 992 return status; 993} 994 995static const struct spi_device_id mcp23s08_ids[] = { 996 { "mcp23s08", MCP_TYPE_S08 }, 997 { "mcp23s17", MCP_TYPE_S17 }, 998 { }, 999}; 1000MODULE_DEVICE_TABLE(spi, mcp23s08_ids); 1001 1002static struct spi_driver mcp23s08_driver = { 1003 .probe = mcp23s08_probe, 1004 .remove = mcp23s08_remove, 1005 .id_table = mcp23s08_ids, 1006 .driver = { 1007 .name = "mcp23s08", 1008 .owner = THIS_MODULE, 1009 .of_match_table = of_match_ptr(mcp23s08_spi_of_match), 1010 }, 1011}; 1012 1013static int __init mcp23s08_spi_init(void) 1014{ 1015 return spi_register_driver(&mcp23s08_driver); 1016} 1017 1018static void mcp23s08_spi_exit(void) 1019{ 1020 spi_unregister_driver(&mcp23s08_driver); 1021} 1022 1023#else 1024 1025static int __init mcp23s08_spi_init(void) { return 0; } 1026static void mcp23s08_spi_exit(void) { } 1027 1028#endif /* CONFIG_SPI_MASTER */ 1029 1030/*----------------------------------------------------------------------*/ 1031 1032static int __init mcp23s08_init(void) 1033{ 1034 int ret; 1035 1036 ret = mcp23s08_spi_init(); 1037 if (ret) 1038 goto spi_fail; 1039 1040 ret = mcp23s08_i2c_init(); 1041 if (ret) 1042 goto i2c_fail; 1043 1044 return 0; 1045 1046 i2c_fail: 1047 mcp23s08_spi_exit(); 1048 spi_fail: 1049 return ret; 1050} 1051/* register after spi/i2c postcore initcall and before 1052 * subsys initcalls that may rely on these GPIOs 1053 */ 1054subsys_initcall(mcp23s08_init); 1055 1056static void __exit mcp23s08_exit(void) 1057{ 1058 mcp23s08_spi_exit(); 1059 mcp23s08_i2c_exit(); 1060} 1061module_exit(mcp23s08_exit); 1062 1063MODULE_LICENSE("GPL");