1. 13 5月, 2014 1 次提交
    • T
      mmc: core: Try other signal levels during power up · ceae98f2
      Tim Kryger 提交于
      The eMMC signalling voltage is determined by VCCQ which is provided to
      the card by the host.  Signalling is not required to begin at 3.3v and,
      if the host and card both support a particular VCC/VCCQ combination, it
      can be used immediately.
      
      In contrast, SD Cards must begin with 3.3v signalling and may switch to
      a lower voltage signalling if instructed to do so in CMD11.  A message
      is required to coordinate this operation because the card only receives
      a 3.3v VDD and must know when to use the 1.8v produced by its internal
      regulator.
      
      It makes sense for the core to begin with 3.3v signalling but when that
      can't be set, 1.8v and 1.2v signalling also should be attempted.  This
      is especially important when an external regulator with a limited range
      is used to supply VCCQ to an eMMC part.
      Signed-off-by: NTim Kryger <tim.kryger@linaro.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <chris@printf.net>
      ceae98f2
  2. 22 4月, 2014 4 次提交
    • U
      mmc: core: Invoke sdio func driver's PM callbacks from the sdio bus · 573185cc
      Ulf Hansson 提交于
      The sdio func device is added to the driver model after the card
      device.
      
      This means the sdio func device will be suspend before the card device
      and thus resumed after. The consequence are the mmc core don't
      explicity need to protect itself from receiving sdio requests in
      suspended state. Instead that can be handled from the sdio bus, which
      is thus invokes the PM callbacks instead of old dummy function.
      
      In the case were the sdio func driver don't implement the PM callbacks
      the mmc core will in the early phase of system suspend, remove the
      card from the driver model and thus power off it.
      
      Cc: Aaron Lu <aaron.lu@intel.com>
      Cc: NeilBrown <neilb@suse.de>
      Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NAaron Lu <aaron.lu@intel.com>
      Tested-by: Nxiaoming wang <xiaoming.wang@intel.com>
      Tested-by: NChuanxiao Dong <chuanxiao.dong@intel.com>
      Signed-off-by: NChris Ball <chris@printf.net>
      573185cc
    • S
      mmc: core: Use maximum timeout values in case TACC field is zero · f7bf11a3
      Stefan Wahren 提交于
      When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
      we get the following kernel warning:
      
      WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
      Modules linked in:
      CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
      Workqueue: kmmcd mmc_rescan
      [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
      [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
      [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
      [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
      [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
      [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
      [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
      [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
      [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
      [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
      [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
      [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
      [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
      [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
      [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
      
      The error is due to an invalid value in CSD register of a specific 2GB
      micro SD card. The CSD version of this card is 1.0 but the TACC field
      has the invalid value 0.
      
      cid:0000005553442020000000000000583f
      csd:00000032535a83bfedb7ffbf1680003f
      date:08/2005
      erase_size:512
      fwrev:0x0
      hwrev:0x0
      manfid:0x000000
      name:USD
      oemid:0x0000
      preferred_erase_size:4194304
      scr:0225000000000000
      serial:0x00000000
      type:SD
      
      Since the kernel is making use of this TACC field to calculate the SD
      card timeout, an invalid value 0 leads to a warning at
      mxs_ns_to_ssp_ticks() and later the following misleading error message
      appears in a loop:
      
      mxs-mmc 80010000.ssp: card claims to support voltages below defined range
      mxs-mmc 80010000.ssp: no support for card's volts
      mmc0: error -22 whilst initialising MMC card
      
      This error is only found on this 2GB SD card on mxs platform.
      On x86 this card works without any problems.
      
      The following patch based on the work of Peter Chan and Otavio Salvador.
      It catches the case that the determined timeout is still 0 and sets it
      to a valid value.
      
      Successful tested on a i.MX28 board.
      Signed-off-by: NStefan Wahren <stefan.wahren@i2se.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <chris@printf.net>
      f7bf11a3
    • A
      mmc: Convert to use ATTRIBUTE_GROUPS · d1e58212
      Axel Lin 提交于
      Use new ATTRIBUTE_GROUPS macro to declare attribute groups.
      Signed-off-by: NAxel Lin <axel.lin@ingics.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <chris@printf.net>
      d1e58212
    • M
      mmc: Delay the card_event callback into the mmc_rescan worker · fa372a51
      Markus Mayer 提交于
      This change removes the callback from atomic context which it doesn't
      need to be in, and puts it in line with the debounced rescan.
      
      This code is based on these e-mail threads with Christian Daudt:
      
        https://lkml.org/lkml/2013/8/19/539
        https://lkml.org/lkml/2014/3/19/79Signed-off-by: NMarkus Mayer <markus.mayer@linaro.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <chris@printf.net>
      fa372a51
  3. 21 4月, 2014 1 次提交
  4. 17 3月, 2014 3 次提交
  5. 10 3月, 2014 1 次提交
  6. 23 2月, 2014 10 次提交
  7. 14 2月, 2014 5 次提交
  8. 18 1月, 2014 1 次提交
  9. 14 1月, 2014 3 次提交
  10. 07 12月, 2013 1 次提交
    • R
      ACPI / bind: Redefine acpi_preset_companion() · 9c5ad36d
      Rafael J. Wysocki 提交于
      Modify acpi_preset_companion() to take a struct acpi_device pointer
      instead of an ACPI handle as its second argument and redefine it as
      a static inline wrapper around ACPI_COMPANION_SET() passing the
      return value of acpi_find_child_device() directly as the second
      argument to it.  Update its users to pass struct acpi_device
      pointers instead of ACPI handles to it.
      
      This allows some unnecessary acpi_bus_get_device() calls to be
      avoided.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Reviewed-by: NAaron Lu <aaron.lu@intel.com>
      Tested-by: Aaron Lu <aaron.lu@intel.com> # for ATA binding
      9c5ad36d
  11. 15 11月, 2013 1 次提交
    • R
      ACPI / driver core: Store an ACPI device pointer in struct acpi_dev_node · 7b199811
      Rafael J. Wysocki 提交于
      Modify struct acpi_dev_node to contain a pointer to struct acpi_device
      associated with the given device object (that is, its ACPI companion
      device) instead of an ACPI handle corresponding to it.  Introduce two
      new macros for manipulating that pointer in a CONFIG_ACPI-safe way,
      ACPI_COMPANION() and ACPI_COMPANION_SET(), and rework the
      ACPI_HANDLE() macro to take the above changes into account.
      Drop the ACPI_HANDLE_SET() macro entirely and rework its users to
      use ACPI_COMPANION_SET() instead.  For some of them who used to
      pass the result of acpi_get_child() directly to ACPI_HANDLE_SET()
      introduce a helper routine acpi_preset_companion() doing an
      equivalent thing.
      
      The main motivation for doing this is that there are things
      represented by struct acpi_device objects that don't have valid
      ACPI handles (so called fixed ACPI hardware features, such as
      power and sleep buttons) and we would like to create platform
      device objects for them and "glue" them to their ACPI companions
      in the usual way (which currently is impossible due to the
      lack of valid ACPI handles).  However, there are more reasons
      why it may be useful.
      
      First, struct acpi_device pointers allow of much better type checking
      than void pointers which are ACPI handles, so it should be more
      difficult to write buggy code using modified struct acpi_dev_node
      and the new macros.  Second, the change should help to reduce (over
      time) the number of places in which the result of ACPI_HANDLE() is
      passed to acpi_bus_get_device() in order to obtain a pointer to the
      struct acpi_device associated with the given "physical" device,
      because now that pointer is returned by ACPI_COMPANION() directly.
      Finally, the change should make it easier to write generic code that
      will build both for CONFIG_ACPI set and unset without adding explicit
      compiler directives to it.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com> # on Haswell
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Reviewed-by: Aaron Lu <aaron.lu@intel.com> # for ATA and SDIO part
      7b199811
  12. 09 11月, 2013 1 次提交
  13. 31 10月, 2013 8 次提交
    • U
      mmc: core: Add MMC_CAP_RUNTIME_RESUME to resume at runtime_resume · 4d223782
      Ulf Hansson 提交于
      In some environments it is to prefer to postpone the resume of the card
      device until runtime_resume is being carried out, since it will mean a
      signficant decrease of the total system resume time.
      
      The reason of the decreased resume time is simply because of the actual
      re-initalization of the card, which typically takes hundreds of
      milliseconds, is performed outside the resume sequence and wont thus
      affect it.
      
      For removable card, the detect work tries to re-detect the card to make
      sure it is still present, as a part of that sequence the card will also
      be runtime_resumed and thus also fully resumed.
      
      For a non-removable card, typically a mmc blk request will trigger a
      runtime_resume and thus fully resume the card. This also means the
      first request will likely suffer from an inital latency since the
      re-initialization of the card needs to be performed.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      4d223782
    • U
      mmc: core: Improve runtime PM support during suspend/resume for sd/mmc · 0cb403a2
      Ulf Hansson 提交于
      The card device is considered as in-active after it has been suspended.
      To prevent any further runtime PM requests in suspend state, we then
      disable runtime PM.
      
      After the card device has been resumed, we shall consider it as active,
      like we also do after a probe sequence. When resumed, we can safely
      enable runtime PM again.
      
      This will make sure the PM core can request the card device to go to
      in-active state after a resume has been completed. Previously we had to
      wait for new pm_runtime_get->pm_runtime_put cycle to be executed.
      
      Additionally, once a resume has been carried out, update the last busy
      mark. At the moment this will have no effect but if the PM core will
      respect autosuspend enabled devices, when it directly triggers a
      runtime_suspend from a runtime_idle, it will mean the card device will
      be scheduled for a delayed runtime_suspend instead of done immediately.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      0cb403a2
    • U
      mmc: core: Remove redundant mmc_power_up|off at runtime callbacks · 0cc81a8c
      Ulf Hansson 提交于
      Commit "mmc: core: Push common suspend|resume code into each bus_ops"
      moved the responsibility for doing mmc_power_up|off into each
      suspend/resume bus_ops. When using MMC_CAP_AGGRESSIVE_PM, through the
      runtime callbacks, calls to mmc_power_up|off became redundant.
      
      When removing them, we are also able to remove the calls to
      mmc_claim|release_host, thus simplifing code a bit more.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      0cc81a8c
    • U
      mmc: Don't force card to active state when entering suspend/shutdown · 9ec775f7
      Ulf Hansson 提交于
      By adding a card state that records if it is suspended or resumed, we
      can accept asyncronus suspend/resume requests for the mmc and sd
      bus_ops.
      
      MMC_CAP_AGGRESSIVE_PM, will at request inactivity through the runtime
      bus_ops callbacks, execute a suspend of the the card. In the state were
      this has been done, we can receive a suspend request for the mmc bus,
      which for sd and mmc forced the card to active state by a
      pm_runtime_get_sync. In other words, the card was resumed and then
      immediately suspended again, completely unnecessary.
      
      Since the suspend/resume bus_ops callbacks for sd and mmc are now
      capable of handling asynchronous requests, we no longer need to force
      the card to active state before executing suspend. Evidently preventing
      the above sequence for MMC_CAP_AGGRESSIVE_PM.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      9ec775f7
    • U
      mmc: core: Remove deprecated mmc_suspend|resume_host APIs · 3c0d22e8
      Ulf Hansson 提交于
      The are no more users of the deprecated mmc_suspend|resume_host API,
      so let's remove it.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      3c0d22e8
    • U
      mmc: core: Signal wakeup event at card insert/removal · bbd43682
      Ulf Hansson 提交于
      We want to give user space provision to fully consume a card
      insert/remove event, when the event was caused by a wakeup irq.
      
      By signaling the wakeup event for a time of 5 s for devices configured
      as wakeup capable, we likely will be prevent a sleep long enough to let
      user space consume the event.
      
      To enable this feature, host drivers must thus configure their devices
      as wakeup capable.
      
      This is a reworked implementation of the old wakelocks for the mmc
      subsystem, originally authored by Colin Cross and San Mehat for the
      Android kernel. Zoran Markovic shall also be given cred for recently
      re-trying to upstream this feature.
      
      Cc: San Mehat <san@google.com>
      Cc: Colin Cross <ccross@android.com>
      Cc: John Stultz <john.stultz@linaro.org>
      Cc: Zoran Markovic <zoran.markovic@linaro.org>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Reviewed-by: NZoran Markovic <zoran.markovic@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      bbd43682
    • U
      mmc: core: Collect common code for card ocr validation · 726d6f23
      Ulf Hansson 提交于
      Since mmc_select_voltage now only gets called from the attach sequence,
      it makes sense to move the out of spec validations of the card ocr into
      this function.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      726d6f23
    • U
      mmc: core: Prevent violation of specs while initializing cards · ce69d37b
      Ulf Hansson 提交于
      According to eMMC/SD/SDIO specs, the VDD (VCC) voltage level must be
      maintained during the initialization sequence. If we want/need to tune
      the voltage level, a complete power cycle of the card must be executed.
      
      Most host drivers conforms to the specifications by only allowing to
      change VDD voltage level at the MMC_POWER_UP state, but some also cares
      about MMC_POWER_ON state, which they should'nt. This patch will not
      break those drivers, but they could clean up code to better reflect
      what is expected from the protocol layer.
      
      A big re-work of the mmc_select_voltage function is done to only change
      VDD voltage level if the host supports MMC_CAP2_FULL_PWR_CYCLE.
      Otherwise only validation of the host and card ocr mask will be done.
      
      A very nice side-effect of this patch is that we now don't need to
      reset the negotiated ocr mask at the mmc_power_off function, since now
      it will actually reflect the present voltage level, which safely can be
      used at the next power up and re-initialization. Moreover, we then only
      need to execute mmc_select_voltage from the attach sequence.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      ce69d37b