From patchwork Tue Aug 26 06:30:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Lee X-Patchwork-Id: 382963 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 18A8E1400F1; Tue, 26 Aug 2014 16:30:55 +1000 (EST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1XMAHL-0004Fp-Ud; Tue, 26 Aug 2014 06:30:51 +0000 Received: from mail-pd0-f173.google.com ([209.85.192.173]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1XMAHE-0004Ez-PZ for kernel-team@lists.ubuntu.com; Tue, 26 Aug 2014 06:30:44 +0000 Received: by mail-pd0-f173.google.com with SMTP id w10so21961500pde.4 for ; Mon, 25 Aug 2014 23:30:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=4c9IKmPTYWGVu+8MwH+xkQty7bw8OW5Rwh7qDhDwIpc=; b=lzRoi1zUy/Kkft1HIBBn5RFR0pzaHPfLwXitRACrYyI21Bp2zux6JykQWTEYhm2uR3 JAMJQ7dYofCGS3JWDDPTn7fT5B07+QKO9b0/Y9iqR+pkoDeIlPEpP49dwvcUKnPFmAIa dRboqFOTxLitG/V2o6v2xmURHSZA3UMdhIjFEF6t5uPml1cv90uORemyWF9L9gkJeuCp dY+WehD4hdGCTHIA8CPQo3yJA+L8f8qoVLpwwlkVs0gaPYMxLjCGVax/8yBSuRom0Yqc UewqaafPtjytEej3pv76ktTIT7079PIxjchayBmufJUI6Cv5Dv8I9ijMqhCjtbKPN4MO 1opQ== X-Gm-Message-State: ALoCoQnfJyI7sgXTXIAmUR3Wy/lK+AMBDnzBVG+cys9sLb15eFpaEN20uiJ6h5wwMDHh04OZ8BT8 X-Received: by 10.68.131.134 with SMTP id om6mr34017553pbb.41.1409034643827; Mon, 25 Aug 2014 23:30:43 -0700 (PDT) Received: from localhost ([116.213.191.74]) by mx.google.com with ESMTPSA id u13sm2946871pdj.34.2014.08.25.23.30.42 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Aug 2014 23:30:43 -0700 (PDT) From: Adam Lee To: kernel-team@lists.ubuntu.com Subject: [Trusty][PATCH 2/2] mfd: rtsx: Add support for card reader rtl8402 Date: Tue, 26 Aug 2014 14:30:50 +0800 Message-Id: <1409034650-17580-2-git-send-email-adam.lee@canonical.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1409034650-17580-1-git-send-email-adam.lee@canonical.com> References: <1409034650-17580-1-git-send-email-adam.lee@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Micky Ching BugLink: http://bugs.launchpad.net/bugs/1361086 rtl8402 is much like rtl8411, so just add it to rtl8411.c Signed-off-by: Micky Ching Reviewed-by: Dan Carpenter Signed-off-by: Lee Jones (cherry picked from commit 56cb3cc1872923b69fdeeb00362b7da4d6cf5590) Signed-off-by: Adam Lee --- drivers/mfd/rtl8411.c | 44 ++++++++++++++++++++++++++++++++++++++++---- drivers/mfd/rtsx_pcr.c | 5 +++++ drivers/mfd/rtsx_pcr.h | 1 + 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/rtl8411.c b/drivers/mfd/rtl8411.c index 00ecf6b..2d96552 100644 --- a/drivers/mfd/rtl8411.c +++ b/drivers/mfd/rtl8411.c @@ -191,24 +191,25 @@ static int rtl8411_card_power_off(struct rtsx_pcr *pcr, int card) BPP_LDO_POWB, BPP_LDO_SUSPEND); } -static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +static int rtl8411_do_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage, + int bpp_tuned18_shift, int bpp_asic_1v8) { u8 mask, val; int err; - mask = (BPP_REG_TUNED18 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_MASK; + mask = (BPP_REG_TUNED18 << bpp_tuned18_shift) | BPP_PAD_MASK; if (voltage == OUTPUT_3V3) { err = rtsx_pci_write_register(pcr, SD30_DRIVE_SEL, 0x07, pcr->sd30_drive_sel_3v3); if (err < 0) return err; - val = (BPP_ASIC_3V3 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_3V3; + val = (BPP_ASIC_3V3 << bpp_tuned18_shift) | BPP_PAD_3V3; } else if (voltage == OUTPUT_1V8) { err = rtsx_pci_write_register(pcr, SD30_DRIVE_SEL, 0x07, pcr->sd30_drive_sel_1v8); if (err < 0) return err; - val = (BPP_ASIC_1V8 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_1V8; + val = (bpp_asic_1v8 << bpp_tuned18_shift) | BPP_PAD_1V8; } else { return -EINVAL; } @@ -216,6 +217,18 @@ static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) return rtsx_pci_write_register(pcr, LDO_CTL, mask, val); } +static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +{ + return rtl8411_do_switch_output_voltage(pcr, voltage, + BPP_TUNED18_SHIFT_8411, BPP_ASIC_1V8); +} + +static int rtl8402_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) +{ + return rtl8411_do_switch_output_voltage(pcr, voltage, + BPP_TUNED18_SHIFT_8402, BPP_ASIC_2V0); +} + static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr) { unsigned int card_exist; @@ -295,6 +308,22 @@ static const struct pcr_ops rtl8411_pcr_ops = { .force_power_down = rtl8411_force_power_down, }; +static const struct pcr_ops rtl8402_pcr_ops = { + .fetch_vendor_settings = rtl8411_fetch_vendor_settings, + .extra_init_hw = rtl8411_extra_init_hw, + .optimize_phy = NULL, + .turn_on_led = rtl8411_turn_on_led, + .turn_off_led = rtl8411_turn_off_led, + .enable_auto_blink = rtl8411_enable_auto_blink, + .disable_auto_blink = rtl8411_disable_auto_blink, + .card_power_on = rtl8411_card_power_on, + .card_power_off = rtl8411_card_power_off, + .switch_output_voltage = rtl8402_switch_output_voltage, + .cd_deglitch = rtl8411_cd_deglitch, + .conv_clk_and_div_n = rtl8411_conv_clk_and_div_n, + .force_power_down = rtl8411_force_power_down, +}; + static const struct pcr_ops rtl8411b_pcr_ops = { .fetch_vendor_settings = rtl8411b_fetch_vendor_settings, .extra_init_hw = rtl8411b_extra_init_hw, @@ -471,3 +500,10 @@ void rtl8411b_init_params(struct rtsx_pcr *pcr) else set_pull_ctrl_tables(pcr, rtl8411b_qfn64); } + +void rtl8402_init_params(struct rtsx_pcr *pcr) +{ + rtl8411_init_common_params(pcr); + pcr->ops = &rtl8402_pcr_ops; + set_pull_ctrl_tables(pcr, rtl8411); +} diff --git a/drivers/mfd/rtsx_pcr.c b/drivers/mfd/rtsx_pcr.c index 705698f..d8ab56d 100644 --- a/drivers/mfd/rtsx_pcr.c +++ b/drivers/mfd/rtsx_pcr.c @@ -57,6 +57,7 @@ static DEFINE_PCI_DEVICE_TABLE(rtsx_pci_ids) = { { PCI_DEVICE(0x10EC, 0x5227), PCI_CLASS_OTHERS << 16, 0xFF0000 }, { PCI_DEVICE(0x10EC, 0x5249), PCI_CLASS_OTHERS << 16, 0xFF0000 }, { PCI_DEVICE(0x10EC, 0x5287), PCI_CLASS_OTHERS << 16, 0xFF0000 }, + { PCI_DEVICE(0x10EC, 0x5286), PCI_CLASS_OTHERS << 16, 0xFF0000 }, { 0, } }; @@ -1061,6 +1062,10 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr) case 0x5287: rtl8411b_init_params(pcr); break; + + case 0x5286: + rtl8402_init_params(pcr); + break; } dev_dbg(&(pcr->pci->dev), "PID: 0x%04x, IC version: 0x%02x\n", diff --git a/drivers/mfd/rtsx_pcr.h b/drivers/mfd/rtsx_pcr.h index e9feadb..07e4c2e 100644 --- a/drivers/mfd/rtsx_pcr.h +++ b/drivers/mfd/rtsx_pcr.h @@ -30,6 +30,7 @@ void rts5209_init_params(struct rtsx_pcr *pcr); void rts5229_init_params(struct rtsx_pcr *pcr); void rtl8411_init_params(struct rtsx_pcr *pcr); +void rtl8402_init_params(struct rtsx_pcr *pcr); void rts5227_init_params(struct rtsx_pcr *pcr); void rts5249_init_params(struct rtsx_pcr *pcr); void rtl8411b_init_params(struct rtsx_pcr *pcr);