Thread (8 messages) 8 messages, 3 authors, 2022-01-10

Re: [PATCH v9 3/3] mmc: Add driver for LiteX's LiteSDCard interface

From: Andy Shevchenko <hidden>
Date: 2022-01-08 17:43:59
Also in: linux-mmc, lkml

On Sat, Jan 8, 2022 at 6:11 PM Gabriel Somlo [off-list ref] wrote:
LiteX (https://github.com/enjoy-digital/litex) is a SoC framework
that targets FPGAs. LiteSDCard is a small footprint, configurable
SDCard core commonly used in LiteX designs.

The driver was first written in May 2020 and has been maintained
cooperatively by the LiteX community. Thanks to all contributors!
Thanks for an update, my comments below.

...
+#include <linux/bits.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/interrupt.h>
+#include <linux/iopoll.h>
+#include <linux/litex.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/mmc/host.h>
+#include <linux/mmc/mmc.h>
+#include <linux/mmc/sd.h>
I would move this group of headers...
+#include <linux/platform_device.h>
+
...somewhere here to show that this driver belongs to the MMC subsystem.

...
+#define LITEX_MMC_OCR (MMC_VDD_27_28 | MMC_VDD_28_29 | MMC_VDD_29_30 | \
+                      MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 | \
+                      MMC_VDD_33_34 | MMC_VDD_34_35 | MMC_VDD_35_36)
Seems to me this is identical to
https://elixir.bootlin.com/linux/latest/source/drivers/mmc/host/au1xmmc.c#L72

And may be reused in
https://elixir.bootlin.com/linux/latest/source/drivers/mmc/host/vub300.c#L2168.

Perhaps it makes sense to have

#define MMC_VDD_27_36 ...

in mmc.h?

In any case, it can be postponed, just a side note for the future improvements.

...
+       /* Ensure bus width will be set (again) upon card (re)insertion */
+       if (ret == 0)
+               host->is_bus_width_set = false;
+
+       return ret;
Please, switch to standard pattern, i.e.

  if (ret)
    return ret;
  ...
  return 0;

...
+       u32 div;
+
+       div = freq ? host->ref_clk / freq : 256U;
+       div = roundup_pow_of_two(div);
+       div = clamp(div, 2U, 256U);
Not sure why it becomes two lines again.

...
+       ret = devm_add_action_or_reset(dev,
+                                      (void(*)(void *))mmc_free_host, mmc);
One line?
An actually preferable way is to define a separate wrapper function
and use it here without any casting.
+       if (ret) {
+               dev_err(dev, "Failed to register mmc_free_host action\n");
+               return ret;
return dev_err_probe(...);
+       }
...
+       clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(clk)) {
+               ret = dev_err_probe(dev, PTR_ERR(clk), "can't get clock\n");
+               return ret;
    return dev_err_probe(...);
+       }
...
+       ret = mmc_add_host(mmc);
+
+       return ret;
It's now

    return mmc_add_host(...);
+}
-- 
With Best Regards,
Andy Shevchenko
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help