|
@@ -184,6 +184,19 @@ static inline void spi_use_in(struct spi_trans *trans, unsigned bytes)
|
|
|
trans->bytesin -= bytes;
|
|
|
}
|
|
|
|
|
|
+static void spi_lock_down(struct ich_spi_platdata *plat, void *sbase)
|
|
|
+{
|
|
|
+ if (plat->ich_version == ICHV_7) {
|
|
|
+ struct ich7_spi_regs *ich7_spi = sbase;
|
|
|
+
|
|
|
+ setbits_le16(&ich7_spi->spis, SPIS_LOCK);
|
|
|
+ } else if (plat->ich_version == ICHV_9) {
|
|
|
+ struct ich9_spi_regs *ich9_spi = sbase;
|
|
|
+
|
|
|
+ setbits_le16(&ich9_spi->hsfs, HSFS_FLOCKDN);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static bool spi_lock_status(struct ich_spi_platdata *plat, void *sbase)
|
|
|
{
|
|
|
int lock = 0;
|
|
@@ -592,6 +605,12 @@ static int ich_spi_probe(struct udevice *dev)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /* Lock down SPI controller settings if required */
|
|
|
+ if (plat->lockdown) {
|
|
|
+ ich_spi_config_opcode(dev);
|
|
|
+ spi_lock_down(plat, priv->base);
|
|
|
+ }
|
|
|
+
|
|
|
priv->cur_speed = priv->max_speed;
|
|
|
|
|
|
return 0;
|
|
@@ -662,6 +681,9 @@ static int ich_spi_ofdata_to_platdata(struct udevice *dev)
|
|
|
plat->ich_version = ICHV_9;
|
|
|
}
|
|
|
|
|
|
+ plat->lockdown = fdtdec_get_bool(gd->fdt_blob, node,
|
|
|
+ "intel,spi-lock-down");
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|