* [PATCH v2 2/4] spi: spi-fsl-dspi: Fix continuous selection format
From: maitysanchayan at gmail.com @ 2016-11-22 6:11 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <59ac10adfe92916770aa30146e958887@agner.ch>
On 16-11-21 15:15:41, Stefan Agner wrote:
> On 2016-11-20 21:54, Sanchayan Maity wrote:
> > Current DMA implementation was not handling the continuous selection
> > format viz. SPI chip select would be deasserted even between sequential
> > serial transfers. Use the cs_change variable and correctly set or
> > reset the CONT bit accordingly for case where peripherals require
> > the chip select to be asserted between sequential transfers.
> >
> > Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
> > ---
> > drivers/spi/spi-fsl-dspi.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
> > index b1ee1f5..41422cd 100644
> > --- a/drivers/spi/spi-fsl-dspi.c
> > +++ b/drivers/spi/spi-fsl-dspi.c
> > @@ -261,6 +261,8 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
> > dspi->dma->tx_dma_buf[i] = SPI_PUSHR_TXDATA(val) |
> > SPI_PUSHR_PCS(dspi->cs) |
> > SPI_PUSHR_CTAS(0);
> > + if (!dspi->cs_change)
> > + dspi->dma->tx_dma_buf[i] |= SPI_PUSHR_CONT;
> > dspi->tx += tx_word + 1;
> >
> > dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx,
>
> Other transfer mode use:
>
> if ((dspi->cs_change) && (!dspi->len))
>
> dspi_pushr &= ~SPI_PUSHR_CONT;
>
> which indicates that they only clear SPI_PUSHR_CONT at the very end of a
> transfer... The DMA code currently deselects after every DMA transfer if
> dspi->cs_change is set.
>
> Maybe we should use the helper dspi_data_to_pushr to fill the DMA buffer
> and _clear_ SPI_PUSHR_CONT if necessary like the other transfer modes
> do... Then we can use the for loop to fill the complete buffer and get
> rid of some code dupplication.
>
> I see that dspi_data_to_pushr does move len too, which we did not in the
> DMA case. dspi->len gets incremented only on successful DMA transfer in
> dspi_dma_xfer. However, I wonder if that is not even a bug: We increment
> dspi->tx always, but len only on success. This makes len go off sync
> with regards to the tx pointer which does not help anybody. So lets get
> rid of the update code in dspi_dma_xfer
>
Thanks for the feedback. Using dspi_data_to_pushr really cleans up that
tx path very nicely. Why didn't I see it. Will send a follow up patch
soon after testing again.
- Sanchayan.
^ permalink raw reply
* [PATCH v2 4/4] spi: spi-fsl-dspi: Minor code cleanup and error path fixes
From: maitysanchayan at gmail.com @ 2016-11-22 6:12 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <43b518a92352986f09b0893646ff8016@agner.ch>
On 16-11-21 15:22:09, Stefan Agner wrote:
> On 2016-11-20 21:54, Sanchayan Maity wrote:
> > Code cleanup for improving code readability and error path fixes
> > and cleanup removing use of devm_kfree.
>
> Two things in one, not very nice. Especially the dma_free_coherent is
> really a bug and the other is a cleanup. Can you make a separate patch
> for the bug?
>
> As for the cleanup, I don't like the one line conditions too, but I
> don't think it is worth a patch. At least the TX path should be solved
> with my suggestion in patch 2.
Agreed.
- Sanchayan.
>
> --
> Stefan
>
> >
> > Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
> > ---
> > drivers/spi/spi-fsl-dspi.c | 22 ++++++++++++++++------
> > 1 file changed, 16 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
> > index 08882f7..2987a16 100644
> > --- a/drivers/spi/spi-fsl-dspi.c
> > +++ b/drivers/spi/spi-fsl-dspi.c
> > @@ -226,8 +226,10 @@ static void dspi_rx_dma_callback(void *arg)
> > if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) {
> > for (i = 0; i < dma->curr_xfer_len; i++) {
> > d = dspi->dma->rx_dma_buf[i];
> > - rx_word ? (*(u16 *)dspi->rx = d) :
> > - (*(u8 *)dspi->rx = d);
> > + if (rx_word)
> > + *(u16 *)dspi->rx = d;
> > + else
> > + *(u8 *)dspi->rx = d;
> > dspi->rx += rx_word + 1;
> > }
> > }
> > @@ -247,14 +249,20 @@ static int dspi_next_xfer_dma_submit(struct
> > fsl_dspi *dspi)
> > tx_word = is_double_byte_mode(dspi);
> >
> > for (i = 0; i < dma->curr_xfer_len - 1; i++) {
> > - val = tx_word ? *(u16 *) dspi->tx : *(u8 *) dspi->tx;
> > + if (tx_word)
> > + val = *(u16 *) dspi->tx;
> > + else
> > + val = *(u8 *) dspi->tx;
> > dspi->dma->tx_dma_buf[i] =
> > SPI_PUSHR_TXDATA(val) | SPI_PUSHR_PCS(dspi->cs) |
> > SPI_PUSHR_CTAS(0) | SPI_PUSHR_CONT;
> > dspi->tx += tx_word + 1;
> > }
> >
> > - val = tx_word ? *(u16 *) dspi->tx : *(u8 *) dspi->tx;
> > + if (tx_word)
> > + val = *(u16 *) dspi->tx;
> > + else
> > + val = *(u8 *) dspi->tx;
> > dspi->dma->tx_dma_buf[i] = SPI_PUSHR_TXDATA(val) |
> > SPI_PUSHR_PCS(dspi->cs) |
> > SPI_PUSHR_CTAS(0);
> > @@ -430,9 +438,11 @@ static int dspi_request_dma(struct fsl_dspi
> > *dspi, phys_addr_t phy_addr)
> > return 0;
> >
> > err_slave_config:
> > - devm_kfree(dev, dma->rx_dma_buf);
> > + dma_free_coherent(dev, DSPI_DMA_BUFSIZE,
> > + dma->rx_dma_buf, dma->rx_dma_phys);
> > err_rx_dma_buf:
> > - devm_kfree(dev, dma->tx_dma_buf);
> > + dma_free_coherent(dev, DSPI_DMA_BUFSIZE,
> > + dma->tx_dma_buf, dma->tx_dma_phys);
> > err_tx_dma_buf:
> > dma_release_channel(dma->chan_tx);
> > err_tx_channel:
^ permalink raw reply
* [PATCH v2 1/5] ARM: memory: da8xx-ddrctl: new driver
From: Sekhar Nori @ 2016-11-22 6:25 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <5833A2DA.40701@gmail.com>
Hi Frank,
On Tuesday 22 November 2016 07:13 AM, Frank Rowand wrote:
> On 11/21/16 08:33, Sekhar Nori wrote:
>> On Monday 31 October 2016 08:15 PM, Bartosz Golaszewski wrote:
>>> +static int da8xx_ddrctl_probe(struct platform_device *pdev)
>>> +{
>>> + const struct da8xx_ddrctl_config_knob *knob;
>>> + const struct da8xx_ddrctl_setting *setting;
>>> + struct device_node *node;
>>> + struct resource *res;
>>> + void __iomem *ddrctl;
>>> + struct device *dev;
>>> + u32 reg;
>>> +
>>> + dev = &pdev->dev;
>>> + node = dev->of_node;
>>> +
>>> + setting = da8xx_ddrctl_get_board_settings();
>>> + if (!setting) {
>>> + dev_err(dev, "no settings for board '%s'\n",
>>> + of_flat_dt_get_machine_name());
>>> + return -EINVAL;
>>> + }
>>
>> This causes a section mismatch because of_flat_dt_get_machine_name()
>> has an __init annotation. I did not notice that before, sorry.
>>
>> It can be fixed with a patch like below:
>>
>> ---8<---
>> diff --git a/drivers/memory/da8xx-ddrctl.c b/drivers/memory/da8xx-ddrctl.c
>> index a20e7bbbcbe0..9ca5aab3ac54 100644
>> --- a/drivers/memory/da8xx-ddrctl.c
>> +++ b/drivers/memory/da8xx-ddrctl.c
>> @@ -102,6 +102,18 @@ static const struct da8xx_ddrctl_setting *da8xx_ddrctl_get_board_settings(void)
>> return NULL;
>> }
>>
>> +static const char* da8xx_ddrctl_get_machine_name(void)
>> +{
>> + const char *str;
>> + int ret;
>> +
>> + ret = of_property_read_string(of_root, "model", &str);
>> + if (ret)
>> + ret = of_property_read_string(of_root, "compatible", &str);
>> +
>> + return str;
>> +}
>> +
>> static int da8xx_ddrctl_probe(struct platform_device *pdev)
>> {
>> const struct da8xx_ddrctl_config_knob *knob;
>> @@ -118,7 +130,7 @@ static int da8xx_ddrctl_probe(struct platform_device *pdev)
>> setting = da8xx_ddrctl_get_board_settings();
>> if (!setting) {
>> dev_err(dev, "no settings for board '%s'\n",
>> - of_flat_dt_get_machine_name());
>
> da8xx_ddrctl_get_board_settings() tries to match based on the "compatible"
> property in the root node. The "model" property in the root node has
> nothing to do with the failure to match. So creating and then using
> da8xx_ddrctl_get_machine_name() to potentially report model is not useful.
>
> It should be sufficient to simply report that no compatible matched.
I agree with you on this. Even if model name is printed, you will have
to go back and check the compatible anyway. But I think it will be
useful to print the compatible instead of just reporting that nothing
matched.
Bartosz, if you agree too, could you send a fix patch just printing the
compatible?
Thanks,
Sekhar
^ permalink raw reply
* [PATCH v3 0/3] Fixes for Vybrid SPI DMA implementation
From: Sanchayan Maity @ 2016-11-22 7:01 UTC (permalink / raw)
To: linux-arm-kernel
Hello,
This v3 set of patches have fixes for Vybrid SPI DMA
implementation and is rebased on top of latest topic/fsl-dspi.
http://git.kernel.org/cgit/linux/kernel/git/broonie/spi.git/log/?h=topic/fsl-dspi
The patches have been tested on a Toradex Colibri Vybrid VF61 module
and now incoporate feedback from Stefan on version 2 of patchset.
Changes since v2:
1. Drop the patch "Fix SPI transfer issue when using multiple SPI_IOC_MESSAGE"
since it's now applied and rebase the whole patchset
2. Second patch in this series "Fix continuous selection format" now
fixes the issue using an existing function and handling it similar to
existing EOQ mode and also cleaning up nicely the transmit code path.
3. Third patch now just fixes the incorrect freeing of DMA allocated buffers
and drops the minor clean up patch from earlier series completely due to
the clean up from 2 above.
Changes since v1:
1. Place the continuous selection format patch second in order and remove
code duplication
2. Improve the use of curr_xfer_len and instead of converting from bytes
to DMA transfers in every use, do it at a single place. Accordingly change
it's use at other places
3. Code cleanup patch has less to clean with change above
v2:
https://www.spinics.net/lists/arm-kernel/msg543941.html
v1:
http://www.mail-archive.com/linux-kernel at vger.kernel.org/msg1274632.html
Thanks & Regards,
Sanchayan.
Sanchayan Maity (3):
spi: spi-fsl-dspi: Fix incorrect DMA setup
spi: spi-fsl-dspi: Fix continuous selection format
spi: spi-fsl-dspi: Fix incorrect freeing of DMA allocated buffers
drivers/spi/spi-fsl-dspi.c | 59 +++++++++++++++++++++-------------------------
1 file changed, 27 insertions(+), 32 deletions(-)
--
2.10.2
^ permalink raw reply
* [PATCH v3 1/3] spi: spi-fsl-dspi: Fix incorrect DMA setup
From: Sanchayan Maity @ 2016-11-22 7:01 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <cover.1479796821.git.maitysanchayan@gmail.com>
Currently dmaengine_prep_slave_single was being called with length
set to the complete DMA buffer size. This resulted in unwanted bytes
being transferred to the SPI register leading to clock and MOSI lines
having unwanted data even after chip select got deasserted and the
required bytes having been transferred.
While at it also clean up the use of curr_xfer_len which is central
to the DMA setup, from bytes to DMA transfers for every use.
Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
Reviewed-by: Stefan Agner <stefan@agner.ch>
---
drivers/spi/spi-fsl-dspi.c | 35 ++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index b1ee1f5..911aadb 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -151,6 +151,7 @@ static const struct fsl_dspi_devtype_data ls2085a_data = {
};
struct fsl_dspi_dma {
+ /* Length of transfer in words of DSPI_FIFO_SIZE */
u32 curr_xfer_len;
u32 *tx_dma_buf;
@@ -217,15 +218,13 @@ static void dspi_rx_dma_callback(void *arg)
struct fsl_dspi *dspi = arg;
struct fsl_dspi_dma *dma = dspi->dma;
int rx_word;
- int i, len;
+ int i;
u16 d;
rx_word = is_double_byte_mode(dspi);
- len = rx_word ? (dma->curr_xfer_len / 2) : dma->curr_xfer_len;
-
if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) {
- for (i = 0; i < len; i++) {
+ for (i = 0; i < dma->curr_xfer_len; i++) {
d = dspi->dma->rx_dma_buf[i];
rx_word ? (*(u16 *)dspi->rx = d) :
(*(u8 *)dspi->rx = d);
@@ -242,14 +241,12 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
struct device *dev = &dspi->pdev->dev;
int time_left;
int tx_word;
- int i, len;
+ int i;
u16 val;
tx_word = is_double_byte_mode(dspi);
- len = tx_word ? (dma->curr_xfer_len / 2) : dma->curr_xfer_len;
-
- for (i = 0; i < len - 1; i++) {
+ for (i = 0; i < dma->curr_xfer_len - 1; i++) {
val = tx_word ? *(u16 *) dspi->tx : *(u8 *) dspi->tx;
dspi->dma->tx_dma_buf[i] =
SPI_PUSHR_TXDATA(val) | SPI_PUSHR_PCS(dspi->cs) |
@@ -265,7 +262,9 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx,
dma->tx_dma_phys,
- DSPI_DMA_BUFSIZE, DMA_MEM_TO_DEV,
+ dma->curr_xfer_len *
+ DMA_SLAVE_BUSWIDTH_4_BYTES,
+ DMA_MEM_TO_DEV,
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (!dma->tx_desc) {
dev_err(dev, "Not able to get desc for DMA xfer\n");
@@ -281,7 +280,9 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
dma->rx_desc = dmaengine_prep_slave_single(dma->chan_rx,
dma->rx_dma_phys,
- DSPI_DMA_BUFSIZE, DMA_DEV_TO_MEM,
+ dma->curr_xfer_len *
+ DMA_SLAVE_BUSWIDTH_4_BYTES,
+ DMA_DEV_TO_MEM,
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (!dma->rx_desc) {
dev_err(dev, "Not able to get desc for DMA xfer\n");
@@ -328,17 +329,17 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)
struct device *dev = &dspi->pdev->dev;
int curr_remaining_bytes;
int bytes_per_buffer;
- int tx_word;
+ int word = 1;
int ret = 0;
- tx_word = is_double_byte_mode(dspi);
+ if (is_double_byte_mode(dspi))
+ word = 2;
curr_remaining_bytes = dspi->len;
+ bytes_per_buffer = DSPI_DMA_BUFSIZE / DSPI_FIFO_SIZE;
while (curr_remaining_bytes) {
/* Check if current transfer fits the DMA buffer */
- dma->curr_xfer_len = curr_remaining_bytes;
- bytes_per_buffer = DSPI_DMA_BUFSIZE /
- (DSPI_FIFO_SIZE / (tx_word ? 2 : 1));
- if (curr_remaining_bytes > bytes_per_buffer)
+ dma->curr_xfer_len = curr_remaining_bytes / word;
+ if (dma->curr_xfer_len > bytes_per_buffer)
dma->curr_xfer_len = bytes_per_buffer;
ret = dspi_next_xfer_dma_submit(dspi);
@@ -347,7 +348,7 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)
goto exit;
} else {
- curr_remaining_bytes -= dma->curr_xfer_len;
+ curr_remaining_bytes -= dma->curr_xfer_len * word;
if (curr_remaining_bytes < 0)
curr_remaining_bytes = 0;
dspi->len = curr_remaining_bytes;
--
2.10.2
^ permalink raw reply related
* [PATCH v3 2/3] spi: spi-fsl-dspi: Fix continuous selection format
From: Sanchayan Maity @ 2016-11-22 7:01 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <cover.1479796821.git.maitysanchayan@gmail.com>
Current DMA implementation was not handling the continuous selection
format viz. SPI chip select would be deasserted even between sequential
serial transfers.
Use existing dspi_data_to_pushr function to restructure the transmit
code path and set or reset the CONT bit on same lines as code path
in EOQ mode does. This correctly implements continuous selection format
while also correcting and cleaning up the transmit code path.
Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
---
drivers/spi/spi-fsl-dspi.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 911aadb..8af3151 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -196,6 +196,8 @@ struct fsl_dspi {
struct fsl_dspi_dma *dma;
};
+static u32 dspi_data_to_pushr(struct fsl_dspi *dspi, int tx_word);
+
static inline int is_double_byte_mode(struct fsl_dspi *dspi)
{
unsigned int val;
@@ -242,24 +244,15 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
int time_left;
int tx_word;
int i;
- u16 val;
tx_word = is_double_byte_mode(dspi);
- for (i = 0; i < dma->curr_xfer_len - 1; i++) {
- val = tx_word ? *(u16 *) dspi->tx : *(u8 *) dspi->tx;
- dspi->dma->tx_dma_buf[i] =
- SPI_PUSHR_TXDATA(val) | SPI_PUSHR_PCS(dspi->cs) |
- SPI_PUSHR_CTAS(0) | SPI_PUSHR_CONT;
- dspi->tx += tx_word + 1;
+ for (i = 0; i < dma->curr_xfer_len; i++) {
+ dspi->dma->tx_dma_buf[i] = dspi_data_to_pushr(dspi, tx_word);
+ if ((dspi->cs_change) && (!dspi->len))
+ dspi->dma->tx_dma_buf[i] &= ~SPI_PUSHR_CONT;
}
- val = tx_word ? *(u16 *) dspi->tx : *(u8 *) dspi->tx;
- dspi->dma->tx_dma_buf[i] = SPI_PUSHR_TXDATA(val) |
- SPI_PUSHR_PCS(dspi->cs) |
- SPI_PUSHR_CTAS(0);
- dspi->tx += tx_word + 1;
-
dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx,
dma->tx_dma_phys,
dma->curr_xfer_len *
@@ -351,7 +344,6 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)
curr_remaining_bytes -= dma->curr_xfer_len * word;
if (curr_remaining_bytes < 0)
curr_remaining_bytes = 0;
- dspi->len = curr_remaining_bytes;
}
}
--
2.10.2
^ permalink raw reply related
* [PATCH v3 3/3] spi: spi-fsl-dspi: Fix incorrect freeing of DMA allocated buffers
From: Sanchayan Maity @ 2016-11-22 7:01 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <cover.1479796821.git.maitysanchayan@gmail.com>
Buffers allocated with a call to dma_alloc_coherent should be
freed with dma_free_coherent instead of the currently used
devm_kfree.
Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
---
drivers/spi/spi-fsl-dspi.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 8af3151..7ada112 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -420,9 +420,11 @@ static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)
return 0;
err_slave_config:
- devm_kfree(dev, dma->rx_dma_buf);
+ dma_free_coherent(dev, DSPI_DMA_BUFSIZE,
+ dma->rx_dma_buf, dma->rx_dma_phys);
err_rx_dma_buf:
- devm_kfree(dev, dma->tx_dma_buf);
+ dma_free_coherent(dev, DSPI_DMA_BUFSIZE,
+ dma->tx_dma_buf, dma->tx_dma_phys);
err_tx_dma_buf:
dma_release_channel(dma->chan_tx);
err_tx_channel:
--
2.10.2
^ permalink raw reply related
* [BUG] hdlcd gets confused about base address
From: Daniel Vetter @ 2016-11-22 7:02 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161121145528.GI1041@n2100.armlinux.org.uk>
On Mon, Nov 21, 2016 at 02:55:28PM +0000, Russell King - ARM Linux wrote:
> On Mon, Nov 21, 2016 at 02:30:53PM +0000, Russell King - ARM Linux wrote:
> > On Mon, Nov 21, 2016 at 01:24:19PM +0000, Russell King - ARM Linux wrote:
> > > On Mon, Nov 21, 2016 at 12:56:53PM +0000, Liviu Dudau wrote:
> > > > That is mostly due to the check in hdlcd_crtc_disable() which I should
> > > > remove, I've added it because I was getting a ->disable() hook call
> > > > before any ->enable() was called at startup time. I need to revisit
> > > > this as I remember Daniel was commenting that this was not needed.
> > >
> > > Removing that test results in:
> > >
> > > [drm:drm_atomic_helper_commit_cleanup_done] *ERROR* [CRTC:24:crtc-0] flip_done timed out
> > >
> > > and the kernel hanging, seemingly in an IRQs-off region.
> >
> > Annoyingly, enabling DRM debug prevents the kernel hanging...
>
> I've been trying to trace through what's happening with this flip_done
> stuff, but I'm finding it _extremely_ difficult to follow the atomic
> code.
>
> (Sorry, I'm going to go over my usual 72 column limit for this due to
> the damn long DRM function names.)
>
> I can see that drm_atomic_helper_commit() calls drm_atomic_helper_setup_commit()
> which sets up commit->flip_done for each CRTC, and sets up an event for
> each.
>
> drm_atomic_helper_commit() continues on to eventually call drm_atomic_helper_swap_state()
> which then swaps the state for the CRTCs, but then ends up dropping
> the event reference:
>
> state->crtcs[i].commit->event = NULL;
>
> What I can't see is why this isn't a leaked pointer - I don't see
> anything inbetween taking charge of that structure. The _commit_
> hasn't been swapped from what I can see, it's just state->crtcs[i].state
> that have been swapped.
The event is also stored in crtc_state->event, which after swap_states
land in drm_crtc->state->event, which is the place drivers are supposed to
pick it up from for delivery.
> So I can't see who's responsible for generating this event, or how the
> backend DRM drivers get to know about this event, and that they should
> complete the flip.
>
> What I also don't get is why DRM is wanting to wait for a flip event
> when we're disabling the CRTC. None of this makes sense to me, like
> much of the atomic modeset code...
The DRM event has two uses:
- high-precision timestamp for when the new frame starts displaying.
- confirmation that the old buffers are no longer being used by the hw.
This is used on Android's drm_hwcomposer in the new hwc2 mode.
Note that the crtc_state->event has 3 uses in total, all hidden behind the
abstraction:
- flip_done, for the atomic helpers
- drm event, for current userspace (also needed to emulate legacy flips)
- and out-fences, needed by android.
The trouble with ->event delivery was that many drivers didn't bother to
implement this at all, since driver submitters never even tested
pageflippping. And for those maintainers that did test pageflipping, they
only ever tested the legacy page_flip paths, which e.g. doesn't ever ask
for an event when disabling the CRTC (since you can't do that). But atomic
allows all this, and review wasn't enough to fight the influx of bad
drivers. Hence I opted to make the nonblocking support in the atomic
helpers enforce this part of the abi contract, even for blocking modesets.
If you're stuck on a flip_done, then your driver doesn't send out events
when disabling the CRTC.
All the waits have a 10s timeout, and none of them are in atomic contexts,
so no idea why this takes down your box. I suspect it's something
unrelated.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
^ permalink raw reply
* [PATCH 2/2] MAINTAINERS: Add myself as co-maintainer to fpga mgr framework.
From: Michal Simek @ 2016-11-22 7:48 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <alpine.DEB.2.20.1611212021050.3633@atull-VirtualBox2>
On 22.11.2016 03:29, atull wrote:
> On Mon, 21 Nov 2016, Moritz Fischer wrote:
>
>> Add myself as co-maintainer to fpga mgr framework.
>>
>> Signed-off-by: Moritz Fischer <mdf@kernel.org>
>> Cc: Alan Tull <atull@opensource.altera.com>
>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>> Cc: linux-kernel at vger.kernel.org
>> Cc: linux-fpga at vger.kernel.org
>> ---
>> Hi all,
>>
>> Lately we've fallen behind a bit on reviewing patches lately.
>
> Hi Moritz,
>
> drivers/fpga has been in the upstream kernel a year now. Most of that
> time, traffic has been very slow. Recently we had more traffic while
> I was travelling and moving to a new office, both cases leaving me
> with bad network connectivity. Things will probably return to normal.
> I appreciate your passion and all your effort reviewing stuff. I
> don't see a need for two maintainers at this point.
TBH. I think it is not a bad option. I do normally have backup person
for all repos I do maintain. It doesn't mean that second maintainer does
something but it has all accesses to repos you maintain.
It means if something really happens to you (hopefully not) than this
person can continue in this work without any delay which is not a bad
thing.
It is really just about talking to each other what that second person
will do - probably just review patches as is done now. You can also
learn from each other.
I would like to be involved more in this but unfortunately I don't have
enough time to do it properly.
Regarding maintaining this repo. It is just standard process. Apply
sensible things, well described and test it. And then send pull request
to Greg based on signed tags and you are done.
Greg should told you what should be the base which you should use for
pull request. Someone is taking patches based on rc1 tag, someone is
rebasing it on the final tag.
Acked-by: Michal Simek <michal.simek@xilinx.com>
Thanks,
Michal
^ permalink raw reply
* [PATCH 0/6] add hisilicon reset
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
Add reset-hi3660.c
Update reset-hi6220 as well
reset.c is shared by reset-hi3660.c and reset-hi6220.c
Change hi6220.dtsi accordingly
Zhangfei Gao (6):
reset: hisilicon: add reset core
dt-bindings: Document the hi3660 reset bindings
reset: hisilicon: add reset-hi3660
dt-bindings: change hi6220-reset.txt according to reset-hi6220.c
reset: hisilicon: Use new driver reset-hi6222
arm64: dts: hi6220: update reset node according to reset-hi6220.c
.../bindings/reset/hisilicon,hi3660-reset.txt | 42 ++++++
.../bindings/reset/hisilicon,hi6220-reset.txt | 14 +-
arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 20 ++-
drivers/reset/Makefile | 2 +-
drivers/reset/hisilicon/Kconfig | 7 +
drivers/reset/hisilicon/Makefile | 4 +-
drivers/reset/hisilicon/hi6220_reset.c | 157 ---------------------
drivers/reset/hisilicon/reset-hi3660.c | 78 ++++++++++
drivers/reset/hisilicon/reset-hi6220.c | 123 ++++++++++++++++
drivers/reset/hisilicon/reset.c | 108 ++++++++++++++
drivers/reset/hisilicon/reset.h | 37 +++++
include/dt-bindings/reset/hisi,hi3660-resets.h | 38 +++++
include/dt-bindings/reset/hisi,hi6220-resets.h | 130 ++++++++---------
13 files changed, 527 insertions(+), 233 deletions(-)
create mode 100644 Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.txt
delete mode 100644 drivers/reset/hisilicon/hi6220_reset.c
create mode 100644 drivers/reset/hisilicon/reset-hi3660.c
create mode 100644 drivers/reset/hisilicon/reset-hi6220.c
create mode 100644 drivers/reset/hisilicon/reset.c
create mode 100644 drivers/reset/hisilicon/reset.h
create mode 100644 include/dt-bindings/reset/hisi,hi3660-resets.h
--
2.7.4
^ permalink raw reply
* [PATCH 1/6] reset: hisilicon: add reset core
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
reset.c will be shared by hisilicon chips like hi3660 and hi6220
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/reset/Makefile | 2 +-
drivers/reset/hisilicon/Makefile | 1 +
drivers/reset/hisilicon/reset.c | 108 +++++++++++++++++++++++++++++++++++++++
drivers/reset/hisilicon/reset.h | 37 ++++++++++++++
4 files changed, 147 insertions(+), 1 deletion(-)
create mode 100644 drivers/reset/hisilicon/reset.c
create mode 100644 drivers/reset/hisilicon/reset.h
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index bbe7026..7e3dc4e 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -1,8 +1,8 @@
obj-y += core.o
-obj-y += hisilicon/
obj-$(CONFIG_ARCH_STI) += sti/
obj-$(CONFIG_RESET_ATH79) += reset-ath79.o
obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
+obj-$(CONFIG_ARCH_HISI) += hisilicon/
obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o
obj-$(CONFIG_RESET_MESON) += reset-meson.o
obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
diff --git a/drivers/reset/hisilicon/Makefile b/drivers/reset/hisilicon/Makefile
index c932f86..df511f5 100644
--- a/drivers/reset/hisilicon/Makefile
+++ b/drivers/reset/hisilicon/Makefile
@@ -1 +1,2 @@
+obj-y += reset.o
obj-$(CONFIG_COMMON_RESET_HI6220) += hi6220_reset.o
diff --git a/drivers/reset/hisilicon/reset.c b/drivers/reset/hisilicon/reset.c
new file mode 100644
index 0000000..c4971c9
--- /dev/null
+++ b/drivers/reset/hisilicon/reset.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016-2017 Linaro Ltd.
+ * Copyright (c) 2016-2017 HiSilicon Technologies Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/types.h>
+#include <linux/of_device.h>
+#include <linux/mfd/syscon.h>
+
+#include "reset.h"
+
+struct hisi_reset_controller {
+ struct reset_controller_dev rst;
+ const struct hisi_reset_channel_data *channels;
+ struct regmap *map;
+};
+
+#define to_hisi_reset_controller(_rst) \
+ container_of(_rst, struct hisi_reset_controller, rst)
+
+static int hisi_reset_program_hw(struct reset_controller_dev *rcdev,
+ unsigned long idx, bool assert)
+{
+ struct hisi_reset_controller *rc = to_hisi_reset_controller(rcdev);
+ const struct hisi_reset_channel_data *ch;
+
+ if (idx >= rcdev->nr_resets)
+ return -EINVAL;
+
+ ch = &rc->channels[idx];
+
+ if (assert)
+ return regmap_write(rc->map, ch->enable.reg,
+ GENMASK(ch->enable.msb, ch->enable.lsb));
+ else
+ return regmap_write(rc->map, ch->disable.reg,
+ GENMASK(ch->disable.msb, ch->disable.lsb));
+}
+
+static int hisi_reset_assert(struct reset_controller_dev *rcdev,
+ unsigned long idx)
+{
+ return hisi_reset_program_hw(rcdev, idx, true);
+}
+
+static int hisi_reset_deassert(struct reset_controller_dev *rcdev,
+ unsigned long idx)
+{
+ return hisi_reset_program_hw(rcdev, idx, false);
+}
+
+static int hisi_reset_dev(struct reset_controller_dev *rcdev,
+ unsigned long idx)
+{
+ int err;
+
+ err = hisi_reset_assert(rcdev, idx);
+ if (err)
+ return err;
+
+ return hisi_reset_deassert(rcdev, idx);
+}
+
+static struct reset_control_ops hisi_reset_ops = {
+ .reset = hisi_reset_dev,
+ .assert = hisi_reset_assert,
+ .deassert = hisi_reset_deassert,
+};
+
+int hisi_reset_probe(struct platform_device *pdev)
+{
+ struct hisi_reset_controller *rc;
+ struct device_node *np = pdev->dev.of_node;
+ struct hisi_reset_controller_data *d;
+ struct device *dev = &pdev->dev;
+ const struct of_device_id *match;
+
+ match = of_match_device(dev->driver->of_match_table, dev);
+ if (!match || !match->data)
+ return -EINVAL;
+
+ d = (struct hisi_reset_controller_data *)match->data;
+ rc = devm_kzalloc(dev, sizeof(*rc), GFP_KERNEL);
+ if (!rc)
+ return -ENOMEM;
+
+ rc->map = syscon_regmap_lookup_by_phandle(np, "hisi,rst-syscon");
+ if (IS_ERR(rc->map)) {
+ dev_err(dev, "failed to get hisi,rst-syscon\n");
+ return PTR_ERR(rc->map);
+ }
+
+ rc->rst.ops = &hisi_reset_ops,
+ rc->rst.of_node = np;
+ rc->rst.nr_resets = d->nr_channels;
+ rc->channels = d->channels;
+
+ return reset_controller_register(&rc->rst);
+}
+EXPORT_SYMBOL_GPL(hisi_reset_probe);
diff --git a/drivers/reset/hisilicon/reset.h b/drivers/reset/hisilicon/reset.h
new file mode 100644
index 0000000..77259ee
--- /dev/null
+++ b/drivers/reset/hisilicon/reset.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016-2017 Linaro Ltd.
+ * Copyright (c) 2016-2017 HiSilicon Technologies Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __HISILICON_RESET_H
+#define __HISILICON_RESET_H
+
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+/* reset separated register offset is 0x4 */
+#define HISI_RST_SEP(off, bit) \
+ { .enable = REG_FIELD(off, bit, bit), \
+ .disable = REG_FIELD(off + 0x4, bit, bit), \
+ .status = REG_FIELD(off + 0x8, bit, bit), }
+
+struct hisi_reset_channel_data {
+ struct reg_field enable;
+ struct reg_field disable;
+ struct reg_field status;
+};
+
+struct hisi_reset_controller_data {
+ int nr_channels;
+ const struct hisi_reset_channel_data *channels;
+};
+
+int hisi_reset_probe(struct platform_device *pdev);
+
+#endif /* __HISILICON_RESET_H */
--
2.7.4
^ permalink raw reply related
* [PATCH 2/6] dt-bindings: Document the hi3660 reset bindings
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
Add DT bindings documentation for hi3660 SoC reset controller.
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
.../bindings/reset/hisilicon,hi3660-reset.txt | 42 ++++++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.txt
diff --git a/Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.txt b/Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.txt
new file mode 100644
index 0000000..20e03a8
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.txt
@@ -0,0 +1,42 @@
+Hisilicon System Reset Controller
+======================================
+
+Please also refer to reset.txt in this directory for common reset
+controller binding usage.
+
+The reset controller registers are part of the system-ctl block on
+hi3660 SoC.
+
+Required properties:
+- compatible: should be one of the following:
+ - "hisilicon,hi3660-reset-crgctrl : reset control for peripherals in crgctrl.
+ - "hisilicon,hi3660-reset-iomcu : reset control for peripherals in iomcu.
+- hisi,rst-syscon: phandle of the reset's syscon.
+- #reset-cells: 1, see below
+
+Example:
+ crg_ctrl: crg_ctrl at fff35000 {
+ compatible = "hisilicon,hi3660-crgctrl", "syscon";
+ reg = <0x0 0xfff35000 0x0 0x1000>;
+ #clock-cells = <1>;
+ };
+
+ crg_rst: crg_rst_controller {
+ compatible = "hisilicon,hi3660-reset-crgctrl";
+ #reset-cells = <1>;
+ hisi,rst-syscon = <&crg_ctrl>;
+ };
+
+Specifying reset lines connected to IP modules
+==============================================
+example:
+
+ ufs: ufs at ..... {
+ ...
+ resets = <&crg_rst HI3660_RST_UFS>,
+ <&crg_rst HI3660_RST_UFS_ASSERT>;
+ reset-names = "rst", "assert";
+ ...
+ };
+
+The index could be found in <dt-bindings/reset/hisi,hi3660-resets.h>.
--
2.7.4
^ permalink raw reply related
* [PATCH 3/6] reset: hisilicon: add reset-hi3660
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
Add hi3660 reset driver based on common reset.c
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/reset/hisilicon/Kconfig | 7 +++
drivers/reset/hisilicon/Makefile | 1 +
drivers/reset/hisilicon/reset-hi3660.c | 78 ++++++++++++++++++++++++++
include/dt-bindings/reset/hisi,hi3660-resets.h | 38 +++++++++++++
4 files changed, 124 insertions(+)
create mode 100644 drivers/reset/hisilicon/reset-hi3660.c
create mode 100644 include/dt-bindings/reset/hisi,hi3660-resets.h
diff --git a/drivers/reset/hisilicon/Kconfig b/drivers/reset/hisilicon/Kconfig
index 1ff8b0c..10134dc 100644
--- a/drivers/reset/hisilicon/Kconfig
+++ b/drivers/reset/hisilicon/Kconfig
@@ -1,3 +1,10 @@
+config COMMON_RESET_HI3660
+ tristate "Hi3660 Reset Driver"
+ depends on ARCH_HISI || COMPILE_TEST
+ default ARCH_HISI
+ help
+ Build the Hisilicon Hi3660 reset driver.
+
config COMMON_RESET_HI6220
tristate "Hi6220 Reset Driver"
depends on ARCH_HISI || COMPILE_TEST
diff --git a/drivers/reset/hisilicon/Makefile b/drivers/reset/hisilicon/Makefile
index df511f5..57e9893 100644
--- a/drivers/reset/hisilicon/Makefile
+++ b/drivers/reset/hisilicon/Makefile
@@ -1,2 +1,3 @@
obj-y += reset.o
+obj-$(CONFIG_COMMON_RESET_HI3660) += reset-hi3660.o
obj-$(CONFIG_COMMON_RESET_HI6220) += hi6220_reset.o
diff --git a/drivers/reset/hisilicon/reset-hi3660.c b/drivers/reset/hisilicon/reset-hi3660.c
new file mode 100644
index 0000000..7da3153
--- /dev/null
+++ b/drivers/reset/hisilicon/reset-hi3660.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016-2017 Linaro Ltd.
+ * Copyright (c) 2016-2017 HiSilicon Technologies Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/reset/hisi,hi3660-resets.h>
+
+#include "reset.h"
+
+static const struct hisi_reset_channel_data hi3660_iomcu_rst[] = {
+ [HI3660_RST_I2C0] = HISI_RST_SEP(0x20, 3),
+ [HI3660_RST_I2C1] = HISI_RST_SEP(0x20, 4),
+ [HI3660_RST_I2C2] = HISI_RST_SEP(0x20, 5),
+ [HI3660_RST_I2C6] = HISI_RST_SEP(0x20, 27),
+};
+
+static struct hisi_reset_controller_data hi3660_iomcu_controller = {
+ .nr_channels = ARRAY_SIZE(hi3660_iomcu_rst),
+ .channels = hi3660_iomcu_rst,
+};
+
+static const struct hisi_reset_channel_data hi3660_crgctrl_rst[] = {
+ [HI3660_RST_I2C3] = HISI_RST_SEP(0x78, 7),
+ [HI3660_RST_I2C4] = HISI_RST_SEP(0x78, 27),
+ [HI3660_RST_I2C7] = HISI_RST_SEP(0x60, 14),
+ [HI3660_RST_SD] = HISI_RST_SEP(0x90, 18),
+ [HI3660_RST_SDIO] = HISI_RST_SEP(0x90, 20),
+ [HI3660_RST_UFS] = HISI_RST_SEP(0x84, 12),
+ [HI3660_RST_UFS_ASSERT] = HISI_RST_SEP(0x84, 7),
+ [HI3660_RST_PCIE_SYS] = HISI_RST_SEP(0x84, 26),
+ [HI3660_RST_PCIE_PHY] = HISI_RST_SEP(0x84, 27),
+ [HI3660_RST_PCIE_BUS] = HISI_RST_SEP(0x84, 31),
+ [HI3660_RST_USB3OTG_PHY] = HISI_RST_SEP(0x90, 3),
+ [HI3660_RST_USB3OTG] = HISI_RST_SEP(0x90, 5),
+ [HI3660_RST_USB3OTG_32K] = HISI_RST_SEP(0x90, 6),
+ [HI3660_RST_USB3OTG_AHB] = HISI_RST_SEP(0x90, 7),
+ [HI3660_RST_USB3OTG_MUX] = HISI_RST_SEP(0x90, 8),
+};
+
+static struct hisi_reset_controller_data hi3660_crgctrl_controller = {
+ .nr_channels = ARRAY_SIZE(hi3660_crgctrl_rst),
+ .channels = hi3660_crgctrl_rst,
+};
+
+static const struct of_device_id hi3660_reset_match[] = {
+ { .compatible = "hisilicon,hi3660-reset-crgctrl",
+ .data = &hi3660_crgctrl_controller, },
+ { .compatible = "hisilicon,hi3660-reset-iomcu",
+ .data = &hi3660_iomcu_controller, },
+ {},
+};
+MODULE_DEVICE_TABLE(of, hi3660_reset_match);
+
+static struct platform_driver hi3660_reset_driver = {
+ .probe = hisi_reset_probe,
+ .driver = {
+ .name = "reset-hi3660",
+ .of_match_table = hi3660_reset_match,
+ },
+};
+
+static int __init hi3660_reset_init(void)
+{
+ return platform_driver_register(&hi3660_reset_driver);
+}
+arch_initcall(hi3660_reset_init);
+
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:hi3660-reset");
+MODULE_DESCRIPTION("HiSilicon Hi3660 Reset Driver");
diff --git a/include/dt-bindings/reset/hisi,hi3660-resets.h b/include/dt-bindings/reset/hisi,hi3660-resets.h
new file mode 100644
index 0000000..a65f382
--- /dev/null
+++ b/include/dt-bindings/reset/hisi,hi3660-resets.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016-2017 Linaro Ltd.
+ * Copyright (c) 2016-2017 HiSilicon Technologies Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef _DT_BINDINGS_RESET_CONTROLLER_HI3660
+#define _DT_BINDINGS_RESET_CONTROLLER_HI3660
+
+/* reset in iomcu */
+#define HI3660_RST_I2C0 0
+#define HI3660_RST_I2C1 1
+#define HI3660_RST_I2C2 2
+#define HI3660_RST_I2C6 3
+
+
+/* reset in crgctrl */
+#define HI3660_RST_I2C3 0
+#define HI3660_RST_I2C4 1
+#define HI3660_RST_I2C7 2
+#define HI3660_RST_SD 3
+#define HI3660_RST_SDIO 4
+#define HI3660_RST_UFS 5
+#define HI3660_RST_UFS_ASSERT 6
+#define HI3660_RST_PCIE_SYS 7
+#define HI3660_RST_PCIE_PHY 8
+#define HI3660_RST_PCIE_BUS 9
+#define HI3660_RST_USB3OTG_PHY 10
+#define HI3660_RST_USB3OTG 11
+#define HI3660_RST_USB3OTG_32K 12
+#define HI3660_RST_USB3OTG_AHB 13
+#define HI3660_RST_USB3OTG_MUX 14
+
+#endif /*_DT_BINDINGS_RESET_CONTROLLER_HI3660*/
--
2.7.4
^ permalink raw reply related
* [PATCH 4/6] dt-bindings: change hi6220-reset.txt according to reset-hi6220.c
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
.../devicetree/bindings/reset/hisilicon,hi6220-reset.txt | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/Documentation/devicetree/bindings/reset/hisilicon,hi6220-reset.txt b/Documentation/devicetree/bindings/reset/hisilicon,hi6220-reset.txt
index c25da39..6a864f3 100644
--- a/Documentation/devicetree/bindings/reset/hisilicon,hi6220-reset.txt
+++ b/Documentation/devicetree/bindings/reset/hisilicon,hi6220-reset.txt
@@ -9,10 +9,9 @@ hi6220 SoC.
Required properties:
- compatible: should be one of the following:
- - "hisilicon,hi6220-sysctrl", "syscon" : For peripheral reset controller.
- - "hisilicon,hi6220-mediactrl", "syscon" : For media reset controller.
-- reg: should be register base and length as documented in the
- datasheet
+ - "hisilicon,hi6220-reset-sysctrl" : For peripheral reset controller.
+ - "hisilicon,hi6220-reset-mediactrl" : For media reset controller.
+- hisi,rst-syscon: phandle of the reset's syscon.
- #reset-cells: 1, see below
Example:
@@ -20,7 +19,12 @@ sys_ctrl: sys_ctrl at f7030000 {
compatible = "hisilicon,hi6220-sysctrl", "syscon";
reg = <0x0 0xf7030000 0x0 0x2000>;
#clock-cells = <1>;
+};
+
+sys_ctrl_rst: sys_rst_controller {
+ compatible = "hisilicon,hi6220-reset-sysctrl";
#reset-cells = <1>;
+ hisi,rst-syscon = <&sys_ctrl>;
};
Specifying reset lines connected to IP modules
@@ -29,7 +33,7 @@ example:
uart1: serial at ..... {
...
- resets = <&sys_ctrl PERIPH_RSTEN3_UART1>;
+ resets = <&sys_ctrl_rst PERIPH_RSTEN3_UART1>;
...
};
--
2.7.4
^ permalink raw reply related
* [PATCH 5/6] reset: hisilicon: Use new driver reset-hi6222
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
Using new reset-hi6220 with common reset.c
And keeps the same reset define
dts hi6220.c should be updated with new node sys_ctrl_rst
Solving potential issue of sys_ctrl can not be used as clock and reset
at the same time.
sys_ctrl: sys_ctrl at f7030000 {
compatible = "hisilicon,hi6220-sysctrl", "syscon";
reg = <0x0 0xf7030000 0x0 0x2000>;
#clock-cells = <1>;
};
sys_ctrl_rst: sys_rst_controller {
compatible = "hisilicon,hi6220-reset-sysctrl";
#reset-cells = <1>;
hisi,rst-syscon = <&sys_ctrl>;
};
uart1: serial at ..... {
...
resets = <&sys_ctrl_rst PERIPH_RSTEN3_UART1>;
...
};
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
drivers/reset/hisilicon/Makefile | 2 +-
drivers/reset/hisilicon/hi6220_reset.c | 157 -------------------------
drivers/reset/hisilicon/reset-hi6220.c | 123 +++++++++++++++++++
include/dt-bindings/reset/hisi,hi6220-resets.h | 130 ++++++++++----------
4 files changed, 190 insertions(+), 222 deletions(-)
delete mode 100644 drivers/reset/hisilicon/hi6220_reset.c
create mode 100644 drivers/reset/hisilicon/reset-hi6220.c
diff --git a/drivers/reset/hisilicon/Makefile b/drivers/reset/hisilicon/Makefile
index 57e9893..caddac1 100644
--- a/drivers/reset/hisilicon/Makefile
+++ b/drivers/reset/hisilicon/Makefile
@@ -1,3 +1,3 @@
obj-y += reset.o
obj-$(CONFIG_COMMON_RESET_HI3660) += reset-hi3660.o
-obj-$(CONFIG_COMMON_RESET_HI6220) += hi6220_reset.o
+obj-$(CONFIG_COMMON_RESET_HI6220) += reset-hi6220.o
diff --git a/drivers/reset/hisilicon/hi6220_reset.c b/drivers/reset/hisilicon/hi6220_reset.c
deleted file mode 100644
index 35ce53e..0000000
--- a/drivers/reset/hisilicon/hi6220_reset.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Hisilicon Hi6220 reset controller driver
- *
- * Copyright (c) 2016 Linaro Limited.
- * Copyright (c) 2015-2016 Hisilicon Limited.
- *
- * Author: Feng Chen <puck.chen@hisilicon.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/io.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/bitops.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/regmap.h>
-#include <linux/mfd/syscon.h>
-#include <linux/reset-controller.h>
-#include <linux/reset.h>
-#include <linux/platform_device.h>
-
-#define PERIPH_ASSERT_OFFSET 0x300
-#define PERIPH_DEASSERT_OFFSET 0x304
-#define PERIPH_MAX_INDEX 0x509
-
-#define SC_MEDIA_RSTEN 0x052C
-#define SC_MEDIA_RSTDIS 0x0530
-#define MEDIA_MAX_INDEX 8
-
-#define to_reset_data(x) container_of(x, struct hi6220_reset_data, rc_dev)
-
-enum hi6220_reset_ctrl_type {
- PERIPHERAL,
- MEDIA,
-};
-
-struct hi6220_reset_data {
- struct reset_controller_dev rc_dev;
- struct regmap *regmap;
-};
-
-static int hi6220_peripheral_assert(struct reset_controller_dev *rc_dev,
- unsigned long idx)
-{
- struct hi6220_reset_data *data = to_reset_data(rc_dev);
- struct regmap *regmap = data->regmap;
- u32 bank = idx >> 8;
- u32 offset = idx & 0xff;
- u32 reg = PERIPH_ASSERT_OFFSET + bank * 0x10;
-
- return regmap_write(regmap, reg, BIT(offset));
-}
-
-static int hi6220_peripheral_deassert(struct reset_controller_dev *rc_dev,
- unsigned long idx)
-{
- struct hi6220_reset_data *data = to_reset_data(rc_dev);
- struct regmap *regmap = data->regmap;
- u32 bank = idx >> 8;
- u32 offset = idx & 0xff;
- u32 reg = PERIPH_DEASSERT_OFFSET + bank * 0x10;
-
- return regmap_write(regmap, reg, BIT(offset));
-}
-
-static const struct reset_control_ops hi6220_peripheral_reset_ops = {
- .assert = hi6220_peripheral_assert,
- .deassert = hi6220_peripheral_deassert,
-};
-
-static int hi6220_media_assert(struct reset_controller_dev *rc_dev,
- unsigned long idx)
-{
- struct hi6220_reset_data *data = to_reset_data(rc_dev);
- struct regmap *regmap = data->regmap;
-
- return regmap_write(regmap, SC_MEDIA_RSTEN, BIT(idx));
-}
-
-static int hi6220_media_deassert(struct reset_controller_dev *rc_dev,
- unsigned long idx)
-{
- struct hi6220_reset_data *data = to_reset_data(rc_dev);
- struct regmap *regmap = data->regmap;
-
- return regmap_write(regmap, SC_MEDIA_RSTDIS, BIT(idx));
-}
-
-static const struct reset_control_ops hi6220_media_reset_ops = {
- .assert = hi6220_media_assert,
- .deassert = hi6220_media_deassert,
-};
-
-static int hi6220_reset_probe(struct platform_device *pdev)
-{
- struct device_node *np = pdev->dev.of_node;
- struct device *dev = &pdev->dev;
- enum hi6220_reset_ctrl_type type;
- struct hi6220_reset_data *data;
- struct regmap *regmap;
-
- data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
- if (!data)
- return -ENOMEM;
-
- type = (enum hi6220_reset_ctrl_type)of_device_get_match_data(dev);
-
- regmap = syscon_node_to_regmap(np);
- if (IS_ERR(regmap)) {
- dev_err(dev, "failed to get reset controller regmap\n");
- return PTR_ERR(regmap);
- }
-
- data->regmap = regmap;
- data->rc_dev.of_node = np;
- if (type == MEDIA) {
- data->rc_dev.ops = &hi6220_media_reset_ops;
- data->rc_dev.nr_resets = MEDIA_MAX_INDEX;
- } else {
- data->rc_dev.ops = &hi6220_peripheral_reset_ops;
- data->rc_dev.nr_resets = PERIPH_MAX_INDEX;
- }
-
- return reset_controller_register(&data->rc_dev);
-}
-
-static const struct of_device_id hi6220_reset_match[] = {
- {
- .compatible = "hisilicon,hi6220-sysctrl",
- .data = (void *)PERIPHERAL,
- },
- {
- .compatible = "hisilicon,hi6220-mediactrl",
- .data = (void *)MEDIA,
- },
- { /* sentinel */ },
-};
-MODULE_DEVICE_TABLE(of, hi6220_reset_match);
-
-static struct platform_driver hi6220_reset_driver = {
- .probe = hi6220_reset_probe,
- .driver = {
- .name = "reset-hi6220",
- .of_match_table = hi6220_reset_match,
- },
-};
-
-static int __init hi6220_reset_init(void)
-{
- return platform_driver_register(&hi6220_reset_driver);
-}
-
-postcore_initcall(hi6220_reset_init);
diff --git a/drivers/reset/hisilicon/reset-hi6220.c b/drivers/reset/hisilicon/reset-hi6220.c
new file mode 100644
index 0000000..a2a64ae
--- /dev/null
+++ b/drivers/reset/hisilicon/reset-hi6220.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2016-2017 Linaro Ltd.
+ * Copyright (c) 2016-2017 HiSilicon Technologies Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <dt-bindings/reset/hisi,hi6220-resets.h>
+
+#include "reset.h"
+
+static const struct hisi_reset_channel_data hi6220_media_rst[] = {
+ [MEDIA_G3D] = HISI_RST_SEP(0x52c, 0),
+ [MEDIA_CODEC_VPU] = HISI_RST_SEP(0x52c, 2),
+ [MEDIA_CODEC_JPEG] = HISI_RST_SEP(0x52c, 3),
+ [MEDIA_ISP] = HISI_RST_SEP(0x52c, 4),
+ [MEDIA_ADE] = HISI_RST_SEP(0x52c, 5),
+ [MEDIA_MMU] = HISI_RST_SEP(0x52c, 6),
+ [MEDIA_XG2RAM1] = HISI_RST_SEP(0x52c, 7),
+};
+
+static struct hisi_reset_controller_data hi6220_media_controller = {
+ .nr_channels = ARRAY_SIZE(hi6220_media_rst),
+ .channels = hi6220_media_rst,
+};
+
+static const struct hisi_reset_channel_data hi6220_sysctrl_rst[] = {
+ [PERIPH_RSTDIS0_MMC0] = HISI_RST_SEP(0x300, 0),
+ [PERIPH_RSTDIS0_MMC1] = HISI_RST_SEP(0x300, 1),
+ [PERIPH_RSTDIS0_MMC2] = HISI_RST_SEP(0x300, 2),
+ [PERIPH_RSTDIS0_NANDC] = HISI_RST_SEP(0x300, 3),
+ [PERIPH_RSTDIS0_USBOTG_BUS] = HISI_RST_SEP(0x300, 4),
+ [PERIPH_RSTDIS0_POR_PICOPHY] = HISI_RST_SEP(0x300, 5),
+ [PERIPH_RSTDIS0_USBOTG] = HISI_RST_SEP(0x300, 6),
+ [PERIPH_RSTDIS0_USBOTG_32K] = HISI_RST_SEP(0x300, 7),
+ [PERIPH_RSTDIS1_HIFI] = HISI_RST_SEP(0x310, 0),
+ [PERIPH_RSTDIS1_DIGACODEC] = HISI_RST_SEP(0x310, 5),
+ [PERIPH_RSTEN2_IPF] = HISI_RST_SEP(0x320, 0),
+ [PERIPH_RSTEN2_SOCP] = HISI_RST_SEP(0x320, 1),
+ [PERIPH_RSTEN2_DMAC] = HISI_RST_SEP(0x320, 2),
+ [PERIPH_RSTEN2_SECENG] = HISI_RST_SEP(0x320, 3),
+ [PERIPH_RSTEN2_ABB] = HISI_RST_SEP(0x320, 4),
+ [PERIPH_RSTEN2_HPM0] = HISI_RST_SEP(0x320, 5),
+ [PERIPH_RSTEN2_HPM1] = HISI_RST_SEP(0x320, 6),
+ [PERIPH_RSTEN2_HPM2] = HISI_RST_SEP(0x320, 7),
+ [PERIPH_RSTEN2_HPM3] = HISI_RST_SEP(0x320, 8),
+ [PERIPH_RSTEN3_CSSYS] = HISI_RST_SEP(0x330, 0),
+ [PERIPH_RSTEN3_I2C0] = HISI_RST_SEP(0x330, 1),
+ [PERIPH_RSTEN3_I2C1] = HISI_RST_SEP(0x330, 2),
+ [PERIPH_RSTEN3_I2C2] = HISI_RST_SEP(0x330, 3),
+ [PERIPH_RSTEN3_I2C3] = HISI_RST_SEP(0x330, 4),
+ [PERIPH_RSTEN3_UART1] = HISI_RST_SEP(0x330, 5),
+ [PERIPH_RSTEN3_UART2] = HISI_RST_SEP(0x330, 6),
+ [PERIPH_RSTEN3_UART3] = HISI_RST_SEP(0x330, 7),
+ [PERIPH_RSTEN3_UART4] = HISI_RST_SEP(0x330, 8),
+ [PERIPH_RSTEN3_SSP] = HISI_RST_SEP(0x330, 9),
+ [PERIPH_RSTEN3_PWM] = HISI_RST_SEP(0x330, 10),
+ [PERIPH_RSTEN3_BLPWM] = HISI_RST_SEP(0x330, 11),
+ [PERIPH_RSTEN3_TSENSOR] = HISI_RST_SEP(0x330, 12),
+ [PERIPH_RSTEN3_DAPB] = HISI_RST_SEP(0x330, 18),
+ [PERIPH_RSTEN3_HKADC] = HISI_RST_SEP(0x330, 19),
+ [PERIPH_RSTEN3_CODEC_SSI] = HISI_RST_SEP(0x330, 20),
+ [PERIPH_RSTEN8_RS0] = HISI_RST_SEP(0x340, 0),
+ [PERIPH_RSTEN8_RS2] = HISI_RST_SEP(0x340, 1),
+ [PERIPH_RSTEN8_RS3] = HISI_RST_SEP(0x340, 2),
+ [PERIPH_RSTEN8_MS0] = HISI_RST_SEP(0x340, 3),
+ [PERIPH_RSTEN8_MS2] = HISI_RST_SEP(0x340, 5),
+ [PERIPH_RSTEN8_XG2RAM0] = HISI_RST_SEP(0x340, 6),
+ [PERIPH_RSTEN8_X2SRAM_TZMA] = HISI_RST_SEP(0x340, 7),
+ [PERIPH_RSTEN8_SRAM] = HISI_RST_SEP(0x340, 8),
+ [PERIPH_RSTEN8_HARQ] = HISI_RST_SEP(0x340, 10),
+ [PERIPH_RSTEN8_DDRC] = HISI_RST_SEP(0x340, 12),
+ [PERIPH_RSTEN8_DDRC_APB] = HISI_RST_SEP(0x340, 13),
+ [PERIPH_RSTEN8_DDRPACK_APB] = HISI_RST_SEP(0x340, 14),
+ [PERIPH_RSTEN8_DDRT] = HISI_RST_SEP(0x340, 17),
+ [PERIPH_RSDIST9_CARM_DAP] = HISI_RST_SEP(0x350, 0),
+ [PERIPH_RSDIST9_CARM_ATB] = HISI_RST_SEP(0x350, 1),
+ [PERIPH_RSDIST9_CARM_LBUS] = HISI_RST_SEP(0x350, 2),
+ [PERIPH_RSDIST9_CARM_POR] = HISI_RST_SEP(0x350, 3),
+ [PERIPH_RSDIST9_CARM_CORE] = HISI_RST_SEP(0x350, 4),
+ [PERIPH_RSDIST9_CARM_DBG] = HISI_RST_SEP(0x350, 5),
+ [PERIPH_RSDIST9_CARM_L2] = HISI_RST_SEP(0x350, 6),
+ [PERIPH_RSDIST9_CARM_SOCDBG] = HISI_RST_SEP(0x350, 7),
+ [PERIPH_RSDIST9_CARM_ETM] = HISI_RST_SEP(0x350, 8),
+};
+
+static struct hisi_reset_controller_data hi6220_sysctrl_controller = {
+ .nr_channels = ARRAY_SIZE(hi6220_sysctrl_rst),
+ .channels = hi6220_sysctrl_rst,
+};
+
+static const struct of_device_id hi6220_reset_match[] = {
+ { .compatible = "hisilicon,hi6220-reset-sysctrl",
+ .data = &hi6220_sysctrl_controller, },
+ { .compatible = "hisilicon,hi6220-reset-mediactrl",
+ .data = &hi6220_media_controller, },
+ {},
+};
+MODULE_DEVICE_TABLE(of, hi6220_reset_match);
+
+static struct platform_driver hi6220_reset_driver = {
+ .probe = hisi_reset_probe,
+ .driver = {
+ .name = "reset-hi6220",
+ .of_match_table = hi6220_reset_match,
+ },
+};
+
+static int __init hi6220_reset_init(void)
+{
+ return platform_driver_register(&hi6220_reset_driver);
+}
+arch_initcall(hi6220_reset_init);
+
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:hi6220-reset");
+MODULE_DESCRIPTION("HiSilicon hi6220 Reset Driver");
diff --git a/include/dt-bindings/reset/hisi,hi6220-resets.h b/include/dt-bindings/reset/hisi,hi6220-resets.h
index 322ec53..837f1a1 100644
--- a/include/dt-bindings/reset/hisi,hi6220-resets.h
+++ b/include/dt-bindings/reset/hisi,hi6220-resets.h
@@ -5,71 +5,73 @@
#ifndef _DT_BINDINGS_RESET_CONTROLLER_HI6220
#define _DT_BINDINGS_RESET_CONTROLLER_HI6220
-#define PERIPH_RSTDIS0_MMC0 0x000
-#define PERIPH_RSTDIS0_MMC1 0x001
-#define PERIPH_RSTDIS0_MMC2 0x002
-#define PERIPH_RSTDIS0_NANDC 0x003
-#define PERIPH_RSTDIS0_USBOTG_BUS 0x004
-#define PERIPH_RSTDIS0_POR_PICOPHY 0x005
-#define PERIPH_RSTDIS0_USBOTG 0x006
-#define PERIPH_RSTDIS0_USBOTG_32K 0x007
-#define PERIPH_RSTDIS1_HIFI 0x100
-#define PERIPH_RSTDIS1_DIGACODEC 0x105
-#define PERIPH_RSTEN2_IPF 0x200
-#define PERIPH_RSTEN2_SOCP 0x201
-#define PERIPH_RSTEN2_DMAC 0x202
-#define PERIPH_RSTEN2_SECENG 0x203
-#define PERIPH_RSTEN2_ABB 0x204
-#define PERIPH_RSTEN2_HPM0 0x205
-#define PERIPH_RSTEN2_HPM1 0x206
-#define PERIPH_RSTEN2_HPM2 0x207
-#define PERIPH_RSTEN2_HPM3 0x208
-#define PERIPH_RSTEN3_CSSYS 0x300
-#define PERIPH_RSTEN3_I2C0 0x301
-#define PERIPH_RSTEN3_I2C1 0x302
-#define PERIPH_RSTEN3_I2C2 0x303
-#define PERIPH_RSTEN3_I2C3 0x304
-#define PERIPH_RSTEN3_UART1 0x305
-#define PERIPH_RSTEN3_UART2 0x306
-#define PERIPH_RSTEN3_UART3 0x307
-#define PERIPH_RSTEN3_UART4 0x308
-#define PERIPH_RSTEN3_SSP 0x309
-#define PERIPH_RSTEN3_PWM 0x30a
-#define PERIPH_RSTEN3_BLPWM 0x30b
-#define PERIPH_RSTEN3_TSENSOR 0x30c
-#define PERIPH_RSTEN3_DAPB 0x312
-#define PERIPH_RSTEN3_HKADC 0x313
-#define PERIPH_RSTEN3_CODEC_SSI 0x314
-#define PERIPH_RSTEN3_PMUSSI1 0x316
-#define PERIPH_RSTEN8_RS0 0x400
-#define PERIPH_RSTEN8_RS2 0x401
-#define PERIPH_RSTEN8_RS3 0x402
-#define PERIPH_RSTEN8_MS0 0x403
-#define PERIPH_RSTEN8_MS2 0x405
-#define PERIPH_RSTEN8_XG2RAM0 0x406
-#define PERIPH_RSTEN8_X2SRAM_TZMA 0x407
-#define PERIPH_RSTEN8_SRAM 0x408
-#define PERIPH_RSTEN8_HARQ 0x40a
-#define PERIPH_RSTEN8_DDRC 0x40c
-#define PERIPH_RSTEN8_DDRC_APB 0x40d
-#define PERIPH_RSTEN8_DDRPACK_APB 0x40e
-#define PERIPH_RSTEN8_DDRT 0x411
-#define PERIPH_RSDIST9_CARM_DAP 0x500
-#define PERIPH_RSDIST9_CARM_ATB 0x501
-#define PERIPH_RSDIST9_CARM_LBUS 0x502
-#define PERIPH_RSDIST9_CARM_POR 0x503
-#define PERIPH_RSDIST9_CARM_CORE 0x504
-#define PERIPH_RSDIST9_CARM_DBG 0x505
-#define PERIPH_RSDIST9_CARM_L2 0x506
-#define PERIPH_RSDIST9_CARM_SOCDBG 0x507
-#define PERIPH_RSDIST9_CARM_ETM 0x508
+/* reset in sysctrl */
+#define PERIPH_RSTDIS0_MMC0 0
+#define PERIPH_RSTDIS0_MMC1 1
+#define PERIPH_RSTDIS0_MMC2 2
+#define PERIPH_RSTDIS0_NANDC 3
+#define PERIPH_RSTDIS0_USBOTG_BUS 4
+#define PERIPH_RSTDIS0_POR_PICOPHY 5
+#define PERIPH_RSTDIS0_USBOTG 6
+#define PERIPH_RSTDIS0_USBOTG_32K 7
+#define PERIPH_RSTDIS1_HIFI 8
+#define PERIPH_RSTDIS1_DIGACODEC 9
+#define PERIPH_RSTEN2_IPF 10
+#define PERIPH_RSTEN2_SOCP 11
+#define PERIPH_RSTEN2_DMAC 12
+#define PERIPH_RSTEN2_SECENG 13
+#define PERIPH_RSTEN2_ABB 14
+#define PERIPH_RSTEN2_HPM0 15
+#define PERIPH_RSTEN2_HPM1 16
+#define PERIPH_RSTEN2_HPM2 17
+#define PERIPH_RSTEN2_HPM3 18
+#define PERIPH_RSTEN3_CSSYS 19
+#define PERIPH_RSTEN3_I2C0 20
+#define PERIPH_RSTEN3_I2C1 21
+#define PERIPH_RSTEN3_I2C2 22
+#define PERIPH_RSTEN3_I2C3 23
+#define PERIPH_RSTEN3_UART1 24
+#define PERIPH_RSTEN3_UART2 25
+#define PERIPH_RSTEN3_UART3 26
+#define PERIPH_RSTEN3_UART4 27
+#define PERIPH_RSTEN3_SSP 28
+#define PERIPH_RSTEN3_PWM 29
+#define PERIPH_RSTEN3_BLPWM 30
+#define PERIPH_RSTEN3_TSENSOR 31
+#define PERIPH_RSTEN3_DAPB 32
+#define PERIPH_RSTEN3_HKADC 33
+#define PERIPH_RSTEN3_CODEC_SSI 34
+#define PERIPH_RSTEN8_RS0 35
+#define PERIPH_RSTEN8_RS2 36
+#define PERIPH_RSTEN8_RS3 37
+#define PERIPH_RSTEN8_MS0 38
+#define PERIPH_RSTEN8_MS2 39
+#define PERIPH_RSTEN8_XG2RAM0 40
+#define PERIPH_RSTEN8_X2SRAM_TZMA 41
+#define PERIPH_RSTEN8_SRAM 42
+#define PERIPH_RSTEN8_HARQ 43
+#define PERIPH_RSTEN8_DDRC 44
+#define PERIPH_RSTEN8_DDRC_APB 45
+#define PERIPH_RSTEN8_DDRPACK_APB 46
+#define PERIPH_RSTEN8_DDRT 47
+#define PERIPH_RSDIST9_CARM_DAP 48
+#define PERIPH_RSDIST9_CARM_ATB 49
+#define PERIPH_RSDIST9_CARM_LBUS 50
+#define PERIPH_RSDIST9_CARM_POR 51
+#define PERIPH_RSDIST9_CARM_CORE 52
+#define PERIPH_RSDIST9_CARM_DBG 53
+#define PERIPH_RSDIST9_CARM_L2 54
+#define PERIPH_RSDIST9_CARM_SOCDBG 55
+#define PERIPH_RSDIST9_CARM_ETM 56
+
+/* reset in media */
#define MEDIA_G3D 0
-#define MEDIA_CODEC_VPU 2
-#define MEDIA_CODEC_JPEG 3
-#define MEDIA_ISP 4
-#define MEDIA_ADE 5
-#define MEDIA_MMU 6
-#define MEDIA_XG2RAM1 7
+#define MEDIA_CODEC_VPU 1
+#define MEDIA_CODEC_JPEG 2
+#define MEDIA_ISP 3
+#define MEDIA_ADE 4
+#define MEDIA_MMU 5
+#define MEDIA_XG2RAM1 6
#endif /*_DT_BINDINGS_RESET_CONTROLLER_HI6220*/
--
2.7.4
^ permalink raw reply related
* [PATCH 6/6] arm64: dts: hi6220: update reset node according to reset-hi6220.c
From: Zhangfei Gao @ 2016-11-22 7:49 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-1-git-send-email-zhangfei.gao@linaro.org>
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
---
arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
index 17839db..7918043 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
@@ -246,14 +246,24 @@
compatible = "hisilicon,hi6220-sysctrl", "syscon";
reg = <0x0 0xf7030000 0x0 0x2000>;
#clock-cells = <1>;
- #reset-cells = <1>;
};
media_ctrl: media_ctrl at f4410000 {
compatible = "hisilicon,hi6220-mediactrl", "syscon";
reg = <0x0 0xf4410000 0x0 0x1000>;
#clock-cells = <1>;
+ };
+
+ sys_ctrl_rst: sys_rst_controller {
+ compatible = "hisilicon,hi6220-reset-sysctrl";
+ #reset-cells = <1>;
+ hisi,rst-syscon = <&sys_ctrl>;
+ };
+
+ media_ctrl_rst: media_rst_controller {
+ compatible = "hisilicon,hi6220-reset-mediactrl";
#reset-cells = <1>;
+ hisi,rst-syscon = <&media_ctrl>;
};
pm_ctrl: pm_ctrl at f7032000 {
@@ -771,7 +781,7 @@
interrupts = <0x0 0x48 0x4>;
clocks = <&sys_ctrl 2>, <&sys_ctrl 1>;
clock-names = "ciu", "biu";
- resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>;
+ resets = <&sys_ctrl_rst PERIPH_RSTDIS0_MMC0>;
bus-width = <0x8>;
vmmc-supply = <&ldo19>;
pinctrl-names = "default";
@@ -794,7 +804,7 @@
#size-cells = <0x0>;
clocks = <&sys_ctrl 4>, <&sys_ctrl 3>;
clock-names = "ciu", "biu";
- resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>;
+ resets = <&sys_ctrl_rst PERIPH_RSTDIS0_MMC1>;
vqmmc-supply = <&ldo7>;
vmmc-supply = <&ldo10>;
bus-width = <0x4>;
@@ -812,7 +822,7 @@
interrupts = <0x0 0x4a 0x4>;
clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>;
clock-names = "ciu", "biu";
- resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>;
+ resets = <&sys_ctrl_rst PERIPH_RSTDIS0_MMC2>;
bus-width = <0x4>;
broken-cd;
pinctrl-names = "default", "idle";
@@ -867,7 +877,7 @@
reg = <0x0 0xf4100000 0x0 0x7800>;
reg-names = "ade_base";
hisilicon,noc-syscon = <&medianoc_ade>;
- resets = <&media_ctrl MEDIA_ADE>;
+ resets = <&media_ctrl_rst MEDIA_ADE>;
interrupts = <0 115 4>; /* ldi interrupt */
clocks = <&media_ctrl HI6220_ADE_CORE>,
--
2.7.4
^ permalink raw reply related
* [PATCH 2/2] MAINTAINERS: Add myself as co-maintainer to fpga mgr framework.
From: Greg Kroah-Hartman @ 2016-11-22 8:07 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <47eb36a7-ee48-53bd-fbdc-15225c3147ec@xilinx.com>
On Tue, Nov 22, 2016 at 08:48:57AM +0100, Michal Simek wrote:
> On 22.11.2016 03:29, atull wrote:
> > On Mon, 21 Nov 2016, Moritz Fischer wrote:
> >
> >> Add myself as co-maintainer to fpga mgr framework.
> >>
> >> Signed-off-by: Moritz Fischer <mdf@kernel.org>
> >> Cc: Alan Tull <atull@opensource.altera.com>
> >> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> >> Cc: linux-kernel at vger.kernel.org
> >> Cc: linux-fpga at vger.kernel.org
> >> ---
> >> Hi all,
> >>
> >> Lately we've fallen behind a bit on reviewing patches lately.
> >
> > Hi Moritz,
> >
> > drivers/fpga has been in the upstream kernel a year now. Most of that
> > time, traffic has been very slow. Recently we had more traffic while
> > I was travelling and moving to a new office, both cases leaving me
> > with bad network connectivity. Things will probably return to normal.
> > I appreciate your passion and all your effort reviewing stuff. I
> > don't see a need for two maintainers at this point.
>
> TBH. I think it is not a bad option. I do normally have backup person
> for all repos I do maintain. It doesn't mean that second maintainer does
> something but it has all accesses to repos you maintain.
> It means if something really happens to you (hopefully not) than this
> person can continue in this work without any delay which is not a bad
> thing.
> It is really just about talking to each other what that second person
> will do - probably just review patches as is done now. You can also
> learn from each other.
> I would like to be involved more in this but unfortunately I don't have
> enough time to do it properly.
>
> Regarding maintaining this repo. It is just standard process. Apply
> sensible things, well described and test it. And then send pull request
> to Greg based on signed tags and you are done.
> Greg should told you what should be the base which you should use for
> pull request. Someone is taking patches based on rc1 tag, someone is
> rebasing it on the final tag.
Greg doesn't care what base you use, as long as you don't rebase
patches. What subsystem does that? I need to go yell at someone...
And I take patches just as easily, what ever works best for the
subsystem.
thanks,
greg k-h
^ permalink raw reply
* [PATCH v2] clk: qoriq: added ls1012a clock configuration
From: yuantian.tang at nxp.com @ 2016-11-22 8:14 UTC (permalink / raw)
To: linux-arm-kernel
From: Tang Yuantian <Yuantian.Tang@nxp.com>
Signed-off-by: Tang Yuantian <yuantian.tang@nxp.com>
---
v2:
- remove commit message as it is duplicated to title
drivers/clk/clk-qoriq.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c
index 1bece0f..65c21d7 100644
--- a/drivers/clk/clk-qoriq.c
+++ b/drivers/clk/clk-qoriq.c
@@ -202,6 +202,14 @@ static const struct clockgen_muxinfo ls1021a_cmux = {
}
};
+static const struct clockgen_muxinfo ls1012a_cmux = {
+ {
+ [0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
+ {},
+ [2] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
+ }
+};
+
static const struct clockgen_muxinfo t1040_cmux = {
{
[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
@@ -482,6 +490,16 @@ static const struct clockgen_chipinfo chipinfo[] = {
.pll_mask = 0x03,
},
{
+ .compat = "fsl,ls1012a-clockgen",
+ .cmux_groups = {
+ &ls1012a_cmux
+ },
+ .cmux_to_group = {
+ 0, -1
+ },
+ .pll_mask = 0x03,
+ },
+ {
.compat = "fsl,ls1043a-clockgen",
.init_periph = t2080_init_periph,
.cmux_groups = {
@@ -1282,6 +1300,7 @@ static void __init clockgen_init(struct device_node *np)
CLK_OF_DECLARE(qoriq_clockgen_1, "fsl,qoriq-clockgen-1.0", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_2, "fsl,qoriq-clockgen-2.0", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen", clockgen_init);
+CLK_OF_DECLARE(qoriq_clockgen_ls1012a, "fsl,ls1012a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls1043a, "fsl,ls1043a-clockgen", clockgen_init);
CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen", clockgen_init);
--
2.1.0.27.g96db324
^ permalink raw reply related
* [PATCH] clk: qoriq: added ls1012a clock configuration
From: Y.T. Tang @ 2016-11-22 8:20 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479279262.21746.40.camel@buserror.net>
Hi Scott,
> -----Original Message-----
> From: Scott Wood [mailto:oss at buserror.net]
> Sent: Wednesday, November 16, 2016 2:54 PM
> To: Y.T. Tang <yuantian.tang@nxp.com>; mturquette at baylibre.com
> Cc: sboyd at codeaurora.org; linux-kernel at vger.kernel.org; Scott Wood
> <scott.wood@nxp.com>; linux-clk at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org
> Subject: Re: [PATCH] clk: qoriq: added ls1012a clock configuration
>
> On Wed, 2016-11-16 at 13:58 +0800, yuantian.tang at nxp.com wrote:
> > From: Tang Yuantian <Yuantian.Tang@nxp.com>
> >
> > Added ls1012a clock configuation information.
>
> Do we really need the same line in the changelog twice?
>
> >
> > Signed-off-by: Tang Yuantian <yuantian.tang@nxp.com>
> > ---
> > ?drivers/clk/clk-qoriq.c | 19 +++++++++++++++++++
> > ?1 file changed, 19 insertions(+)
> >
> > diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c index
> > 1bece0f..563d874 100644
> > --- a/drivers/clk/clk-qoriq.c
> > +++ b/drivers/clk/clk-qoriq.c
> > @@ -202,6 +202,14 @@ static const struct clockgen_muxinfo ls1021a_cmux
> = {
> > ? }
> > ?};
> >
> > +static const struct clockgen_muxinfo ls1012a_cmux = {
> > + {
> > + [0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
> > + {},
> > + [2] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
> > + }
> > +};
> > +
>
> Based on the "ls1021a_cmux" in the context it looks like this patch is
> intended to apply on top
> of?https://patchwork.kernel.org/patch/8923541/?but I don't see any mention
> of that.
>
I saw this patch had been merged already.
Regards,
Yuantian
> > ?static const struct clockgen_muxinfo t1040_cmux = {
> > ? {
> > ? [0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 }, @@ -482,6
> +490,16 @@
> > static const struct clockgen_chipinfo chipinfo[] = {
> > ? .pll_mask = 0x03,
> > ? },
> > ? {
> > + .compat = "fsl,ls1012a-clockgen",
> > + .cmux_groups = {
> > + &ls1012a_cmux
> > + },
> > + .cmux_to_group = {
> > + 0, -1
> > + },
> > + .pll_mask = 0x03,
> > + },
> > + {
> > ? .compat = "fsl,ls1043a-clockgen",
> > ? .init_periph = t2080_init_periph,
> > ? .cmux_groups = {
> > @@ -1284,6 +1302,7 @@ CLK_OF_DECLARE(qoriq_clockgen_2,
> > "fsl,qoriq-clockgen- 2.0", clockgen_init);
> > ?CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen",
> > clockgen_init);
> > ?CLK_OF_DECLARE(qoriq_clockgen_ls1043a, "fsl,ls1043a-clockgen",
> > clockgen_init);
> > ?CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen",
> > clockgen_init);
> > +CLK_OF_DECLARE(qoriq_clockgen_ls1012a, "fsl,ls1012a-clockgen",
> > clockgen_init);
>
> Please keep these lists of chips sorted (or as close as you can in the case of
> the cmux structs which already have some sorting issues).
>
> -Scott
^ permalink raw reply
* [PATCH 2/2] MAINTAINERS: Add myself as co-maintainer to fpga mgr framework.
From: Michal Simek @ 2016-11-22 8:28 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161122080713.GB22441@kroah.com>
On 22.11.2016 09:07, Greg Kroah-Hartman wrote:
> On Tue, Nov 22, 2016 at 08:48:57AM +0100, Michal Simek wrote:
>> On 22.11.2016 03:29, atull wrote:
>>> On Mon, 21 Nov 2016, Moritz Fischer wrote:
>>>
>>>> Add myself as co-maintainer to fpga mgr framework.
>>>>
>>>> Signed-off-by: Moritz Fischer <mdf@kernel.org>
>>>> Cc: Alan Tull <atull@opensource.altera.com>
>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>>> Cc: linux-kernel at vger.kernel.org
>>>> Cc: linux-fpga at vger.kernel.org
>>>> ---
>>>> Hi all,
>>>>
>>>> Lately we've fallen behind a bit on reviewing patches lately.
>>>
>>> Hi Moritz,
>>>
>>> drivers/fpga has been in the upstream kernel a year now. Most of that
>>> time, traffic has been very slow. Recently we had more traffic while
>>> I was travelling and moving to a new office, both cases leaving me
>>> with bad network connectivity. Things will probably return to normal.
>>> I appreciate your passion and all your effort reviewing stuff. I
>>> don't see a need for two maintainers at this point.
>>
>> TBH. I think it is not a bad option. I do normally have backup person
>> for all repos I do maintain. It doesn't mean that second maintainer does
>> something but it has all accesses to repos you maintain.
>> It means if something really happens to you (hopefully not) than this
>> person can continue in this work without any delay which is not a bad
>> thing.
>> It is really just about talking to each other what that second person
>> will do - probably just review patches as is done now. You can also
>> learn from each other.
>> I would like to be involved more in this but unfortunately I don't have
>> enough time to do it properly.
>>
>> Regarding maintaining this repo. It is just standard process. Apply
>> sensible things, well described and test it. And then send pull request
>> to Greg based on signed tags and you are done.
>> Greg should told you what should be the base which you should use for
>> pull request. Someone is taking patches based on rc1 tag, someone is
>> rebasing it on the final tag.
>
> Greg doesn't care what base you use, as long as you don't rebase
> patches. What subsystem does that? I need to go yell at someone...
:-) Not sure if there is any subsystem which use this.
And for my microblaze tree I do normally base patches on the top of
rc7/8 or final tag but that's done mostly because I collect patches at
that time. But IIRC when I started with this someone mentioned that for
small number of patches this is fine.
Thanks,
Michal
^ permalink raw reply
* Synopsys Ethernet QoS Driver
From: Ozgur Karatas @ 2016-11-22 8:38 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <937252db-9538-2cf6-c8fa-82b558531c51@st.com>
Hello all,
I think, ethtool and mdio don't work because the tool's not support to "QoS", right?
Maybe, need a new API. I'm looking for dwceqos code but "tc" tools is very idea.
I hope to be me always helpful.
Regards,
Ozgur
21.11.2016, 16:38, "Giuseppe CAVALLARO" <peppe.cavallaro@st.com>:
> Hello Joao
>
> On 11/21/2016 2:48 PM, Joao Pinto wrote:
>> ?Synopsys QoS IP is a separated hardware component, so it should be reusable by
>> ?all implementations using it and so have its own "core driver" and platform +
>> ?pci glue drivers. This is necessary for example in hardware validation, where
>> ?you prototype an IP and instantiate its drivers and test it.
>>
>> ?Was there a strong reason to integrate QoS features directly in stmmac and not
>> ?in synopsys/dwc_eth_qos.*?
>
> We decided to enhance the stmmac on supporting the QoS for several
> reasons; for example the common APIs that the driver already exposed and
> actually suitable for other SYNP chips. Then, PTP, EEE,
> S/RGMII, MMC could be shared among different chips with a minimal
> effort. This meant a lot of code already ready.
>
> For sure, the net-core, Ethtool, mdio parts were reused. Same for the
> glue logic files.
> For the latter, this helped to easily bring-up new platforms also
> because the stmmac uses the HW cap register to auto-configure many
> parts of the MAC core, DMA and modules. This helped many users, AFAIK.
>
> For validation purpose, this is my experience, the stmmac helped
> a lot because people used the same code to validate different HW
> and it was easy to switch to a platform to another one in order to
> verify / check if the support was ok or if a regression was introduced.
> This is important for complex supports like PTP or EEE.
>
> Hoping this can help.
>
> Do not hesitate to contact me for further details
>
> peppe
^ permalink raw reply
* linux-next: manual merge of the clk tree with the arm-soc tree
From: Stephen Rothwell @ 2016-11-22 8:41 UTC (permalink / raw)
To: linux-arm-kernel
Hi all,
Today's linux-next merge of the clk tree got conflicts in:
arch/arm/boot/dts/r8a7779.dtsi
arch/arm/boot/dts/r8a7790.dtsi
arch/arm/boot/dts/r8a7791.dtsi
arch/arm/boot/dts/r8a7792.dtsi
arch/arm/boot/dts/r8a7793.dtsi
arch/arm/boot/dts/r8a7794.dtsi
arch/arm/mach-shmobile/setup-rcar-gen2.c
arch/arm64/boot/dts/renesas/r8a7795.dtsi
arch/arm64/boot/dts/renesas/r8a7796.dtsi
drivers/soc/renesas/Makefile
between various commits from the arm-soc tree and commits from the
clk tree.
It was just too much at this time of day, so please talk to each other
and figure out how to fix these up. I have used the clk tree from
next-20161117 for today.
--
Cheers,
Stephen Rothwell
^ permalink raw reply
* [PATCH 1/6] reset: hisilicon: add reset core
From: Arnd Bergmann @ 2016-11-22 8:45 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-2-git-send-email-zhangfei.gao@linaro.org>
On Tuesday, November 22, 2016 3:49:16 PM CET Zhangfei Gao wrote:
> @@ -1,8 +1,8 @@
> obj-y += core.o
> -obj-y += hisilicon/
> obj-$(CONFIG_ARCH_STI) += sti/
> obj-$(CONFIG_RESET_ATH79) += reset-ath79.o
> obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
> +obj-$(CONFIG_ARCH_HISI) += hisilicon/
> obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o
> obj-$(CONFIG_RESET_MESON) += reset-meson.o
> obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
Please leave the obj-y line, otherwise the COMPILE_TEST variant won't work.
Arnd
^ permalink raw reply
* [PATCH] ARM: ux500: fix prcmu_is_cpu_in_wfi() calculation
From: Linus Walleij @ 2016-11-22 8:47 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161116152047.3336967-1-arnd@arndb.de>
On Wed, Nov 16, 2016 at 4:20 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> This function clearly never worked and always returns true,
> as pointed out by gcc-7:
>
> arch/arm/mach-ux500/pm.c: In function 'prcmu_is_cpu_in_wfi':
> arch/arm/mach-ux500/pm.c:137:212: error: ?: using integer constants in boolean context, the expression will always evaluate to 'true' [-Werror=int-in-bool-context]
>
> With the added braces, the condition actually makes sense.
>
> Fixes: 34fe6f107eab ("mfd : Check if the other db8500 core is in WFI")
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Will you apply it directly to ARM SoC or should I queue it and
send it with a pull request?
Yours,
Linus Walleij
^ permalink raw reply
* [PATCH 4/6] dt-bindings: change hi6220-reset.txt according to reset-hi6220.c
From: Arnd Bergmann @ 2016-11-22 8:48 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1479800961-6249-5-git-send-email-zhangfei.gao@linaro.org>
On Tuesday, November 22, 2016 3:49:19 PM CET Zhangfei Gao wrote:
> Required properties:
> - compatible: should be one of the following:
> - - "hisilicon,hi6220-sysctrl", "syscon" : For peripheral reset controller.
> - - "hisilicon,hi6220-mediactrl", "syscon" : For media reset controller.
> -- reg: should be register base and length as documented in the
> - datasheet
> + - "hisilicon,hi6220-reset-sysctrl" : For peripheral reset controller.
> + - "hisilicon,hi6220-reset-mediactrl" : For media reset controller.
> +- hisi,rst-syscon: phandle of the reset's syscon.
> - #reset-cells: 1, see below
>
Please keep the old strings around for compatibility.
Arnd
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox