Hi Timur, On Thu, 17 Nov 2011 16:09:17 -0600 Timur Tabi <ti...@freescale.com> wrote: > > Stephen Rothwell wrote: > > >> + struct device_node *indirect_node = NULL; > >> + struct ccsr_guts_85xx __iomem *guts = NULL; > >> + u8 __iomem *lbc_lcs0_ba = NULL; > >> + u8 __iomem *lbc_lcs1_ba = NULL; > > > > And if you had multiple error path labels, you could avoid these others > > as well (and the NULL checks on the error path). > > But I don't want multiple error path labels. The error path could only > happen if someone passed in a broken device tree (i.e. pretty much > never), so I'm not keen on complicating my code just to optimize > something that will never be used.
But you are already optimizing for the error path by doing the assignments and NULL checks that are unneeded in the non error path. What I am suggesting is adding a little more code that could end up doing less at run time. How about (not even compile tested): static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) { struct device_node *guts_node; struct device_node *indirect_node; struct ccsr_guts_85xx __iomem *guts; u8 __iomem *lbc_lcs0_ba; u8 __iomem *lbc_lcs1_ba; u8 b; /* Map the global utilities registers. */ guts_node = of_find_compatible_node(NULL, NULL, "fsl,p1022-guts"); if (!guts_node) { pr_err("p1022ds: missing global utilties device node\n"); return; } guts = of_iomap(guts_node, 0); of_node_put(guts_node); if (!guts) { pr_err("p1022ds: could not map global utilties device\n"); return; } indirect_node = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-indirect-pixis"); if (!indirect_node) { pr_err("p1022ds: missing pixis indirect mode node\n"); goto exit_guts_iounmap; } lbc_lcs0_ba = of_iomap(indirect_node, 0); if (!lbc_lcs0_ba) { pr_err("p1022ds: could not map localbus chip select 0\n"); goto exit_indirect_node; } lbc_lcs1_ba = of_iomap(indirect_node, 1); if (!lbc_lcs1_ba) { pr_err("p1022ds: could not map localbus chip select 1\n"); goto exit_lcs0_iounmap; } /* Make sure we're in indirect mode first. */ if ((in_be32(&guts->pmuxcr) & PMUXCR_ELBCDIU_MASK) != PMUXCR_ELBCDIU_DIU) { struct device_node *pixis_node; void __iomem *pixis; pixis_node = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-fpga"); if (!pixis_node) { pr_err("p1022ds: missing pixis node\n"); goto exit_lcs1_iounmap; } pixis = of_iomap(pixis_node, 0); of_node_put(pixis_node); if (!pixis) { pr_err("p1022ds: could not map pixis registers\n"); goto exit_lcs1_iounmap; } /* Enable indirect PIXIS mode. */ setbits8(pixis + PX_CTL, PX_CTL_ALTACC); iounmap(pixis); /* Switch the board mux to the DIU */ out_8(lbc_lcs0_ba, PX_BRDCFG0); /* BRDCFG0 */ b = in_8(lbc_lcs1_ba); b |= PX_BRDCFG0_ELBC_DIU; out_8(lbc_lcs1_ba, b); /* Set the chip mux to DIU mode. */ clrsetbits_be32(&guts->pmuxcr, PMUXCR_ELBCDIU_MASK, PMUXCR_ELBCDIU_DIU); in_be32(&guts->pmuxcr); } switch (port) { case FSL_DIU_PORT_DVI: /* Enable the DVI port, disable the DFP and the backlight */ out_8(lbc_lcs0_ba, PX_BRDCFG1); b = in_8(lbc_lcs1_ba); b &= ~(PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT); b |= PX_BRDCFG1_DVIEN; out_8(lbc_lcs1_ba, b); break; case FSL_DIU_PORT_LVDS: /* * LVDS also needs backlight enabled, otherwise the display * will be blank. */ /* Enable the DFP port, disable the DVI and the backlight */ out_8(lbc_lcs0_ba, PX_BRDCFG1); b = in_8(lbc_lcs1_ba); b &= ~PX_BRDCFG1_DVIEN; b |= PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT; out_8(lbc_lcs1_ba, b); break; default: pr_err("p1022ds: unsupported monitor port %i\n", port); } exit_lcs1_iounmap: iounmap(lbc_lcs1_ba); exit_lcs0_iounmap: iounmap(lbc_lcs0_ba); exit_indirect_node: of_node_put(indirect_node); exit_guts_iounmap: iounmap(guts); } -- Cheers, Stephen Rothwell s...@canb.auug.org.au http://www.canb.auug.org.au/~sfr/
pgpRUWCahvZ7C.pgp
Description: PGP signature
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev