From patchwork Fri Oct 2 02:22:09 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Magnus Damm X-Patchwork-Id: 51273 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n922QxZd007173 for ; Fri, 2 Oct 2009 02:27:00 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754708AbZJBC0p (ORCPT ); Thu, 1 Oct 2009 22:26:45 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754689AbZJBC0p (ORCPT ); Thu, 1 Oct 2009 22:26:45 -0400 Received: from mail-ew0-f211.google.com ([209.85.219.211]:61326 "EHLO mail-ew0-f211.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754513AbZJBC0o (ORCPT ); Thu, 1 Oct 2009 22:26:44 -0400 Received: by mail-ew0-f211.google.com with SMTP id 7so778329ewy.17 for ; Thu, 01 Oct 2009 19:26:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:date:message-id :in-reply-to:references:subject; bh=p3CLVNBilSNujy7WJ3P/gSVYbO9YiCFTxpUlS/gP+88=; b=KS7toVByw0MKcDxO2h5e1CI5hFMBNamlSZQFgzlun8gFnUTuHjz3zpeW53cUoVe+oJ UGFzWkwTrF2fkLvOML2zO3AIH0qaXKsn4Uxoq7vDV9fOc0SP2M2GwAIY3bfIBrGV2x3y VA8BVegFY02TDrrWEzahyaMzfp0zYLnbpo/2I= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:date:message-id:in-reply-to:references:subject; b=UZdZpm6UXrxBzulP1u9ZJ42VByAtNGuFTpp49BMxgLg0SMZV1HgkJeT4VcQLqXBwot H1n0lEY114mYNuKy8P9Y0pxsJ9SV8hFqVgly2qwZy2UDTTPBfZFzCWEjQ28s0rqXPm3i 0hqtoH6hI8RCz5YxT7PMhiyZ6sFOpunaGEuJ0= Received: by 10.211.129.20 with SMTP id g20mr8754194ebn.14.1254450407735; Thu, 01 Oct 2009 19:26:47 -0700 (PDT) Received: from rxone.opensource.se (49.14.32.202.bf.2iij.net [202.32.14.49]) by mx.google.com with ESMTPS id 5sm901794eyh.32.2009.10.01.19.26.43 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 01 Oct 2009 19:26:46 -0700 (PDT) From: Magnus Damm To: linux-sh@vger.kernel.org Cc: akpm@linux-foundation.org, linux-mmc@vger.kernel.org, ian@mnementh.co.uk, lethal@linux-sh.org, Magnus Damm , g.liakhovetski@gmx.de Date: Fri, 02 Oct 2009 11:22:09 +0900 Message-Id: <20091002022209.8215.81916.sendpatchset@rxone.opensource.se> In-Reply-To: <20091002022158.8215.58317.sendpatchset@rxone.opensource.se> References: <20091002022158.8215.58317.sendpatchset@rxone.opensource.se> Subject: [PATCH 01/07] mfd: Add SuperH Mobile SDHI platform driver Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org --- 0001/drivers/mfd/Kconfig +++ work/drivers/mfd/Kconfig 2009-10-01 11:22:18.000000000 +0900 @@ -35,6 +35,14 @@ config MFD_ASIC3 This driver supports the ASIC3 multifunction chip found on many PDAs (mainly iPAQ and HTC based ones) +config MFD_SH_MOBILE_SDHI + bool "Support for SuperH Mobile SDHI" + depends on SUPERH + select MFD_CORE + ---help--- + This driver supports the SDHI hardware block found in many + SuperH Mobile SoC:s. + config MFD_DM355EVM_MSP bool "DaVinci DM355 EVM microcontroller" depends on I2C && MACH_DAVINCI_DM355_EVM --- 0002/drivers/mfd/Makefile +++ work/drivers/mfd/Makefile 2009-10-01 10:58:05.000000000 +0900 @@ -4,6 +4,7 @@ obj-$(CONFIG_MFD_SM501) += sm501.o obj-$(CONFIG_MFD_ASIC3) += asic3.o +obj-$(CONFIG_MFD_SH_MOBILE_SDHI) += sh_mobile_sdhi.o obj-$(CONFIG_HTC_EGPIO) += htc-egpio.o obj-$(CONFIG_HTC_PASIC3) += htc-pasic3.o --- /dev/null +++ work/drivers/mfd/sh_mobile_sdhi.c 2009-10-01 12:07:48.000000000 +0900 @@ -0,0 +1,145 @@ +/* + * SuperH Mobile SDHI + * + * Copyright (C) 2009 Magnus Damm + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Based on "Compaq ASIC3 support": + * + * Copyright 2001 Compaq Computer Corporation. + * Copyright 2004-2005 Phil Blundell + * Copyright 2007-2008 OpenedHand Ltd. + * + * Authors: Phil Blundell , + * Samuel Ortiz + * + */ + +#include +#include +#include + +#include +#include + +struct sh_mobile_sdhi { + struct clk *clk; + struct tmio_mmc_data mmc_data; + struct mfd_cell cell_mmc; +}; + +static struct resource sh_mobile_sdhi_resources[] = { + { + .start = 0x000, + .end = 0x1ff, + .flags = IORESOURCE_MEM, + }, + { + .start = 0, + .end = 0, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct mfd_cell sh_mobile_sdhi_cell = { + .name = "tmio-mmc", + .num_resources = ARRAY_SIZE(sh_mobile_sdhi_resources), + .resources = sh_mobile_sdhi_resources, +}; + +static int __init sh_mobile_sdhi_probe(struct platform_device *pdev) +{ + struct sh_mobile_sdhi *priv; + struct resource *mem; + char clk_name[8]; + int ret, irq; + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!mem) + dev_err(&pdev->dev, "missing MEM resource\n"); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + dev_err(&pdev->dev, "missing IRQ resource\n"); + + if (!mem || (irq < 0)) + return -EINVAL; + + priv = kzalloc(sizeof(struct sh_mobile_sdhi), GFP_KERNEL); + if (priv == NULL) { + dev_err(&pdev->dev, "kzalloc failed\n"); + return -ENOMEM; + } + + snprintf(clk_name, sizeof(clk_name), "sdhi%d", pdev->id); + priv->clk = clk_get(&pdev->dev, clk_name); + if (IS_ERR(priv->clk)) { + dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name); + ret = PTR_ERR(priv->clk); + kfree(priv); + return ret; + } + + clk_enable(priv->clk); + + /* FIXME: silly const unsigned int hclk */ + *(unsigned int *)&priv->mmc_data.hclk = clk_get_rate(priv->clk); + + memcpy(&priv->cell_mmc, &sh_mobile_sdhi_cell, sizeof(priv->cell_mmc)); + priv->cell_mmc.driver_data = &priv->mmc_data; + priv->cell_mmc.platform_data = &priv->cell_mmc; + priv->cell_mmc.data_size = sizeof(priv->cell_mmc); + + platform_set_drvdata(pdev, priv); + + ret = mfd_add_devices(&pdev->dev, pdev->id, + &priv->cell_mmc, 1, mem, irq); + if (ret) { + clk_disable(priv->clk); + clk_put(priv->clk); + kfree(priv); + } + + return ret; +} + +static int sh_mobile_sdhi_remove(struct platform_device *pdev) +{ + struct sh_mobile_sdhi *priv = platform_get_drvdata(pdev); + + mfd_remove_devices(&pdev->dev); + clk_disable(priv->clk); + clk_put(priv->clk); + kfree(priv); + + return 0; +} + +static struct platform_driver sh_mobile_sdhi_driver = { + .driver = { + .name = "sh_mobile_sdhi", + .owner = THIS_MODULE, + }, + .probe = sh_mobile_sdhi_probe, + .remove = __devexit_p(sh_mobile_sdhi_remove), +}; + +static int __init sh_mobile_sdhi_init(void) +{ + return platform_driver_register(&sh_mobile_sdhi_driver); +} + +static void __exit sh_mobile_sdhi_exit(void) +{ + platform_driver_unregister(&sh_mobile_sdhi_driver); +} + +module_init(sh_mobile_sdhi_init); +module_exit(sh_mobile_sdhi_exit); + +MODULE_DESCRIPTION("SuperH Mobile SDHI driver"); +MODULE_AUTHOR("Magnus Damm"); +MODULE_LICENSE("GPL v2");