linux/arch/powerpc/sysdev/cpm1.c
<<
>>
Prefs
   1/*
   2 * General Purpose functions for the global management of the
   3 * Communication Processor Module.
   4 * Copyright (c) 1997 Dan error_act (dmalek@jlc.net)
   5 *
   6 * In addition to the individual control of the communication
   7 * channels, there are a few functions that globally affect the
   8 * communication processor.
   9 *
  10 * Buffer descriptors must be allocated from the dual ported memory
  11 * space.  The allocator for that is here.  When the communication
  12 * process is reset, we reclaim the memory available.  There is
  13 * currently no deallocator for this memory.
  14 * The amount of space available is platform dependent.  On the
  15 * MBX, the EPPC software loads additional microcode into the
  16 * communication processor, and uses some of the DP ram for this
  17 * purpose.  Current, the first 512 bytes and the last 256 bytes of
  18 * memory are used.  Right now I am conservative and only use the
  19 * memory that can never be used for microcode.  If there are
  20 * applications that require more DP ram, we can expand the boundaries
  21 * but then we have to be careful of any downloaded microcode.
  22 */
  23#include <linux/errno.h>
  24#include <linux/sched.h>
  25#include <linux/kernel.h>
  26#include <linux/dma-mapping.h>
  27#include <linux/param.h>
  28#include <linux/string.h>
  29#include <linux/mm.h>
  30#include <linux/interrupt.h>
  31#include <linux/irq.h>
  32#include <linux/module.h>
  33#include <linux/spinlock.h>
  34#include <linux/slab.h>
  35#include <asm/page.h>
  36#include <asm/pgtable.h>
  37#include <asm/8xx_immap.h>
  38#include <asm/cpm1.h>
  39#include <asm/io.h>
  40#include <asm/tlbflush.h>
  41#include <asm/rheap.h>
  42#include <asm/prom.h>
  43#include <asm/cpm.h>
  44
  45#include <asm/fs_pd.h>
  46
  47#ifdef CONFIG_8xx_GPIO
  48#include <linux/of_gpio.h>
  49#endif
  50
  51#define CPM_MAP_SIZE    (0x4000)
  52
  53cpm8xx_t __iomem *cpmp;  /* Pointer to comm processor space */
  54immap_t __iomem *mpc8xx_immr;
  55static cpic8xx_t __iomem *cpic_reg;
  56
  57static struct irq_domain *cpm_pic_host;
  58
  59static void cpm_mask_irq(struct irq_data *d)
  60{
  61        unsigned int cpm_vec = (unsigned int)irqd_to_hwirq(d);
  62
  63        clrbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));
  64}
  65
  66static void cpm_unmask_irq(struct irq_data *d)
  67{
  68        unsigned int cpm_vec = (unsigned int)irqd_to_hwirq(d);
  69
  70        setbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));
  71}
  72
  73static void cpm_end_irq(struct irq_data *d)
  74{
  75        unsigned int cpm_vec = (unsigned int)irqd_to_hwirq(d);
  76
  77        out_be32(&cpic_reg->cpic_cisr, (1 << cpm_vec));
  78}
  79
  80static struct irq_chip cpm_pic = {
  81        .name = "CPM PIC",
  82        .irq_mask = cpm_mask_irq,
  83        .irq_unmask = cpm_unmask_irq,
  84        .irq_eoi = cpm_end_irq,
  85};
  86
  87int cpm_get_irq(void)
  88{
  89        int cpm_vec;
  90
  91        /* Get the vector by setting the ACK bit and then reading
  92         * the register.
  93         */
  94        out_be16(&cpic_reg->cpic_civr, 1);
  95        cpm_vec = in_be16(&cpic_reg->cpic_civr);
  96        cpm_vec >>= 11;
  97
  98        return irq_linear_revmap(cpm_pic_host, cpm_vec);
  99}
 100
 101static int cpm_pic_host_map(struct irq_domain *h, unsigned int virq,
 102                          irq_hw_number_t hw)
 103{
 104        pr_debug("cpm_pic_host_map(%d, 0x%lx)\n", virq, hw);
 105
 106        irq_set_status_flags(virq, IRQ_LEVEL);
 107        irq_set_chip_and_handler(virq, &cpm_pic, handle_fasteoi_irq);
 108        return 0;
 109}
 110
 111/* The CPM can generate the error interrupt when there is a race condition
 112 * between generating and masking interrupts.  All we have to do is ACK it
 113 * and return.  This is a no-op function so we don't need any special
 114 * tests in the interrupt handler.
 115 */
 116static irqreturn_t cpm_error_interrupt(int irq, void *dev)
 117{
 118        return IRQ_HANDLED;
 119}
 120
 121static struct irqaction cpm_error_irqaction = {
 122        .handler = cpm_error_interrupt,
 123        .flags = IRQF_NO_THREAD,
 124        .name = "error",
 125};
 126
 127static const struct irq_domain_ops cpm_pic_host_ops = {
 128        .map = cpm_pic_host_map,
 129};
 130
 131unsigned int cpm_pic_init(void)
 132{
 133        struct device_node *np = NULL;
 134        struct resource res;
 135        unsigned int sirq = NO_IRQ, hwirq, eirq;
 136        int ret;
 137
 138        pr_debug("cpm_pic_init\n");
 139
 140        np = of_find_compatible_node(NULL, NULL, "fsl,cpm1-pic");
 141        if (np == NULL)
 142                np = of_find_compatible_node(NULL, "cpm-pic", "CPM");
 143        if (np == NULL) {
 144                printk(KERN_ERR "CPM PIC init: can not find cpm-pic node\n");
 145                return sirq;
 146        }
 147
 148        ret = of_address_to_resource(np, 0, &res);
 149        if (ret)
 150                goto end;
 151
 152        cpic_reg = ioremap(res.start, resource_size(&res));
 153        if (cpic_reg == NULL)
 154                goto end;
 155
 156        sirq = irq_of_parse_and_map(np, 0);
 157        if (sirq == NO_IRQ)
 158                goto end;
 159
 160        /* Initialize the CPM interrupt controller. */
 161        hwirq = (unsigned int)virq_to_hw(sirq);
 162        out_be32(&cpic_reg->cpic_cicr,
 163            (CICR_SCD_SCC4 | CICR_SCC_SCC3 | CICR_SCB_SCC2 | CICR_SCA_SCC1) |
 164                ((hwirq/2) << 13) | CICR_HP_MASK);
 165
 166        out_be32(&cpic_reg->cpic_cimr, 0);
 167
 168        cpm_pic_host = irq_domain_add_linear(np, 64, &cpm_pic_host_ops, NULL);
 169        if (cpm_pic_host == NULL) {
 170                printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
 171                sirq = NO_IRQ;
 172                goto end;
 173        }
 174
 175        /* Install our own error handler. */
 176        np = of_find_compatible_node(NULL, NULL, "fsl,cpm1");
 177        if (np == NULL)
 178                np = of_find_node_by_type(NULL, "cpm");
 179        if (np == NULL) {
 180                printk(KERN_ERR "CPM PIC init: can not find cpm node\n");
 181                goto end;
 182        }
 183
 184        eirq = irq_of_parse_and_map(np, 0);
 185        if (eirq == NO_IRQ)
 186                goto end;
 187
 188        if (setup_irq(eirq, &cpm_error_irqaction))
 189                printk(KERN_ERR "Could not allocate CPM error IRQ!");
 190
 191        setbits32(&cpic_reg->cpic_cicr, CICR_IEN);
 192
 193end:
 194        of_node_put(np);
 195        return sirq;
 196}
 197
 198void __init cpm_reset(void)
 199{
 200        sysconf8xx_t __iomem *siu_conf;
 201
 202        mpc8xx_immr = ioremap(get_immrbase(), 0x4000);
 203        if (!mpc8xx_immr) {
 204                printk(KERN_CRIT "Could not map IMMR\n");
 205                return;
 206        }
 207
 208        cpmp = &mpc8xx_immr->im_cpm;
 209
 210#ifndef CONFIG_PPC_EARLY_DEBUG_CPM
 211        /* Perform a reset.
 212        */
 213        out_be16(&cpmp->cp_cpcr, CPM_CR_RST | CPM_CR_FLG);
 214
 215        /* Wait for it.
 216        */
 217        while (in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG);
 218#endif
 219
 220#ifdef CONFIG_UCODE_PATCH
 221        cpm_load_patch(cpmp);
 222#endif
 223
 224        /* Set SDMA Bus Request priority 5.
 225         * On 860T, this also enables FEC priority 6.  I am not sure
 226         * this is what we really want for some applications, but the
 227         * manual recommends it.
 228         * Bit 25, FAM can also be set to use FEC aggressive mode (860T).
 229         */
 230        siu_conf = immr_map(im_siu_conf);
 231        if ((mfspr(SPRN_IMMR) & 0xffff) == 0x0900) /* MPC885 */
 232                out_be32(&siu_conf->sc_sdcr, 0x40);
 233        else
 234                out_be32(&siu_conf->sc_sdcr, 1);
 235        immr_unmap(siu_conf);
 236
 237        cpm_muram_init();
 238}
 239
 240static DEFINE_SPINLOCK(cmd_lock);
 241
 242#define MAX_CR_CMD_LOOPS        10000
 243
 244int cpm_command(u32 command, u8 opcode)
 245{
 246        int i, ret;
 247        unsigned long flags;
 248
 249        if (command & 0xffffff0f)
 250                return -EINVAL;
 251
 252        spin_lock_irqsave(&cmd_lock, flags);
 253
 254        ret = 0;
 255        out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8));
 256        for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
 257                if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
 258                        goto out;
 259
 260        printk(KERN_ERR "%s(): Not able to issue CPM command\n", __func__);
 261        ret = -EIO;
 262out:
 263        spin_unlock_irqrestore(&cmd_lock, flags);
 264        return ret;
 265}
 266EXPORT_SYMBOL(cpm_command);
 267
 268/* Set a baud rate generator.  This needs lots of work.  There are
 269 * four BRGs, any of which can be wired to any channel.
 270 * The internal baud rate clock is the system clock divided by 16.
 271 * This assumes the baudrate is 16x oversampled by the uart.
 272 */
 273#define BRG_INT_CLK             (get_brgfreq())
 274#define BRG_UART_CLK            (BRG_INT_CLK/16)
 275#define BRG_UART_CLK_DIV16      (BRG_UART_CLK/16)
 276
 277void
 278cpm_setbrg(uint brg, uint rate)
 279{
 280        u32 __iomem *bp;
 281
 282        /* This is good enough to get SMCs running.....
 283        */
 284        bp = &cpmp->cp_brgc1;
 285        bp += brg;
 286        /* The BRG has a 12-bit counter.  For really slow baud rates (or
 287         * really fast processors), we may have to further divide by 16.
 288         */
 289        if (((BRG_UART_CLK / rate) - 1) < 4096)
 290                out_be32(bp, (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN);
 291        else
 292                out_be32(bp, (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) |
 293                              CPM_BRG_EN | CPM_BRG_DIV16);
 294}
 295
 296struct cpm_ioport16 {
 297        __be16 dir, par, odr_sor, dat, intr;
 298        __be16 res[3];
 299};
 300
 301struct cpm_ioport32b {
 302        __be32 dir, par, odr, dat;
 303};
 304
 305struct cpm_ioport32e {
 306        __be32 dir, par, sor, odr, dat;
 307};
 308
 309static void cpm1_set_pin32(int port, int pin, int flags)
 310{
 311        struct cpm_ioport32e __iomem *iop;
 312        pin = 1 << (31 - pin);
 313
 314        if (port == CPM_PORTB)
 315                iop = (struct cpm_ioport32e __iomem *)
 316                      &mpc8xx_immr->im_cpm.cp_pbdir;
 317        else
 318                iop = (struct cpm_ioport32e __iomem *)
 319                      &mpc8xx_immr->im_cpm.cp_pedir;
 320
 321        if (flags & CPM_PIN_OUTPUT)
 322                setbits32(&iop->dir, pin);
 323        else
 324                clrbits32(&iop->dir, pin);
 325
 326        if (!(flags & CPM_PIN_GPIO))
 327                setbits32(&iop->par, pin);
 328        else
 329                clrbits32(&iop->par, pin);
 330
 331        if (port == CPM_PORTB) {
 332                if (flags & CPM_PIN_OPENDRAIN)
 333                        setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
 334                else
 335                        clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
 336        }
 337
 338        if (port == CPM_PORTE) {
 339                if (flags & CPM_PIN_SECONDARY)
 340                        setbits32(&iop->sor, pin);
 341                else
 342                        clrbits32(&iop->sor, pin);
 343
 344                if (flags & CPM_PIN_OPENDRAIN)
 345                        setbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin);
 346                else
 347                        clrbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin);
 348        }
 349}
 350
 351static void cpm1_set_pin16(int port, int pin, int flags)
 352{
 353        struct cpm_ioport16 __iomem *iop =
 354                (struct cpm_ioport16 __iomem *)&mpc8xx_immr->im_ioport;
 355
 356        pin = 1 << (15 - pin);
 357
 358        if (port != 0)
 359                iop += port - 1;
 360
 361        if (flags & CPM_PIN_OUTPUT)
 362                setbits16(&iop->dir, pin);
 363        else
 364                clrbits16(&iop->dir, pin);
 365
 366        if (!(flags & CPM_PIN_GPIO))
 367                setbits16(&iop->par, pin);
 368        else
 369                clrbits16(&iop->par, pin);
 370
 371        if (port == CPM_PORTA) {
 372                if (flags & CPM_PIN_OPENDRAIN)
 373                        setbits16(&iop->odr_sor, pin);
 374                else
 375                        clrbits16(&iop->odr_sor, pin);
 376        }
 377        if (port == CPM_PORTC) {
 378                if (flags & CPM_PIN_SECONDARY)
 379                        setbits16(&iop->odr_sor, pin);
 380                else
 381                        clrbits16(&iop->odr_sor, pin);
 382        }
 383}
 384
 385void cpm1_set_pin(enum cpm_port port, int pin, int flags)
 386{
 387        if (port == CPM_PORTB || port == CPM_PORTE)
 388                cpm1_set_pin32(port, pin, flags);
 389        else
 390                cpm1_set_pin16(port, pin, flags);
 391}
 392
 393int cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode)
 394{
 395        int shift;
 396        int i, bits = 0;
 397        u32 __iomem *reg;
 398        u32 mask = 7;
 399
 400        u8 clk_map[][3] = {
 401                {CPM_CLK_SCC1, CPM_BRG1, 0},
 402                {CPM_CLK_SCC1, CPM_BRG2, 1},
 403                {CPM_CLK_SCC1, CPM_BRG3, 2},
 404                {CPM_CLK_SCC1, CPM_BRG4, 3},
 405                {CPM_CLK_SCC1, CPM_CLK1, 4},
 406                {CPM_CLK_SCC1, CPM_CLK2, 5},
 407                {CPM_CLK_SCC1, CPM_CLK3, 6},
 408                {CPM_CLK_SCC1, CPM_CLK4, 7},
 409
 410                {CPM_CLK_SCC2, CPM_BRG1, 0},
 411                {CPM_CLK_SCC2, CPM_BRG2, 1},
 412                {CPM_CLK_SCC2, CPM_BRG3, 2},
 413                {CPM_CLK_SCC2, CPM_BRG4, 3},
 414                {CPM_CLK_SCC2, CPM_CLK1, 4},
 415                {CPM_CLK_SCC2, CPM_CLK2, 5},
 416                {CPM_CLK_SCC2, CPM_CLK3, 6},
 417                {CPM_CLK_SCC2, CPM_CLK4, 7},
 418
 419                {CPM_CLK_SCC3, CPM_BRG1, 0},
 420                {CPM_CLK_SCC3, CPM_BRG2, 1},
 421                {CPM_CLK_SCC3, CPM_BRG3, 2},
 422                {CPM_CLK_SCC3, CPM_BRG4, 3},
 423                {CPM_CLK_SCC3, CPM_CLK5, 4},
 424                {CPM_CLK_SCC3, CPM_CLK6, 5},
 425                {CPM_CLK_SCC3, CPM_CLK7, 6},
 426                {CPM_CLK_SCC3, CPM_CLK8, 7},
 427
 428                {CPM_CLK_SCC4, CPM_BRG1, 0},
 429                {CPM_CLK_SCC4, CPM_BRG2, 1},
 430                {CPM_CLK_SCC4, CPM_BRG3, 2},
 431                {CPM_CLK_SCC4, CPM_BRG4, 3},
 432                {CPM_CLK_SCC4, CPM_CLK5, 4},
 433                {CPM_CLK_SCC4, CPM_CLK6, 5},
 434                {CPM_CLK_SCC4, CPM_CLK7, 6},
 435                {CPM_CLK_SCC4, CPM_CLK8, 7},
 436
 437                {CPM_CLK_SMC1, CPM_BRG1, 0},
 438                {CPM_CLK_SMC1, CPM_BRG2, 1},
 439                {CPM_CLK_SMC1, CPM_BRG3, 2},
 440                {CPM_CLK_SMC1, CPM_BRG4, 3},
 441                {CPM_CLK_SMC1, CPM_CLK1, 4},
 442                {CPM_CLK_SMC1, CPM_CLK2, 5},
 443                {CPM_CLK_SMC1, CPM_CLK3, 6},
 444                {CPM_CLK_SMC1, CPM_CLK4, 7},
 445
 446                {CPM_CLK_SMC2, CPM_BRG1, 0},
 447                {CPM_CLK_SMC2, CPM_BRG2, 1},
 448                {CPM_CLK_SMC2, CPM_BRG3, 2},
 449                {CPM_CLK_SMC2, CPM_BRG4, 3},
 450                {CPM_CLK_SMC2, CPM_CLK5, 4},
 451                {CPM_CLK_SMC2, CPM_CLK6, 5},
 452                {CPM_CLK_SMC2, CPM_CLK7, 6},
 453                {CPM_CLK_SMC2, CPM_CLK8, 7},
 454        };
 455
 456        switch (target) {
 457        case CPM_CLK_SCC1:
 458                reg = &mpc8xx_immr->im_cpm.cp_sicr;
 459                shift = 0;
 460                break;
 461
 462        case CPM_CLK_SCC2:
 463                reg = &mpc8xx_immr->im_cpm.cp_sicr;
 464                shift = 8;
 465                break;
 466
 467        case CPM_CLK_SCC3:
 468                reg = &mpc8xx_immr->im_cpm.cp_sicr;
 469                shift = 16;
 470                break;
 471
 472        case CPM_CLK_SCC4:
 473                reg = &mpc8xx_immr->im_cpm.cp_sicr;
 474                shift = 24;
 475                break;
 476
 477        case CPM_CLK_SMC1:
 478                reg = &mpc8xx_immr->im_cpm.cp_simode;
 479                shift = 12;
 480                break;
 481
 482        case CPM_CLK_SMC2:
 483                reg = &mpc8xx_immr->im_cpm.cp_simode;
 484                shift = 28;
 485                break;
 486
 487        default:
 488                printk(KERN_ERR "cpm1_clock_setup: invalid clock target\n");
 489                return -EINVAL;
 490        }
 491
 492        for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
 493                if (clk_map[i][0] == target && clk_map[i][1] == clock) {
 494                        bits = clk_map[i][2];
 495                        break;
 496                }
 497        }
 498
 499        if (i == ARRAY_SIZE(clk_map)) {
 500                printk(KERN_ERR "cpm1_clock_setup: invalid clock combination\n");
 501                return -EINVAL;
 502        }
 503
 504        bits <<= shift;
 505        mask <<= shift;
 506
 507        if (reg == &mpc8xx_immr->im_cpm.cp_sicr) {
 508                if (mode == CPM_CLK_RTX) {
 509                        bits |= bits << 3;
 510                        mask |= mask << 3;
 511                } else if (mode == CPM_CLK_RX) {
 512                        bits <<= 3;
 513                        mask <<= 3;
 514                }
 515        }
 516
 517        out_be32(reg, (in_be32(reg) & ~mask) | bits);
 518
 519        return 0;
 520}
 521
 522/*
 523 * GPIO LIB API implementation
 524 */
 525#ifdef CONFIG_8xx_GPIO
 526
 527struct cpm1_gpio16_chip {
 528        struct of_mm_gpio_chip mm_gc;
 529        spinlock_t lock;
 530
 531        /* shadowed data register to clear/set bits safely */
 532        u16 cpdata;
 533};
 534
 535static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
 536{
 537        struct cpm1_gpio16_chip *cpm1_gc =
 538                container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc);
 539        struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 540
 541        cpm1_gc->cpdata = in_be16(&iop->dat);
 542}
 543
 544static int cpm1_gpio16_get(struct gpio_chip *gc, unsigned int gpio)
 545{
 546        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 547        struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 548        u16 pin_mask;
 549
 550        pin_mask = 1 << (15 - gpio);
 551
 552        return !!(in_be16(&iop->dat) & pin_mask);
 553}
 554
 555static void __cpm1_gpio16_set(struct of_mm_gpio_chip *mm_gc, u16 pin_mask,
 556        int value)
 557{
 558        struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 559        struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 560
 561        if (value)
 562                cpm1_gc->cpdata |= pin_mask;
 563        else
 564                cpm1_gc->cpdata &= ~pin_mask;
 565
 566        out_be16(&iop->dat, cpm1_gc->cpdata);
 567}
 568
 569static void cpm1_gpio16_set(struct gpio_chip *gc, unsigned int gpio, int value)
 570{
 571        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 572        struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 573        unsigned long flags;
 574        u16 pin_mask = 1 << (15 - gpio);
 575
 576        spin_lock_irqsave(&cpm1_gc->lock, flags);
 577
 578        __cpm1_gpio16_set(mm_gc, pin_mask, value);
 579
 580        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 581}
 582
 583static int cpm1_gpio16_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
 584{
 585        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 586        struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 587        struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 588        unsigned long flags;
 589        u16 pin_mask = 1 << (15 - gpio);
 590
 591        spin_lock_irqsave(&cpm1_gc->lock, flags);
 592
 593        setbits16(&iop->dir, pin_mask);
 594        __cpm1_gpio16_set(mm_gc, pin_mask, val);
 595
 596        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 597
 598        return 0;
 599}
 600
 601static int cpm1_gpio16_dir_in(struct gpio_chip *gc, unsigned int gpio)
 602{
 603        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 604        struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 605        struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 606        unsigned long flags;
 607        u16 pin_mask = 1 << (15 - gpio);
 608
 609        spin_lock_irqsave(&cpm1_gc->lock, flags);
 610
 611        clrbits16(&iop->dir, pin_mask);
 612
 613        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 614
 615        return 0;
 616}
 617
 618int cpm1_gpiochip_add16(struct device_node *np)
 619{
 620        struct cpm1_gpio16_chip *cpm1_gc;
 621        struct of_mm_gpio_chip *mm_gc;
 622        struct gpio_chip *gc;
 623
 624        cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL);
 625        if (!cpm1_gc)
 626                return -ENOMEM;
 627
 628        spin_lock_init(&cpm1_gc->lock);
 629
 630        mm_gc = &cpm1_gc->mm_gc;
 631        gc = &mm_gc->gc;
 632
 633        mm_gc->save_regs = cpm1_gpio16_save_regs;
 634        gc->ngpio = 16;
 635        gc->direction_input = cpm1_gpio16_dir_in;
 636        gc->direction_output = cpm1_gpio16_dir_out;
 637        gc->get = cpm1_gpio16_get;
 638        gc->set = cpm1_gpio16_set;
 639
 640        return of_mm_gpiochip_add_data(np, mm_gc, cpm1_gc);
 641}
 642
 643struct cpm1_gpio32_chip {
 644        struct of_mm_gpio_chip mm_gc;
 645        spinlock_t lock;
 646
 647        /* shadowed data register to clear/set bits safely */
 648        u32 cpdata;
 649};
 650
 651static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 652{
 653        struct cpm1_gpio32_chip *cpm1_gc =
 654                container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc);
 655        struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 656
 657        cpm1_gc->cpdata = in_be32(&iop->dat);
 658}
 659
 660static int cpm1_gpio32_get(struct gpio_chip *gc, unsigned int gpio)
 661{
 662        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 663        struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 664        u32 pin_mask;
 665
 666        pin_mask = 1 << (31 - gpio);
 667
 668        return !!(in_be32(&iop->dat) & pin_mask);
 669}
 670
 671static void __cpm1_gpio32_set(struct of_mm_gpio_chip *mm_gc, u32 pin_mask,
 672        int value)
 673{
 674        struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 675        struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 676
 677        if (value)
 678                cpm1_gc->cpdata |= pin_mask;
 679        else
 680                cpm1_gc->cpdata &= ~pin_mask;
 681
 682        out_be32(&iop->dat, cpm1_gc->cpdata);
 683}
 684
 685static void cpm1_gpio32_set(struct gpio_chip *gc, unsigned int gpio, int value)
 686{
 687        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 688        struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 689        unsigned long flags;
 690        u32 pin_mask = 1 << (31 - gpio);
 691
 692        spin_lock_irqsave(&cpm1_gc->lock, flags);
 693
 694        __cpm1_gpio32_set(mm_gc, pin_mask, value);
 695
 696        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 697}
 698
 699static int cpm1_gpio32_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
 700{
 701        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 702        struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 703        struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 704        unsigned long flags;
 705        u32 pin_mask = 1 << (31 - gpio);
 706
 707        spin_lock_irqsave(&cpm1_gc->lock, flags);
 708
 709        setbits32(&iop->dir, pin_mask);
 710        __cpm1_gpio32_set(mm_gc, pin_mask, val);
 711
 712        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 713
 714        return 0;
 715}
 716
 717static int cpm1_gpio32_dir_in(struct gpio_chip *gc, unsigned int gpio)
 718{
 719        struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
 720        struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
 721        struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 722        unsigned long flags;
 723        u32 pin_mask = 1 << (31 - gpio);
 724
 725        spin_lock_irqsave(&cpm1_gc->lock, flags);
 726
 727        clrbits32(&iop->dir, pin_mask);
 728
 729        spin_unlock_irqrestore(&cpm1_gc->lock, flags);
 730
 731        return 0;
 732}
 733
 734int cpm1_gpiochip_add32(struct device_node *np)
 735{
 736        struct cpm1_gpio32_chip *cpm1_gc;
 737        struct of_mm_gpio_chip *mm_gc;
 738        struct gpio_chip *gc;
 739
 740        cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL);
 741        if (!cpm1_gc)
 742                return -ENOMEM;
 743
 744        spin_lock_init(&cpm1_gc->lock);
 745
 746        mm_gc = &cpm1_gc->mm_gc;
 747        gc = &mm_gc->gc;
 748
 749        mm_gc->save_regs = cpm1_gpio32_save_regs;
 750        gc->ngpio = 32;
 751        gc->direction_input = cpm1_gpio32_dir_in;
 752        gc->direction_output = cpm1_gpio32_dir_out;
 753        gc->get = cpm1_gpio32_get;
 754        gc->set = cpm1_gpio32_set;
 755
 756        return of_mm_gpiochip_add_data(np, mm_gc, cpm1_gc);
 757}
 758
 759static int cpm_init_par_io(void)
 760{
 761        struct device_node *np;
 762
 763        for_each_compatible_node(np, NULL, "fsl,cpm1-pario-bank-a")
 764                cpm1_gpiochip_add16(np);
 765
 766        for_each_compatible_node(np, NULL, "fsl,cpm1-pario-bank-b")
 767                cpm1_gpiochip_add32(np);
 768
 769        for_each_compatible_node(np, NULL, "fsl,cpm1-pario-bank-c")
 770                cpm1_gpiochip_add16(np);
 771
 772        for_each_compatible_node(np, NULL, "fsl,cpm1-pario-bank-d")
 773                cpm1_gpiochip_add16(np);
 774
 775        /* Port E uses CPM2 layout */
 776        for_each_compatible_node(np, NULL, "fsl,cpm1-pario-bank-e")
 777                cpm2_gpiochip_add32(np);
 778        return 0;
 779}
 780arch_initcall(cpm_init_par_io);
 781
 782#endif /* CONFIG_8xx_GPIO */
 783