diff mbox series

[v1,4/5] mmc: atmel-mci: Incapsulate used to be a platform data into host structure

Message ID 20240417165708.2965612-5-andriy.shevchenko@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series mmc: atmel-mci: Get rid of leftovers and clean up | expand

Commit Message

Andy Shevchenko April 17, 2024, 4:55 p.m. UTC
After platform data is gone, we always allocate memory for the slot
information. Incapsulate the array of the latter into the host structure,
so we allocate memory only once. This makes code simpler.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/mmc/host/atmel-mci.c | 66 ++++++++++++++----------------------
 1 file changed, 25 insertions(+), 41 deletions(-)

Comments

kernel test robot April 17, 2024, 8:42 p.m. UTC | #1
Hi Andy,

kernel test robot noticed the following build warnings:

[auto build test WARNING on soc/for-next]
[also build test WARNING on linus/master v6.9-rc4 next-20240417]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/mmc-atmel-mci-Get-rid-of-platform-data-leftovers/20240418-005915
base:   https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next
patch link:    https://lore.kernel.org/r/20240417165708.2965612-5-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v1 4/5] mmc: atmel-mci: Incapsulate used to be a platform data into host structure
config: arm-defconfig (https://download.01.org/0day-ci/archive/20240418/202404180428.bZDYDFAE-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project.git f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240418/202404180428.bZDYDFAE-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202404180428.bZDYDFAE-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/mmc/host/atmel-mci.c:378: warning: Function parameter or struct member 'pdata' not described in 'atmel_mci'


vim +378 drivers/mmc/host/atmel-mci.c

65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  245  
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  246  /**
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  247   * struct atmel_mci - MMC controller state shared between all slots
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  248   * @lock: Spinlock protecting the queue and associated data.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  249   * @regs: Pointer to MMIO registers.
796211b7953bd1 Ludovic Desroches  2011-08-11  250   * @sg: Scatterlist entry currently being processed by PIO or PDC code.
f51874b7ec92cb Lee Jones          2020-07-01  251   * @sg_len: Size of the scatterlist
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  252   * @pio_offset: Offset into the current scatterlist entry.
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  253   * @buffer: Buffer used if we don't have the r/w proof capability. We
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  254   *      don't have the time to switch pdc buffers so we have to use only
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  255   *      one buffer for the full transaction.
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  256   * @buf_size: size of the buffer.
f51874b7ec92cb Lee Jones          2020-07-01  257   * @buf_phys_addr: buffer address needed for pdc.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  258   * @cur_slot: The slot which is currently using the controller.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  259   * @mrq: The request currently being processed on @cur_slot,
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  260   *	or NULL if the controller is idle.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  261   * @cmd: The command currently being sent to the card, or NULL.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  262   * @data: The data currently being transferred, or NULL if no data
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  263   *	transfer is in progress.
796211b7953bd1 Ludovic Desroches  2011-08-11  264   * @data_size: just data->blocks * data->blksz.
65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  265   * @dma: DMA client state.
65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  266   * @data_chan: DMA channel being used for the current data transfer.
f51874b7ec92cb Lee Jones          2020-07-01  267   * @dma_conf: Configuration for the DMA slave
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  268   * @cmd_status: Snapshot of SR taken upon completion of the current
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  269   *	command. Only valid when EVENT_CMD_COMPLETE is pending.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  270   * @data_status: Snapshot of SR taken upon completion of the current
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  271   *	data transfer. Only valid when EVENT_DATA_COMPLETE or
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  272   *	EVENT_DATA_ERROR is pending.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  273   * @stop_cmdr: Value to be loaded into CMDR when the stop command is
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  274   *	to be sent.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  275   * @tasklet: Tasklet running the request state machine.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  276   * @pending_events: Bitmask of events flagged by the interrupt handler
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  277   *	to be processed by the tasklet.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  278   * @completed_events: Bitmask of events which the state machine has
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  279   *	processed.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  280   * @state: Tasklet state.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  281   * @queue: List of slots waiting for access to the controller.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  282   * @need_clock_update: Update the clock rate before the next request.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  283   * @need_reset: Reset controller before next request.
24011f346471f7 Ludovic Desroches  2012-05-16  284   * @timer: Timer to balance the data timeout error flag which cannot rise.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  285   * @mode_reg: Value of the MR register.
74791a2dc8dc2a Nicolas Ferre      2009-12-14  286   * @cfg_reg: Value of the CFG register.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  287   * @bus_hz: The rate of @mck in Hz. This forms the basis for MMC bus
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  288   *	rate and timeout calculations.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  289   * @mapbase: Physical address of the MMIO registers.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  290   * @mck: The peripheral bus clock hooked up to the MMC controller.
d9faa6e8381c3a Andy Shevchenko    2024-04-17  291   * @dev: Device associated with the MMC controller.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  292   * @slot: Slots sharing this MMC controller.
796211b7953bd1 Ludovic Desroches  2011-08-11  293   * @caps: MCI capabilities depending on MCI version.
796211b7953bd1 Ludovic Desroches  2011-08-11  294   * @prepare_data: function to setup MCI before data transfer which
796211b7953bd1 Ludovic Desroches  2011-08-11  295   * depends on MCI capabilities.
796211b7953bd1 Ludovic Desroches  2011-08-11  296   * @submit_data: function to start data transfer which depends on MCI
796211b7953bd1 Ludovic Desroches  2011-08-11  297   * capabilities.
796211b7953bd1 Ludovic Desroches  2011-08-11  298   * @stop_transfer: function to stop data transfer which depends on MCI
796211b7953bd1 Ludovic Desroches  2011-08-11  299   * capabilities.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  300   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  301   * Locking
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  302   * =======
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  303   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  304   * @lock is a softirq-safe spinlock protecting @queue as well as
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  305   * @cur_slot, @mrq and @state. These must always be updated
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  306   * at the same time while holding @lock.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  307   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  308   * @lock also protects mode_reg and need_clock_update since these are
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  309   * used to synchronize mode register updates with the queue
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  310   * processing.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  311   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  312   * The @mrq field of struct atmel_mci_slot is also protected by @lock,
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  313   * and must always be written at the same time as the slot is added to
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  314   * @queue.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  315   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  316   * @pending_events and @completed_events are accessed using atomic bit
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  317   * operations, so they don't need any locking.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  318   *
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  319   * None of the fields touched by the interrupt handler need any
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  320   * locking. However, ordering is important: Before EVENT_DATA_ERROR or
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  321   * EVENT_DATA_COMPLETE is set in @pending_events, all data-related
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  322   * interrupts must be disabled and @data_status updated with a
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  323   * snapshot of SR. Similarly, before EVENT_CMD_COMPLETE is set, the
25985edcedea63 Lucas De Marchi    2011-03-30  324   * CMDRDY interrupt must be disabled and @cmd_status updated with a
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  325   * snapshot of SR, and before EVENT_XFER_COMPLETE can be set, the
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  326   * bytes_xfered field of @data must be written. This is ensured by
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  327   * using barriers.
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  328   */
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  329  struct atmel_mci {
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  330  	spinlock_t		lock;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  331  	void __iomem		*regs;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  332  
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  333  	struct scatterlist	*sg;
bdbc5d0c60f3e9 Terry Barnaby      2013-04-08  334  	unsigned int		sg_len;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  335  	unsigned int		pio_offset;
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  336  	unsigned int		*buffer;
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  337  	unsigned int		buf_size;
7a90dcc2d7ceb6 Ludovic Desroches  2012-05-16  338  	dma_addr_t		buf_phys_addr;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  339  
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  340  	struct atmel_mci_slot	*cur_slot;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  341  	struct mmc_request	*mrq;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  342  	struct mmc_command	*cmd;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  343  	struct mmc_data		*data;
796211b7953bd1 Ludovic Desroches  2011-08-11  344  	unsigned int		data_size;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  345  
65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  346  	struct atmel_mci_dma	dma;
65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  347  	struct dma_chan		*data_chan;
e2b35f3dbfc080 Viresh Kumar       2012-02-01  348  	struct dma_slave_config	dma_conf;
65e8b083fc8ec3 Haavard Skinnemoen 2008-07-30  349  
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  350  	u32			cmd_status;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  351  	u32			data_status;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  352  	u32			stop_cmdr;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  353  
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  354  	struct tasklet_struct	tasklet;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  355  	unsigned long		pending_events;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  356  	unsigned long		completed_events;
c06ad2580dca4e Haavard Skinnemoen 2008-07-31  357  	enum atmel_mci_state	state;
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  358  	struct list_head	queue;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  359  
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  360  	bool			need_clock_update;
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  361  	bool			need_reset;
24011f346471f7 Ludovic Desroches  2012-05-16  362  	struct timer_list	timer;
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  363  	u32			mode_reg;
74791a2dc8dc2a Nicolas Ferre      2009-12-14  364  	u32			cfg_reg;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  365  	unsigned long		bus_hz;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  366  	unsigned long		mapbase;
7d2be0749a5909 Haavard Skinnemoen 2008-06-30  367  	struct clk		*mck;
d9faa6e8381c3a Andy Shevchenko    2024-04-17  368  	struct device		*dev;
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  369  
e20b1c52f08695 Andy Shevchenko    2024-04-17  370  	struct mci_slot_pdata	pdata[ATMCI_MAX_NR_SLOTS];
2c96a293bbd6b3 Ludovic Desroches  2011-08-11  371  	struct atmel_mci_slot	*slot[ATMCI_MAX_NR_SLOTS];
796211b7953bd1 Ludovic Desroches  2011-08-11  372  
796211b7953bd1 Ludovic Desroches  2011-08-11  373  	struct atmel_mci_caps   caps;
796211b7953bd1 Ludovic Desroches  2011-08-11  374  
796211b7953bd1 Ludovic Desroches  2011-08-11  375  	u32 (*prepare_data)(struct atmel_mci *host, struct mmc_data *data);
796211b7953bd1 Ludovic Desroches  2011-08-11  376  	void (*submit_data)(struct atmel_mci *host, struct mmc_data *data);
796211b7953bd1 Ludovic Desroches  2011-08-11  377  	void (*stop_transfer)(struct atmel_mci *host);
965ebf33ea5afb Haavard Skinnemoen 2008-09-17 @378  };
965ebf33ea5afb Haavard Skinnemoen 2008-09-17  379
Andy Shevchenko April 18, 2024, 9:33 a.m. UTC | #2
On Thu, Apr 18, 2024 at 04:42:07AM +0800, kernel test robot wrote:
> Hi Andy,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on soc/for-next]
> [also build test WARNING on linus/master v6.9-rc4 next-20240417]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/mmc-atmel-mci-Get-rid-of-platform-data-leftovers/20240418-005915
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next
> patch link:    https://lore.kernel.org/r/20240417165708.2965612-5-andriy.shevchenko%40linux.intel.com
> patch subject: [PATCH v1 4/5] mmc: atmel-mci: Incapsulate used to be a platform data into host structure
> config: arm-defconfig (https://download.01.org/0day-ci/archive/20240418/202404180428.bZDYDFAE-lkp@intel.com/config)
> compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project.git f28c006a5895fc0e329fe15fead81e37457cb1d1)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240418/202404180428.bZDYDFAE-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202404180428.bZDYDFAE-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):
> 
> >> drivers/mmc/host/atmel-mci.c:378: warning: Function parameter or struct member 'pdata' not described in 'atmel_mci'

Indeed. I'll fix this in next version, but will wait for others to comment on
the real code and approach in general.
diff mbox series

Patch

diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index 3aed57c392fa..3ae17b8584a2 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -224,14 +224,6 @@  struct mci_slot_pdata {
 	bool			non_removable;
 };
 
-/**
- * struct mci_platform_data - board-specific MMC/SDcard configuration
- * @slot: Per-slot configuration data.
- */
-struct mci_platform_data {
-	struct mci_slot_pdata	slot[ATMCI_MAX_NR_SLOTS];
-};
-
 struct atmel_mci_caps {
 	bool    has_dma_conf_reg;
 	bool    has_pdc;
@@ -375,6 +367,7 @@  struct atmel_mci {
 	struct clk		*mck;
 	struct device		*dev;
 
+	struct mci_slot_pdata	pdata[ATMCI_MAX_NR_SLOTS];
 	struct atmel_mci_slot	*slot[ATMCI_MAX_NR_SLOTS];
 
 	struct atmel_mci_caps   caps;
@@ -630,22 +623,16 @@  static const struct of_device_id atmci_dt_ids[] = {
 
 MODULE_DEVICE_TABLE(of, atmci_dt_ids);
 
-static struct mci_platform_data *atmci_of_init(struct device *dev)
+static int atmci_of_init(struct atmel_mci *host)
 {
+	struct device *dev = host->dev;
 	struct device_node *np = dev->of_node;
 	struct device_node *cnp;
-	struct mci_platform_data *pdata;
 	u32 slot_id;
 	int err;
 
-	if (!np) {
-		dev_err(dev, "device node not found\n");
-		return ERR_PTR(-EINVAL);
-	}
-
-	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
-	if (!pdata)
-		return ERR_PTR(-ENOMEM);
+	if (!np)
+		return dev_err_probe(dev, -EINVAL, "device node not found\n");
 
 	for_each_child_of_node(np, cnp) {
 		if (of_property_read_u32(cnp, "reg", &slot_id)) {
@@ -661,38 +648,38 @@  static struct mci_platform_data *atmci_of_init(struct device *dev)
 		}
 
 		if (of_property_read_u32(cnp, "bus-width",
-		                         &pdata->slot[slot_id].bus_width))
-			pdata->slot[slot_id].bus_width = 1;
+					 &host->pdata[slot_id].bus_width))
+			host->pdata[slot_id].bus_width = 1;
 
-		pdata->slot[slot_id].detect_pin =
+		host->pdata[slot_id].detect_pin =
 			devm_fwnode_gpiod_get(dev, of_fwnode_handle(cnp),
 					      "cd", GPIOD_IN, "cd-gpios");
-		err = PTR_ERR_OR_ZERO(pdata->slot[slot_id].detect_pin);
+		err = PTR_ERR_OR_ZERO(host->pdata[slot_id].detect_pin);
 		if (err) {
 			if (err != -ENOENT) {
 				of_node_put(cnp);
-				return ERR_PTR(err);
+				return err;
 			}
-			pdata->slot[slot_id].detect_pin = NULL;
+			host->pdata[slot_id].detect_pin = NULL;
 		}
 
-		pdata->slot[slot_id].non_removable =
+		host->pdata[slot_id].non_removable =
 			of_property_read_bool(cnp, "non-removable");
 
-		pdata->slot[slot_id].wp_pin =
+		host->pdata[slot_id].wp_pin =
 			devm_fwnode_gpiod_get(dev, of_fwnode_handle(cnp),
 					      "wp", GPIOD_IN, "wp-gpios");
-		err = PTR_ERR_OR_ZERO(pdata->slot[slot_id].wp_pin);
+		err = PTR_ERR_OR_ZERO(host->pdata[slot_id].wp_pin);
 		if (err) {
 			if (err != -ENOENT) {
 				of_node_put(cnp);
-				return ERR_PTR(err);
+				return err;
 			}
-			pdata->slot[slot_id].wp_pin = NULL;
+			host->pdata[slot_id].wp_pin = NULL;
 		}
 	}
 
-	return pdata;
+	return 0;
 }
 
 static inline unsigned int atmci_get_version(struct atmel_mci *host)
@@ -2456,7 +2443,6 @@  static void atmci_get_cap(struct atmel_mci *host)
 static int atmci_probe(struct platform_device *pdev)
 {
 	struct device			*dev = &pdev->dev;
-	struct mci_platform_data	*pdata;
 	struct atmel_mci		*host;
 	struct resource			*regs;
 	unsigned int			nr_slots;
@@ -2467,12 +2453,6 @@  static int atmci_probe(struct platform_device *pdev)
 	if (!regs)
 		return -ENXIO;
 
-	pdata = atmci_of_init(dev);
-	if (IS_ERR(pdata)) {
-		dev_err(dev, "platform data not available\n");
-		return PTR_ERR(pdata);
-	}
-
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0)
 		return irq;
@@ -2485,6 +2465,10 @@  static int atmci_probe(struct platform_device *pdev)
 	spin_lock_init(&host->lock);
 	INIT_LIST_HEAD(&host->queue);
 
+	ret = atmci_of_init(host);
+	if (ret)
+		return dev_err_probe(dev, ret, "Slot information not available\n");
+
 	host->mck = devm_clk_get(dev, "mci_clk");
 	if (IS_ERR(host->mck))
 		return PTR_ERR(host->mck);
@@ -2544,16 +2528,16 @@  static int atmci_probe(struct platform_device *pdev)
 	/* We need at least one slot to succeed */
 	nr_slots = 0;
 	ret = -ENODEV;
-	if (pdata->slot[0].bus_width) {
-		ret = atmci_init_slot(host, &pdata->slot[0],
+	if (host->pdata[0].bus_width) {
+		ret = atmci_init_slot(host, &host->pdata[0],
 				0, ATMCI_SDCSEL_SLOT_A, ATMCI_SDIOIRQA);
 		if (!ret) {
 			nr_slots++;
 			host->buf_size = host->slot[0]->mmc->max_req_size;
 		}
 	}
-	if (pdata->slot[1].bus_width) {
-		ret = atmci_init_slot(host, &pdata->slot[1],
+	if (host->pdata[1].bus_width) {
+		ret = atmci_init_slot(host, &host->pdata[1],
 				1, ATMCI_SDCSEL_SLOT_B, ATMCI_SDIOIRQB);
 		if (!ret) {
 			nr_slots++;