Re: [PATCH v3 3/8] clk: shmobile: Add MSTP clock support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi Mark,

I'd like to send v4 of this series soon, hopefully for the last time. Would 
you be able to reply to the two issues that are still left and discussed below 
? That would be really appreciated.

On Wednesday 20 November 2013 22:54:58 Laurent Pinchart wrote:
> On Tuesday 19 November 2013 18:19:36 Mark Rutland wrote:
> > On Tue, Nov 19, 2013 at 05:00:40PM +0000, Laurent Pinchart wrote:
> > > On Tuesday 19 November 2013 16:28:21 Mark Rutland wrote:
> > > > On Tue, Nov 19, 2013 at 02:45:42PM +0000, Laurent Pinchart wrote:
> > > > > MSTP clocks are gate clocks controlled through a register that
> > > > > handles up to 32 clocks. The register is often sparsely populated.
> > > > 
> > > > Does that mean some clocks aren't wired up, or that some clocks don't
> > > > exist at all?
> > > 
> > > It means that some of the bits don't control anything.
> > > 
> > > > What is the behaviour of the unpopulated bits?
> > > 
> > > According to the datasheet they're reserved, read-only, and read an
> > > unspecified value that is to be written back without modification when
> > > writing the register.
> > 
> > Ok.
> > 
> > > > > Those clocks are found on Renesas ARM SoCs.
> > > > > 
> > > > > Cc: devicetree@xxxxxxxxxxxxxxx
> > > > > Signed-off-by: Laurent Pinchart
> > > > > <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
> > > > > ---
> > > > > 
> > > > >  .../bindings/clock/renesas,cpg-mstp-clocks.txt     |  48 +++++
> > > > >  drivers/clk/shmobile/Makefile                      |   1 +
> > > > >  drivers/clk/shmobile/clk-mstp.c                    | 229 ++++++++++
> > > > >  3 files changed, 278 insertions(+)
> > > > >  create mode 100644
> > > > >  Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
> > > > >  create mode 100644 drivers/clk/shmobile/clk-mstp.c
> > > > > 
> > > > > diff --git
> > > > > a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-
> > > > > clocks.txt
> > > > > b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-
> > > > > clocks.txt
> > > > > new file mode 100644
> > > > > index 0000000..126b17e
> > > > > --- /dev/null
> > > > > +++
> > > > > b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-
> > > > > clocks.txt
> > > > > @@ -0,0 +1,48 @@
> > > > > +* Renesas CPG Module Stop (MSTP) Clocks
> > > > > +
> > > > > +The CPG can gate SoC device clocks. The gates are organized in
> > > > > groups of up to
> > > > > +32 gates.
> > > > > +
> > > > > +This device tree binding describes a single 32 gate clocks group
> > > > > per node.
> > > > > +Clocks are referenced by user nodes by the MSTP node phandle and
> > > > > the clock
> > > > > +index in the group, from 0 to 31.
> > > > > +
> > > > > +Required Properties:
> > > > > +
> > > > > +  - compatible: Must be one of the following
> > > > > +    - "renesas,r8a7790-mstp-clocks" for R8A7790 (R-Car H2) MSTP
> > > > > gate clocks
> > > > > +    - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2) MSTP
> > > > > gate clocks
> > > > > +    - "renesas,cpg-mstp-clock" for generic MSTP gate clocks
> > > > > +  - reg: Base address and length of the memory resource used by the
> > > > > MSTP
> > > > > +    clocks
> > > > 
> > > > There are two entries in the example, the code seems to assume they
> > > > are particular registers, but this implies one.
> > > 
> > > There can be one or two registers, depending on the hardware. The first
> > > register is always required and controls the clocks, the second register
> > > is optional (in the sense that it's not implemented for some of the MSTP
> > > instances) and reports the clock status.
> > 
> > Ok. The documentation should note this.
> 
> What about
> 
>   - reg: Base address and length of the I/O mapped registers used by the
> MSTP clocks. The first register is the clock control register and is
> mandatory. The second register is the clock status register and is optional
> when not implemented in hardware.
> 
> > > > Are these not part of a larger bank of registers?
> > > 
> > > They are. Here's the memory map for the r8a7791 for instance.
> > > 
> > > MSTPSR0		H'E615 0030
> > > MSTPSR1		H'E615 0038
> > > MSTPSR2		H'E615 0040
> > > MSTPSR3		H'E615 0048
> > > MSTPSR4		H'E615 004C
> > > MSTPSR5		H'E615 003C
> > > MSTPSR6		H'E615 01C0
> > > MSTPSR7		H'E615 01C4
> > > MSTPSR8		H'E615 09A0
> > > MSTPSR9		H'E615 09A4
> > > MSTPSR10		H'E615 09A8
> > > MSTPSR11		H'E615 09AC
> > > 
> > > SMSTPCR0		H'E615 0130
> > > SMSTPCR1		H'E615 0134
> > > SMSTPCR2		H'E615 0138
> > > SMSTPCR3		H'E615 013C
> > > SMSTPCR4		H'E615 0140
> > > SMSTPCR5		H'E615 0144
> > > SMSTPCR6		H'E615 0148
> > > SMSTPCR7		H'E615 014C
> > > SMSTPCR8		H'E615 0990
> > > SMSTPCR9		H'E615 0994
> > > SMSTPCR10		H'E615 0998
> > > SMSTPCR11		H'E615 099C
> > > 
> > > I've pondered whether we should use a single device node for all the
> > > MSTP clocks, but I don't think it would be very practical. Not only
> > > would we need to encode all bit positions, we also would have to encode
> > > register offsets in DT. This would become pretty messy in a single node.
> > > 
> > > > > +  - clocks: Reference to the parent clocks
> > > > 
> > > > How many, and what do they correspond to?
> > > 
> > > What about
> > > 
> > > - clocks: Reference to the parent clocks, one per output clock. The
> > > parents must appear in the same order as the output clocks.
> > 
> > That sounds reasonable.
> > 
> > > > > +  - #clock-cells: Must be 1
> > > > > +  - clock-output-names: The name of the clocks as free-form strings
> > > > > +  - renesas,indices: Indices of the gate clocks into the group (0
> > > > > to 31)
> > > > 
> > > > The description of this property doesn't describe half of what it
> > > > means. I believe something like the below does:
> > > > 
> > > > - renesas,indices: A list of clock IDs (single cells), one for each
> > > >   clock present. Each entry may correspond to a clock-output-names
> > > >   entry at the same index, and its location in the list defines the
> > > >   corresponding clock-specifier for the entry.
> > > 
> > > I might be mistaken, but doesn't "its location in the list defines the
> > > corresponding clock-specifier for the entry" imply that clock specifiers
> > > use the location in the list as the clock ID instead of the numerical
> > > value of the indices entry ? Each entry in the renesas,indices list
> > > corresponds to one clocks entry and one clock-output-names entry, and
> > > clock users reference an MSTP clock using the value of its indices
> > > entry, not the position of the entry.
> > 
> > Sorry, the code confused me. Having read over it again, I'm even more
> > confused.
> > 
> > You said the registers were sparesly populated, but the code assumes
> > that the bits start at 0 and the set of populated bits are contiguous,
> > which is not what I would describe that as sparse. Are the bits always
> > contiguous?
> 
> They're not, and the code doesn't assume so. The driver loops over all the
> clocks using the position in the renesas,indices array as the loop counter
> i. It then retrieves the output name, the parent and the index and
> registers the clock. When registration succeeds, the clock is stored in the
> clks array at the index corresponding to the renesas,indices value. The
> clks array is thus sparsely populated, exactly as the MSTP register.
> 
> > I thought the bits in the register were truly sparse (i.e. you could
> > have two bits which were at either end of the register), and the indices
> > property allowed you to define the set of bits which were valid.
> > 
> > As far as I can see from cpg_mstp_clocks_init and
> > cpg_mstp_clock_register, the indices property assings the set of IDs for
> > consumers to use, and I don't see what the point of that is if we
> > already have a well-defined linear index (the bit position in the
> > register) which we could use instead, which also makes the binding and
> > code simpler.
> > 
> > > > I'd imagine we have a few sparse clocks by now, and we might be able
> > > > to make this more uniform. But I may be mistaken.
> > > > 
> > > > [...]
> > > > 
> > > > > +static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
> > > > > +{
> > > > > +	struct mstp_clock *clock = to_mstp_clock(hw);
> > > > > +	struct mstp_clock_group *group = clock->group;
> > > > > +	u32 bitmask = BIT(clock->bit_index);
> > > > > +	unsigned long flags;
> > > > > +	unsigned int i;
> > > > > +	u32 value;
> > > > > +
> > > > > +	spin_lock_irqsave(&group->lock, flags);
> > > > > +
> > > > > +	value = clk_readl(group->smstpcr);
> > > > > +	if (enable)
> > > > > +		value &= ~bitmask;
> > > > > +	else
> > > > > +		value |= bitmask;
> > > > > +	clk_writel(value, group->smstpcr);
> > > > > +
> > > > > +	spin_unlock_irqrestore(&group->lock, flags);
> > > > > +
> > > > > +	if (!enable || !group->mstpsr)
> > > > > +		return 0;
> > > > > +
> > > > > +	for (i = 1000; i > 0; --i) {
> > > > > +		if (!(clk_readl(group->mstpsr) & bitmask))
> > > > > +			break;
> > > > > +		cpu_relax();
> > > > > +	}
> > > > 
> > > > Any particular reason for 1000 times? Is there a known minimum time to
> > > > switch a clock between disabled and enabled? A comment would be nice.
> > > 
> > > There's no particular reason, the datasheet doesn't provide any useful
> > > information. I've just copied that value from existing C code.
> > 
> > Any chance it might work without?
> 
> Yes, with roughly a 75% chance :-) Without this look I get a crash around
> once every four times with the video processing devices. Other devices are
> affected as well, but delays in their respective drivers hide the problem.

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux