[PATCH 2/3] ARM: bcm2835: Add the Raspberry Pi firmware driver

Eric Anholt eric at anholt.net
Tue May 12 17:38:53 PDT 2015

Stephen Warren <swarren at wwwdotorg.org> writes:

> On 05/12/2015 11:46 AM, Eric Anholt wrote:
>> Stephen Warren <swarren at wwwdotorg.org> writes:
>>> On 04/29/15 11:51, Eric Anholt wrote:
>>>> Stephen Warren <swarren at wwwdotorg.org> writes:
>>>>> On 04/27/2015 05:14 PM, Eric Anholt wrote:
>>>>>> This gives us a function for making mailbox property channel requests
>>>>>> of the firmware, and uses it to control the 3 power domains provided
>>>>>> by the firmware.
>>>>>> diff --git a/arch/arm/mach-bcm/raspberrypi-firmware.c b/arch/arm/mach-bcm/raspberrypi-firmware.c
>>>>>> +/*
>>>>>> + * Submits a set of concatenated tags to the VPU firmware through the
>>>>>> + * mailbox property interface.
>>>>>> + *
>>>>>> + * The buffer header and the ending tag are added by this function and
>>>>>> + * don't need to be supplied, just the actual tags for your operation.
>>>>>> + * See struct raspberrypi_firmware_property_tag_header for the per-tag structure.
>>>>>> + */
>>>>>> +int raspberrypi_firmware_property(void *data, size_t tag_size)
>>>>>> +{
>>>>>> +	size_t size = tag_size + 12;
>>>>>> +	u32 *buf;
>>>>>> +	dma_addr_t bus_addr;
>>>>>> +	int ret = 0;
>>>>>> +
>>>>>> +	if (!firmware)
>>>>>> +		return -EPROBE_DEFER;
>>>>> I think it'd make more sense if the clients looked up the firmware
>>>>> driver via phandle at their probe time. This would mean:
>>>>> * No need for global "firmware", since clients could pass the firmware
>>>>> driver handle into this function.
>>>>> * Clients resolve deferred probe at their probe time. That way, they
>>>>> won't register themselves with subsystems asserting they can provide
>>>>> services, but find out they can't yet provide the service at that time.
>>>> The one client so far (vc4) was resolving deferred probe at its probe
>>>> time, but not taking a reference on the firmware driver.  I figure I'll
>>>> have it do the phandle lookup and refcount -- do you still want the
>>>> struct platform_device passed in here?  If we de-global firmware, it's
>>>> going to mean some faffing in the power domain side of things to find
>>>> the device again, it seems.
>>> I think I'd expect the API in the firmware driver to require the client
>>> to pass the client DT node pointer plus a property name, and do all the
>>> lookup itself. That's what most DT resource lookup APIs in the kernel do
>>> now.
>> I've made this change, but it's not great -- the client has to know some
>> details of how this driver is structured (that it sets the drvdata) in
>> order to figure out whether the driver is loaded or not and return
>> -EPROBE_DEFERRED.  I couldn't find any other existing solutions than
>> that in the tree.
> The client shouldn't need to know that.
> I'd expect the client to pass a DT node pointer to the provider's 
> driver, and that provider driver would know and isolate all the details 
> about its own internals. The provider could return some kind of 
> handler/... to the provider device if required.
> I would expect any subsystem that supports client->provider references 
> in DT would have an example of this (e.g. IRQs, GPIOs, regulators, ...). 
> However, the code for those can be rather complex to dive into for the 
> first time. For a fairly simple standalone example, check out:
> Provider:
> drivers/amba/tegra-ahb.c
> tegra_ahb_enable_smmu()
> Consumer:
> drivers/iommu/tegra-smmu.c
> tegra_smmu_ahb_enable()
> (called from tegra_smmu_probe() in the same file)

It's somewhat suspicious to me as an example of how -EPROBE_DEFER ought
to work, that tegra_ahb_enable_smmu()'s return value isn't being checked
by tegra_smmu_ahb_enable().

That said, this looks like this is "Yeah, just call into the producer
driver to do setup, and if it returns -EPROBE_DEFER, then bail out and
return -EPROBE_DEFER, yourself."  That's what I was doing in this
function and its consumers, that you commented on, only I wasn't passing
in the dt node.  Is that all you wanted changed?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-rpi-kernel/attachments/20150512/1e75a572/attachment.sig>

More information about the linux-rpi-kernel mailing list