11f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/* 21f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 31f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * Toshiba T7L66XB core mfd support 41f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 51f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * Copyright (c) 2005, 2007, 2008 Ian Molton 61f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * Copyright (c) 2008 Dmitry Baryshkov 71f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 81f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * This program is free software; you can redistribute it and/or modify 91f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * it under the terms of the GNU General Public License version 2 as 101f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * published by the Free Software Foundation. 111f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 121f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * T7L66 features: 131f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 141f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * Supported in this driver: 151f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * SD/MMC 161f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * SM/NAND flash controller 171f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * 181f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * As yet not supported 191f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * GPIO interface (on NAND pins) 201f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * Serial interface 211f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * TFT 'interface converter' 221f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton * PCMCIA interface logic 231f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton */ 241f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 251f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/kernel.h> 261f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/module.h> 277acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton#include <linux/err.h> 281f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/io.h> 295a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 301f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/irq.h> 317acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton#include <linux/clk.h> 321f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/platform_device.h> 331f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/mfd/core.h> 341f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/mfd/tmio.h> 351f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#include <linux/mfd/t7l66xb.h> 361f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 371f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonenum { 381f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton T7L66XB_CELL_NAND, 391f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton T7L66XB_CELL_MMC, 401f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 411f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4264e8867ba8098b69889c1af94997a5ba2348fb26Ian Moltonstatic const struct resource t7l66xb_mmc_resources[] = { 4364e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton { 4464e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .start = 0x800, 4564e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .end = 0x9ff, 4664e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .flags = IORESOURCE_MEM, 4764e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton }, 4864e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton { 4964e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .start = IRQ_T7L66XB_MMC, 5064e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .end = IRQ_T7L66XB_MMC, 5164e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .flags = IORESOURCE_IRQ, 5264e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton }, 5364e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton}; 5464e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 551f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_REVID 0x08 /* b Revision ID */ 561f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_IMR 0x42 /* b Interrupt Mask */ 571f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_DEV_CTL 0xe0 /* b Device control */ 581f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_ISR 0xe1 /* b Interrupt Status */ 591f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_GPO_OC 0xf0 /* b GPO output control */ 601f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_GPO_OS 0xf1 /* b GPO output enable */ 611f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_GPI_S 0xf2 /* w GPI status */ 621f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_APDC 0xf8 /* b Active pullup down ctrl */ 631f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 641f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_DEV_CTL_USB BIT(0) /* USB enable */ 651f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define SCR_DEV_CTL_MMC BIT(1) /* MMC enable */ 661f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 671f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 681f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 691f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstruct t7l66xb { 701f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton void __iomem *scr; 711f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton /* Lock to protect registers requiring read/modify/write ops. */ 721f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spinlock_t lock; 731f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 741f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct resource rscr; 757acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton struct clk *clk48m; 767acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton struct clk *clk32k; 771f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton int irq; 781f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton int irq_base; 791f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 801f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 811f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 821f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 831f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_mmc_enable(struct platform_device *mmc) 841f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 851f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct platform_device *dev = to_platform_device(mmc->dev.parent); 861f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 871f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned long flags; 881f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton u8 dev_ctl; 891f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 907acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_enable(t7l66xb->clk32k); 911f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 921f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_lock_irqsave(&t7l66xb->lock, flags); 931f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 941f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton dev_ctl = tmio_ioread8(t7l66xb->scr + SCR_DEV_CTL); 951f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton dev_ctl |= SCR_DEV_CTL_MMC; 961f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton tmio_iowrite8(dev_ctl, t7l66xb->scr + SCR_DEV_CTL); 971f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 981f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_unlock_irqrestore(&t7l66xb->lock, flags); 991f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 10064e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton tmio_core_mmc_enable(t7l66xb->scr + 0x200, 0, 10164e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton t7l66xb_mmc_resources[0].start & 0xfffe); 10264e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 1031f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return 0; 1041f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 1051f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1061f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_mmc_disable(struct platform_device *mmc) 1071f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 1081f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct platform_device *dev = to_platform_device(mmc->dev.parent); 1091f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 1101f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned long flags; 1111f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton u8 dev_ctl; 1121f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1131f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_lock_irqsave(&t7l66xb->lock, flags); 1141f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1151f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton dev_ctl = tmio_ioread8(t7l66xb->scr + SCR_DEV_CTL); 1161f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton dev_ctl &= ~SCR_DEV_CTL_MMC; 1171f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton tmio_iowrite8(dev_ctl, t7l66xb->scr + SCR_DEV_CTL); 1181f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1191f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_unlock_irqrestore(&t7l66xb->lock, flags); 1201f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1217acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_disable(t7l66xb->clk32k); 1221f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1231f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return 0; 1241f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 1251f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 12664e8867ba8098b69889c1af94997a5ba2348fb26Ian Moltonstatic void t7l66xb_mmc_pwr(struct platform_device *mmc, int state) 12764e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton{ 12864e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton struct platform_device *dev = to_platform_device(mmc->dev.parent); 12964e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 13064e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 13164e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton tmio_core_mmc_pwr(t7l66xb->scr + 0x200, 0, state); 13264e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton} 13364e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 13464e8867ba8098b69889c1af94997a5ba2348fb26Ian Moltonstatic void t7l66xb_mmc_clk_div(struct platform_device *mmc, int state) 13564e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton{ 13664e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton struct platform_device *dev = to_platform_device(mmc->dev.parent); 13764e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 13864e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 13964e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton tmio_core_mmc_clk_div(t7l66xb->scr + 0x200, 0, state); 14064e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton} 14164e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 1421f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 1431f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1444d3792e054f706f73837769a0e5607b3b7ad25a2Samuel Ortizstatic struct tmio_mmc_data t7166xb_mmc_data = { 145f0e46cc4971f6be96010d9248e0fc076b229d989Philipp Zabel .hclk = 24000000, 14664e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .set_pwr = t7l66xb_mmc_pwr, 14764e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton .set_clk_div = t7l66xb_mmc_clk_div, 1481f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 1491f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1503446d4bb93b4d8c7c5b667dd0271669f012fb166Tobias Klauserstatic const struct resource t7l66xb_nand_resources[] = { 1511f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton { 1521f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .start = 0xc00, 1531f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .end = 0xc07, 1541f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .flags = IORESOURCE_MEM, 1551f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 1561f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton { 1571f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .start = 0x0100, 1581f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .end = 0x01ff, 1591f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .flags = IORESOURCE_MEM, 1601f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 1611f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton { 1621f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .start = IRQ_T7L66XB_NAND, 1631f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .end = IRQ_T7L66XB_NAND, 1641f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .flags = IORESOURCE_IRQ, 1651f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 1661f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 1671f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1681f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic struct mfd_cell t7l66xb_cells[] = { 1691f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton [T7L66XB_CELL_MMC] = { 1701f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .name = "tmio-mmc", 1711f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .enable = t7l66xb_mmc_enable, 1721f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .disable = t7l66xb_mmc_disable, 173ec71974f2a3ae052cdbb57a92ce3c3b34ebd7b5dSamuel Ortiz .platform_data = &t7166xb_mmc_data, 174ec71974f2a3ae052cdbb57a92ce3c3b34ebd7b5dSamuel Ortiz .pdata_size = sizeof(t7166xb_mmc_data), 1751f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .num_resources = ARRAY_SIZE(t7l66xb_mmc_resources), 1761f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .resources = t7l66xb_mmc_resources, 1771f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 1781f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton [T7L66XB_CELL_NAND] = { 1791f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .name = "tmio-nand", 1801f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .num_resources = ARRAY_SIZE(t7l66xb_nand_resources), 1811f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .resources = t7l66xb_nand_resources, 1821f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 1831f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 1841f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1851f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 1861f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1871f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/* Handle the T7L66XB interrupt mux */ 1881f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic void t7l66xb_irq(unsigned int irq, struct irq_desc *desc) 1891f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 190d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner struct t7l66xb *t7l66xb = irq_get_handler_data(irq); 1911f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned int isr; 1921f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned int i, irq_base; 1931f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1941f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton irq_base = t7l66xb->irq_base; 1951f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 1961f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton while ((isr = tmio_ioread8(t7l66xb->scr + SCR_ISR) & 1971f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton ~tmio_ioread8(t7l66xb->scr + SCR_IMR))) 1981f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton for (i = 0; i < T7L66XB_NR_IRQS; i++) 1991f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (isr & (1 << i)) 2001f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton generic_handle_irq(irq_base + i); 2011f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2021f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 203a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brownstatic void t7l66xb_irq_mask(struct irq_data *data) 2041f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 205a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown struct t7l66xb *t7l66xb = irq_data_get_irq_chip_data(data); 2061f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned long flags; 2071f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton u8 imr; 2081f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2091f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_lock_irqsave(&t7l66xb->lock, flags); 2101f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton imr = tmio_ioread8(t7l66xb->scr + SCR_IMR); 211a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown imr |= 1 << (data->irq - t7l66xb->irq_base); 2121f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton tmio_iowrite8(imr, t7l66xb->scr + SCR_IMR); 2131f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_unlock_irqrestore(&t7l66xb->lock, flags); 2141f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2151f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 216a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brownstatic void t7l66xb_irq_unmask(struct irq_data *data) 2171f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 218a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown struct t7l66xb *t7l66xb = irq_data_get_irq_chip_data(data); 2191f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned long flags; 2201f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton u8 imr; 2211f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2221f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_lock_irqsave(&t7l66xb->lock, flags); 2231f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton imr = tmio_ioread8(t7l66xb->scr + SCR_IMR); 224a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown imr &= ~(1 << (data->irq - t7l66xb->irq_base)); 2251f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton tmio_iowrite8(imr, t7l66xb->scr + SCR_IMR); 2261f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_unlock_irqrestore(&t7l66xb->lock, flags); 2271f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2281f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2291f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic struct irq_chip t7l66xb_chip = { 230a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown .name = "t7l66xb", 231a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown .irq_ack = t7l66xb_irq_mask, 232a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown .irq_mask = t7l66xb_irq_mask, 233a4e7feadcc2aa5754f5ebfe67b9f07b5fddede51Mark Brown .irq_unmask = t7l66xb_irq_unmask, 2341f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 2351f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2361f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 2371f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2381f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/* Install the IRQ handler */ 2391f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic void t7l66xb_attach_irq(struct platform_device *dev) 2401f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 2411f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 2421f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned int irq, irq_base; 2431f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2441f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton irq_base = t7l66xb->irq_base; 2451f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2461f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton for (irq = irq_base; irq < irq_base + T7L66XB_NR_IRQS; irq++) { 247d6f7ce9f7fde069424e6400c31717ef34aab7e5fThomas Gleixner irq_set_chip_and_handler(irq, &t7l66xb_chip, handle_level_irq); 248d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_chip_data(irq, t7l66xb); 2491f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#ifdef CONFIG_ARM 2501f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); 2511f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#endif 2521f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton } 2531f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 254d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_irq_type(t7l66xb->irq, IRQ_TYPE_EDGE_FALLING); 255d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_handler_data(t7l66xb->irq, t7l66xb); 256d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_chained_handler(t7l66xb->irq, t7l66xb_irq); 2571f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2581f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2591f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic void t7l66xb_detach_irq(struct platform_device *dev) 2601f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 2611f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 2621f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton unsigned int irq, irq_base; 2631f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2641f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton irq_base = t7l66xb->irq_base; 2651f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 266d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_chained_handler(t7l66xb->irq, NULL); 267d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_handler_data(t7l66xb->irq, NULL); 2681f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2691f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton for (irq = irq_base; irq < irq_base + T7L66XB_NR_IRQS; irq++) { 2701f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#ifdef CONFIG_ARM 2711f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton set_irq_flags(irq, 0); 2721f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#endif 273d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_chip(irq, NULL); 274d5bb122165981aed327845c32a9916d1b8ae0e4bThomas Gleixner irq_set_chip_data(irq, NULL); 2751f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton } 2761f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2771f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2781f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 2791f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2801f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#ifdef CONFIG_PM 2811f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_suspend(struct platform_device *dev, pm_message_t state) 2821f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 2837acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 284334a41ce9b753ec615e8c6c50ee07d6197190610Jingoo Han struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); 2851f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2861f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (pdata && pdata->suspend) 2871f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton pdata->suspend(dev); 2887acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_disable(t7l66xb->clk48m); 2891f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2901f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return 0; 2911f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 2921f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2931f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_resume(struct platform_device *dev) 2941f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 2957acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 296334a41ce9b753ec615e8c6c50ee07d6197190610Jingoo Han struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); 2971f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 2987acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_enable(t7l66xb->clk48m); 2991f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (pdata && pdata->resume) 3001f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton pdata->resume(dev); 3011f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 30264e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton tmio_core_mmc_enable(t7l66xb->scr + 0x200, 0, 30364e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton t7l66xb_mmc_resources[0].start & 0xfffe); 30464e8867ba8098b69889c1af94997a5ba2348fb26Ian Molton 3051f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return 0; 3061f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 3071f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#else 3081f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define t7l66xb_suspend NULL 3091f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#define t7l66xb_resume NULL 3101f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton#endif 3111f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3121f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 3131f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3141f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_probe(struct platform_device *dev) 3151f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 316334a41ce9b753ec615e8c6c50ee07d6197190610Jingoo Han struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); 3171f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb; 3181f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct resource *iomem, *rscr; 3191f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton int ret; 3201f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3219ad285d6db6e04c1c51c79152d2214fffefc92abSamuel Ortiz if (pdata == NULL) 3229ad285d6db6e04c1c51c79152d2214fffefc92abSamuel Ortiz return -EINVAL; 3239ad285d6db6e04c1c51c79152d2214fffefc92abSamuel Ortiz 3241f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton iomem = platform_get_resource(dev, IORESOURCE_MEM, 0); 3251f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (!iomem) 3261f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return -EINVAL; 3271f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3281f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb = kzalloc(sizeof *t7l66xb, GFP_KERNEL); 3291f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (!t7l66xb) 3301f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return -ENOMEM; 3311f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3321f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton spin_lock_init(&t7l66xb->lock); 3331f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3341f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton platform_set_drvdata(dev, t7l66xb); 3351f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3361f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton ret = platform_get_irq(dev, 0); 3371f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (ret >= 0) 3381f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb->irq = ret; 3391f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton else 3401f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton goto err_noirq; 3411f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3421f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb->irq_base = pdata->irq_base; 3431f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3447acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton t7l66xb->clk32k = clk_get(&dev->dev, "CLK_CK32K"); 3457acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton if (IS_ERR(t7l66xb->clk32k)) { 3467acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton ret = PTR_ERR(t7l66xb->clk32k); 3477acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton goto err_clk32k_get; 3487acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton } 3497acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton 3507acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton t7l66xb->clk48m = clk_get(&dev->dev, "CLK_CK48M"); 3517acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton if (IS_ERR(t7l66xb->clk48m)) { 3527acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton ret = PTR_ERR(t7l66xb->clk48m); 3537acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton goto err_clk48m_get; 3547acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton } 3557acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton 3561f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton rscr = &t7l66xb->rscr; 3571f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton rscr->name = "t7l66xb-core"; 3581f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton rscr->start = iomem->start; 3591f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton rscr->end = iomem->start + 0xff; 3601f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton rscr->flags = IORESOURCE_MEM; 3611f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3621f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton ret = request_resource(iomem, rscr); 3631f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (ret) 3641f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton goto err_request_scr; 3651f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 366c02e6a5ff43d24d73cf7830c2925e213fc72e037H Hartley Sweeten t7l66xb->scr = ioremap(rscr->start, resource_size(rscr)); 3671f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (!t7l66xb->scr) { 3681f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton ret = -ENOMEM; 3691f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton goto err_ioremap; 3701f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton } 3711f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3727acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_enable(t7l66xb->clk48m); 3737acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton 3741f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (pdata && pdata->enable) 3751f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton pdata->enable(dev); 3761f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3771f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton /* Mask all interrupts */ 3781f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton tmio_iowrite8(0xbf, t7l66xb->scr + SCR_IMR); 3791f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3801f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton printk(KERN_INFO "%s rev %d @ 0x%08lx, irq %d\n", 3811f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton dev->name, tmio_ioread8(t7l66xb->scr + SCR_REVID), 3821f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton (unsigned long)iomem->start, t7l66xb->irq); 3831f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3841f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb_attach_irq(dev); 3851f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3867dc00a0d14992d0083fefccad7839ac837ea55bcSamuel Ortiz t7l66xb_cells[T7L66XB_CELL_NAND].platform_data = pdata->nand_data; 3877dc00a0d14992d0083fefccad7839ac837ea55bcSamuel Ortiz t7l66xb_cells[T7L66XB_CELL_NAND].pdata_size = sizeof(*pdata->nand_data); 3888a4fbe013fb6a2a65a4eddcddb888ebe38d0270dIan Molton 38956bf2bda0651ca368a259468e4f309c71ed35c35Samuel Ortiz ret = mfd_add_devices(&dev->dev, dev->id, 39056bf2bda0651ca368a259468e4f309c71ed35c35Samuel Ortiz t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells), 3910848c94fb4a5cc213a7fb0fb3a5721ad6e16f096Mark Brown iomem, t7l66xb->irq_base, NULL); 3921f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3931f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton if (!ret) 3941f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return 0; 3951f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 3961f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb_detach_irq(dev); 3971f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton iounmap(t7l66xb->scr); 3981f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonerr_ioremap: 3991f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton release_resource(&t7l66xb->rscr); 4001f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonerr_request_scr: 4017acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_put(t7l66xb->clk48m); 4027acb706ca97fce84bda4a902a33de2f3dae10260Ian Moltonerr_clk48m_get: 4037acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_put(t7l66xb->clk32k); 4047acb706ca97fce84bda4a902a33de2f3dae10260Ian Moltonerr_clk32k_get: 4057acb706ca97fce84bda4a902a33de2f3dae10260Ian Moltonerr_noirq: 4060e820ab60118e06db62ef4e55b6dd96db807a34eJulia Lawall kfree(t7l66xb); 4071f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return ret; 4081f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 4091f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4101f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic int t7l66xb_remove(struct platform_device *dev) 4111f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton{ 412334a41ce9b753ec615e8c6c50ee07d6197190610Jingoo Han struct t7l66xb_platform_data *pdata = dev_get_platdata(&dev->dev); 4131f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton struct t7l66xb *t7l66xb = platform_get_drvdata(dev); 4141f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton int ret; 4151f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4161f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton ret = pdata->disable(dev); 4177acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_disable(t7l66xb->clk48m); 4187acb706ca97fce84bda4a902a33de2f3dae10260Ian Molton clk_put(t7l66xb->clk48m); 419d2d272a965baeb3d78f843374bc48f0cbce8ac3dAxel Lin clk_disable(t7l66xb->clk32k); 420d2d272a965baeb3d78f843374bc48f0cbce8ac3dAxel Lin clk_put(t7l66xb->clk32k); 4211f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton t7l66xb_detach_irq(dev); 4221f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton iounmap(t7l66xb->scr); 4231f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton release_resource(&t7l66xb->rscr); 42456bf2bda0651ca368a259468e4f309c71ed35c35Samuel Ortiz mfd_remove_devices(&dev->dev); 4251f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton kfree(t7l66xb); 4261f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4271f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton return ret; 4281f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4291f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton} 4301f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4311f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Moltonstatic struct platform_driver t7l66xb_platform_driver = { 4321f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .driver = { 4331f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .name = "t7l66xb", 4341f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .owner = THIS_MODULE, 4351f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton }, 4361f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .suspend = t7l66xb_suspend, 4371f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .resume = t7l66xb_resume, 4381f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .probe = t7l66xb_probe, 4391f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton .remove = t7l66xb_remove, 4401f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton}; 4411f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4421f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton/*--------------------------------------------------------------------------*/ 4431f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 44465349d60d27e850c94544567c91ab1be3e4c0777Mark Brownmodule_platform_driver(t7l66xb_platform_driver); 4451f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian Molton 4461f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian MoltonMODULE_DESCRIPTION("Toshiba T7L66XB core driver"); 4471f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian MoltonMODULE_LICENSE("GPL v2"); 4481f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian MoltonMODULE_AUTHOR("Ian Molton"); 4491f192015ca5b2f4d0a79c191f03f64e72fd8fc29Ian MoltonMODULE_ALIAS("platform:t7l66xb"); 450