On 3/19/19 6:26 PM, Dan Murphy wrote: > Create a m_can platform framework that peripheral > devices can register to and use common code and register sets. > The peripheral devices may provide read/write and configuration > support of the IP. > > Acked-by: Wolfgang Grandegger > Signed-off-by: Dan Murphy [...] > -/* m_can private data structure */ > -struct m_can_priv { > - struct can_priv can; /* must be the first member */ > - struct napi_struct napi; > - struct net_device *dev; > - struct device *device; > - struct clk *hclk; > - struct clk *cclk; > - void __iomem *base; > - u32 irqstatus; > - int version; > - > - /* message ram configuration */ > - void __iomem *mram_base; > - struct mram_cfg mcfg[MRAM_CFG_NUM]; > -}; > +static u32 m_can_read(struct m_can_priv *priv, enum m_can_reg reg) > +{ > + if (priv->ops->read_reg) > + return priv->ops->read_reg(priv, reg); > + else > + return -EINVAL; > +} How do you plan to check the return value here? What's the difference between a register value of 0xffffffe9 and returning -EINVAL? > > -static inline u32 m_can_read(const struct m_can_priv *priv, enum m_can_reg reg) > +static int m_can_write(struct m_can_priv *priv, enum m_can_reg reg, u32 val) > { > - return readl(priv->base + reg); > + if (priv->ops->write_reg) > + return priv->ops->write_reg(priv, reg, val); > + else > + return -EINVAL; > } I don't see anyone checking the return value. Better just dereference the pointer and the kernel will produce a nice backtrace. Same should be done for all read and write variants. Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |