lkml.org 
[lkml]   [2014]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCHv1 5/6] HSI: Introduce OMAP SSI driver
Hi Mark,

On Mon, Feb 24, 2014 at 03:51:32PM +0000, Mark Rutland wrote:
> > + irq = platform_get_resource_byname(pd, IORESOURCE_IRQ, "gdd_mpu");
> > + if (!irq) {
> > + dev_err(&pd->dev, "GDD IRQ resource missing\n");
> > + err = -ENXIO;
> > + goto out_err;
> > + }
> > + omap_ssi->gdd_irq = irq->start;
>
> You can use platform_get_irq_byname here.

Right. Will be changed in PATCHv2.

> > +static inline int ssi_of_get_available_child_count(const struct device_node *np)
> > +{
> > + struct device_node *child;
> > + int num = 0;
> > +
> > + for_each_child_of_node(np, child)
> > + if (of_device_is_available(child))
> > + num++;
> > +
> > + return num;
> > +}
>
> You can find of_get_available_child_count in <linux/of.h>.

That did not exist when I started with the DT conversion of the
driver.

> That said, this seems to be trying to count the number of ports,
> which should all be compatible with "ti,omap3-ssi-port", no?
>
> So maybe you should count all available child nodes compatible with
> that.

I updated the function to check the compatible string
and use for_each_available_child_of_node(), which has
also been added after I wrote this function.

> > +static int __init ssi_probe(struct platform_device *pd)
> > +{
> > + struct device_node *np = pd->dev.of_node;
> > + struct hsi_controller *ssi;
> > + int err;
> > + int num_ports;
> > +
> > + if (!np) {
> > + dev_err(&pd->dev, "missing device tree data\n");
> > + return -EINVAL;
> > + }
> > +
> > + num_ports = ssi_of_get_available_child_count(np);
> > +
> > + ssi = hsi_alloc_controller(num_ports, GFP_KERNEL);
> > + if (!ssi) {
> > + dev_err(&pd->dev, "No memory for controller\n");
> > + return -ENOMEM;
> > + }
> > +
> > + platform_set_drvdata(pd, ssi);
> > +
> > + err = ssi_add_controller(ssi, pd);
> > + if (err < 0)
> > + goto out1;
> > +
> > + pm_runtime_irq_safe(&pd->dev);
> > + pm_runtime_enable(&pd->dev);
> > +
> > + err = ssi_hw_init(ssi);
> > + if (err < 0)
> > + goto out2;
> > +#ifdef CONFIG_DEBUG_FS
> > + err = ssi_debug_add_ctrl(ssi);
> > + if (err < 0)
> > + goto out2;
> > +#endif
> > +
> > + err = of_platform_populate(pd->dev.of_node, NULL, NULL, &pd->dev);
>
> I'm not keen on doing this because it allows arbitrary devices which are
> not ssi ports to be placed in the ssi host controller node that will be
> probed, which is nonsensical and something I'd like to avoid by
> construction.
>
> Is there any reason the ports have to be platform devices at all?

not strictly, but I get system resources via platform_get_resource_byname.

> If so, is there no way we can register them directly and skip any other
> devices?

I set the second parameter (matches) of the of_platform_populate()
call to a table containing the ssi-port compatible value.

> > +static int __exit ssi_remove(struct platform_device *pd)
> > +{
> > + struct hsi_controller *ssi = platform_get_drvdata(pd);
> > +
> > +#ifdef CONFIG_DEBUG_FS
> > + ssi_debug_remove_ctrl(ssi);
> > +#endif
> > + ssi_remove_controller(ssi);
> > + platform_set_drvdata(pd, NULL);
> > +
> > + pm_runtime_disable(&pd->dev);
> > +
> > + /* cleanup of of_platform_populate() call */
> > + device_for_each_child(&pd->dev, NULL, ssi_remove_ports);
>
> This would certainly be broken for a non ssi port device.

I never intended to support other subdevices, but this only
unregisters each subdevice, so its probably safe...

> > +static int omap_ssi_port_runtime_suspend(struct device *dev)
> > +{
> > + struct hsi_port *port = dev_get_drvdata(dev);
> > + struct omap_ssi_port *omap_port = hsi_port_drvdata(port);
> > + struct hsi_controller *ssi = to_hsi_controller(port->device.parent);
> > + struct omap_ssi_controller *omap_ssi = hsi_controller_drvdata(ssi);
> > +
> > + dev_dbg(dev, "port runtime suspend!\n");
> > +
> > + ssi_set_port_mode(omap_port, SSI_MODE_SLEEP);
> > + if (omap_ssi->get_loss)
> > + omap_port->loss_count =
> > + (*omap_ssi->get_loss)(ssi->device.parent);
>
> You don't need to do (*struct->func)(args) when invoking a function
> pointer. You can jsut have struct->func(args) as we do elsewhere. This
> can be:
>
> omap_ssi->get_loss(ssi->device.parent)
>
> This should be fixed up in the other sites too.

Thanks, fixed everywhere.

-- Sebastian
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2014-02-27 00:41    [W:0.158 / U:1.304 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site