From: Jan Andersson <jan-FkzTOoA/JUnLoDKTGw+V6w@public.gmane.org>
To: grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH] spi: add support for aeroflex gaisler spimctrl
Date: Sat, 30 Apr 2011 15:09:15 +0200 [thread overview]
Message-ID: <4DBC09FB.5070406@gaisler.se> (raw)
In-Reply-To: <1304023295-5829-1-git-send-email-jan-FkzTOoA/JUlBDgjK7y7TUQ@public.gmane.org>
Hi Grant,
It seems something on my end ate your reply so I am replying to my own
message pasting in your reply from the archive.
Grant Likely wrote:
> On Thu, Apr 28, 2011 at 10:41:35PM +0200, Jan Andersson wrote:
>> This patch adds support for Aeroflex Gaisler SPI memory controller
[ .... ]
>> drivers/spi/Kconfig | 8 +
>> drivers/spi/Makefile | 1 +
>> drivers/spi/ag_spimctrl.c | 354
> +++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 363 insertions(+), 0 deletions(-)
>> create mode 100644 drivers/spi/ag_spimctrl.c
>>
>> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
>> index fc14b8d..a1846da 100644
>> --- a/drivers/spi/Kconfig
>> +++ b/drivers/spi/Kconfig
>> @@ -53,6 +53,14 @@ if SPI_MASTER
>>
>> comment "SPI Master Controller Drivers"
>>
>> +config SPI_AG_SPIMCTRL
>> + tristate "Aeroflex Gaisler SPI memory controller"
>> + depends on SPARC_LEON
>
> inconsistent whitespace. use tabs.
>
Fixed.
>> + select SPI_BITBANG
>> + help
>> + This is the driver for Aeroflex Gaisler's SPI memory controller
>> + (SPIMCTRL) found on some LEON/GRLIB SoCs.
>> +
>> config SPI_ALTERA
>> tristate "Altera SPI Controller"
>> select SPI_BITBANG
>> diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
>> index fd2fc5f..8a11a19 100644
>> --- a/drivers/spi/Makefile
>> +++ b/drivers/spi/Makefile
>> @@ -9,6 +9,7 @@ ccflags-$(CONFIG_SPI_DEBUG) := -DDEBUG
>> obj-$(CONFIG_SPI_MASTER) += spi.o
>>
>> # SPI master controller drivers (bus)
>> +obj-$(CONFIG_SPI_AG_SPIMCTRL) += ag_spimctrl.o
>> obj-$(CONFIG_SPI_ALTERA) += spi_altera.o
>> obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o
>> obj-$(CONFIG_SPI_ATH79) += ath79_spi.o
>> diff --git a/drivers/spi/ag_spimctrl.c b/drivers/spi/ag_spimctrl.c
>> new file mode 100644
>> index 0000000..022c1e8
>> --- /dev/null
>> +++ b/drivers/spi/ag_spimctrl.c
>> @@ -0,0 +1,354 @@
>> +/*
[ ... ]
>> +
>> +static int __devinit ag_spimctrl_probe(struct platform_device *pdev)
>> +{
>> + struct ag_spimctrl *hw;
>> + struct spi_master *master;
>> + int err = -ENODEV;
>> + u32 status;
>> +
>> + master = spi_alloc_master(&pdev->dev, sizeof(struct ag_spimctrl));
>> + if (!master)
>> + return err;
>> +
>> + /* setup the master state */
>> + master->bus_num = pdev->id;
>> + master->num_chipselect = AG_SPIM_NUMCS;
>> + master->mode_bits = SPI_CS_HIGH;
>> + master->setup = ag_spimctrl_setup;
>> + master->cleanup = ag_spimctrl_cleanup;
>> +
>> + hw = spi_master_get_devdata(master);
>> + platform_set_drvdata(pdev, hw);
>> +
>> + /* setup the state for the bitbang driver */
>> + hw->bitbang.master = spi_master_get(master);
>> + if (!hw->bitbang.master)
>> + goto exit;
>> + hw->bitbang.master->dev.of_node = pdev->dev.of_node;
>
> hw->bitbang.master->dev.of_node = of_node_get(pdev->dev.of_node);
>
Fixed.
>> +
>> + hw->bitbang.setup_transfer = ag_spimctrl_setupxfer;
>> + hw->bitbang.chipselect = ag_spimctrl_chipsel;
>> + hw->bitbang.txrx_bufs = ag_spimctrl_txrx;
>> +
>> + /* find and map our resources */
>> + hw->base = of_ioremap(&pdev->resource[AG_SPIM_REGBANK], 0,
>
> Hmmm. Will this device ever appear on anything other than a SPARC
machine?
> Using of_ioremap() makes the driver non-portable since only SPARC
> implements it. An alternative would be devm_ioremap()
>
We will probably only see it on SPARC SoCs so I have left it as is for
now. Let me know if you want it changed.
>> + resource_size(&pdev->resource[AG_SPIM_REGBANK]),
>> + "ag-spimctrl regs");
>
> Instead of hardcoding the offset into the resource table, use
> platform_get_resource(), with the IORESOURCE_MEM flag.
>
Fixed
>> + if (!hw->base) {
>> + err = -EBUSY;
>> + goto exit;
>> + }
>> +
>> + /* check current hw state. if controller is busy, leave it alone */
>> + status = ag_spim_read(hw->base + AG_SPIM_STAT);
>> + if (status & AG_SPIM_STAT_BUSY) {
>> + err = -EBUSY;
>> + goto exit_iounmap;
>> + }
>> +
>> + /* save control register value to keep settings */
>> + hw->ctrl = ag_spim_read(hw->base + AG_SPIM_CTRL);
>> +
>> + /* irq is optional */
>> + hw->irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
>
> The irq should already be populated in the platform_device resource
> table. You shouldn't need to call irq_of_parse_and_map().
>
I tried replacing the call with platform_get_irq() but did not get a
sensible value back. I am not familiar with how these structures get
populated. If I would follow how the irq is obtained in other drivers
for these SoCs I would have done: hw->irq = pdev->archdata.irqs[0];
I thought the call to irq_of_parse_and_map was cleaner, and the end
result is the same. If the use of irq_of_parse_and_map is not acceptable
I will need to dig deeper.
>> + if (hw->irq != NO_IRQ) {
>> + init_completion(&hw->done);
>> + err = request_irq(hw->irq, ag_spimctrl_irq, 0, pdev->name, hw);
>> + if (err)
>> + goto exit_iounmap;
>> + /* enable interrupt, written to hw below*/
>> + hw->ctrl |= AG_SPIM_CTRL_IEN;
>> + }
>> +
>> + /* enter user mode so SPI comm. can be done via reg. interface */
>> + if (!(hw->ctrl & AG_SPIM_CTRL_USRC)) {
>> + hw->ctrl |= AG_SPIM_CTRL_USRC;
>> + ag_spim_write(hw->ctrl, hw->base + AG_SPIM_CTRL);
>> + }
>> +
[ ... ]
>> + platform_set_drvdata(pdev, NULL);
>> +
>> + return 0;
>> +}
>> +
>> +#ifdef CONFIG_OF
>> +static const struct of_device_id ag_spimctrl_of_match[] = {
>> + { .name = "GAISLER_SPIMCTRL",},
>> + { .name = "01_045",},
>
> Matching by name is deprecated and strongly discouraged. You should
> match by compatible property. See
> http://devicetree.org/Device_Tree_Usage for a description on how to
> use the compatible property.
>
Thanks for the link. GRLIB SoCs have one, or several, plug'n'play
area(s) that are scanned by the loader. Currently the device tree for
LEON/GRLIB SoCs is automatically generated at boot by a loader (quite
convenient as the same linux image will work on many systems without the
need for user intervention) that creates { .name = "<vendor id>_<device
id>",} entries based on the information in plug'n'play. Apparently the
machine generated tree does not comply to what is described in
Device_Tree_Usage.
It seem that to be compliant with Device_Tree_Usage, the loaders that
generate the device tree will need to be modified. I have not been
involved in that development but I can bring this up with the developers
on Monday.
Could you accept the current match table for now and when/if the loaders
are updated we can submit patches that fixes all our drivers that use {
.name = "<vendor>_<device>",}?
I will send a V2 should you consider the changes above to be acceptable.
In the V2 I will also add support for shared IRQs and after comments
from a colleague I have renamed the driver to be consistent with names
of other drivers for GRLIB SoCs.
Thank you very much for the review!
Best regards,
Jan
------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network
management toolset available today. Delivers lowest initial
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
next prev parent reply other threads:[~2011-04-30 13:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-28 20:41 [PATCH] spi: add support for aeroflex gaisler spimctrl Jan Andersson
[not found] ` <1304023295-5829-1-git-send-email-jan-FkzTOoA/JUlBDgjK7y7TUQ@public.gmane.org>
2011-04-29 21:45 ` Grant Likely
2011-04-30 13:09 ` Jan Andersson [this message]
[not found] ` <4DBC09FB.5070406-FkzTOoA/JUnLoDKTGw+V6w@public.gmane.org>
2011-05-04 14:46 ` Jan Andersson
[not found] ` <4DC166B0.4090001-FkzTOoA/JUnLoDKTGw+V6w@public.gmane.org>
2011-05-04 14:46 ` Grant Likely
2011-04-30 13:11 ` [PATCH V2] " Jan Andersson
[not found] ` <1304169112-11224-1-git-send-email-jan-FkzTOoA/JUlBDgjK7y7TUQ@public.gmane.org>
2011-04-30 13:38 ` [PATCH V3] " Jan Andersson
[not found] ` <1304170705-11319-1-git-send-email-jan-FkzTOoA/JUlBDgjK7y7TUQ@public.gmane.org>
2011-05-20 7:26 ` Jan Andersson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DBC09FB.5070406@gaisler.se \
--to=jan-fkztooa/junlodktgw+v6w@public.gmane.org \
--cc=grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org \
--cc=spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).