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 |
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
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 --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++;
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(-)