]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - include/mmc.h
net: designware: Make driver independent from DM_GPIO again
[people/ms/u-boot.git] / include / mmc.h
index cda9a19ce0aab545faf5bc70ced71e34f0a48ad3..f383925ade2c5a846952175158997591035e357a 100644 (file)
@@ -49,6 +49,7 @@
 #define MMC_VERSION_4_41       MAKE_MMC_VERSION(4, 4, 1)
 #define MMC_VERSION_4_5                MAKE_MMC_VERSION(4, 5, 0)
 #define MMC_VERSION_5_0                MAKE_MMC_VERSION(5, 0, 0)
+#define MMC_VERSION_5_1                MAKE_MMC_VERSION(5, 1, 0)
 
 #define MMC_MODE_HS            (1 << 0)
 #define MMC_MODE_HS_52MHz      (1 << 1)
 #define OCR_VOLTAGE_MASK       0x007FFF80
 #define OCR_ACCESS_MODE                0x60000000
 
-#define SECURE_ERASE           0x80000000
+#define MMC_ERASE_ARG          0x00000000
+#define MMC_SECURE_ERASE_ARG   0x80000000
+#define MMC_TRIM_ARG           0x00000001
+#define MMC_DISCARD_ARG                0x00000003
+#define MMC_SECURE_TRIM1_ARG   0x80000001
+#define MMC_SECURE_TRIM2_ARG   0x80008000
 
 #define MMC_STATUS_MASK                (~0x0206BF7F)
 #define MMC_STATUS_SWITCH_ERROR        (1 << 7)
@@ -339,7 +345,9 @@ struct mmc_config {
 
 /* TODO struct mmc should be in mmc_private but it's hard to fix right now */
 struct mmc {
+#ifndef CONFIG_BLK
        struct list_head link;
+#endif
        const struct mmc_config *cfg;   /* provided configuration */
        uint version;
        void *priv;
@@ -359,7 +367,6 @@ struct mmc {
        u8 part_attr;
        u8 wr_rel_set;
        char part_config;
-       char part_num;
        uint tran_speed;
        uint read_bl_len;
        uint write_bl_len;
@@ -372,11 +379,16 @@ struct mmc {
        u64 capacity_gp[4];
        u64 enh_user_start;
        u64 enh_user_size;
-       block_dev_desc_t block_dev;
+#ifndef CONFIG_BLK
+       struct blk_desc block_dev;
+#endif
        char op_cond_pending;   /* 1 if we are waiting on an op_cond command */
        char init_in_progress;  /* 1 if we have done mmc_start_init() */
        char preinit;           /* start init as early as possible */
        int ddr_mode;
+#ifdef CONFIG_DM_MMC
+       struct udevice *dev;    /* Device for this MMC controller */
+#endif
 };
 
 struct mmc_hwpart_conf {
@@ -400,9 +412,30 @@ enum mmc_hwpart_conf_mode {
        MMC_HWPART_CONF_COMPLETE,
 };
 
-int mmc_register(struct mmc *mmc);
 struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
+
+/**
+ * mmc_bind() - Set up a new MMC device ready for probing
+ *
+ * A child block device is bound with the IF_TYPE_MMC interface type. This
+ * allows the device to be used with CONFIG_BLK
+ *
+ * @dev:       MMC device to set up
+ * @mmc:       MMC struct
+ * @cfg:       MMC configuration
+ * @return 0 if OK, -ve on error
+ */
+int mmc_bind(struct udevice *dev, struct mmc *mmc,
+            const struct mmc_config *cfg);
 void mmc_destroy(struct mmc *mmc);
+
+/**
+ * mmc_unbind() - Unbind a MMC device's child block device
+ *
+ * @dev:       MMC device
+ * @return 0 if OK, -ve on error
+ */
+int mmc_unbind(struct udevice *dev);
 int mmc_initialize(bd_t *bis);
 int mmc_init(struct mmc *mmc);
 int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
@@ -411,7 +444,6 @@ struct mmc *find_mmc_device(int dev_num);
 int mmc_set_dev(int dev_num);
 void print_mmc_devices(char separator);
 int get_mmc_num(void);
-int mmc_switch_part(int dev_num, unsigned int part_num);
 int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
                      enum mmc_hwpart_conf_mode mode);
 int mmc_getcd(struct mmc *mmc);
@@ -460,21 +492,18 @@ int mmc_start_init(struct mmc *mmc);
  */
 void mmc_set_preinit(struct mmc *mmc, int preinit);
 
-#ifdef CONFIG_GENERIC_MMC
 #ifdef CONFIG_MMC_SPI
 #define mmc_host_is_spi(mmc)   ((mmc)->cfg->host_caps & MMC_MODE_SPI)
 #else
 #define mmc_host_is_spi(mmc)   0
 #endif
 struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
-#else
-int mmc_legacy_init(int verbose);
-#endif
 
 void board_mmc_power_init(void);
 int board_mmc_init(bd_t *bis);
 int cpu_mmc_init(bd_t *bis);
 int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
+int mmc_get_env_dev(void);
 
 struct pci_device_id;
 
@@ -484,15 +513,21 @@ struct pci_device_id;
  * This finds all the matching PCI IDs and sets them up as MMC devices.
  *
  * @name:              Name to use for devices
- * @mmc_supported:     PCI IDs to search for
- * @num_ids:           Number of elements in @mmc_supported
+ * @mmc_supported:     PCI IDs to search for, terminated by {0, 0}
  */
-int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported,
-                int num_ids);
+int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported);
 
 /* Set block count limit because of 16 bit register limit on some hardware*/
 #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
 #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
 #endif
 
+/**
+ * mmc_get_blk_desc() - Get the block descriptor for an MMC device
+ *
+ * @mmc:       MMC device
+ * @return block device if found, else NULL
+ */
+struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);
+
 #endif /* _MMC_H_ */