Lines Matching refs:host
42 struct mmc_host *host = cls_dev_to_mmc_host(dev); in mmc_host_classdev_release() local
44 idr_remove(&mmc_host_idr, host->index); in mmc_host_classdev_release()
46 kfree(host); in mmc_host_classdev_release()
68 struct mmc_host *host = cls_dev_to_mmc_host(dev); in clkgate_delay_show() local
69 return snprintf(buf, PAGE_SIZE, "%lu\n", host->clkgate_delay); in clkgate_delay_show()
75 struct mmc_host *host = cls_dev_to_mmc_host(dev); in clkgate_delay_store() local
81 spin_lock_irqsave(&host->clk_lock, flags); in clkgate_delay_store()
82 host->clkgate_delay = value; in clkgate_delay_store()
83 spin_unlock_irqrestore(&host->clk_lock, flags); in clkgate_delay_store()
94 static void mmc_host_clk_gate_delayed(struct mmc_host *host) in mmc_host_clk_gate_delayed() argument
97 unsigned long freq = host->ios.clock; in mmc_host_clk_gate_delayed()
103 mmc_hostname(host)); in mmc_host_clk_gate_delayed()
111 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
118 if (!host->clk_requests) { in mmc_host_clk_gate_delayed()
119 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
121 ndelay(host->clk_delay * tick_ns); in mmc_host_clk_gate_delayed()
124 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
127 mutex_lock(&host->clk_gate_mutex); in mmc_host_clk_gate_delayed()
128 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
129 if (!host->clk_requests) { in mmc_host_clk_gate_delayed()
130 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
132 mmc_gate_clock(host); in mmc_host_clk_gate_delayed()
133 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
134 pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); in mmc_host_clk_gate_delayed()
136 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_gate_delayed()
137 mutex_unlock(&host->clk_gate_mutex); in mmc_host_clk_gate_delayed()
145 struct mmc_host *host = container_of(work, struct mmc_host, in mmc_host_clk_gate_work() local
148 mmc_host_clk_gate_delayed(host); in mmc_host_clk_gate_work()
159 void mmc_host_clk_hold(struct mmc_host *host) in mmc_host_clk_hold() argument
164 cancel_delayed_work_sync(&host->clk_gate_work); in mmc_host_clk_hold()
165 mutex_lock(&host->clk_gate_mutex); in mmc_host_clk_hold()
166 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_hold()
167 if (host->clk_gated) { in mmc_host_clk_hold()
168 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_hold()
169 mmc_ungate_clock(host); in mmc_host_clk_hold()
170 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_hold()
171 pr_debug("%s: ungated MCI clock\n", mmc_hostname(host)); in mmc_host_clk_hold()
173 host->clk_requests++; in mmc_host_clk_hold()
174 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_hold()
175 mutex_unlock(&host->clk_gate_mutex); in mmc_host_clk_hold()
206 void mmc_host_clk_release(struct mmc_host *host) in mmc_host_clk_release() argument
210 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_release()
211 host->clk_requests--; in mmc_host_clk_release()
212 if (mmc_host_may_gate_card(host->card) && in mmc_host_clk_release()
213 !host->clk_requests) in mmc_host_clk_release()
214 schedule_delayed_work(&host->clk_gate_work, in mmc_host_clk_release()
215 msecs_to_jiffies(host->clkgate_delay)); in mmc_host_clk_release()
216 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_release()
225 unsigned int mmc_host_clk_rate(struct mmc_host *host) in mmc_host_clk_rate() argument
230 spin_lock_irqsave(&host->clk_lock, flags); in mmc_host_clk_rate()
231 if (host->clk_gated) in mmc_host_clk_rate()
232 freq = host->clk_old; in mmc_host_clk_rate()
234 freq = host->ios.clock; in mmc_host_clk_rate()
235 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_host_clk_rate()
243 static inline void mmc_host_clk_init(struct mmc_host *host) in mmc_host_clk_init() argument
245 host->clk_requests = 0; in mmc_host_clk_init()
247 host->clk_delay = 8; in mmc_host_clk_init()
252 host->clkgate_delay = 0; in mmc_host_clk_init()
253 host->clk_gated = false; in mmc_host_clk_init()
254 INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); in mmc_host_clk_init()
255 spin_lock_init(&host->clk_lock); in mmc_host_clk_init()
256 mutex_init(&host->clk_gate_mutex); in mmc_host_clk_init()
263 static inline void mmc_host_clk_exit(struct mmc_host *host) in mmc_host_clk_exit() argument
269 if (cancel_delayed_work_sync(&host->clk_gate_work)) in mmc_host_clk_exit()
270 mmc_host_clk_gate_delayed(host); in mmc_host_clk_exit()
271 if (host->clk_gated) in mmc_host_clk_exit()
272 mmc_host_clk_hold(host); in mmc_host_clk_exit()
274 WARN_ON(host->clk_requests > 1); in mmc_host_clk_exit()
277 static inline void mmc_host_clk_sysfs_init(struct mmc_host *host) in mmc_host_clk_sysfs_init() argument
279 host->clkgate_delay_attr.show = clkgate_delay_show; in mmc_host_clk_sysfs_init()
280 host->clkgate_delay_attr.store = clkgate_delay_store; in mmc_host_clk_sysfs_init()
281 sysfs_attr_init(&host->clkgate_delay_attr.attr); in mmc_host_clk_sysfs_init()
282 host->clkgate_delay_attr.attr.name = "clkgate_delay"; in mmc_host_clk_sysfs_init()
283 host->clkgate_delay_attr.attr.mode = S_IRUGO | S_IWUSR; in mmc_host_clk_sysfs_init()
284 if (device_create_file(&host->class_dev, &host->clkgate_delay_attr)) in mmc_host_clk_sysfs_init()
286 mmc_hostname(host)); in mmc_host_clk_sysfs_init()
290 static inline void mmc_host_clk_init(struct mmc_host *host) in mmc_host_clk_init() argument
294 static inline void mmc_host_clk_exit(struct mmc_host *host) in mmc_host_clk_exit() argument
298 static inline void mmc_host_clk_sysfs_init(struct mmc_host *host) in mmc_host_clk_sysfs_init() argument
313 int mmc_of_parse(struct mmc_host *host) in mmc_of_parse() argument
321 if (!host->parent || !host->parent->of_node) in mmc_of_parse()
324 np = host->parent->of_node; in mmc_of_parse()
328 dev_dbg(host->parent, in mmc_of_parse()
335 host->caps |= MMC_CAP_8_BIT_DATA; in mmc_of_parse()
338 host->caps |= MMC_CAP_4_BIT_DATA; in mmc_of_parse()
343 dev_err(host->parent, in mmc_of_parse()
349 of_property_read_u32(np, "max-frequency", &host->f_max); in mmc_of_parse()
365 host->caps |= MMC_CAP_NONREMOVABLE; in mmc_of_parse()
370 host->caps |= MMC_CAP_NEEDS_POLL; in mmc_of_parse()
372 ret = mmc_gpiod_request_cd(host, "cd", 0, true, in mmc_of_parse()
375 dev_info(host->parent, "Got CD GPIO\n"); in mmc_of_parse()
391 host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; in mmc_of_parse()
397 ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert); in mmc_of_parse()
399 dev_info(host->parent, "Got WP GPIO\n"); in mmc_of_parse()
405 host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; in mmc_of_parse()
408 host->caps |= MMC_CAP_SD_HIGHSPEED; in mmc_of_parse()
410 host->caps |= MMC_CAP_MMC_HIGHSPEED; in mmc_of_parse()
412 host->caps |= MMC_CAP_UHS_SDR12; in mmc_of_parse()
414 host->caps |= MMC_CAP_UHS_SDR25; in mmc_of_parse()
416 host->caps |= MMC_CAP_UHS_SDR50; in mmc_of_parse()
418 host->caps |= MMC_CAP_UHS_SDR104; in mmc_of_parse()
420 host->caps |= MMC_CAP_UHS_DDR50; in mmc_of_parse()
422 host->caps |= MMC_CAP_POWER_OFF_CARD; in mmc_of_parse()
424 host->caps |= MMC_CAP_SDIO_IRQ; in mmc_of_parse()
426 host->caps2 |= MMC_CAP2_FULL_PWR_CYCLE; in mmc_of_parse()
428 host->pm_caps |= MMC_PM_KEEP_POWER; in mmc_of_parse()
430 host->pm_caps |= MMC_PM_WAKE_SDIO_IRQ; in mmc_of_parse()
432 host->caps |= MMC_CAP_1_8V_DDR; in mmc_of_parse()
434 host->caps |= MMC_CAP_1_2V_DDR; in mmc_of_parse()
436 host->caps2 |= MMC_CAP2_HS200_1_8V_SDR; in mmc_of_parse()
438 host->caps2 |= MMC_CAP2_HS200_1_2V_SDR; in mmc_of_parse()
440 host->caps2 |= MMC_CAP2_HS400_1_8V | MMC_CAP2_HS200_1_8V_SDR; in mmc_of_parse()
442 host->caps2 |= MMC_CAP2_HS400_1_2V | MMC_CAP2_HS200_1_2V_SDR; in mmc_of_parse()
444 host->dsr_req = !of_property_read_u32(np, "dsr", &host->dsr); in mmc_of_parse()
445 if (host->dsr_req && (host->dsr & ~0xffff)) { in mmc_of_parse()
446 dev_err(host->parent, in mmc_of_parse()
448 host->dsr); in mmc_of_parse()
449 host->dsr_req = 0; in mmc_of_parse()
452 return mmc_pwrseq_alloc(host); in mmc_of_parse()
467 struct mmc_host *host; in mmc_alloc_host() local
469 host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); in mmc_alloc_host()
470 if (!host) in mmc_alloc_host()
474 host->rescan_disable = 1; in mmc_alloc_host()
477 err = idr_alloc(&mmc_host_idr, host, 0, 0, GFP_NOWAIT); in mmc_alloc_host()
479 host->index = err; in mmc_alloc_host()
483 kfree(host); in mmc_alloc_host()
487 dev_set_name(&host->class_dev, "mmc%d", host->index); in mmc_alloc_host()
489 host->parent = dev; in mmc_alloc_host()
490 host->class_dev.parent = dev; in mmc_alloc_host()
491 host->class_dev.class = &mmc_host_class; in mmc_alloc_host()
492 device_initialize(&host->class_dev); in mmc_alloc_host()
494 if (mmc_gpio_alloc(host)) { in mmc_alloc_host()
495 put_device(&host->class_dev); in mmc_alloc_host()
499 mmc_host_clk_init(host); in mmc_alloc_host()
501 spin_lock_init(&host->lock); in mmc_alloc_host()
502 init_waitqueue_head(&host->wq); in mmc_alloc_host()
503 INIT_DELAYED_WORK(&host->detect, mmc_rescan); in mmc_alloc_host()
505 host->pm_notify.notifier_call = mmc_pm_notify; in mmc_alloc_host()
512 host->max_segs = 1; in mmc_alloc_host()
513 host->max_seg_size = PAGE_CACHE_SIZE; in mmc_alloc_host()
515 host->max_req_size = PAGE_CACHE_SIZE; in mmc_alloc_host()
516 host->max_blk_size = 512; in mmc_alloc_host()
517 host->max_blk_count = PAGE_CACHE_SIZE / 512; in mmc_alloc_host()
519 return host; in mmc_alloc_host()
532 int mmc_add_host(struct mmc_host *host) in mmc_add_host() argument
536 WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) && in mmc_add_host()
537 !host->ops->enable_sdio_irq); in mmc_add_host()
539 err = device_add(&host->class_dev); in mmc_add_host()
543 led_trigger_register_simple(dev_name(&host->class_dev), &host->led); in mmc_add_host()
546 mmc_add_host_debugfs(host); in mmc_add_host()
548 mmc_host_clk_sysfs_init(host); in mmc_add_host()
550 mmc_start_host(host); in mmc_add_host()
551 register_pm_notifier(&host->pm_notify); in mmc_add_host()
566 void mmc_remove_host(struct mmc_host *host) in mmc_remove_host() argument
568 unregister_pm_notifier(&host->pm_notify); in mmc_remove_host()
569 mmc_stop_host(host); in mmc_remove_host()
572 mmc_remove_host_debugfs(host); in mmc_remove_host()
575 device_del(&host->class_dev); in mmc_remove_host()
577 led_trigger_unregister_simple(host->led); in mmc_remove_host()
579 mmc_host_clk_exit(host); in mmc_remove_host()
590 void mmc_free_host(struct mmc_host *host) in mmc_free_host() argument
592 mmc_pwrseq_free(host); in mmc_free_host()
593 put_device(&host->class_dev); in mmc_free_host()