cpm1.c (15697B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * General Purpose functions for the global management of the 4 * Communication Processor Module. 5 * Copyright (c) 1997 Dan error_act (dmalek@jlc.net) 6 * 7 * In addition to the individual control of the communication 8 * channels, there are a few functions that globally affect the 9 * communication processor. 10 * 11 * Buffer descriptors must be allocated from the dual ported memory 12 * space. The allocator for that is here. When the communication 13 * process is reset, we reclaim the memory available. There is 14 * currently no deallocator for this memory. 15 * The amount of space available is platform dependent. On the 16 * MBX, the EPPC software loads additional microcode into the 17 * communication processor, and uses some of the DP ram for this 18 * purpose. Current, the first 512 bytes and the last 256 bytes of 19 * memory are used. Right now I am conservative and only use the 20 * memory that can never be used for microcode. If there are 21 * applications that require more DP ram, we can expand the boundaries 22 * but then we have to be careful of any downloaded microcode. 23 */ 24#include <linux/errno.h> 25#include <linux/sched.h> 26#include <linux/kernel.h> 27#include <linux/dma-mapping.h> 28#include <linux/param.h> 29#include <linux/string.h> 30#include <linux/mm.h> 31#include <linux/interrupt.h> 32#include <linux/irq.h> 33#include <linux/module.h> 34#include <linux/spinlock.h> 35#include <linux/slab.h> 36#include <linux/of_irq.h> 37#include <asm/page.h> 38#include <asm/8xx_immap.h> 39#include <asm/cpm1.h> 40#include <asm/io.h> 41#include <asm/rheap.h> 42#include <asm/cpm.h> 43 44#include <asm/fs_pd.h> 45 46#ifdef CONFIG_8xx_GPIO 47#include <linux/of_gpio.h> 48#endif 49 50#define CPM_MAP_SIZE (0x4000) 51 52cpm8xx_t __iomem *cpmp; /* Pointer to comm processor space */ 53immap_t __iomem *mpc8xx_immr = (void __iomem *)VIRT_IMMR_BASE; 54 55void __init cpm_reset(void) 56{ 57 sysconf8xx_t __iomem *siu_conf; 58 59 cpmp = &mpc8xx_immr->im_cpm; 60 61#ifndef CONFIG_PPC_EARLY_DEBUG_CPM 62 /* Perform a reset. */ 63 out_be16(&cpmp->cp_cpcr, CPM_CR_RST | CPM_CR_FLG); 64 65 /* Wait for it. */ 66 while (in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG); 67#endif 68 69#ifdef CONFIG_UCODE_PATCH 70 cpm_load_patch(cpmp); 71#endif 72 73 /* 74 * Set SDMA Bus Request priority 5. 75 * On 860T, this also enables FEC priority 6. I am not sure 76 * this is what we really want for some applications, but the 77 * manual recommends it. 78 * Bit 25, FAM can also be set to use FEC aggressive mode (860T). 79 */ 80 siu_conf = immr_map(im_siu_conf); 81 if ((mfspr(SPRN_IMMR) & 0xffff) == 0x0900) /* MPC885 */ 82 out_be32(&siu_conf->sc_sdcr, 0x40); 83 else 84 out_be32(&siu_conf->sc_sdcr, 1); 85 immr_unmap(siu_conf); 86} 87 88static DEFINE_SPINLOCK(cmd_lock); 89 90#define MAX_CR_CMD_LOOPS 10000 91 92int cpm_command(u32 command, u8 opcode) 93{ 94 int i, ret; 95 unsigned long flags; 96 97 if (command & 0xffffff0f) 98 return -EINVAL; 99 100 spin_lock_irqsave(&cmd_lock, flags); 101 102 ret = 0; 103 out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8)); 104 for (i = 0; i < MAX_CR_CMD_LOOPS; i++) 105 if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0) 106 goto out; 107 108 printk(KERN_ERR "%s(): Not able to issue CPM command\n", __func__); 109 ret = -EIO; 110out: 111 spin_unlock_irqrestore(&cmd_lock, flags); 112 return ret; 113} 114EXPORT_SYMBOL(cpm_command); 115 116/* 117 * Set a baud rate generator. This needs lots of work. There are 118 * four BRGs, any of which can be wired to any channel. 119 * The internal baud rate clock is the system clock divided by 16. 120 * This assumes the baudrate is 16x oversampled by the uart. 121 */ 122#define BRG_INT_CLK (get_brgfreq()) 123#define BRG_UART_CLK (BRG_INT_CLK/16) 124#define BRG_UART_CLK_DIV16 (BRG_UART_CLK/16) 125 126void 127cpm_setbrg(uint brg, uint rate) 128{ 129 u32 __iomem *bp; 130 131 /* This is good enough to get SMCs running..... */ 132 bp = &cpmp->cp_brgc1; 133 bp += brg; 134 /* 135 * The BRG has a 12-bit counter. For really slow baud rates (or 136 * really fast processors), we may have to further divide by 16. 137 */ 138 if (((BRG_UART_CLK / rate) - 1) < 4096) 139 out_be32(bp, (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN); 140 else 141 out_be32(bp, (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) | 142 CPM_BRG_EN | CPM_BRG_DIV16); 143} 144EXPORT_SYMBOL(cpm_setbrg); 145 146struct cpm_ioport16 { 147 __be16 dir, par, odr_sor, dat, intr; 148 __be16 res[3]; 149}; 150 151struct cpm_ioport32b { 152 __be32 dir, par, odr, dat; 153}; 154 155struct cpm_ioport32e { 156 __be32 dir, par, sor, odr, dat; 157}; 158 159static void __init cpm1_set_pin32(int port, int pin, int flags) 160{ 161 struct cpm_ioport32e __iomem *iop; 162 pin = 1 << (31 - pin); 163 164 if (port == CPM_PORTB) 165 iop = (struct cpm_ioport32e __iomem *) 166 &mpc8xx_immr->im_cpm.cp_pbdir; 167 else 168 iop = (struct cpm_ioport32e __iomem *) 169 &mpc8xx_immr->im_cpm.cp_pedir; 170 171 if (flags & CPM_PIN_OUTPUT) 172 setbits32(&iop->dir, pin); 173 else 174 clrbits32(&iop->dir, pin); 175 176 if (!(flags & CPM_PIN_GPIO)) 177 setbits32(&iop->par, pin); 178 else 179 clrbits32(&iop->par, pin); 180 181 if (port == CPM_PORTB) { 182 if (flags & CPM_PIN_OPENDRAIN) 183 setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin); 184 else 185 clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin); 186 } 187 188 if (port == CPM_PORTE) { 189 if (flags & CPM_PIN_SECONDARY) 190 setbits32(&iop->sor, pin); 191 else 192 clrbits32(&iop->sor, pin); 193 194 if (flags & CPM_PIN_OPENDRAIN) 195 setbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin); 196 else 197 clrbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin); 198 } 199} 200 201static void __init cpm1_set_pin16(int port, int pin, int flags) 202{ 203 struct cpm_ioport16 __iomem *iop = 204 (struct cpm_ioport16 __iomem *)&mpc8xx_immr->im_ioport; 205 206 pin = 1 << (15 - pin); 207 208 if (port != 0) 209 iop += port - 1; 210 211 if (flags & CPM_PIN_OUTPUT) 212 setbits16(&iop->dir, pin); 213 else 214 clrbits16(&iop->dir, pin); 215 216 if (!(flags & CPM_PIN_GPIO)) 217 setbits16(&iop->par, pin); 218 else 219 clrbits16(&iop->par, pin); 220 221 if (port == CPM_PORTA) { 222 if (flags & CPM_PIN_OPENDRAIN) 223 setbits16(&iop->odr_sor, pin); 224 else 225 clrbits16(&iop->odr_sor, pin); 226 } 227 if (port == CPM_PORTC) { 228 if (flags & CPM_PIN_SECONDARY) 229 setbits16(&iop->odr_sor, pin); 230 else 231 clrbits16(&iop->odr_sor, pin); 232 if (flags & CPM_PIN_FALLEDGE) 233 setbits16(&iop->intr, pin); 234 else 235 clrbits16(&iop->intr, pin); 236 } 237} 238 239void __init cpm1_set_pin(enum cpm_port port, int pin, int flags) 240{ 241 if (port == CPM_PORTB || port == CPM_PORTE) 242 cpm1_set_pin32(port, pin, flags); 243 else 244 cpm1_set_pin16(port, pin, flags); 245} 246 247int __init cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode) 248{ 249 int shift; 250 int i, bits = 0; 251 u32 __iomem *reg; 252 u32 mask = 7; 253 254 u8 clk_map[][3] = { 255 {CPM_CLK_SCC1, CPM_BRG1, 0}, 256 {CPM_CLK_SCC1, CPM_BRG2, 1}, 257 {CPM_CLK_SCC1, CPM_BRG3, 2}, 258 {CPM_CLK_SCC1, CPM_BRG4, 3}, 259 {CPM_CLK_SCC1, CPM_CLK1, 4}, 260 {CPM_CLK_SCC1, CPM_CLK2, 5}, 261 {CPM_CLK_SCC1, CPM_CLK3, 6}, 262 {CPM_CLK_SCC1, CPM_CLK4, 7}, 263 264 {CPM_CLK_SCC2, CPM_BRG1, 0}, 265 {CPM_CLK_SCC2, CPM_BRG2, 1}, 266 {CPM_CLK_SCC2, CPM_BRG3, 2}, 267 {CPM_CLK_SCC2, CPM_BRG4, 3}, 268 {CPM_CLK_SCC2, CPM_CLK1, 4}, 269 {CPM_CLK_SCC2, CPM_CLK2, 5}, 270 {CPM_CLK_SCC2, CPM_CLK3, 6}, 271 {CPM_CLK_SCC2, CPM_CLK4, 7}, 272 273 {CPM_CLK_SCC3, CPM_BRG1, 0}, 274 {CPM_CLK_SCC3, CPM_BRG2, 1}, 275 {CPM_CLK_SCC3, CPM_BRG3, 2}, 276 {CPM_CLK_SCC3, CPM_BRG4, 3}, 277 {CPM_CLK_SCC3, CPM_CLK5, 4}, 278 {CPM_CLK_SCC3, CPM_CLK6, 5}, 279 {CPM_CLK_SCC3, CPM_CLK7, 6}, 280 {CPM_CLK_SCC3, CPM_CLK8, 7}, 281 282 {CPM_CLK_SCC4, CPM_BRG1, 0}, 283 {CPM_CLK_SCC4, CPM_BRG2, 1}, 284 {CPM_CLK_SCC4, CPM_BRG3, 2}, 285 {CPM_CLK_SCC4, CPM_BRG4, 3}, 286 {CPM_CLK_SCC4, CPM_CLK5, 4}, 287 {CPM_CLK_SCC4, CPM_CLK6, 5}, 288 {CPM_CLK_SCC4, CPM_CLK7, 6}, 289 {CPM_CLK_SCC4, CPM_CLK8, 7}, 290 291 {CPM_CLK_SMC1, CPM_BRG1, 0}, 292 {CPM_CLK_SMC1, CPM_BRG2, 1}, 293 {CPM_CLK_SMC1, CPM_BRG3, 2}, 294 {CPM_CLK_SMC1, CPM_BRG4, 3}, 295 {CPM_CLK_SMC1, CPM_CLK1, 4}, 296 {CPM_CLK_SMC1, CPM_CLK2, 5}, 297 {CPM_CLK_SMC1, CPM_CLK3, 6}, 298 {CPM_CLK_SMC1, CPM_CLK4, 7}, 299 300 {CPM_CLK_SMC2, CPM_BRG1, 0}, 301 {CPM_CLK_SMC2, CPM_BRG2, 1}, 302 {CPM_CLK_SMC2, CPM_BRG3, 2}, 303 {CPM_CLK_SMC2, CPM_BRG4, 3}, 304 {CPM_CLK_SMC2, CPM_CLK5, 4}, 305 {CPM_CLK_SMC2, CPM_CLK6, 5}, 306 {CPM_CLK_SMC2, CPM_CLK7, 6}, 307 {CPM_CLK_SMC2, CPM_CLK8, 7}, 308 }; 309 310 switch (target) { 311 case CPM_CLK_SCC1: 312 reg = &mpc8xx_immr->im_cpm.cp_sicr; 313 shift = 0; 314 break; 315 316 case CPM_CLK_SCC2: 317 reg = &mpc8xx_immr->im_cpm.cp_sicr; 318 shift = 8; 319 break; 320 321 case CPM_CLK_SCC3: 322 reg = &mpc8xx_immr->im_cpm.cp_sicr; 323 shift = 16; 324 break; 325 326 case CPM_CLK_SCC4: 327 reg = &mpc8xx_immr->im_cpm.cp_sicr; 328 shift = 24; 329 break; 330 331 case CPM_CLK_SMC1: 332 reg = &mpc8xx_immr->im_cpm.cp_simode; 333 shift = 12; 334 break; 335 336 case CPM_CLK_SMC2: 337 reg = &mpc8xx_immr->im_cpm.cp_simode; 338 shift = 28; 339 break; 340 341 default: 342 printk(KERN_ERR "cpm1_clock_setup: invalid clock target\n"); 343 return -EINVAL; 344 } 345 346 for (i = 0; i < ARRAY_SIZE(clk_map); i++) { 347 if (clk_map[i][0] == target && clk_map[i][1] == clock) { 348 bits = clk_map[i][2]; 349 break; 350 } 351 } 352 353 if (i == ARRAY_SIZE(clk_map)) { 354 printk(KERN_ERR "cpm1_clock_setup: invalid clock combination\n"); 355 return -EINVAL; 356 } 357 358 bits <<= shift; 359 mask <<= shift; 360 361 if (reg == &mpc8xx_immr->im_cpm.cp_sicr) { 362 if (mode == CPM_CLK_RTX) { 363 bits |= bits << 3; 364 mask |= mask << 3; 365 } else if (mode == CPM_CLK_RX) { 366 bits <<= 3; 367 mask <<= 3; 368 } 369 } 370 371 out_be32(reg, (in_be32(reg) & ~mask) | bits); 372 373 return 0; 374} 375 376/* 377 * GPIO LIB API implementation 378 */ 379#ifdef CONFIG_8xx_GPIO 380 381struct cpm1_gpio16_chip { 382 struct of_mm_gpio_chip mm_gc; 383 spinlock_t lock; 384 385 /* shadowed data register to clear/set bits safely */ 386 u16 cpdata; 387 388 /* IRQ associated with Pins when relevant */ 389 int irq[16]; 390}; 391 392static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc) 393{ 394 struct cpm1_gpio16_chip *cpm1_gc = 395 container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc); 396 struct cpm_ioport16 __iomem *iop = mm_gc->regs; 397 398 cpm1_gc->cpdata = in_be16(&iop->dat); 399} 400 401static int cpm1_gpio16_get(struct gpio_chip *gc, unsigned int gpio) 402{ 403 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 404 struct cpm_ioport16 __iomem *iop = mm_gc->regs; 405 u16 pin_mask; 406 407 pin_mask = 1 << (15 - gpio); 408 409 return !!(in_be16(&iop->dat) & pin_mask); 410} 411 412static void __cpm1_gpio16_set(struct of_mm_gpio_chip *mm_gc, u16 pin_mask, 413 int value) 414{ 415 struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 416 struct cpm_ioport16 __iomem *iop = mm_gc->regs; 417 418 if (value) 419 cpm1_gc->cpdata |= pin_mask; 420 else 421 cpm1_gc->cpdata &= ~pin_mask; 422 423 out_be16(&iop->dat, cpm1_gc->cpdata); 424} 425 426static void cpm1_gpio16_set(struct gpio_chip *gc, unsigned int gpio, int value) 427{ 428 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 429 struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 430 unsigned long flags; 431 u16 pin_mask = 1 << (15 - gpio); 432 433 spin_lock_irqsave(&cpm1_gc->lock, flags); 434 435 __cpm1_gpio16_set(mm_gc, pin_mask, value); 436 437 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 438} 439 440static int cpm1_gpio16_to_irq(struct gpio_chip *gc, unsigned int gpio) 441{ 442 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 443 struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 444 445 return cpm1_gc->irq[gpio] ? : -ENXIO; 446} 447 448static int cpm1_gpio16_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) 449{ 450 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 451 struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 452 struct cpm_ioport16 __iomem *iop = mm_gc->regs; 453 unsigned long flags; 454 u16 pin_mask = 1 << (15 - gpio); 455 456 spin_lock_irqsave(&cpm1_gc->lock, flags); 457 458 setbits16(&iop->dir, pin_mask); 459 __cpm1_gpio16_set(mm_gc, pin_mask, val); 460 461 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 462 463 return 0; 464} 465 466static int cpm1_gpio16_dir_in(struct gpio_chip *gc, unsigned int gpio) 467{ 468 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 469 struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 470 struct cpm_ioport16 __iomem *iop = mm_gc->regs; 471 unsigned long flags; 472 u16 pin_mask = 1 << (15 - gpio); 473 474 spin_lock_irqsave(&cpm1_gc->lock, flags); 475 476 clrbits16(&iop->dir, pin_mask); 477 478 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 479 480 return 0; 481} 482 483int cpm1_gpiochip_add16(struct device *dev) 484{ 485 struct device_node *np = dev->of_node; 486 struct cpm1_gpio16_chip *cpm1_gc; 487 struct of_mm_gpio_chip *mm_gc; 488 struct gpio_chip *gc; 489 u16 mask; 490 491 cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL); 492 if (!cpm1_gc) 493 return -ENOMEM; 494 495 spin_lock_init(&cpm1_gc->lock); 496 497 if (!of_property_read_u16(np, "fsl,cpm1-gpio-irq-mask", &mask)) { 498 int i, j; 499 500 for (i = 0, j = 0; i < 16; i++) 501 if (mask & (1 << (15 - i))) 502 cpm1_gc->irq[i] = irq_of_parse_and_map(np, j++); 503 } 504 505 mm_gc = &cpm1_gc->mm_gc; 506 gc = &mm_gc->gc; 507 508 mm_gc->save_regs = cpm1_gpio16_save_regs; 509 gc->ngpio = 16; 510 gc->direction_input = cpm1_gpio16_dir_in; 511 gc->direction_output = cpm1_gpio16_dir_out; 512 gc->get = cpm1_gpio16_get; 513 gc->set = cpm1_gpio16_set; 514 gc->to_irq = cpm1_gpio16_to_irq; 515 gc->parent = dev; 516 gc->owner = THIS_MODULE; 517 518 return of_mm_gpiochip_add_data(np, mm_gc, cpm1_gc); 519} 520 521struct cpm1_gpio32_chip { 522 struct of_mm_gpio_chip mm_gc; 523 spinlock_t lock; 524 525 /* shadowed data register to clear/set bits safely */ 526 u32 cpdata; 527}; 528 529static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc) 530{ 531 struct cpm1_gpio32_chip *cpm1_gc = 532 container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc); 533 struct cpm_ioport32b __iomem *iop = mm_gc->regs; 534 535 cpm1_gc->cpdata = in_be32(&iop->dat); 536} 537 538static int cpm1_gpio32_get(struct gpio_chip *gc, unsigned int gpio) 539{ 540 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 541 struct cpm_ioport32b __iomem *iop = mm_gc->regs; 542 u32 pin_mask; 543 544 pin_mask = 1 << (31 - gpio); 545 546 return !!(in_be32(&iop->dat) & pin_mask); 547} 548 549static void __cpm1_gpio32_set(struct of_mm_gpio_chip *mm_gc, u32 pin_mask, 550 int value) 551{ 552 struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 553 struct cpm_ioport32b __iomem *iop = mm_gc->regs; 554 555 if (value) 556 cpm1_gc->cpdata |= pin_mask; 557 else 558 cpm1_gc->cpdata &= ~pin_mask; 559 560 out_be32(&iop->dat, cpm1_gc->cpdata); 561} 562 563static void cpm1_gpio32_set(struct gpio_chip *gc, unsigned int gpio, int value) 564{ 565 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 566 struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 567 unsigned long flags; 568 u32 pin_mask = 1 << (31 - gpio); 569 570 spin_lock_irqsave(&cpm1_gc->lock, flags); 571 572 __cpm1_gpio32_set(mm_gc, pin_mask, value); 573 574 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 575} 576 577static int cpm1_gpio32_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) 578{ 579 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 580 struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 581 struct cpm_ioport32b __iomem *iop = mm_gc->regs; 582 unsigned long flags; 583 u32 pin_mask = 1 << (31 - gpio); 584 585 spin_lock_irqsave(&cpm1_gc->lock, flags); 586 587 setbits32(&iop->dir, pin_mask); 588 __cpm1_gpio32_set(mm_gc, pin_mask, val); 589 590 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 591 592 return 0; 593} 594 595static int cpm1_gpio32_dir_in(struct gpio_chip *gc, unsigned int gpio) 596{ 597 struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); 598 struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc); 599 struct cpm_ioport32b __iomem *iop = mm_gc->regs; 600 unsigned long flags; 601 u32 pin_mask = 1 << (31 - gpio); 602 603 spin_lock_irqsave(&cpm1_gc->lock, flags); 604 605 clrbits32(&iop->dir, pin_mask); 606 607 spin_unlock_irqrestore(&cpm1_gc->lock, flags); 608 609 return 0; 610} 611 612int cpm1_gpiochip_add32(struct device *dev) 613{ 614 struct device_node *np = dev->of_node; 615 struct cpm1_gpio32_chip *cpm1_gc; 616 struct of_mm_gpio_chip *mm_gc; 617 struct gpio_chip *gc; 618 619 cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL); 620 if (!cpm1_gc) 621 return -ENOMEM; 622 623 spin_lock_init(&cpm1_gc->lock); 624 625 mm_gc = &cpm1_gc->mm_gc; 626 gc = &mm_gc->gc; 627 628 mm_gc->save_regs = cpm1_gpio32_save_regs; 629 gc->ngpio = 32; 630 gc->direction_input = cpm1_gpio32_dir_in; 631 gc->direction_output = cpm1_gpio32_dir_out; 632 gc->get = cpm1_gpio32_get; 633 gc->set = cpm1_gpio32_set; 634 gc->parent = dev; 635 gc->owner = THIS_MODULE; 636 637 return of_mm_gpiochip_add_data(np, mm_gc, cpm1_gc); 638} 639 640#endif /* CONFIG_8xx_GPIO */