#endif /* !CONFIG_PPC_CPM_NEW_BINDING */
 
 struct cpm_ioport16 {
-       __be16 dir, par, sor, dat, intr;
+       __be16 dir, par, odr_sor, dat, intr;
        __be16 res[3];
 };
 
        else
                clrbits32(&iop->par, pin);
 
+       if (port == CPM_PORTB) {
+               if (flags & CPM_PIN_OPENDRAIN)
+                       setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
+               else
+                       clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
+       }
+
        if (port == CPM_PORTE) {
                if (flags & CPM_PIN_SECONDARY)
                        setbits32(&iop->sor, pin);
        else
                clrbits16(&iop->par, pin);
 
+       if (port == CPM_PORTA) {
+               if (flags & CPM_PIN_OPENDRAIN)
+                       setbits16(&iop->odr_sor, pin);
+               else
+                       clrbits16(&iop->odr_sor, pin);
+       }
        if (port == CPM_PORTC) {
                if (flags & CPM_PIN_SECONDARY)
-                       setbits16(&iop->sor, pin);
+                       setbits16(&iop->odr_sor, pin);
                else
-                       clrbits16(&iop->sor, pin);
+                       clrbits16(&iop->odr_sor, pin);
        }
 }