[PATCH 1/2] spi: bcm2835: add spi-bcm2835aux driver for the auxiliar spi1 and spi2

Martin Sperl kernel at martin.sperl.org
Thu Jul 30 08:27:44 PDT 2015

> On 30.07.2015, at 09:10, Martin Sperl <kernel at martin.sperl.org> wrote:
>> What about adding “bcrm,bcm2835-aux-enable” to drivers/mfd/syscon.c
>> compatibility?
>> That way we:
>> * have a clean dt that only represents hardware
>> * reuse existing code with minimal modifications
>> * minimal effort
>> That would be a minimal patch to enable this, so we can ask if that is
>> acceptable and if it is not then we can still think of something else,
>> which would be mostly replicating the bit-management portion of syscon.
> that minimal patch extending compatibility of syscon and also including
> the config portion for the kernel as well as the device tree would look
> something like this (note that it is not tested yet):

> --- a/drivers/mfd/syscon.c
> +++ b/drivers/mfd/syscon.c
> @@ -211,6 +211,12 @@ static int syscon_probe(struct platform_device *pdev)
>        return 0;
> }
> +static const struct of_device_id syscon_match[] = {
> +       { .compatible = "bcrm,bcm2835-aux-enable", },
> +       {}
> +};
> +MODULE_DEVICE_TABLE(of, syscon_match);
> +
> static const struct platform_device_id syscon_ids[] = {
>        { "syscon", },
>        { }

Unfortunately the above does not work with syscon, as it
_explicitly_ requires a compatibility of “syscon”:

        if (!of_device_is_compatible(np, "syscon"))
                return ERR_PTR(-EINVAL);

So by the rational of device-tree representing only the
hardware this driver should never get used because of this

Replicating syscon/regmap into a separate driver that has explicit
compatibility of “bcrm, bcm2835-aux” results in more than 162 lines
of extra code (plus changes to Makefile and Kconfig)

So I wonder if it would not be acceptable to allow:
  compatiblity = “bcrm,bcm2835-aux”, “syscon”;

and avoid an unnecessary extra driver which provides only
the following functions:

void bcm2835aux_enable(struct bcm2835aux *aux, u32 mask);
void bcm2835aux_disable(struct bcm2835aux *aux, u32 mask);
struct bcm2835aux *bcm2835aux_lookup_by_phandle(
	struct device_node *np,
	const char *property);

all of which are available almost identical in syscon/regmap.

We can also try to discuss if a modification to syscon so that it
also checks the “explicit” compatibility in the configured list.


More information about the linux-rpi-kernel mailing list