diff mbox series

[v2] fpga: mgr: altera-ps-spi: enable usage on non-dt platforms

Message ID 20181029141709.14749-1-agust@denx.de
State Changes Requested
Headers show
Series [v2] fpga: mgr: altera-ps-spi: enable usage on non-dt platforms | expand

Commit Message

Anatolij Gustschin Oct. 29, 2018, 2:17 p.m. UTC
Driver probing fails on non-dt platforms since of_match_device()
always returns NULL here. Add device names and matching driver
data to the spi_device_id table. This allows driver binding to
dynamically added PS-SPI devices (e.g. added via spi_new_device()
after hot-plugging).

Signed-off-by: Anatolij Gustschin <agust@denx.de>
---
Changes in v2:
 - removed not necessary braces {}
 - dropped not needed !id check
 
 drivers/fpga/altera-ps-spi.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

Comments

Alan Tull Nov. 1, 2018, 7:37 p.m. UTC | #1
On Mon, Oct 29, 2018 at 9:17 AM Anatolij Gustschin <agust@denx.de> wrote:

Hi Anatolij,

>
> Driver probing fails on non-dt platforms since of_match_device()
> always returns NULL here. Add device names and matching driver
> data to the spi_device_id table. This allows driver binding to
> dynamically added PS-SPI devices (e.g. added via spi_new_device()
> after hot-plugging).
>
> Signed-off-by: Anatolij Gustschin <agust@denx.de>
> ---
> Changes in v2:
>  - removed not necessary braces {}
>  - dropped not needed !id check
>
>  drivers/fpga/altera-ps-spi.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/fpga/altera-ps-spi.c b/drivers/fpga/altera-ps-spi.c
> index 33aafda50af5..b8136ee49ace 100644
> --- a/drivers/fpga/altera-ps-spi.c
> +++ b/drivers/fpga/altera-ps-spi.c
> @@ -238,17 +238,23 @@ static int altera_ps_probe(struct spi_device *spi)
>  {
>         struct altera_ps_conf *conf;
>         const struct of_device_id *of_id;
> +       const struct spi_device_id *id;
>         struct fpga_manager *mgr;
>
>         conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL);
>         if (!conf)
>                 return -ENOMEM;
>
> -       of_id = of_match_device(of_ef_match, &spi->dev);
> -       if (!of_id)
> -               return -ENODEV;
> +       if (spi->dev.of_node) {
> +               of_id = of_match_device(of_ef_match, &spi->dev);
> +               if (!of_id)
> +                       return -ENODEV;
> +               conf->data = of_id->data;
> +       } else {
> +               id = spi_get_device_id(spi);
> +               conf->data = (struct altera_ps_data *)id->driver_data;
> +       }
>
> -       conf->data = of_id->data;
>         conf->spi = spi;
>         conf->config = devm_gpiod_get(&spi->dev, "nconfig", GPIOD_OUT_LOW);
>         if (IS_ERR(conf->config)) {
> @@ -294,7 +300,9 @@ static int altera_ps_remove(struct spi_device *spi)
>  }
>
>  static const struct spi_device_id altera_ps_spi_ids[] = {
> -       {"cyclone-ps-spi", 0},
> +       {"cyclone-ps-spi", (kernel_ulong_t)&c5_data},
> +       {"fpga-passive-serial", (kernel_ulong_t)&c5_data},
> +       {"fpga-arria10-passive-serial", (kernel_ulong_t)&a10_data},

I don't think this should be implemented as a pointer. This would be
easy if driver_data were void* but it's a value that's not a pointer.
 I suggest using driver_data as a index to an array of pointers to the
structs instead.

Thanks,
Alan

>         {}
>  };
>  MODULE_DEVICE_TABLE(spi, altera_ps_spi_ids);
> --
> 2.17.1
>
Anatolij Gustschin Nov. 5, 2018, 5:54 p.m. UTC | #2
Hi Alan,

On Thu, 1 Nov 2018 14:37:02 -0500
Alan Tull atull@kernel.org wrote:
...
>>  static const struct spi_device_id altera_ps_spi_ids[] = {
>> -       {"cyclone-ps-spi", 0},
>> +       {"cyclone-ps-spi", (kernel_ulong_t)&c5_data},
>> +       {"fpga-passive-serial", (kernel_ulong_t)&c5_data},
>> +       {"fpga-arria10-passive-serial", (kernel_ulong_t)&a10_data},  
>
>I don't think this should be implemented as a pointer. This would be
>easy if driver_data were void* but it's a value that's not a pointer.
> I suggest using driver_data as a index to an array of pointers to the
>structs instead.

Thanks for review. I've sent v3 using array of pointers. It uses
the FPGA type in driver_data. It could be used as an index to the
array of pointers, but I'd prefer checking for this type explicitly,
so it will work even if the array is wrongly extended or reordered
by future changes.

Thanks,

Anatolij
diff mbox series

Patch

diff --git a/drivers/fpga/altera-ps-spi.c b/drivers/fpga/altera-ps-spi.c
index 33aafda50af5..b8136ee49ace 100644
--- a/drivers/fpga/altera-ps-spi.c
+++ b/drivers/fpga/altera-ps-spi.c
@@ -238,17 +238,23 @@  static int altera_ps_probe(struct spi_device *spi)
 {
 	struct altera_ps_conf *conf;
 	const struct of_device_id *of_id;
+	const struct spi_device_id *id;
 	struct fpga_manager *mgr;
 
 	conf = devm_kzalloc(&spi->dev, sizeof(*conf), GFP_KERNEL);
 	if (!conf)
 		return -ENOMEM;
 
-	of_id = of_match_device(of_ef_match, &spi->dev);
-	if (!of_id)
-		return -ENODEV;
+	if (spi->dev.of_node) {
+		of_id = of_match_device(of_ef_match, &spi->dev);
+		if (!of_id)
+			return -ENODEV;
+		conf->data = of_id->data;
+	} else {
+		id = spi_get_device_id(spi);
+		conf->data = (struct altera_ps_data *)id->driver_data;
+	}
 
-	conf->data = of_id->data;
 	conf->spi = spi;
 	conf->config = devm_gpiod_get(&spi->dev, "nconfig", GPIOD_OUT_LOW);
 	if (IS_ERR(conf->config)) {
@@ -294,7 +300,9 @@  static int altera_ps_remove(struct spi_device *spi)
 }
 
 static const struct spi_device_id altera_ps_spi_ids[] = {
-	{"cyclone-ps-spi", 0},
+	{"cyclone-ps-spi", (kernel_ulong_t)&c5_data},
+	{"fpga-passive-serial", (kernel_ulong_t)&c5_data},
+	{"fpga-arria10-passive-serial", (kernel_ulong_t)&a10_data},
 	{}
 };
 MODULE_DEVICE_TABLE(spi, altera_ps_spi_ids);