-
-void __init pSeries_find_serial_port(void)
-{
- struct device_node *np;
- unsigned long encode_phys_size = 32;
- u32 *sizeprop;
-
- struct isa_reg_property {
- u32 space;
- u32 address;
- u32 size;
- };
- struct pci_reg_property {
- struct pci_address addr;
- u32 size_hi;
- u32 size_lo;
- };
-
- DBG(" -> pSeries_find_serial_port()\n");
-
- naca->serialPortAddr = 0;
-
- np = of_find_node_by_path("/");
- if (!np)
- return;
- sizeprop = (u32 *)get_property(np, "#size-cells", NULL);
- if (sizeprop != NULL)
- encode_phys_size = (*sizeprop) << 5;
-
- for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
- struct device_node *isa, *pci;
- struct isa_reg_property *reg;
- union pci_range *rangesp;
- char *typep;
-
- typep = (char *)get_property(np, "ibm,aix-loc", NULL);
- if ((typep == NULL) || (typep && strcmp(typep, "S1")))
- continue;
-
- reg = (struct isa_reg_property *)get_property(np, "reg", NULL);
-
- isa = of_get_parent(np);
- if (!isa) {
- DBG("no isa parent found\n");
- break;
- }
- pci = of_get_parent(isa);
- if (!pci) {
- DBG("no pci parent found\n");
- break;
- }
-
- rangesp = (union pci_range *)get_property(pci, "ranges", NULL);
-
- if ( encode_phys_size == 32 )
- naca->serialPortAddr = rangesp->pci32.phys+reg->address;
- else {
- naca->serialPortAddr =
- ((((unsigned long)rangesp->pci64.phys_hi) << 32)
- |
- (rangesp->pci64.phys_lo)) + reg->address;
- }
- break;
- }
-
- DBG(" <- pSeries_find_serial_port()\n");
-}
-
-