root/arch/sh/drivers/pci/fixups-sdk7786.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pcibios_setup
  2. sdk7786_pci_init

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * SDK7786 FPGA PCIe mux handling
   4  *
   5  * Copyright (C) 2010  Paul Mundt
   6  */
   7 #define pr_fmt(fmt) "PCI: " fmt
   8 
   9 #include <linux/init.h>
  10 #include <linux/kernel.h>
  11 #include <linux/pci.h>
  12 #include <mach/fpga.h>
  13 
  14 /*
  15  * The SDK7786 FPGA supports mangling of most of the slots in some way or
  16  * another. Slots 3/4 are special in that only one can be supported at a
  17  * time, and both appear on port 3 to the PCI bus scan. Enabling slot 4
  18  * (the horizontal edge connector) will disable slot 3 entirely.
  19  *
  20  * Misconfigurations can be detected through the FPGA via the slot
  21  * resistors to determine card presence. Hotplug remains unsupported.
  22  */
  23 static unsigned int slot4en __initdata;
  24 
  25 char *__init pcibios_setup(char *str)
  26 {
  27         if (strcmp(str, "slot4en") == 0) {
  28                 slot4en = 1;
  29                 return NULL;
  30         }
  31 
  32         return str;
  33 }
  34 
  35 static int __init sdk7786_pci_init(void)
  36 {
  37         u16 data = fpga_read_reg(PCIECR);
  38 
  39         /*
  40          * Enable slot #4 if it's been specified on the command line.
  41          *
  42          * Optionally reroute if slot #4 has a card present while slot #3
  43          * does not, regardless of command line value.
  44          *
  45          * Card presence is logically inverted.
  46          */
  47         slot4en ?: (!(data & PCIECR_PRST4) && (data & PCIECR_PRST3));
  48         if (slot4en) {
  49                 pr_info("Activating PCIe slot#4 (disabling slot#3)\n");
  50 
  51                 data &= ~PCIECR_PCIEMUX1;
  52                 fpga_write_reg(data, PCIECR);
  53 
  54                 /* Warn about forced rerouting if slot#3 is occupied */
  55                 if ((data & PCIECR_PRST3) == 0) {
  56                         pr_warning("Unreachable card detected in slot#3\n");
  57                         return -EBUSY;
  58                 }
  59         } else
  60                 pr_info("PCIe slot#4 disabled\n");
  61 
  62         return 0;
  63 }
  64 postcore_initcall(sdk7786_pci_init);

/* [<][>][^][v][top][bottom][index][help] */