On 11/14/11 00:23, Sujit Reddy Thumma wrote:
> diff --git a/Documentation/mmc/mmc-dev-attrs.txt 
> b/Documentation/mmc/mmc-dev-attrs.txt
> index 8898a95..b024556 100644
> --- a/Documentation/mmc/mmc-dev-attrs.txt
> +++ b/Documentation/mmc/mmc-dev-attrs.txt
> @@ -64,3 +64,13 @@ Note on Erase Size and Preferred Erase Size:
>       size specified by the card.
>  
>       "preferred_erase_size" is in bytes.
> +
> +SD/MMC/SDIO Clock Gating Attribute
> +==================================
> +
> +Read and write access is provided to following attribute.
> +This attribute appears only if CONFIG_MMC_CLKGATE is enabled.
> +
> +     clkgate_delay   Tune the clock gating delay with desired value in milli 
> seconds.

milliseconds is one word.

> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index ca2e4f5..ba4cc5d 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -53,6 +53,31 @@ static DEFINE_IDR(mmc_host_idr);
>  static DEFINE_SPINLOCK(mmc_host_lock);
>  
>  #ifdef CONFIG_MMC_CLKGATE
> +static ssize_t clkgate_delay_show(struct device *dev,
> +             struct device_attribute *attr, char *buf)
> +{
> +     struct mmc_host *host = cls_dev_to_mmc_host(dev);
> +     return snprintf(buf, PAGE_SIZE, "%lu millisecs\n",

Perhaps this should just be %lu to simplify userspace parsing.

> +static ssize_t clkgate_delay_store(struct device *dev,
> +             struct device_attribute *attr, const char *buf, size_t count)
> +{
> +     struct mmc_host *host = cls_dev_to_mmc_host(dev);
> +     unsigned long flags, value;
> +
> +     if (kstrtoul(buf, 0, &value))
> +             return -EINVAL;
> +
> +     spin_lock_irqsave(&host->clk_lock, flags);
> +     host->clkgate_delay = value;
> +     spin_unlock_irqrestore(&host->clk_lock, flags);
> +
> +     pr_info("%s: clock gate delay set to %lu ms\n",
> +                     mmc_hostname(host), value);

Is this pr_info() necessary?

> @@ -236,6 +269,17 @@ static inline void mmc_host_clk_exit(struct mmc_host 
> *host)
>       WARN_ON(host->clk_requests > 1);
>  }
>  
> +static inline void mmc_host_clk_sysfs_init(struct mmc_host *host)
> +{
> +     host->clkgate_delay_attr.show = clkgate_delay_show;
> +     host->clkgate_delay_attr.store = clkgate_delay_store;
> +     sysfs_attr_init(&host->clkgate_delay_attr.attr);
> +     host->clkgate_delay_attr.attr.name = "clkgate_delay";
> +     host->clkgate_delay_attr.attr.mode = S_IRUGO | S_IWUSR;
> +     if (device_create_file(&host->class_dev, &host->clkgate_delay_attr))
> +             pr_err("%s: Failed to create clkgate_delay sysfs entry\n",
> +                             mmc_hostname(host));
> +}

Would it be simpler to assign dev_attrs in the mmc_host_class instead?

> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index a3ac9c4..7206c80 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -253,10 +253,12 @@ struct mmc_host {
>       int                     clk_requests;   /* internal reference counter */
>       unsigned int            clk_delay;      /* number of MCI clk hold 
> cycles */
>       bool                    clk_gated;      /* clock gated */
> -     struct work_struct      clk_gate_work; /* delayed clock gate */
> +     struct delayed_work     clk_gate_work; /* delayed clock gate */
>       unsigned int            clk_old;        /* old clock value cache */
>       spinlock_t              clk_lock;       /* lock for clk fields */
>       struct mutex            clk_gate_mutex; /* mutex for clock gating */
> +     struct device_attribute clkgate_delay_attr;

If you used the class device attributes then this would probably go away.

-- 
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to