Javier Martin <javier.martin@xxxxxxxxxxxxxxxxx> writes: Hi, > SAHARA2 HW module is included in the i.MX27 SoC from > Freescale. It is capable of performing cipher algorithms > such as AES, 3DES..., hashing and RNG too. The rmmod oops is gone with this version, thanks. > > This driver provides support for AES-CBC and AES-ECB > by now. > > Signed-off-by: Javier Martin <javier.martin@xxxxxxxxxxxxxxxxx> > --- > drivers/crypto/Kconfig | 10 + > drivers/crypto/Makefile | 1 + > drivers/crypto/sahara.c | 1070 +++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 1081 insertions(+) > create mode 100644 drivers/crypto/sahara.c > > diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig > index 87ec4d0..7d73f5a 100644 > --- a/drivers/crypto/Kconfig > +++ b/drivers/crypto/Kconfig > @@ -276,6 +276,16 @@ config CRYPTO_DEV_PICOXCELL > > Saying m here will build a module named pipcoxcell_crypto. > > +config CRYPTO_DEV_SAHARA > + tristate "Support for SAHARA crypto accelerator" > + depends on MACH_MX27 && EXPERIMENTAL && OF maybe switch to ARCH_MXC instead of MAC_MX27 ? [...] > +static struct platform_driver sahara_driver = { > + .probe = sahara_probe, > + .remove = __devexit_p(sahara_remove), Please remove the __devexit_p too. For information, you'll find below what I've changed to test the driver on my imx51. It's not perfect but it's enough for testing things. Arnaud
Index: sascha-new/Documentation/devicetree/bindings/clock/imx5-clock.txt =================================================================== --- sascha-new.orig/Documentation/devicetree/bindings/clock/imx5-clock.txt 2013-02-27 22:30:39.000000000 +0100 +++ sascha-new/Documentation/devicetree/bindings/clock/imx5-clock.txt 2013-02-27 22:36:07.007547186 +0100 @@ -173,6 +173,7 @@ clocks and IDs. can1_ipg_gate 158 srtc_gate 159 pata_gate 160 + sahara_gate 161 Examples (for mx53): Index: sascha-new/arch/arm/boot/dts/imx51-genesi-efika-sb.dts =================================================================== --- sascha-new.orig/arch/arm/boot/dts/imx51-genesi-efika-sb.dts 2013-02-27 22:30:39.000000000 +0100 +++ sascha-new/arch/arm/boot/dts/imx51-genesi-efika-sb.dts 2013-02-27 22:36:07.043547182 +0100 @@ -399,3 +399,6 @@ status = "okay"; }; +&sahara { + status = "okay"; +}; Index: sascha-new/arch/arm/boot/dts/imx51.dtsi =================================================================== --- sascha-new.orig/arch/arm/boot/dts/imx51.dtsi 2013-02-27 22:30:39.000000000 +0100 +++ sascha-new/arch/arm/boot/dts/imx51.dtsi 2013-02-27 22:36:07.071547182 +0100 @@ -678,6 +678,15 @@ clock-names = "per", "ahb"; status = "disabled"; }; + + sahara: sahara@83ff8000 { + compatible = "fsl,imx51-sahara"; + reg = <0x83ff8000 0x4000>; + interrupts = <19>; + clocks = <&clks 161>, <&clks 0>; + clock-names = "ipg", "ahb"; + status = "disabled"; + }; }; }; }; Index: sascha-new/arch/arm/mach-imx/clk-imx51-imx53.c =================================================================== --- sascha-new.orig/arch/arm/mach-imx/clk-imx51-imx53.c 2013-02-27 22:30:39.000000000 +0100 +++ sascha-new/arch/arm/mach-imx/clk-imx51-imx53.c 2013-02-27 22:36:07.015547183 +0100 @@ -83,6 +83,7 @@ enum imx5_clks { ssi2_root_gate, ssi3_root_gate, ssi_ext1_gate, ssi_ext2_gate, epit1_ipg_gate, epit1_hf_gate, epit2_ipg_gate, epit2_hf_gate, can_sel, can1_serial_gate, can1_ipg_gate, srtc_gate, pata_gate, + sahara_gate, clk_max }; @@ -346,6 +347,7 @@ int __init mx51_clocks_init(unsigned lon clk[mipi_esc_gate] = imx_clk_gate2("mipi_esc_gate", "ipg", MXC_CCM_CCGR4, 10); clk[mipi_hsp_gate] = imx_clk_gate2("mipi_hsp_gate", "ipg", MXC_CCM_CCGR4, 12); clk[pata_gate] = imx_clk_gate2("pata_gate", "ipg", MXC_CCM_CCGR4, 0); + clk[sahara_gate] = imx_clk_gate2("sahara_gate", "ipg", MXC_CCM_CCGR4, 14); for (i = 0; i < ARRAY_SIZE(clk); i++) if (IS_ERR(clk[i])) Index: sascha-new/drivers/crypto/Kconfig =================================================================== --- sascha-new.orig/drivers/crypto/Kconfig 2013-02-27 22:30:59.000000000 +0100 +++ sascha-new/drivers/crypto/Kconfig 2013-02-27 22:36:07.079547182 +0100 @@ -278,7 +278,7 @@ config CRYPTO_DEV_PICOXCELL config CRYPTO_DEV_SAHARA tristate "Support for SAHARA crypto accelerator" - depends on MACH_MX27 && EXPERIMENTAL && OF + depends on ARCH_MXC && EXPERIMENTAL && OF select CRYPTO_BLKCIPHER select CRYPTO_AES select CRYPTO_ECB Index: sascha-new/drivers/crypto/sahara.c =================================================================== --- sascha-new.orig/drivers/crypto/sahara.c 2013-02-27 22:30:59.000000000 +0100 +++ sascha-new/drivers/crypto/sahara.c 2013-02-27 22:45:40.359521961 +0100 @@ -24,6 +24,7 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #define SAHARA_NAME "sahara" @@ -859,14 +860,30 @@ static struct platform_device_id sahara_ }; MODULE_DEVICE_TABLE(platform, sahara_platform_ids); +struct sahara_data { + int version; +}; + +static struct sahara_data sahara_data_v3 = { + .version = 3, +}; + +static struct sahara_data sahara_data_v4 = { + .version = 4, +}; + static struct of_device_id sahara_dt_ids[] = { - { .compatible = "fsl,imx27-sahara" }, + { .compatible = "fsl,imx51-sahara", .data = &sahara_data_v4, }, + { .compatible = "fsl,imx27-sahara", .data = &sahara_data_v3, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(platform, sahara_dt_ids); static int sahara_probe(struct platform_device *pdev) { + const struct of_device_id *of_id = + of_match_device(sahara_dt_ids, &pdev->dev); + const struct sahara_data *data; struct sahara_dev *dev; struct resource *res; u32 version; @@ -982,10 +999,13 @@ static int sahara_probe(struct platform_ clk_prepare_enable(dev->clk_ipg); clk_prepare_enable(dev->clk_ahb); + data = of_id->data; + version = sahara_read(dev, SAHARA_REG_VERSION); - if (version != SAHARA_VERSION_3) { - dev_err(&pdev->dev, "SAHARA version %d not supported\n", - version); + /* sahara 4 version nr is not encoded in the same way as 2/3 */ + if ((version != data->version) && (((version >> 8) & 0xff) != data->version)) { + dev_err(&pdev->dev, "SAHARA version %d not supported (wanted %d)\n", + version, data->version); err = -ENODEV; goto err_algs; } @@ -1002,7 +1022,7 @@ static int sahara_probe(struct platform_ if (err) goto err_algs; - dev_info(&pdev->dev, "SAHARA version %d initialized\n", version); + dev_info(&pdev->dev, "SAHARA version %d initialized\n", data->version); return 0; @@ -1054,7 +1074,7 @@ static int sahara_remove(struct platform static struct platform_driver sahara_driver = { .probe = sahara_probe, - .remove = __devexit_p(sahara_remove), + .remove = sahara_remove, .driver = { .name = SAHARA_NAME, .owner = THIS_MODULE,