On 6/17/2020 8:51 AM, Douglas Anderson wrote:
From: Ravi Kumar Bokka <rbo...@codeaurora.org>

This patch adds support for blowing fuses to the qfprom driver if the
required properties are defined in the device tree.

Signed-off-by: Ravi Kumar Bokka <rbo...@codeaurora.org>
Signed-off-by: Douglas Anderson <diand...@chromium.org>
---
Please double-check that I got the major/minor version logic right
here.  I don't have documentation for this, but Srinivas mentioned
that it was at address 0x6000 and I happened to find an "8" and a "7"
on sc7180 so I assumed that was the major and minor version.

Changes in v3:
- Don't provide "reset" value for things; just save/restore.
- Use the major/minor version read from 0x6000.
- Reading should still read "corrected", not "raw".
- Added a sysfs knob to allow you to read "raw" instead of "corrected"
- Simplified the SoC data structure.
- No need for quite so many levels of abstraction for clocks/regulator.
- Don't set regulator voltage.  Rely on device tree to make sure it's right.
- Properly undo things in the case of failure.
- Don't just keep enabling the regulator over and over again.
- Enable / disable the clock each time
- Polling every 100 us but timing out in 10 us didn't make sense; swap.
- No reason for 100 us to be SoC specific.
- No need for reg-names.
- We shouldn't be creating two separate nvmem devices.

  drivers/nvmem/qfprom.c | 314 +++++++++++++++++++++++++++++++++++++++--
  1 file changed, 303 insertions(+), 11 deletions(-)

diff --git a/drivers/nvmem/qfprom.c b/drivers/nvmem/qfprom.c
index 8a91717600be..486202860f84 100644
--- a/drivers/nvmem/qfprom.c
+++ b/drivers/nvmem/qfprom.c
@@ -3,57 +3,349 @@
   * Copyright (C) 2015 Srinivas Kandagatla <srinivas.kandaga...@linaro.org>
   */
+#include <linux/clk.h>
  #include <linux/device.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/mod_devicetable.h>
-#include <linux/io.h>
  #include <linux/nvmem-provider.h>
  #include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
+
+/* Blow timer clock frequency in Mhz */
+#define QFPROM_BLOW_TIMER_OFFSET 0x03c
+
+/* Amount of time required to hold charge to blow fuse in micro-seconds */
+#define QFPROM_FUSE_BLOW_POLL_US       10
+#define QFPROM_FUSE_BLOW_TIMEOUT_US    100
+
+#define QFPROM_BLOW_STATUS_OFFSET      0x048
+#define QFPROM_BLOW_STATUS_BUSY                0x1
+#define QFPROM_BLOW_STATUS_READY       0x0
+
+#define QFPROM_ACCEL_OFFSET            0x044
+
+#define QFPROM_VERSION_OFFSET          0x0
+#define QFPROM_MAJOR_VERSION_SHIFT     28
+#define QFPROM_MAJOR_VERSION_MASK      0xf
+#define QFPROM_MINOR_VERSION_SHIFT     16
+#define QFPROM_MINOR_VERSION_MASK      0xf

Minor looks wrong. Documentation says bits 27:16 are the minor version, and bits 15:0 are step. I think your minor mask needs to be 0xfff.

--
Jeffrey Hugo
Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

Reply via email to